PageSourceSearch

https://missdream.org/wp-includes/js/dist/vendor/react-dom.js

js missdream.org collected 2026-09-24 20:40:34 UTC 1,080,227 bytes, 29,924 lines download raw bytes

1/**
2 * @license React
3 * react-dom.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(function (global, factory) {
11  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
12  typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
13  (global = global || self, factory(global.ReactDOM = {}, global.React));
14}(this, (function (exports, React) { 'use strict';
15
16  var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
17
18  var suppressWarning = false;
19  function setSuppressWarning(newSuppressWarning) {
20    {
21      suppressWarning = newSuppressWarning;
22    }
23  } // In DEV, calls to console.warn and console.error get replaced
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
29  function warn(format) {
30    {
31      if (!suppressWarning) {
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  }
40  function error(format) {
41    {
42      if (!suppressWarning) {
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
52  function 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
77  var FunctionComponent = 0;
78  var ClassComponent = 1;
79  var IndeterminateComponent = 2; // Before we know whether it is function or class
80
81  var HostRoot = 3; // Root of a host tree. Could be nested inside another node.
82
83  var HostPortal = 4; // A subtree. Could be an entry point to a different renderer.
84
85  var HostComponent = 5;
86  var HostText = 6;
87  var Fragment = 7;
88  var Mode = 8;
89  var ContextConsumer = 9;
90  var ContextProvider = 10;
91  var ForwardRef = 11;
92  var Profiler = 12;
93  var SuspenseComponent = 13;
94  var MemoComponent = 14;
95  var SimpleMemoComponent = 15;
96  var LazyComponent = 16;
97  var IncompleteClassComponent = 17;
98  var DehydratedFragment = 18;
99  var SuspenseListComponent = 19;
100  var ScopeComponent = 21;
101  var OffscreenComponent = 22;
102  var LegacyHiddenComponent = 23;
103  var CacheComponent = 24;
104  var TracingMarkerComponent = 25;
105
106  // -----------------------------------------------------------------------------
107
108  var enableClientRenderFallbackOnTextMismatch = true; // TODO: Need to review this code one more time before landing
109  // the react-reconciler package.
110
111  var enableNewReconciler = false; // Support legacy Primer support on internal FB www
112
113  var enableLazyContextPropagation = false; // FB-only usage. The new API has different semantics.
114
115  var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber
116
117  var enableSuspenseAvoidThisFallback = false; // Enables unstable_avoidThisFallback feature in Fizz
118  // React DOM Chopping Block
119  //
120  // Similar to main Chopping Block but only flags related to React DOM. These are
121  // grouped because we will likely batch all of them into a single major release.
122  // -----------------------------------------------------------------------------
123  // Disable support for comment nodes as React DOM containers. Already disabled
124  // in open source, but www codebase still relies on it. Need to remove.
125
126  var disableCommentsAsDOMContainers = true; // Disable javascript: URL strings in href for XSS protection.
127  // and client rendering, mostly to allow JSX attributes to apply to the custom
128  // element's object properties instead of only HTML attributes.
129  // https://github.com/facebook/react/issues/11347
130
131  var enableCustomElementPropertySupport = false; // Disables children for <textarea> elements
132  var warnAboutStringRefs = true; // -----------------------------------------------------------------------------
133  // Debugging and DevTools
134  // -----------------------------------------------------------------------------
135  // Adds user timing marks for e.g. state updates, suspense, and work loop stuff,
136  // for an experimental timeline tool.
137
138  var enableSchedulingProfiler = true; // Helps identify side effects in render-phase lifecycle hooks and setState
139
140  var enableProfilerTimer = true;
140 // Record durations for commit and passive effects phases.
141
142  var enableProfilerCommitHooks = true; // Phase param passed to onRender callback differentiates between an "update" and a "cascading-update".
143
144  var allNativeEvents = new Set();
145  /**
146   * Mapping from registration name to event name
147   */
148
149
150  var registrationNameDependencies = {};
151  /**
152   * Mapping from lowercase registration names to the properly cased version,
153   * used to warn in the case of missing event handlers. Available
154   * only in true.
155   * @type {Object}
156   */
157
158  var possibleRegistrationNames =  {} ; // Trust the developer to only use possibleRegistrationNames in true
159
160  function registerTwoPhaseEvent(registrationName, dependencies) {
161    registerDirectEvent(registrationName, dependencies);
162    registerDirectEvent(registrationName + 'Capture', dependencies);
163  }
164  function registerDirectEvent(registrationName, dependencies) {
165    {
166      if (registrationNameDependencies[registrationName]) {
167        error('EventRegistry: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName);
168      }
169    }
170
171    registrationNameDependencies[registrationName] = dependencies;
172
173    {
174      var lowerCasedName = registrationName.toLowerCase();
175      possibleRegistrationNames[lowerCasedName] = registrationName;
176
177      if (registrationName === 'onDoubleClick') {
178        possibleRegistrationNames.ondblclick = registrationName;
179      }
180    }
181
182    for (var i = 0; i < dependencies.length; i++) {
183      allNativeEvents.add(dependencies[i]);
184    }
185  }
186
187  var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');
188
189  var hasOwnProperty = Object.prototype.hasOwnProperty;
190
191  /*
192   * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol
193   * and Temporal.* types. See https://github.com/facebook/react/pull/22064.
194   *
195   * The functions in this module will throw an easier-to-understand,
196   * easier-to-debug exception with a clear errors message message explaining the
197   * problem. (Instead of a confusing exception thrown inside the implementation
198   * of the `value` object).
199   */
200  // $FlowFixMe only called in DEV, so void return is not possible.
201  function typeName(value) {
202    {
203      // toStringTag is needed for namespaced types like Temporal.Instant
204      var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;
205      var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';
206      return type;
207    }
208  } // $FlowFixMe only called in DEV, so void return is not possible.
209
210
211  function willCoercionThrow(value) {
212    {
213      try {
214        testStringCoercion(value);
215        return false;
216      } catch (e) {
217        return true;
218      }
219    }
220  }
221
222  function testStringCoercion(value) {
223    // If you ended up here by following an exception call stack, here's what's
224    // happened: you supplied an object or symbol value to React (as a prop, key,
225    // DOM attribute, CSS property, string ref, etc.) and when React tried to
226    // coerce it to a string using `'' + value`, an exception was thrown.
227    //
228    // The most common types that will cause this exception are `Symbol` instances
229    // and Temporal objects like `Temporal.Instant`. But any object that has a
230    // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this
231    // exception. (Library authors do this to prevent users from using built-in
232    // numeric operators like `+` or comparison operators like `>=` because custom
233    // methods are needed to perform accurate arithmetic or comparison.)
234    //
235    // To fix the problem, coerce this object or symbol value to a string before
236    // passing it to React. The most reliable way is usually `String(value)`.
237    //
238    // To find which value is throwing, check the browser or debugger console.
239    // Before this exception was thrown, there should be `console.error` output
240    // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the
241    // problem and how that type was used: key, atrribute, input value prop, etc.
242    // In most cases, this console output also shows the component and its
243    // ancestor components where the exception happened.
244    //
245    // eslint-disable-next-line react-internal/safe-string-coercion
246    return '' + value;
247  }
248
249  function checkAttributeStringCoercion(value, attributeName) {
250    {
251      if (willCoercionThrow(value)) {
252        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));
253
254        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
255      }
256    }
257  }
258  function checkKeyStringCoercion(value) {
259    {
260      if (willCoercionThrow(value)) {
261        error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
262
263        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
264      }
265    }
266  }
267  function checkPropStringCoercion(value, propName) {
268    {
269      if (willCoercionThrow(value)) {
270        error('The provided `%s` prop is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', propName, typeName(value));
271
272        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
273      }
274    }
275  }
276  function checkCSSPropertyStringCoercion(value, propName) {
277    {
278      if (willCoercionThrow(value)) {
279        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));
280
281        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
282      }
283    }
284  }
285  function checkHtmlStringCoercion(value) {
286    {
287      if (willCoercionThrow(value)) {
288        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));
289
290        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
291      }
292    }
293  }
294  function checkFormFieldValueStringCoercion(value) {
295    {
296      if (willCoercionThrow(value)) {
297        error('Form field values (value, checked, defaultValue, or defaultChecked props)' + ' must be strings, not %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
298
299        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
300      }
301    }
302  }
303
304  // A reserved attribute.
305  // It is handled by React separately and shouldn't be written to the DOM.
306  var RESERVED = 0; // A simple string attribute.
307  // Attributes that aren't in the filter are presumed to have this type.
308
309  var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called
310  // "enumerated" attributes with "true" and "false" as possible values.
311  // When true, it should be set to a "true" string.
312  // When false, it should be set to a "false" string.
313
314  var BOOLEANISH_STRING = 2; // A real boolean attribute.
315  // When true, it should be present (set either to an empty string or its name).
316  // When false, it should be omitted.
317
318  var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.
319  // When true, it should be present (set either to an empty string or its name).
320  // When false, it should be omitted.
321  // For any other value, should be present with that value.
322
323  var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.
324  // When falsy, it should be removed.
325
326  var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.
327  // When falsy, it should be removed.
328
329  var POSITIVE_NUMERIC = 6;
330
331  /* eslint-disable max-len */
332  var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u
vendor: 10,234 bytes, lines 332-570
332037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
333  /* eslint-enable max-len */
334
335  var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
336  var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');
337  var illegalAttributeNameCache = {};
338  var validatedAttributeNameCache = {};
339  function isAttributeNameSafe(attributeName) {
340    if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {
341      return true;
342    }
343
344    if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {
345      return false;
346    }
347
348    if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
349      validatedAttributeNameCache[attributeName] = true;
350      return true;
351    }
352
353    illegalAttributeNameCache[attributeName] = true;
354
355    {
356      error('Invalid attribute name: `%s`', attributeName);
357    }
358
359    return false;
360  }
361  function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {
362    if (propertyInfo !== null) {
363      return propertyInfo.type === RESERVED;
364    }
365
366    if (isCustomComponentTag) {
367      return false;
368    }
369
370    if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {
371      return true;
372    }
373
374    return false;
375  }
376  function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {
377    if (propertyInfo !== null && propertyInfo.type === RESERVED) {
378      return false;
379    }
380
381    switch (typeof value) {
382      case 'function': // $FlowIssue symbol is perfectly valid here
383
384      case 'symbol':
385        // eslint-disable-line
386        return true;
387
388      case 'boolean':
389        {
390          if (isCustomComponentTag) {
391            return false;
392          }
393
394          if (propertyInfo !== null) {
395            return !propertyInfo.acceptsBooleans;
396          } else {
397            var prefix = name.toLowerCase().slice(0, 5);
398            return prefix !== 'data-' && prefix !== 'aria-';
399          }
400        }
401
402      default:
403        return false;
404    }
405  }
406  function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {
407    if (value === null || typeof value === 'undefined') {
408      return true;
409    }
410
411    if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {
412      return true;
413    }
414
415    if (isCustomComponentTag) {
416
417      return false;
418    }
419
420    if (propertyInfo !== null) {
421
422      switch (propertyInfo.type) {
423        case BOOLEAN:
424          return !value;
425
426        case OVERLOADED_BOOLEAN:
427          return value === false;
428
429        case NUMERIC:
430          return isNaN(value);
431
432        case POSITIVE_NUMERIC:
433          return isNaN(value) || value < 1;
434      }
435    }
436
437    return false;
438  }
439  function getPropertyInfo(name) {
440    return properties.hasOwnProperty(name) ? properties[name] : null;
441  }
442
443  function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) {
444    this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;
445    this.attributeName = attributeName;
446    this.attributeNamespace = attributeNamespace;
447    this.mustUseProperty = mustUseProperty;
448    this.propertyName = name;
449    this.type = type;
450    this.sanitizeURL = sanitizeURL;
451    this.removeEmptyString = removeEmptyString;
452  } // When adding attributes to this list, be sure to also add them to
453  // the `possibleStandardNames` module to ensure casing and incorrect
454  // name warnings.
455
456
457  var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.
458
459  var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular
460  // elements (not just inputs). Now that ReactDOMInput assigns to the
461  // defaultValue property -- do we need this?
462  'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];
463
464  reservedProps.forEach(function (name) {
465    properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty
466    name, // attributeName
467    null, // attributeNamespace
468    false, // sanitizeURL
469    false);
470  }); // A few React string attributes have a different name.
471  // This is a mapping from React prop names to the attribute names.
472
473  [['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {
474    var name = _ref[0],
475        attributeName = _ref[1];
476    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
477    attributeName, // attributeName
478    null, // attributeNamespace
479    false, // sanitizeURL
480    false);
481  }); // These are "enumerated" HTML attributes that accept "true" and "false".
482  // In React, we let users pass `true` and `false` even though technically
483  // these aren't boolean attributes (they are coerced to strings).
484
485  ['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {
486    properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
487    name.toLowerCase(), // attributeName
488    null, // attributeNamespace
489    false, // sanitizeURL
490    false);
491  }); // These are "enumerated" SVG attributes that accept "true" and "false".
492  // In React, we let users pass `true` and `false` even though technically
493  // these aren't boolean attributes (they are coerced to strings).
494  // Since these are SVG attributes, their attribute names are case-sensitive.
495
496  ['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {
497    properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
498    name, // attributeName
499    null, // attributeNamespace
500    false, // sanitizeURL
501    false);
502  }); // These are HTML boolean attributes.
503
504  ['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM
505  // on the client side because the browsers are inconsistent. Instead we call focus().
506  'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata
507  'itemScope'].forEach(function (name) {
508    properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty
509    name.toLowerCase(), // attributeName
510    null, // attributeNamespace
511    false, // sanitizeURL
512    false);
513  }); // These are the few React props that we set as DOM properties
514  // rather than attributes. These are all booleans.
515
516  ['checked', // Note: `option.selected` is not updated if `select.multiple` is
517  // disabled with `removeAttribute`. We have special logic for handling this.
518  'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,
519  // you'll need to set attributeName to name.toLowerCase()
520  // instead in the assignment below.
521  ].forEach(function (name) {
522    properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty
523    name, // attributeName
524    null, // attributeNamespace
525    false, // sanitizeURL
526    false);
527  }); // These are HTML attributes that are "overloaded booleans": they behave like
528  // booleans, but can also accept a string value.
529
530  ['capture', 'download' // NOTE: if you add a camelCased prop to this list,
531  // you'll need to set attributeName to name.toLowerCase()
532  // instead in the assignment below.
533  ].forEach(function (name) {
534    properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty
535    name, // attributeName
536    null, // attributeNamespace
537    false, // sanitizeURL
538    false);
539  }); // These are HTML attributes that must be positive numbers.
540
541  ['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,
542  // you'll need to set attributeName to name.toLowerCase()
543  // instead in the assignment below.
544  ].forEach(function (name) {
545    properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty
546    name, // attributeName
547    null, // attributeNamespace
548    false, // sanitizeURL
549    false);
550  }); // These are HTML attributes that must be numbers.
551
552  ['rowSpan', 'start'].forEach(function (name) {
553    properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty
554    name.toLowerCase(), // attributeName
555    null, // attributeNamespace
556    false, // sanitizeURL
557    false);
558  });
559  var CAMELIZE = /[\-\:]([a-z])/g;
560
561  var capitalize = function (token) {
562    return token[1].toUpperCase();
563  }; // This is a list of all SVG attributes that need special casing, namespacing,
564  // or boolean value assignment. Regular attributes that just accept strings
565  // and have the same names are omitted, just like in the HTML attribute filter.
566  // Some of these attributes can be hard to find. This list was created by
567  // scraping the MDN documentation.
568
569
570  ['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
570-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,
571  // you'll need to set attributeName to name.toLowerCase()
572  // instead in the assignment below.
573  ].forEach(function (attributeName) {
574    var name = attributeName.replace(CAMELIZE, capitalize);
575    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
576    attributeName, null, // attributeNamespace
577    false, // sanitizeURL
578    false);
579  }); // String SVG attributes with the xlink namespace.
580
581  ['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,
582  // you'll need to set attributeName to name.toLowerCase()
583  // instead in the assignment below.
584  ].forEach(function (attributeName) {
585    var name = attributeName.replace(CAMELIZE, capitalize);
586    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
587    attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL
588    false);
589  }); // String SVG attributes with the xml namespace.
590
591  ['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,
592  // you'll need to set attributeName to name.toLowerCase()
593  // instead in the assignment below.
594  ].forEach(function (attributeName) {
595    var name = attributeName.replace(CAMELIZE, capitalize);
596    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
597    attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL
598    false);
599  }); // These attribute exists both in HTML and SVG.
600  // The attribute name is case-sensitive in SVG so we can't just use
601  // the React name like we do for attributes that exist only in HTML.
602
603  ['tabIndex', 'crossOrigin'].forEach(function (attributeName) {
604    properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
605    attributeName.toLowerCase(), // attributeName
606    null, // attributeNamespace
607    false, // sanitizeURL
608    false);
609  }); // These attributes accept URLs. These must not allow javascript: URLS.
610  // These will also need to accept Trusted Types object in the future.
611
612  var xlinkHref = 'xlinkHref';
613  properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty
614  'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL
615  false);
616  ['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {
617    properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
618    attributeName.toLowerCase(), // attributeName
619    null, // attributeNamespace
620    true, // sanitizeURL
621    true);
622  });
623
624  // and any newline or tab are filtered out as if they're not part of the URL.
625  // https://url.spec.whatwg.org/#url-parsing
626  // Tab or newline are defined as \r\n\t:
627  // https://infra.spec.whatwg.org/#ascii-tab-or-newline
628  // A C0 control is a code point in the range \u0000 NULL to \u001F
629  // INFORMATION SEPARATOR ONE, inclusive:
630  // https://infra.spec.whatwg.org/#c0-control-or-space
631
632  /* eslint-disable max-len */
633
634  var 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;
635  var didWarn = false;
636
637  function sanitizeURL(url) {
638    {
639      if (!didWarn && isJavaScriptProtocol.test(url)) {
640        didWarn = true;
641
642        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));
643      }
644    }
645  }
646
647  /**
648   * Get the value for a property on a node. Only used in DEV for SSR validation.
649   * The "expected" argument is used as a hint of what the expected value is.
650   * Some properties have multiple equivalent values.
651   */
652  function getValueForProperty(node, name, expected, propertyInfo) {
653    {
654      if (propertyInfo.mustUseProperty) {
655        var propertyName = propertyInfo.propertyName;
656        return node[propertyName];
657      } else {
658        // This check protects multiple uses of `expected`, which is why the
659        // react-internal/safe-string-coercion rule is disabled in several spots
660        // below.
661        {
662          checkAttributeStringCoercion(expected, name);
663        }
664
665        if ( propertyInfo.sanitizeURL) {
666          // If we haven't fully disabled javascript: URLs, and if
667          // the hydration is successful of a javascript: URL, we
668          // still want to warn on the client.
669          // eslint-disable-next-line react-internal/safe-string-coercion
670          sanitizeURL('' + expected);
671        }
672
673        var attributeName = propertyInfo.attributeName;
674        var stringValue = null;
675
676        if (propertyInfo.type === OVERLOADED_BOOLEAN) {
677          if (node.hasAttribute(attributeName)) {
678            var value = node.getAttribute(attributeName);
679
680            if (value === '') {
681              return true;
682            }
683
684            if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
685              return value;
686            } // eslint-disable-next-line react-internal/safe-string-coercion
687
688
689            if (value === '' + expected) {
690              return expected;
691            }
692
693            return value;
694          }
695        } else if (node.hasAttribute(attributeName)) {
696          if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
697            // We had an attribute but shouldn't have had one, so read it
698            // for the error message.
699            return node.getAttribute(attributeName);
700          }
701
702          if (propertyInfo.type === BOOLEAN) {
703            // If this was a boolean, it doesn't matter what the value is
704            // the fact that we have it is the same as the expected.
705            return expected;
706          } // Even if this property uses a namespace we use getAttribute
707          // because we assume its namespaced name is the same as our config.
708          // To use getAttributeNS we need the local name which we don't have
709          // in our config atm.
710
711
vendor: 5,542 bytes, lines 712-888
712          stringValue = node.getAttribute(attributeName);
713        }
714
715        if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
716          return stringValue === null ? expected : stringValue; // eslint-disable-next-line react-internal/safe-string-coercion
717        } else if (stringValue === '' + expected) {
718          return expected;
719        } else {
720          return stringValue;
721        }
722      }
723    }
724  }
725  /**
726   * Get the value for a attribute on a node. Only used in DEV for SSR validation.
727   * The third argument is used as a hint of what the expected value is. Some
728   * attributes have multiple equivalent values.
729   */
730
731  function getValueForAttribute(node, name, expected, isCustomComponentTag) {
732    {
733      if (!isAttributeNameSafe(name)) {
734        return;
735      }
736
737      if (!node.hasAttribute(name)) {
738        return expected === undefined ? undefined : null;
739      }
740
741      var value = node.getAttribute(name);
742
743      {
744        checkAttributeStringCoercion(expected, name);
745      }
746
747      if (value === '' + expected) {
748        return expected;
749      }
750
751      return value;
752    }
753  }
754  /**
755   * Sets the value for a property on a node.
756   *
757   * @param {DOMElement} node
758   * @param {string} name
759   * @param {*} value
760   */
761
762  function setValueForProperty(node, name, value, isCustomComponentTag) {
763    var propertyInfo = getPropertyInfo(name);
764
765    if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {
766      return;
767    }
768
769    if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {
770      value = null;
771    }
772
773
774    if (isCustomComponentTag || propertyInfo === null) {
775      if (isAttributeNameSafe(name)) {
776        var _attributeName = name;
777
778        if (value === null) {
779          node.removeAttribute(_attributeName);
780        } else {
781          {
782            checkAttributeStringCoercion(value, name);
783          }
784
785          node.setAttribute(_attributeName,  '' + value);
786        }
787      }
788
789      return;
790    }
791
792    var mustUseProperty = propertyInfo.mustUseProperty;
793
794    if (mustUseProperty) {
795      var propertyName = propertyInfo.propertyName;
796
797      if (value === null) {
798        var type = propertyInfo.type;
799        node[propertyName] = type === BOOLEAN ? false : '';
800      } else {
801        // Contrary to `setAttribute`, object properties are properly
802        // `toString`ed by IE8/9.
803        node[propertyName] = value;
804      }
805
806      return;
807    } // The rest are treated as attributes with special cases.
808
809
810    var attributeName = propertyInfo.attributeName,
811        attributeNamespace = propertyInfo.attributeNamespace;
812
813    if (value === null) {
814      node.removeAttribute(attributeName);
815    } else {
816      var _type = propertyInfo.type;
817      var attributeValue;
818
819      if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {
820        // If attribute type is boolean, we know for sure it won't be an execution sink
821        // and we won't require Trusted Type here.
822        attributeValue = '';
823      } else {
824        // `setAttribute` with objects becomes only `[object]` in IE8/9,
825        // ('' + value) makes it output the correct toString()-value.
826        {
827          {
828            checkAttributeStringCoercion(value, attributeName);
829          }
830
831          attributeValue = '' + value;
832        }
833
834        if (propertyInfo.sanitizeURL) {
835          sanitizeURL(attributeValue.toString());
836        }
837      }
838
839      if (attributeNamespace) {
840        node.setAttributeNS(attributeNamespace, attributeName, attributeValue);
841      } else {
842        node.setAttribute(attributeName, attributeValue);
843      }
844    }
845  }
846
847  // ATTENTION
848  // When adding new symbols to this file,
849  // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
850  // The Symbol used to tag the ReactElement-like types.
851  var REACT_ELEMENT_TYPE = Symbol.for('react.element');
852  var REACT_PORTAL_TYPE = Symbol.for('react.portal');
853  var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');
854  var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');
855  var REACT_PROFILER_TYPE = Symbol.for('react.profiler');
856  var REACT_PROVIDER_TYPE = Symbol.for('react.provider');
857  var REACT_CONTEXT_TYPE = Symbol.for('react.context');
858  var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');
859  var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');
860  var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');
861  var REACT_MEMO_TYPE = Symbol.for('react.memo');
862  var REACT_LAZY_TYPE = Symbol.for('react.lazy');
863  var REACT_SCOPE_TYPE = Symbol.for('react.scope');
864  var REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for('react.debug_trace_mode');
865  var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');
866  var REACT_LEGACY_HIDDEN_TYPE = Symbol.for('react.legacy_hidden');
867  var REACT_CACHE_TYPE = Symbol.for('react.cache');
868  var REACT_TRACING_MARKER_TYPE = Symbol.for('react.tracing_marker');
869  var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
870  var FAUX_ITERATOR_SYMBOL = '@@iterator';
871  function getIteratorFn(maybeIterable) {
872    if (maybeIterable === null || typeof maybeIterable !== 'object') {
873      return null;
874    }
875
876    var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
877
878    if (typeof maybeIterator === 'function') {
879      return maybeIterator;
880    }
881
882    return null;
883  }
884
885  var assign = Object.assign;
886
887  // Helpers to patch console.logs to avoid logging during side-effect free
888  // replaying on render function. This currently only patches the object
889  // lazily which won't cover if the log function was extracted eagerly.
890  // We could also eagerly patch the method.
891  var disabledDepth = 0;
892  var prevLog;
893  var prevInfo;
894  var prevWarn;
895  var prevError;
896  var prevGroup;
897  var prevGroupCollapsed;
898  var prevGroupEnd;
899
900  function disabledLog() {}
901
902  disabledLog.__reactDisabledLog = true;
903  function disableLogs() {
904    {
905      if (disabledDepth === 0) {
906        /* eslint-disable react-internal/no-production-logging */
907        prevLog = console.log;
908        prevInfo = console.info;
909        prevWarn = console.warn;
910        prevError = console.error;
911        prevGroup = console.group;
912        prevGroupCollapsed = console.groupCollapsed;
913        prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099
914
915        var props = {
916          configurable: true,
917          enumerable: true,
918          value: disabledLog,
919          writable: true
920        }; // $FlowFixMe Flow thinks console is immutable.
921
922        Object.defineProperties(console, {
923          info: props,
924          log: props,
925          warn: props,
926          error: props,
927          group: props,
928          groupCollapsed: props,
929          groupEnd: props
930        });
931        /* eslint-enable react-internal/no-production-logging */
932      }
933
934      disabledDepth++;
935    }
936  }
937  function reenableLogs() {
938    {
939      disabledDepth--;
940
941      if (disabledDepth === 0) {
942        /* eslint-disable react-internal/no-production-logging */
943        var props = {
944          configurable: true,
945          enumerable: true,
946          writable: true
947        }; // $FlowFixMe Flow thinks console is immutable.
948
949        Object.defineProperties(console, {
950          log: assign({}, props, {
951            value: prevLog
952          }),
953          info: assign({}, props, {
954            value: prevInfo
955          }),
956          warn: assign({}, props, {
957            value: prevWarn
958          }),
959          error: assign({}, props, {
960            value: prevError
961          }),
962          group: assign({}, props, {
963            value: prevGroup
964          }),
965          groupCollapsed: assign({}, props, {
966            value: prevGroupCollapsed
967          }),
968          groupEnd: assign({}, props, {
969            value: prevGroupEnd
970          })
971        });
972        /* eslint-enable react-internal/no-production-logging */
973      }
974
975      if (disabledDepth < 0) {
976        error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');
977      }
978    }
979  }
980
981  var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
982  var prefix;
983  function describeBuiltInComponentFrame(name, source, ownerFn) {
984    {
985      if (prefix === undefined) {
986        // Extract the VM specific prefix used by each line.
987        try {
988          throw Error();
989        } catch (x) {
990          var match = x.stack.trim().match(/\n( *(at )?)/);
991          prefix = match && match[1] || '';
992        }
993      } // We use the prefix to ensure our stacks line up with native stack frames.
994
995
996      return '\n' + prefix + name;
997    }
998  }
999  var reentry = false;
1000  var componentFrameCache;
1001
1002  {
1003    var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
1004    componentFrameCache = new PossiblyWeakMap();
1005  }
1006
1007  function describeNativeComponentFrame(fn, construct) {
1008    // If something asked for a stack inside a fake render, it should get ignored.
1009    if ( !fn || reentry) {
1010      return '';
1011    }
1012
1013    {
1014      var frame = componentFrameCache.get(fn);
1015
1016      if (frame !== undefined) {
1017        return frame;
1018      }
1019    }
1020
1021    var control;
1022    reentry = true;
1023    var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.
1024
1025    Error.prepareStackTrace = undefined;
1026    var previousDispatcher;
1027
1028    {
1029      previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function
1030      // for warnings.
1031
1032      ReactCurrentDispatcher.current = null;
1033      disableLogs();
1034    }
1035
1036    try {
1037      // This should throw.
1038      if (construct) {
1039        // Something should be setting the props in the constructor.
1040        var Fake = function () {
1041          throw Error();
1042        }; // $FlowFixMe
1043
1044
1045        Object.defineProperty(Fake.prototype, 'props', {
1046          set: function () {
1047            // We use a throwing setter instead of frozen or non-writable props
1048            // because that won't throw in a non-strict mode function.
1049            throw Error();
1050          }
1051        });
1052
1053        if (typeof Reflect === 'object' && Reflect.construct) {
1054          // We construct a different control for this case to include any extra
1055          // frames added by the construct call.
1056          try {
1057            Reflect.construct(Fake, []);
1058          } catch (x) {
1059            control = x;
1060          }
1061
1062          Reflect.construct(fn, [], Fake);
1063        } else {
1064          try {
1065            Fake.call();
1066          } catch (x) {
1067            control = x;
1068          }
1069
1070          fn.call(Fake.prototype);
1071        }
1072      } else {
1073        try {
1074          throw Error();
1075        } catch (x) {
1076          control = x;
1077        }
1078
1079        fn();
1080      }
1081    } catch (sample) {
1082      // This is inlined manually because closure doesn't do it for us.
1083      if (sample && control && typeof sample.stack === 'string') {
1084        // This extracts the first frame from the sample that isn't also in the control.
1085        // Skipping one frame that we assume is the frame that calls the two.
1086        var sampleLines = sample.stack.split('\n');
1087        var controlLines = control.stack.split('\n');
1088        var s = sampleLines.length - 1;
1089        var c = controlLines.length - 1;
1090
1091        while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {
1092          // We expect at least one stack frame to be shared.
1093          // Typically this will be the root most one. However, stack frames may be
1094          // cut off due to maximum stack limits. In this case, one maybe cut off
1095          // earlier than the other. We assume that the sample is longer or the same
1096          // and there for cut off earlier. So we should find the root most frame in
1097          // the sample somewhere in the control.
1098          c--;
1099        }
1100
1101        for (; s >= 1 && c >= 0; s--, c--) {
1102          // Next we find the first one that isn't the same which should be the
1103          // frame that called our sample function and the control.
1104          if (sampleLines[s] !== controlLines[c]) {
1105            // In V8, the first line is describing the message but other VMs don't.
1106            // If we're about to return the first line, and the control is also on the same
1107            // line, that's a pretty good indicator that our sample threw at same line as
1108            // the control. I.e. before we entered the sample frame. So we ignore this result.
1109            // This can happen if you passed a class to function component, or non-function.
1110            if (s !== 1 || c !== 1) {
1111              do {
1112                s--;
1113                c--; // We may still have similar intermediate frames from the construct call.
1114                // The next one that isn't the same should be our match though.
1115
1116                if (c < 0 || sampleLines[s] !== controlLines[c]) {
1117                  // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier.
1118                  var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "<anonymous>"
1119                  // but we have a user-provided "displayName"
1120                  // splice it in to make the stack more readable.
1121
1122
1123                  if (fn.displayName && _frame.includes('<anonymous>')) {
1124                    _frame = _frame.replace('<anonymous>', fn.displayName);
1125                  }
1126
1127                  {
1128                    if (typeof fn === 'function') {
1129                      componentFrameCache.set(fn, _frame);
1130                    }
1131                  } // Return the line we found.
1132
1133
1134                  return _frame;
1135                }
1136              } while (s >= 1 && c >= 0);
1137            }
1138
1139            break;
1140          }
1141        }
1142      }
1143    } finally {
1144      reentry = false;
1145
1146      {
1147        ReactCurrentDispatcher.current = previousDispatcher;
1148        reenableLogs();
1149      }
1150
1151      Error.prepareStackTrace = previousPrepareStackTrace;
1152    } // Fallback to just using the name if we couldn't make it throw.
1153
1154
1155    var name = fn ? fn.displayName || fn.name : '';
1156    var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';
1157
1158    {
1159      if (typeof fn === 'function') {
1160        componentFrameCache.set(fn, syntheticFrame);
1161      }
1162    }
1163
1164    return syntheticFrame;
1165  }
1166
1167  function describeClassComponentFrame(ctor, source, ownerFn) {
1168    {
1169      return describeNativeComponentFrame(ctor, true);
1170    }
1171  }
1172  function describeFunctionComponentFrame(fn, source, ownerFn) {
1173    {
1174      return describeNativeComponentFrame(fn, false);
1175    }
1176  }
1177
1178  function shouldConstruct(Component) {
1179    var prototype = Component.prototype;
1180    return !!(prototype && prototype.isReactComponent);
1181  }
1182
1183  function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {
1184
1185    if (type == null) {
1186      return '';
1187    }
1188
1189    if (typeof type === 'function') {
1190      {
1191        return describeNativeComponentFrame(type, shouldConstruct(type));
1192      }
1193    }
1194
1195    if (typeof type === 'string') {
1196      return describeBuiltInComponentFrame(type);
1197    }
1198
1199    switch (type) {
1200      case REACT_SUSPENSE_TYPE:
1201        return describeBuiltInComponentFrame('Suspense');
1202
1203      case REACT_SUSPENSE_LIST_TYPE:
1204        return describeBuiltInComponentFrame('SuspenseList');
1205    }
1206
1207    if (typeof type === 'object') {
1208      switch (type.$$typeof) {
1209        case REACT_FORWARD_REF_TYPE:
1210          return describeFunctionComponentFrame(type.render);
1211
1212        case REACT_MEMO_TYPE:
1213          // Memo may contain any component type so we recursively resolve it.
1214          return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);
1215
1216        case REACT_LAZY_TYPE:
1217          {
1218            var lazyComponent = type;
1219            var payload = lazyComponent._payload;
1220            var init = lazyComponent._init;
1221
1222            try {
1223              // Lazy may contain any component type so we recursively resolve it.
1224              return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);
1225            } catch (x) {}
1226          }
1227      }
1228    }
1229
1230    return '';
1231  }
1232
1233  function describeFiber(fiber) {
1234    var owner =  fiber._debugOwner ? fiber._debugOwner.type : null ;
1235    var source =  fiber._debugSource ;
1236
1237    switch (fiber.tag) {
1238      case HostComponent:
1239        return describeBuiltInComponentFrame(fiber.type);
1240
1241      case LazyComponent:
1242        return describeBuiltInComponentFrame('Lazy');
1243
1244      case SuspenseComponent:
1245        return describeBuiltInComponentFrame('Suspense');
1246
1247      case SuspenseListComponent:
1248        return describeBuiltInComponentFrame('SuspenseList');
1249
1250      case FunctionComponent:
1251      case IndeterminateComponent:
1252      case SimpleMemoComponent:
1253        return describeFunctionComponentFrame(fiber.type);
1254
1255      case ForwardRef:
1256        return describeFunctionComponentFrame(fiber.type.render);
1257
1258      case ClassComponent:
1259        return describeClassComponentFrame(fiber.type);
1260
1261      default:
1262        return '';
1263    }
1264  }
1265
1266  function getStackByFiberInDevAndProd(workInProgress) {
1267    try {
1268      var info = '';
1269      var node = workInProgress;
1270
1271      do {
1272        info += describeFiber(node);
1273        node = node.return;
1274      } while (node);
1275
1276      return info;
1277    } catch (x) {
1278      return '\nError generating stack: ' + x.message + '\n' + x.stack;
1279    }
1280  }
1281
1282  function getWrappedName(outerType, innerType, wrapperName) {
1283    var displayName = outerType.displayName;
1284
1285    if (displayName) {
1286      return displayName;
1287    }
1288
1289    var functionName = innerType.displayName || innerType.name || '';
1290    return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName;
1291  } // Keep in sync with react-reconciler/getComponentNameFromFiber
1292
1293
1294  function getContextName(type) {
1295    return type.displayName || 'Context';
1296  } // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.
1297
1298
1299  function getComponentNameFromType(type) {
1300    if (type == null) {
1301      // Host root, text node or just invalid type.
1302      return null;
1303    }
1304
1305    {
1306      if (typeof type.tag === 'number') {
1307        error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');
1308      }
1309    }
1310
1311    if (typeof type === 'function') {
1312      return type.displayName || type.name || null;
1313    }
1314
1315    if (typeof type === 'string') {
1316      return type;
1317    }
1318
1319    switch (type) {
1320      case REACT_FRAGMENT_TYPE:
1321        return 'Fragment';
1322
1323      case REACT_PORTAL_TYPE:
1324        return 'Portal';
1325
1326      case REACT_PROFILER_TYPE:
1327        return 'Profiler';
1328
1329      case REACT_STRICT_MODE_TYPE:
1330        return 'StrictMode';
1331
1332      case REACT_SUSPENSE_TYPE:
1333        return 'Suspense';
1334
1335      case REACT_SUSPENSE_LIST_TYPE:
1336        return 'SuspenseList';
1337
1338    }
1339
1340    if (typeof type === 'object') {
1341      switch (type.$$typeof) {
1342        case REACT_CONTEXT_TYPE:
1343          var context = type;
1344          return getContextName(context) + '.Consumer';
1345
1346        case REACT_PROVIDER_TYPE:
1347          var provider = type;
1348          return getContextName(provider._context) + '.Provider';
1349
1350        case REACT_FORWARD_REF_TYPE:
1351          return getWrappedName(type, type.render, 'ForwardRef');
1352
1353        case REACT_MEMO_TYPE:
1354          var outerName = type.displayName || null;
1355
1356          if (outerName !== null) {
1357            return outerName;
1358          }
1359
1360          return getComponentNameFromType(type.type) || 'Memo';
1361
1362        case REACT_LAZY_TYPE:
1363          {
1364            var lazyComponent = type;
1365            var payload = lazyComponent._payload;
1366            var init = lazyComponent._init;
1367
1368            try {
1369              return getComponentNameFromType(init(payload));
1370            } catch (x) {
1371              return null;
1372            }
1373          }
1374
1375        // eslint-disable-next-line no-fallthrough
1376      }
1377    }
1378
1379    return null;
1380  }
1381
1382  function getWrappedName$1(outerType, innerType, wrapperName) {
1383    var functionName = innerType.displayName || innerType.name || '';
1384    return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
1385  } // Keep in sync with shared/getComponentNameFromType
1386
1387
1388  function getContextName$1(type) {
1389    return type.displayName || 'Context';
1390  }
1391
1392  function getComponentNameFromFiber(fiber) {
1393    var tag = fiber.tag,
1394        type = fiber.type;
1395
1396    switch (tag) {
1397      case CacheComponent:
1398        return 'Cache';
1399
1400      case ContextConsumer:
1401        var context = type;
1402        return getContextName$1(context) + '.Consumer';
1403
1404      case ContextProvider:
1405        var provider = type;
1406        return getContextName$1(provider._context) + '.Provider';
1407
1408      case DehydratedFragment:
1409        return 'DehydratedFragment';
1410
1411      case ForwardRef:
1412        return getWrappedName$1(type, type.render, 'ForwardRef');
1413
1414      case Fragment:
1415        return 'Fragment';
1416
1417      case HostComponent:
1418        // Host component type is the display name (e.g. "div", "View")
1419        return type;
1420
1421      case HostPortal:
1422        return 'Portal';
1423
1424      case HostRoot:
1425        return 'Root';
1426
1427      case HostText:
1428        return 'Text';
1429
1430      case LazyComponent:
1431        // Name comes from the type in this case; we don't have a tag.
1432        return getComponentNameFromType(type);
1433
1434      case Mode:
1435        if (type === REACT_STRICT_MODE_TYPE) {
1436          // Don't be less specific than shared/getComponentNameFromType
1437          return 'StrictMode';
1438        }
1439
1440        return 'Mode';
1441
1442      case OffscreenComponent:
1443        return 'Offscreen';
1444
1445      case Profiler:
1446        return 'Profiler';
1447
1448      case ScopeComponent:
1449        return 'Scope';
1450
1451      case SuspenseComponent:
1452        return 'Suspense';
1453
1454      case SuspenseListComponent:
1455        return 'SuspenseList';
1456
1457      case TracingMarkerComponent:
1458        return 'TracingMarker';
vendor: 48,693 bytes, lines 1459-2868
1459      // The display name for this tags come from the user-provided type:
1460
1461      case ClassComponent:
1462      case FunctionComponent:
1463      case IncompleteClassComponent:
1464      case IndeterminateComponent:
1465      case MemoComponent:
1466      case SimpleMemoComponent:
1467        if (typeof type === 'function') {
1468          return type.displayName || type.name || null;
1469        }
1470
1471        if (typeof type === 'string') {
1472          return type;
1473        }
1474
1475        break;
1476
1477    }
1478
1479    return null;
1480  }
1481
1482  var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
1483  var current = null;
1484  var isRendering = false;
1485  function getCurrentFiberOwnerNameInDevOrNull() {
1486    {
1487      if (current === null) {
1488        return null;
1489      }
1490
1491      var owner = current._debugOwner;
1492
1493      if (owner !== null && typeof owner !== 'undefined') {
1494        return getComponentNameFromFiber(owner);
1495      }
1496    }
1497
1498    return null;
1499  }
1500
1501  function getCurrentFiberStackInDev() {
1502    {
1503      if (current === null) {
1504        return '';
1505      } // Safe because if current fiber exists, we are reconciling,
1506      // and it is guaranteed to be the work-in-progress version.
1507
1508
1509      return getStackByFiberInDevAndProd(current);
1510    }
1511  }
1512
1513  function resetCurrentFiber() {
1514    {
1515      ReactDebugCurrentFrame.getCurrentStack = null;
1516      current = null;
1517      isRendering = false;
1518    }
1519  }
1520  function setCurrentFiber(fiber) {
1521    {
1522      ReactDebugCurrentFrame.getCurrentStack = fiber === null ? null : getCurrentFiberStackInDev;
1523      current = fiber;
1524      isRendering = false;
1525    }
1526  }
1527  function getCurrentFiber() {
1528    {
1529      return current;
1530    }
1531  }
1532  function setIsRendering(rendering) {
1533    {
1534      isRendering = rendering;
1535    }
1536  }
1537
1538  // Flow does not allow string concatenation of most non-string types. To work
1539  // around this limitation, we use an opaque type that can only be obtained by
1540  // passing the value through getToStringValue first.
1541  function toString(value) {
1542    // The coercion safety check is performed in getToStringValue().
1543    // eslint-disable-next-line react-internal/safe-string-coercion
1544    return '' + value;
1545  }
1546  function getToStringValue(value) {
1547    switch (typeof value) {
1548      case 'boolean':
1549      case 'number':
1550      case 'string':
1551      case 'undefined':
1552        return value;
1553
1554      case 'object':
1555        {
1556          checkFormFieldValueStringCoercion(value);
1557        }
1558
1559        return value;
1560
1561      default:
1562        // function, symbol are assigned as empty strings
1563        return '';
1564    }
1565  }
1566
1567  var hasReadOnlyValue = {
1568    button: true,
1569    checkbox: true,
1570    image: true,
1571    hidden: true,
1572    radio: true,
1573    reset: true,
1574    submit: true
1575  };
1576  function checkControlledValueProps(tagName, props) {
1577    {
1578      if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) {
1579        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`.');
1580      }
1581
1582      if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) {
1583        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`.');
1584      }
1585    }
1586  }
1587
1588  function isCheckable(elem) {
1589    var type = elem.type;
1590    var nodeName = elem.nodeName;
1591    return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');
1592  }
1593
1594  function getTracker(node) {
1595    return node._valueTracker;
1596  }
1597
1598  function detachTracker(node) {
1599    node._valueTracker = null;
1600  }
1601
1602  function getValueFromNode(node) {
1603    var value = '';
1604
1605    if (!node) {
1606      return value;
1607    }
1608
1609    if (isCheckable(node)) {
1610      value = node.checked ? 'true' : 'false';
1611    } else {
1612      value = node.value;
1613    }
1614
1615    return value;
1616  }
1617
1618  function trackValueOnNode(node) {
1619    var valueField = isCheckable(node) ? 'checked' : 'value';
1620    var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
1621
1622    {
1623      checkFormFieldValueStringCoercion(node[valueField]);
1624    }
1625
1626    var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail
1627    // and don't track value will cause over reporting of changes,
1628    // but it's better then a hard failure
1629    // (needed for certain tests that spyOn input values and Safari)
1630
1631    if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
1632      return;
1633    }
1634
1635    var get = descriptor.get,
1636        set = descriptor.set;
1637    Object.defineProperty(node, valueField, {
1638      configurable: true,
1639      get: function () {
1640        return get.call(this);
1641      },
1642      set: function (value) {
1643        {
1644          checkFormFieldValueStringCoercion(value);
1645        }
1646
1647        currentValue = '' + value;
1648        set.call(this, value);
1649      }
1650    }); // We could've passed this the first time
1651    // but it triggers a bug in IE11 and Edge 14/15.
1652    // Calling defineProperty() again should be equivalent.
1653    // https://github.com/facebook/react/issues/11768
1654
1655    Object.defineProperty(node, valueField, {
1656      enumerable: descriptor.enumerable
1657    });
1658    var tracker = {
1659      getValue: function () {
1660        return currentValue;
1661      },
1662      setValue: function (value) {
1663        {
1664          checkFormFieldValueStringCoercion(value);
1665        }
1666
1667        currentValue = '' + value;
1668      },
1669      stopTracking: function () {
1670        detachTracker(node);
1671        delete node[valueField];
1672      }
1673    };
1674    return tracker;
1675  }
1676
1677  function track(node) {
1678    if (getTracker(node)) {
1679      return;
1680    } // TODO: Once it's just Fiber we can move this to node._wrapperState
1681
1682
1683    node._valueTracker = trackValueOnNode(node);
1684  }
1685  function updateValueIfChanged(node) {
1686    if (!node) {
1687      return false;
1688    }
1689
1690    var tracker = getTracker(node); // if there is no tracker at this point it's unlikely
1691    // that trying again will succeed
1692
1693    if (!tracker) {
1694      return true;
1695    }
1696
1697    var lastValue = tracker.getValue();
1698    var nextValue = getValueFromNode(node);
1699
1700    if (nextValue !== lastValue) {
1701      tracker.setValue(nextValue);
1702      return true;
1703    }
1704
1705    return false;
1706  }
1707
1708  function getActiveElement(doc) {
1709    doc = doc || (typeof document !== 'undefined' ? document : undefined);
1710
1711    if (typeof doc === 'undefined') {
1712      return null;
1713    }
1714
1715    try {
1716      return doc.activeElement || doc.body;
1717    } catch (e) {
1718      return doc.body;
1719    }
1720  }
1721
1722  var didWarnValueDefaultValue = false;
1723  var didWarnCheckedDefaultChecked = false;
1724  var didWarnControlledToUncontrolled = false;
1725  var didWarnUncontrolledToControlled = false;
1726
1727  function isControlled(props) {
1728    var usesChecked = props.type === 'checkbox' || props.type === 'radio';
1729    return usesChecked ? props.checked != null : props.value != null;
1730  }
1731  /**
1732   * Implements an <input> host component that allows setting these optional
1733   * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
1734   *
1735   * If `checked` or `value` are not supplied (or null/undefined), user actions
1736   * that affect the checked state or value will trigger updates to the element.
1737   *
1738   * If they are supplied (and not null/undefined), the rendered element will not
1739   * trigger updates to the element. Instead, the props must change in order for
1740   * the rendered element to be updated.
1741   *
1742   * The rendered element will be initialized as unchecked (or `defaultChecked`)
1743   * with an empty value (or `defaultValue`).
1744   *
1745   * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
1746   */
1747
1748
1749  function getHostProps(element, props) {
1750    var node = element;
1751    var checked = props.checked;
1752    var hostProps = assign({}, props, {
1753      defaultChecked: undefined,
1754      defaultValue: undefined,
1755      value: undefined,
1756      checked: checked != null ? checked : node._wrapperState.initialChecked
1757    });
1758    return hostProps;
1759  }
1760  function initWrapperState(element, props) {
1761    {
1762      checkControlledValueProps('input', props);
1763
1764      if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {
1765        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', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
1766
1767        didWarnCheckedDefaultChecked = true;
1768      }
1769
1770      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {
1771        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', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
1772
1773        didWarnValueDefaultValue = true;
1774      }
1775    }
1776
1777    var node = element;
1778    var defaultValue = props.defaultValue == null ? '' : props.defaultValue;
1779    node._wrapperState = {
1780      initialChecked: props.checked != null ? props.checked : props.defaultChecked,
1781      initialValue: getToStringValue(props.value != null ? props.value : defaultValue),
1782      controlled: isControlled(props)
1783    };
1784  }
1785  function updateChecked(element, props) {
1786    var node = element;
1787    var checked = props.checked;
1788
1789    if (checked != null) {
1790      setValueForProperty(node, 'checked', checked, false);
1791    }
1792  }
1793  function updateWrapper(element, props) {
1794    var node = element;
1795
1796    {
1797      var controlled = isControlled(props);
1798
1799      if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {
1800        error('A component is changing an uncontrolled input to be controlled. ' + 'This is likely caused by the value changing from undefined to ' + 'a defined value, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components');
1801
1802        didWarnUncontrolledToControlled = true;
1803      }
1804
1805      if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {
1806        error('A component is changing a controlled input to be uncontrolled. ' + 'This is likely caused by the value changing from a defined to ' + 'undefined, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components');
1807
1808        didWarnControlledToUncontrolled = true;
1809      }
1810    }
1811
1812    updateChecked(element, props);
1813    var value = getToStringValue(props.value);
1814    var type = props.type;
1815
1816    if (value != null) {
1817      if (type === 'number') {
1818        if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible.
1819        // eslint-disable-next-line
1820        node.value != value) {
1821          node.value = toString(value);
1822        }
1823      } else if (node.value !== toString(value)) {
1824        node.value = toString(value);
1825      }
1826    } else if (type === 'submit' || type === 'reset') {
1827      // Submit/reset inputs need the attribute removed completely to avoid
1828      // blank-text buttons.
1829      node.removeAttribute('value');
1830      return;
1831    }
1832
1833    {
1834      // When syncing the value attribute, the value comes from a cascade of
1835      // properties:
1836      //  1. The value React property
1837      //  2. The defaultValue React property
1838      //  3. Otherwise there should be no change
1839      if (props.hasOwnProperty('value')) {
1840        setDefaultValue(node, props.type, value);
1841      } else if (props.hasOwnProperty('defaultValue')) {
1842        setDefaultValue(node, props.type, getToStringValue(props.defaultValue));
1843      }
1844    }
1845
1846    {
1847      // When syncing the checked attribute, it only changes when it needs
1848      // to be removed, such as transitioning from a checkbox into a text input
1849      if (props.checked == null && props.defaultChecked != null) {
1850        node.defaultChecked = !!props.defaultChecked;
1851      }
1852    }
1853  }
1854  function postMountWrapper(element, props, isHydrating) {
1855    var node = element; // Do not assign value if it is already set. This prevents user text input
1856    // from being lost during SSR hydration.
1857
1858    if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {
1859      var type = props.type;
1860      var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the
1861      // default value provided by the browser. See: #12872
1862
1863      if (isButton && (props.value === undefined || props.value === null)) {
1864        return;
1865      }
1866
1867      var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input
1868      // from being lost during SSR hydration.
1869
1870      if (!isHydrating) {
1871        {
1872          // When syncing the value attribute, the value property should use
1873          // the wrapperState._initialValue property. This uses:
1874          //
1875          //   1. The value React property when present
1876          //   2. The defaultValue React property when present
1877          //   3. An empty string
1878          if (initialValue !== node.value) {
1879            node.value = initialValue;
1880          }
1881        }
1882      }
1883
1884      {
1885        // Otherwise, the value attribute is synchronized to the property,
1886        // so we assign defaultValue to the same thing as the value property
1887        // assignment step above.
1888        node.defaultValue = initialValue;
1889      }
1890    } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug
1891    // this is needed to work around a chrome bug where setting defaultChecked
1892    // will sometimes influence the value of checked (even after detachment).
1893    // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416
1894    // We need to temporarily unset name to avoid disrupting radio button groups.
1895
1896
1897    var name = node.name;
1898
1899    if (name !== '') {
1900      node.name = '';
1901    }
1902
1903    {
1904      // When syncing the checked attribute, both the checked property and
1905      // attribute are assigned at the same time using defaultChecked. This uses:
1906      //
1907      //   1. The checked React property when present
1908      //   2. The defaultChecked React property when present
1909      //   3. Otherwise, false
1910      node.defaultChecked = !node.defaultChecked;
1911      node.defaultChecked = !!node._wrapperState.initialChecked;
1912    }
1913
1914    if (name !== '') {
1915      node.name = name;
1916    }
1917  }
1918  function restoreControlledState(element, props) {
1919    var node = element;
1920    updateWrapper(node, props);
1921    updateNamedCousins(node, props);
1922  }
1923
1924  function updateNamedCousins(rootNode, props) {
1925    var name = props.name;
1926
1927    if (props.type === 'radio' && name != null) {
1928      var queryRoot = rootNode;
1929
1930      while (queryRoot.parentNode) {
1931        queryRoot = queryRoot.parentNode;
1932      } // If `rootNode.form` was non-null, then we could try `form.elements`,
1933      // but that sometimes behaves strangely in IE8. We could also try using
1934      // `form.getElementsByName`, but that will only return direct children
1935      // and won't include inputs that use the HTML5 `form=` attribute. Since
1936      // the input might not even be in a form. It might not even be in the
1937      // document. Let's just use the local `querySelectorAll` to ensure we don't
1938      // miss anything.
1939
1940
1941      {
1942        checkAttributeStringCoercion(name, 'name');
1943      }
1944
1945      var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
1946
1947      for (var i = 0; i < group.length; i++) {
1948        var otherNode = group[i];
1949
1950        if (otherNode === rootNode || otherNode.form !== rootNode.form) {
1951          continue;
1952        } // This will throw if radio buttons rendered by different copies of React
1953        // and the same name are rendered into the same form (same as #1939).
1954        // That's probably okay; we don't support it just as we don't support
1955        // mixing React radio buttons with non-React ones.
1956
1957
1958        var otherProps = getFiberCurrentPropsFromNode(otherNode);
1959
1960        if (!otherProps) {
1961          throw new Error('ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.');
1962        } // We need update the tracked value on the named cousin since the value
1963        // was changed but the input saw no event or value set
1964
1965
1966        updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that
1967        // was previously checked to update will cause it to be come re-checked
1968        // as appropriate.
1969
1970        updateWrapper(otherNode, otherProps);
1971      }
1972    }
1973  } // In Chrome, assigning defaultValue to certain input types triggers input validation.
1974  // For number inputs, the display value loses trailing decimal points. For email inputs,
1975  // Chrome raises "The specified value <x> is not a valid email address".
1976  //
1977  // Here we check to see if the defaultValue has actually changed, avoiding these problems
1978  // when the user is inputting text
1979  //
1980  // https://github.com/facebook/react/issues/7253
1981
1982
1983  function setDefaultValue(node, type, value) {
1984    if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js
1985    type !== 'number' || getActiveElement(node.ownerDocument) !== node) {
1986      if (value == null) {
1987        node.defaultValue = toString(node._wrapperState.initialValue);
1988      } else if (node.defaultValue !== toString(value)) {
1989        node.defaultValue = toString(value);
1990      }
1991    }
1992  }
1993
1994  var didWarnSelectedSetOnOption = false;
1995  var didWarnInvalidChild = false;
1996  var didWarnInvalidInnerHTML = false;
1997  /**
1998   * Implements an <option> host component that warns when `selected` is set.
1999   */
2000
2001  function validateProps(element, props) {
2002    {
2003      // If a value is not provided, then the children must be simple.
2004      if (props.value == null) {
2005        if (typeof props.children === 'object' && props.children !== null) {
2006          React.Children.forEach(props.children, function (child) {
2007            if (child == null) {
2008              return;
2009            }
2010
2011            if (typeof child === 'string' || typeof child === 'number') {
2012              return;
2013            }
2014
2015            if (!didWarnInvalidChild) {
2016              didWarnInvalidChild = true;
2017
2018              error('Cannot infer the option value of complex children. ' + 'Pass a `value` prop or use a plain string as children to <option>.');
2019            }
2020          });
2021        } else if (props.dangerouslySetInnerHTML != null) {
2022          if (!didWarnInvalidInnerHTML) {
2023            didWarnInvalidInnerHTML = true;
2024
2025            error('Pass a `value` prop if you set dangerouslyInnerHTML so React knows ' + 'which value should be selected.');
2026          }
2027        }
2028      } // TODO: Remove support for `selected` in <option>.
2029
2030
2031      if (props.selected != null && !didWarnSelectedSetOnOption) {
2032        error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');
2033
2034        didWarnSelectedSetOnOption = true;
2035      }
2036    }
2037  }
2038  function postMountWrapper$1(element, props) {
2039    // value="" should make a value attribute (#6219)
2040    if (props.value != null) {
2041      element.setAttribute('value', toString(getToStringValue(props.value)));
2042    }
2043  }
2044
2045  var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare
2046
2047  function isArray(a) {
2048    return isArrayImpl(a);
2049  }
2050
2051  var didWarnValueDefaultValue$1;
2052
2053  {
2054    didWarnValueDefaultValue$1 = false;
2055  }
2056
2057  function getDeclarationErrorAddendum() {
2058    var ownerName = getCurrentFiberOwnerNameInDevOrNull();
2059
2060    if (ownerName) {
2061      return '\n\nCheck the render method of `' + ownerName + '`.';
2062    }
2063
2064    return '';
2065  }
2066
2067  var valuePropNames = ['value', 'defaultValue'];
2068  /**
2069   * Validation function for `value` and `defaultValue`.
2070   */
2071
2072  function checkSelectPropTypes(props) {
2073    {
2074      checkControlledValueProps('select', props);
2075
2076      for (var i = 0; i < valuePropNames.length; i++) {
2077        var propName = valuePropNames[i];
2078
2079        if (props[propName] == null) {
2080          continue;
2081        }
2082
2083        var propNameIsArray = isArray(props[propName]);
2084
2085        if (props.multiple && !propNameIsArray) {
2086          error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());
2087        } else if (!props.multiple && propNameIsArray) {
2088          error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());
2089        }
2090      }
2091    }
2092  }
2093
2094  function updateOptions(node, multiple, propValue, setDefaultSelected) {
2095    var options = node.options;
2096
2097    if (multiple) {
2098      var selectedValues = propValue;
2099      var selectedValue = {};
2100
2101      for (var i = 0; i < selectedValues.length; i++) {
2102        // Prefix to avoid chaos with special keys.
2103        selectedValue['$' + selectedValues[i]] = true;
2104      }
2105
2106      for (var _i = 0; _i < options.length; _i++) {
2107        var selected = selectedValue.hasOwnProperty('$' + options[_i].value);
2108
2109        if (options[_i].selected !== selected) {
2110          options[_i].selected = selected;
2111        }
2112
2113        if (selected && setDefaultSelected) {
2114          options[_i].defaultSelected = true;
2115        }
2116      }
2117    } else {
2118      // Do not set `select.value` as exact behavior isn't consistent across all
2119      // browsers for all cases.
2120      var _selectedValue = toString(getToStringValue(propValue));
2121
2122      var defaultSelected = null;
2123
2124      for (var _i2 = 0; _i2 < options.length; _i2++) {
2125        if (options[_i2].value === _selectedValue) {
2126          options[_i2].selected = true;
2127
2128          if (setDefaultSelected) {
2129            options[_i2].defaultSelected = true;
2130          }
2131
2132          return;
2133        }
2134
2135        if (defaultSelected === null && !options[_i2].disabled) {
2136          defaultSelected = options[_i2];
2137        }
2138      }
2139
2140      if (defaultSelected !== null) {
2141        defaultSelected.selected = true;
2142      }
2143    }
2144  }
2145  /**
2146   * Implements a <select> host component that allows optionally setting the
2147   * props `value` and `defaultValue`. If `multiple` is false, the prop must be a
2148   * stringable. If `multiple` is true, the prop must be an array of stringables.
2149   *
2150   * If `value` is not supplied (or null/undefined), user actions that change the
2151   * selected option will trigger updates to the rendered options.
2152   *
2153   * If it is supplied (and not null/undefined), the rendered options will not
2154   * update in response to user actions. Instead, the `value` prop must change in
2155   * order for the rendered options to update.
2156   *
2157   * If `defaultValue` is provided, any options with the supplied values will be
2158   * selected.
2159   */
2160
2161
2162  function getHostProps$1(element, props) {
2163    return assign({}, props, {
2164      value: undefined
2165    });
2166  }
2167  function initWrapperState$1(element, props) {
2168    var node = element;
2169
2170    {
2171      checkSelectPropTypes(props);
2172    }
2173
2174    node._wrapperState = {
2175      wasMultiple: !!props.multiple
2176    };
2177
2178    {
2179      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {
2180        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');
2181
2182        didWarnValueDefaultValue$1 = true;
2183      }
2184    }
2185  }
2186  function postMountWrapper$2(element, props) {
2187    var node = element;
2188    node.multiple = !!props.multiple;
2189    var value = props.value;
2190
2191    if (value != null) {
2192      updateOptions(node, !!props.multiple, value, false);
2193    } else if (props.defaultValue != null) {
2194      updateOptions(node, !!props.multiple, props.defaultValue, true);
2195    }
2196  }
2197  function postUpdateWrapper(element, props) {
2198    var node = element;
2199    var wasMultiple = node._wrapperState.wasMultiple;
2200    node._wrapperState.wasMultiple = !!props.multiple;
2201    var value = props.value;
2202
2203    if (value != null) {
2204      updateOptions(node, !!props.multiple, value, false);
2205    } else if (wasMultiple !== !!props.multiple) {
2206      // For simplicity, reapply `defaultValue` if `multiple` is toggled.
2207      if (props.defaultValue != null) {
2208        updateOptions(node, !!props.multiple, props.defaultValue, true);
2209      } else {
2210        // Revert the select back to its default unselected state.
2211        updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);
2212      }
2213    }
2214  }
2215  function restoreControlledState$1(element, props) {
2216    var node = element;
2217    var value = props.value;
2218
2219    if (value != null) {
2220      updateOptions(node, !!props.multiple, value, false);
2221    }
2222  }
2223
2224  var didWarnValDefaultVal = false;
2225
2226  /**
2227   * Implements a <textarea> host component that allows setting `value`, and
2228   * `defaultValue`. This differs from the traditional DOM API because value is
2229   * usually set as PCDATA children.
2230   *
2231   * If `value` is not supplied (or null/undefined), user actions that affect the
2232   * value will trigger updates to the element.
2233   *
2234   * If `value` is supplied (and not null/undefined), the rendered element will
2235   * not trigger updates to the element. Instead, the `value` prop must change in
2236   * order for the rendered element to be updated.
2237   *
2238   * The rendered element will be initialized with an empty value, the prop
2239   * `defaultValue` if specified, or the children content (deprecated).
2240   */
2241  function getHostProps$2(element, props) {
2242    var node = element;
2243
2244    if (props.dangerouslySetInnerHTML != null) {
2245      throw new Error('`dangerouslySetInnerHTML` does not make sense on <textarea>.');
2246    } // Always set children to the same thing. In IE9, the selection range will
2247    // get reset if `textContent` is mutated.  We could add a check in setTextContent
2248    // to only set the value if/when the value differs from the node value (which would
2249    // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this
2250    // solution. The value can be a boolean or object so that's why it's forced
2251    // to be a string.
2252
2253
2254    var hostProps = assign({}, props, {
2255      value: undefined,
2256      defaultValue: undefined,
2257      children: toString(node._wrapperState.initialValue)
2258    });
2259
2260    return hostProps;
2261  }
2262  function initWrapperState$2(element, props) {
2263    var node = element;
2264
2265    {
2266      checkControlledValueProps('textarea', props);
2267
2268      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {
2269        error('%s contains a textarea with both value and defaultValue props. ' + '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', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
2270
2271        didWarnValDefaultVal = true;
2272      }
2273    }
2274
2275    var initialValue = props.value; // Only bother fetching default value if we're going to use it
2276
2277    if (initialValue == null) {
2278      var children = props.children,
2279          defaultValue = props.defaultValue;
2280
2281      if (children != null) {
2282        {
2283          error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');
2284        }
2285
2286        {
2287          if (defaultValue != null) {
2288            throw new Error('If you supply `defaultValue` on a <textarea>, do not pass children.');
2289          }
2290
2291          if (isArray(children)) {
2292            if (children.length > 1) {
2293              throw new Error('<textarea> can only have at most one child.');
2294            }
2295
2296            children = children[0];
2297          }
2298
2299          defaultValue = children;
2300        }
2301      }
2302
2303      if (defaultValue == null) {
2304        defaultValue = '';
2305      }
2306
2307      initialValue = defaultValue;
2308    }
2309
2310    node._wrapperState = {
2311      initialValue: getToStringValue(initialValue)
2312    };
2313  }
2314  function updateWrapper$1(element, props) {
2315    var node = element;
2316    var value = getToStringValue(props.value);
2317    var defaultValue = getToStringValue(props.defaultValue);
2318
2319    if (value != null) {
2320      // Cast `value` to a string to ensure the value is set correctly. While
2321      // browsers typically do this as necessary, jsdom doesn't.
2322      var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed
2323
2324      if (newValue !== node.value) {
2325        node.value = newValue;
2326      }
2327
2328      if (props.defaultValue == null && node.defaultValue !== newValue) {
2329        node.defaultValue = newValue;
2330      }
2331    }
2332
2333    if (defaultValue != null) {
2334      node.defaultValue = toString(defaultValue);
2335    }
2336  }
2337  function postMountWrapper$3(element, props) {
2338    var node = element; // This is in postMount because we need access to the DOM node, which is not
2339    // available until after the component has mounted.
2340
2341    var textContent = node.textContent; // Only set node.value if textContent is equal to the expected
2342    // initial value. In IE10/IE11 there is a bug where the placeholder attribute
2343    // will populate textContent as well.
2344    // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/
2345
2346    if (textContent === node._wrapperState.initialValue) {
2347      if (textContent !== '' && textContent !== null) {
2348        node.value = textContent;
2349      }
2350    }
2351  }
2352  function restoreControlledState$2(element, props) {
2353    // DOM component is still mounted; update
2354    updateWrapper$1(element, props);
2355  }
2356
2357  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
2358  var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
2359  var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; // Assumes there is no parent namespace.
2360
2361  function getIntrinsicNamespace(type) {
2362    switch (type) {
2363      case 'svg':
2364        return SVG_NAMESPACE;
2365
2366      case 'math':
2367        return MATH_NAMESPACE;
2368
2369      default:
2370        return HTML_NAMESPACE;
2371    }
2372  }
2373  function getChildNamespace(parentNamespace, type) {
2374    if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {
2375      // No (or default) parent namespace: potential entry point.
2376      return getIntrinsicNamespace(type);
2377    }
2378
2379    if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {
2380      // We're leaving SVG.
2381      return HTML_NAMESPACE;
2382    } // By default, pass namespace below.
2383
2384
2385    return parentNamespace;
2386  }
2387
2388  /* globals MSApp */
2389
2390  /**
2391   * Create a function which has 'unsafe' privileges (required by windows8 apps)
2392   */
2393  var createMicrosoftUnsafeLocalFunction = function (func) {
2394    if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {
2395      return function (arg0, arg1, arg2, arg3) {
2396        MSApp.execUnsafeLocalFunction(function () {
2397          return func(arg0, arg1, arg2, arg3);
2398        });
2399      };
2400    } else {
2401      return func;
2402    }
2403  };
2404
2405  var reusableSVGContainer;
2406  /**
2407   * Set the innerHTML property of a node
2408   *
2409   * @param {DOMElement} node
2410   * @param {string} html
2411   * @internal
2412   */
2413
2414  var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {
2415    if (node.namespaceURI === SVG_NAMESPACE) {
2416
2417      if (!('innerHTML' in node)) {
2418        // IE does not have innerHTML for SVG nodes, so instead we inject the
2419        // new markup in a temp node and then move the child nodes across into
2420        // the target node
2421        reusableSVGContainer = reusableSVGContainer || document.createElement('div');
2422        reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>';
2423        var svgNode = reusableSVGContainer.firstChild;
2424
2425        while (node.firstChild) {
2426          node.removeChild(node.firstChild);
2427        }
2428
2429        while (svgNode.firstChild) {
2430          node.appendChild(svgNode.firstChild);
2431        }
2432
2433        return;
2434      }
2435    }
2436
2437    node.innerHTML = html;
2438  });
2439
2440  /**
2441   * HTML nodeType values that represent the type of the node
2442   */
2443  var ELEMENT_NODE = 1;
2444  var TEXT_NODE = 3;
2445  var COMMENT_NODE = 8;
2446  var DOCUMENT_NODE = 9;
2447  var DOCUMENT_FRAGMENT_NODE = 11;
2448
2449  /**
2450   * Set the textContent property of a node. For text updates, it's faster
2451   * to set the `nodeValue` of the Text node directly instead of using
2452   * `.textContent` which will remove the existing node and create a new one.
2453   *
2454   * @param {DOMElement} node
2455   * @param {string} text
2456   * @internal
2457   */
2458
2459  var setTextContent = function (node, text) {
2460    if (text) {
2461      var firstChild = node.firstChild;
2462
2463      if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {
2464        firstChild.nodeValue = text;
2465        return;
2466      }
2467    }
2468
2469    node.textContent = text;
2470  };
2471
2472  // List derived from Gecko source code:
2473  // https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js
2474  var shorthandToLonghand = {
2475    animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'],
2476    background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'],
2477    backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'],
2478    border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'],
2479    borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'],
2480    borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'],
2481    borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'],
2482    borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'],
2483    borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'],
2484    borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'],
2485    borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'],
2486    borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'],
2487    borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'],
2488    borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'],
2489    borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'],
2490    borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'],
2491    borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'],
2492    columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'],
2493    columns: ['columnCount', 'columnWidth'],
2494    flex: ['flexBasis', 'flexGrow', 'flexShrink'],
2495    flexFlow: ['flexDirection', 'flexWrap'],
2496    font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'],
2497    fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'],
2498    gap: ['columnGap', 'rowGap'],
2499    grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
2500    gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'],
2501    gridColumn: ['gridColumnEnd', 'gridColumnStart'],
2502    gridColumnGap: ['columnGap'],
2503    gridGap: ['columnGap', 'rowGap'],
2504    gridRow: ['gridRowEnd', 'gridRowStart'],
2505    gridRowGap: ['rowGap'],
2506    gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
2507    listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'],
2508    margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'],
2509    marker: ['markerEnd', 'markerMid', 'markerStart'],
2510    mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'],
2511    maskPosition: ['maskPositionX', 'maskPositionY'],
2512    outline: ['outlineColor', 'outlineStyle', 'outlineWidth'],
2513    overflow: ['overflowX', 'overflowY'],
2514    padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'],
2515    placeContent: ['alignContent', 'justifyContent'],
2516    placeItems: ['alignItems', 'justifyItems'],
2517    placeSelf: ['alignSelf', 'justifySelf'],
2518    textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'],
2519    textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'],
2520    transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'],
2521    wordWrap: ['overflowWrap']
2522  };
2523
2524  /**
2525   * CSS properties which accept numbers but are not in units of "px".
2526   */
2527  var isUnitlessNumber = {
2528    animationIterationCount: true,
2529    aspectRatio: true,
2530    borderImageOutset: true,
2531    borderImageSlice: true,
2532    borderImageWidth: true,
2533    boxFlex: true,
2534    boxFlexGroup: true,
2535    boxOrdinalGroup: true,
2536    columnCount: true,
2537    columns: true,
2538    flex: true,
2539    flexGrow: true,
2540    flexPositive: true,
2541    flexShrink: true,
2542    flexNegative: true,
2543    flexOrder: true,
2544    gridArea: true,
2545    gridRow: true,
2546    gridRowEnd: true,
2547    gridRowSpan: true,
2548    gridRowStart: true,
2549    gridColumn: true,
2550    gridColumnEnd: true,
2551    gridColumnSpan: true,
2552    gridColumnStart: true,
2553    fontWeight: true,
2554    lineClamp: true,
2555    lineHeight: true,
2556    opacity: true,
2557    order: true,
2558    orphans: true,
2559    tabSize: true,
2560    widows: true,
2561    zIndex: true,
2562    zoom: true,
2563    // SVG-related properties
2564    fillOpacity: true,
2565    floodOpacity: true,
2566    stopOpacity: true,
2567    strokeDasharray: true,
2568    strokeDashoffset: true,
2569    strokeMiterlimit: true,
2570    strokeOpacity: true,
2571    strokeWidth: true
2572  };
2573  /**
2574   * @param {string} prefix vendor-specific prefix, eg: Webkit
2575   * @param {string} key style name, eg: transitionDuration
2576   * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
2577   * WebkitTransitionDuration
2578   */
2579
2580  function prefixKey(prefix, key) {
2581    return prefix + key.charAt(0).toUpperCase() + key.substring(1);
2582  }
2583  /**
2584   * Support style names that may come passed in prefixed by adding permutations
2585   * of vendor prefixes.
2586   */
2587
2588
2589  var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
2590  // infinite loop, because it iterates over the newly added props too.
2591
2592  Object.keys(isUnitlessNumber).forEach(function (prop) {
2593    prefixes.forEach(function (prefix) {
2594      isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
2595    });
2596  });
2597
2598  /**
2599   * Convert a value into the proper css writable value. The style name `name`
2600   * should be logical (no hyphens), as specified
2601   * in `CSSProperty.isUnitlessNumber`.
2602   *
2603   * @param {string} name CSS property name such as `topMargin`.
2604   * @param {*} value CSS property value such as `10px`.
2605   * @return {string} Normalized style value with dimensions applied.
2606   */
2607
2608  function dangerousStyleValue(name, value, isCustomProperty) {
2609    // Note that we've removed escapeTextForBrowser() calls here since the
2610    // whole string will be escaped when the attribute is injected into
2611    // the markup. If you provide unsafe user data here they can inject
2612    // arbitrary CSS which may be problematic (I couldn't repro this):
2613    // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
2614    // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
2615    // This is not an XSS hole but instead a potential CSS injection issue
2616    // which has lead to a greater discussion about how we're going to
2617    // trust URLs moving forward. See #2115901
2618    var isEmpty = value == null || typeof value === 'boolean' || value === '';
2619
2620    if (isEmpty) {
2621      return '';
2622    }
2623
2624    if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {
2625      return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers
2626    }
2627
2628    {
2629      checkCSSPropertyStringCoercion(value, name);
2630    }
2631
2632    return ('' + value).trim();
2633  }
2634
2635  var uppercasePattern = /([A-Z])/g;
2636  var msPattern = /^ms-/;
2637  /**
2638   * Hyphenates a camelcased CSS property name, for example:
2639   *
2640   *   > hyphenateStyleName('backgroundColor')
2641   *   < "background-color"
2642   *   > hyphenateStyleName('MozTransition')
2643   *   < "-moz-transition"
2644   *   > hyphenateStyleName('msTransition')
2645   *   < "-ms-transition"
2646   *
2647   * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
2648   * is converted to `-ms-`.
2649   */
2650
2651  function hyphenateStyleName(name) {
2652    return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');
2653  }
2654
2655  var warnValidStyle = function () {};
2656
2657  {
2658    // 'msTransform' is correct, but the other prefixes should be capitalized
2659    var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
2660    var msPattern$1 = /^-ms-/;
2661    var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon
2662
2663    var badStyleValueWithSemicolonPattern = /;\s*$/;
2664    var warnedStyleNames = {};
2665    var warnedStyleValues = {};
2666    var warnedForNaNValue = false;
2667    var warnedForInfinityValue = false;
2668
2669    var camelize = function (string) {
2670      return string.replace(hyphenPattern, function (_, character) {
2671        return character.toUpperCase();
2672      });
2673    };
2674
2675    var warnHyphenatedStyleName = function (name) {
2676      if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
2677        return;
2678      }
2679
2680      warnedStyleNames[name] = true;
2681
2682      error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests
2683      // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
2684      // is converted to lowercase `ms`.
2685      camelize(name.replace(msPattern$1, 'ms-')));
2686    };
2687
2688    var warnBadVendoredStyleName = function (name) {
2689      if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
2690        return;
2691      }
2692
2693      warnedStyleNames[name] = true;
2694
2695      error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));
2696    };
2697
2698    var warnStyleValueWithSemicolon = function (name, value) {
2699      if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
2700        return;
2701      }
2702
2703      warnedStyleValues[value] = true;
2704
2705      error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));
2706    };
2707
2708    var warnStyleValueIsNaN = function (name, value) {
2709      if (warnedForNaNValue) {
2710        return;
2711      }
2712
2713      warnedForNaNValue = true;
2714
2715      error('`NaN` is an invalid value for the `%s` css style property.', name);
2716    };
2717
2718    var warnStyleValueIsInfinity = function (name, value) {
2719      if (warnedForInfinityValue) {
2720        return;
2721      }
2722
2723      warnedForInfinityValue = true;
2724
2725      error('`Infinity` is an invalid value for the `%s` css style property.', name);
2726    };
2727
2728    warnValidStyle = function (name, value) {
2729      if (name.indexOf('-') > -1) {
2730        warnHyphenatedStyleName(name);
2731      } else if (badVendoredStyleNamePattern.test(name)) {
2732        warnBadVendoredStyleName(name);
2733      } else if (badStyleValueWithSemicolonPattern.test(value)) {
2734        warnStyleValueWithSemicolon(name, value);
2735      }
2736
2737      if (typeof value === 'number') {
2738        if (isNaN(value)) {
2739          warnStyleValueIsNaN(name, value);
2740        } else if (!isFinite(value)) {
2741          warnStyleValueIsInfinity(name, value);
2742        }
2743      }
2744    };
2745  }
2746
2747  var warnValidStyle$1 = warnValidStyle;
2748
2749  /**
2750   * Operations for dealing with CSS properties.
2751   */
2752
2753  /**
2754   * This creates a string that is expected to be equivalent to the style
2755   * attribute generated by server-side rendering. It by-passes warnings and
2756   * security checks so it's not safe to use this value for anything other than
2757   * comparison. It is only used in DEV for SSR validation.
2758   */
2759
2760  function createDangerousStringForStyles(styles) {
2761    {
2762      var serialized = '';
2763      var delimiter = '';
2764
2765      for (var styleName in styles) {
2766        if (!styles.hasOwnProperty(styleName)) {
2767          continue;
2768        }
2769
2770        var styleValue = styles[styleName];
2771
2772        if (styleValue != null) {
2773          var isCustomProperty = styleName.indexOf('--') === 0;
2774          serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':';
2775          serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);
2776          delimiter = ';';
2777        }
2778      }
2779
2780      return serialized || null;
2781    }
2782  }
2783  /**
2784   * Sets the value for multiple styles on a node.  If a value is specified as
2785   * '' (empty string), the corresponding style property will be unset.
2786   *
2787   * @param {DOMElement} node
2788   * @param {object} styles
2789   */
2790
2791  function setValueForStyles(node, styles) {
2792    var style = node.style;
2793
2794    for (var styleName in styles) {
2795      if (!styles.hasOwnProperty(styleName)) {
2796        continue;
2797      }
2798
2799      var isCustomProperty = styleName.indexOf('--') === 0;
2800
2801      {
2802        if (!isCustomProperty) {
2803          warnValidStyle$1(styleName, styles[styleName]);
2804        }
2805      }
2806
2807      var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);
2808
2809      if (styleName === 'float') {
2810        styleName = 'cssFloat';
2811      }
2812
2813      if (isCustomProperty) {
2814        style.setProperty(styleName, styleValue);
2815      } else {
2816        style[styleName] = styleValue;
2817      }
2818    }
2819  }
2820
2821  function isValueEmpty(value) {
2822    return value == null || typeof value === 'boolean' || value === '';
2823  }
2824  /**
2825   * Given {color: 'red', overflow: 'hidden'} returns {
2826   *   color: 'color',
2827   *   overflowX: 'overflow',
2828   *   overflowY: 'overflow',
2829   * }. This can be read as "the overflowY property was set by the overflow
2830   * shorthand". That is, the values are the property that each was derived from.
2831   */
2832
2833
2834  function expandShorthandMap(styles) {
2835    var expanded = {};
2836
2837    for (var key in styles) {
2838      var longhands = shorthandToLonghand[key] || [key];
2839
2840      for (var i = 0; i < longhands.length; i++) {
2841        expanded[longhands[i]] = key;
2842      }
2843    }
2844
2845    return expanded;
2846  }
2847  /**
2848   * When mixing shorthand and longhand property names, we warn during updates if
2849   * we expect an incorrect result to occur. In particular, we warn for:
2850   *
2851   * Updating a shorthand property (longhand gets overwritten):
2852   *   {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'}
2853   *   becomes .style.font = 'baz'
2854   * Removing a shorthand property (longhand gets lost too):
2855   *   {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'}
2856   *   becomes .style.font = ''
2857   * Removing a longhand property (should revert to shorthand; doesn't):
2858   *   {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'}
2859   *   becomes .style.fontVariant = ''
2860   */
2861
2862
2863  function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {
2864    {
2865      if (!nextStyles) {
2866        return;
2867      }
2868
2869      var expandedUpdates = expandShorthandMap(styleUpdates);
2870      var expandedStyles = expandShorthandMap(nextStyles);
2871      var warnedAbout = {};
2872
2873      for (var key in expandedUpdates) {
2874        var originalKey = expandedUpdates[key];
2875        var correctOriginalKey = expandedStyles[key];
2876
2877        if (correctOriginalKey && originalKey !== correctOriginalKey) {
2878          var warningKey = originalKey + ',' + correctOriginalKey;
2879
2880          if (warnedAbout[warningKey]) {
2881            continue;
2882          }
2883
2884          warnedAbout[warningKey] = true;
2885
2886          error('%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + "avoid this, don't mix shorthand and non-shorthand properties " + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey);
2887        }
2888      }
2889    }
2890  }
2891
2892  // For HTML, certain tags should omit their close tag. We keep a list for
2893  // those special-case tags.
2894  var omittedCloseTags = {
2895    area: true,
2896    base: true,
2897    br: true,
2898    col: true,
2899    embed: true,
2900    hr: true,
2901    img: true,
2902    input: true,
2903    keygen: true,
2904    link: true,
2905    meta: true,
2906    param: true,
2907    source: true,
2908    track: true,
2909    wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems.
2910
2911  };
2912
2913  // `omittedCloseTags` except that `menuitem` should still have its closing tag.
2914
2915  var voidElementTags = assign({
2916    menuitem: true
2917  }, omittedCloseTags);
2918
2919  var HTML = '__html';
2920
2921  function assertValidProps(tag, props) {
2922    if (!props) {
2923      return;
2924    } // Note the use of `==` which checks for null or undefined.
2925
2926
2927    if (voidElementTags[tag]) {
2928      if (props.children != null || props.dangerouslySetInnerHTML != null) {
2929        throw new Error(tag + " is a void element tag and must neither have `children` nor " + 'use `dangerouslySetInnerHTML`.');
2930      }
2931    }
2932
2933    if (props.dangerouslySetInnerHTML != null) {
2934      if (props.children != null) {
2935        throw new Error('Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
2936      }
2937
2938      if (typeof props.dangerouslySetInnerHTML !== 'object' || !(HTML in props.dangerouslySetInnerHTML)) {
2939        throw new Error('`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://reactjs.org/link/dangerously-set-inner-html ' + 'for more information.');
2940      }
2941    }
2942
2943    {
2944      if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {
2945        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.');
2946      }
2947    }
2948
2949    if (props.style != null && typeof props.style !== 'object') {
2950      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.');
2951    }
2952  }
2953
2954  function isCustomComponent(tagName, props) {
2955    if (tagName.indexOf('-') === -1) {
2956      return typeof props.is === 'string';
2957    }
2958
2959    switch (tagName) {
2960      // These are reserved SVG and MathML elements.
2961      // We don't mind this list too much because we expect it to never grow.
2962      // The alternative is to track the namespace in a few places which is convoluted.
2963      // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
2964      case 'annotation-xml':
2965      case 'color-profile':
2966      case 'font-face':
2967      case 'font-face-src':
2968      case 'font-face-uri':
2969      case 'font-face-format':
2970      case 'font-face-name':
2971      case 'missing-glyph':
2972        return false;
2973
2974      default:
2975        return true;
2976    }
2977  }
2978
2979  // When adding attributes to the HTML or SVG allowed attribute list, be sure to
2980  // also add them to this module to ensure casing and incorrect name
2981  // warnings.
2982  var possibleStandardNames = {
2983    // HTML
2984    accept: 'accept',
2985    acceptcharset: 'acceptCharset',
2986    'accept-charset': 'acceptCharset',
2987    accesskey: 'accessKey',
2988    action: 'action',
2989    allowfullscreen: 'allowFullScreen',
2990    alt: 'alt',
2991    as: 'as',
2992    async: 'async',
2993    autocapitalize: 'autoCapitalize',
2994    autocomplete: 'autoComplete',
2995    autocorrect: 'autoCorrect',
2996    autofocus: 'autoFocus',
2997    autoplay: 'autoPlay',
2998    autosave: 'autoSave',
2999    capture: 'capture',
3000    cellpadding: 'cellPadding',
3001    cellspacing: 'cellSpacing',
3002    challenge: 'challenge',
3003    charset: 'charSet',
3004    checked: 'checked',
3005    children: 'children',
3006    cite: 'cite',
3007    class: 'className',
3008    classid: 'classID',
3009    classname: 'className',
3010    cols: 'cols',
3011    colspan: 'colSpan',
3012    content: 'content',
3013    contenteditable: 'contentEditable',
3014    contextmenu: 'contextMenu',
3015    controls: 'controls',
3016    controlslist: 'controlsList',
3017    coords: 'coords',
3018    crossorigin: 'crossOrigin',
3019    dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',
3020    data: 'data',
3021    datetime: 'dateTime',
3022    default: 'default',
3023    defaultchecked: 'defaultChecked',
3024    defaultvalue: 'defaultValue',
3025    defer: 'defer',
3026    dir: 'dir',
3027    disabled: 'disabled',
3028    disablepictureinpicture: 'disablePictureInPicture',
3029    disableremoteplayback: 'disableRemotePlayback',
3030    download: 'download',
3031    draggable: 'draggable',
3032    enctype: 'encType',
3033    enterkeyhint: 'enterKeyHint',
3034    for: 'htmlFor',
3035    form: 'form',
3036    formmethod: 'formMethod',
3037    formaction: 'formAction',
3038    formenctype: 'formEncType',
3039    formnovalidate: 'formNoValidate',
3040    formtarget: 'formTarget',
3041    frameborder: 'frameBorder',
3042    headers: 'headers',
3043    height: 'height',
3044    hidden: 'hidden',
3045    high: 'high',
3046    href: 'href',
3047    hreflang: 'hrefLang',
3048    htmlfor: 'htmlFor',
3049    httpequiv: 'httpEquiv',
3050    'http-equiv': 'httpEquiv',
3051    icon: 'icon',
3052    id: 'id',
3053    imagesizes: 'imageSizes',
3054    imagesrcset: 'imageSrcSet',
3055    innerhtml: 'innerHTML',
3056    inputmode: 'inputMode',
3057    integrity: 'integrity',
3058    is: 'is',
3059    itemid: 'itemID',
3060    itemprop: 'itemProp',
3061    itemref: 'itemRef',
3062    itemscope: 'itemScope',
3063    itemtype: 'itemType',
3064    keyparams: 'keyParams',
3065    keytype: 'keyType',
3066    kind: 'kind',
3067    label: 'label',
3068    lang: 'lang',
3069    list: 'list',
3070    loop: 'loop',
3071    low: 'low',
3072    manifest: 'manifest',
3073    marginwidth: 'marginWidth',
3074    marginheight: 'marginHeight',
3075    max: 'max',
3076    maxlength: 'maxLength',
3077    media: 'media',
3078    mediagroup: 'mediaGroup',
3079    method: 'method',
3080    min: 'min',
3081    minlength: 'minLength',
3082    multiple: 'multiple',
3083    muted: 'muted',
3084    name: 'name',
3085    nomodule: 'noModule',
3086    nonce: 'nonce',
3087    novalidate: 'noValidate',
3088    open: 'open',
3089    optimum: 'optimum',
3090    pattern: 'pattern',
3091    placeholder: 'placeholder',
3092    playsinline: 'playsInline',
3093    poster: 'poster',
3094    preload: 'preload',
3095    profile: 'profile',
3096    radiogroup: 'radioGroup',
3097    readonly: 'readOnly',
3098    referrerpolicy: 'referrerPolicy',
3099    rel: 'rel',
3100    required: 'required',
3101    reversed: 'reversed',
3102    role: 'role',
3103    rows: 'rows',
3104    rowspan: 'rowSpan',
3105    sandbox: 'sandbox',
3106    scope: 'scope',
3107    scoped: 'scoped',
3108    scrolling: 'scrolling',
3109    seamless: 'seamless',
3110    selected: 'selected',
3111    shape: 'shape',
3112    size: 'size',
3113    sizes: 'sizes',
3114    span: 'span',
3115    spellcheck: 'spellCheck',
3116    src: 'src',
3117    srcdoc: 'srcDoc',
3118    srclang: 'srcLang',
3119    srcset: 'srcSet',
3120    start: 'start',
3121    step: 'step',
3122    style: 'style',
3123    summary: 'summary',
3124    tabindex: 'tabIndex',
3125    target: 'target',
3126    title: 'title',
3127    type: 'type',
3128    usemap: 'useMap',
3129    value: 'value',
3130    width: 'width',
3131    wmode: 'wmode',
3132    wrap: 'wrap',
3133    // SVG
3134    about: 'about',
3135    accentheight: 'accentHeight',
3136    'accent-height': 'accentHeight',
3137    accumulate: 'accumulate',
3138    additive: 'additive',
3139    alignmentbaseline: 'alignmentBaseline',
3140    'alignment-baseline': 'alignmentBaseline',
3141    allowreorder: 'allowReorder',
3142    alphabetic: 'alphabetic',
3143    amplitude: 'amplitude',
3144    arabicform: 'arabicForm',
3145    'arabic-form': 'arabicForm',
3146    ascent: 'ascent',
3147    attributename: 'attributeName',
3148    attributetype: 'attributeType',
3149    autoreverse: 'autoReverse',
3150    azimuth: 'azimuth',
3151    basefrequency: 'baseFrequency',
3152    baselineshift: 'baselineShift',
3153    'baseline-shift': 'baselineShift',
3154    baseprofile: 'baseProfile',
3155    bbox: 'bbox',
3156    begin: 'begin',
3157    bias: 'bias',
3158    by: 'by',
3159    calcmode: 'calcMode',
3160    capheight: 'capHeight',
3161    'cap-height': 'capHeight',
3162    clip: 'clip',
3163    clippath: 'clipPath',
3164    'clip-path': 'clipPath',
3165    clippathunits: 'clipPathUnits',
3166    cliprule: 'clipRule',
3167    'clip-rule': 'clipRule',
3168    color: 'color',
3169    colorinterpolation: 'colorInterpolation',
3170    'color-interpolation': 'colorInterpolation',
3171    colorinterpolationfilters: 'colorInterpolationFilters',
3172    'color-interpolation-filters': 'colorInterpolationFilters',
3173    colorprofile: 'colorProfile',
3174    'color-profile': 'colorProfile',
3175    colorrendering: 'colorRendering',
3176    'color-rendering': 'colorRendering',
3177    contentscripttype: 'contentScriptType',
3178    contentstyletype: 'contentStyleType',
3179    cursor: 'cursor',
3180    cx: 'cx',
3181    cy: 'cy',
3182    d: 'd',
3183    datatype: 'datatype',
3184    decelerate: 'decelerate',
3185    descent: 'descent',
3186    diffuseconstant: 'diffuseConstant',
3187    direction: 'direction',
3188    display: 'display',
3189    divisor: 'divisor',
3190    dominantbaseline: 'dominantBaseline',
3191    'dominant-baseline': 'dominantBaseline',
3192    dur: 'dur',
3193    dx: 'dx',
3194    dy: 'dy',
3195    edgemode: 'edgeMode',
3196    elevation: 'elevation',
3197    enablebackground: 'enableBackground',
3198    'enable-background': 'enableBackground',
3199    end: 'end',
3200    exponent: 'exponent',
3201    externalresourcesrequired: 'externalResourcesRequired',
3202    fill: 'fill',
3203    fillopacity: 'fillOpacity',
3204    'fill-opacity': 'fillOpacity',
3205    fillrule: 'fillRule',
3206    'fill-rule': 'fillRule',
3207    filter: 'filter',
3208    filterres: 'filterRes',
3209    filterunits: 'filterUnits',
3210    floodopacity: 'floodOpacity',
3211    'flood-opacity': 'floodOpacity',
3212    floodcolor: 'floodColor',
3213    'flood-color': 'floodColor',
3214    focusable: 'focusable',
3215    fontfamily: 'fontFamily',
3216    'font-family': 'fontFamily',
3217    fontsize: 'fontSize',
3218    'font-size': 'fontSize',
3219    fontsizeadjust: 'fontSizeAdjust',
3220    'font-size-adjust': 'fontSizeAdjust',
3221    fontstretch: 'fontStretch',
3222    'font-stretch': 'fontStretch',
3223    fontstyle: 'fontStyle',
3224    'font-style': 'fontStyle',
3225    fontvariant: 'fontVariant',
3226    'font-variant': 'fontVariant',
3227    fontweight: 'fontWeight',
3228    'font-weight': 'fontWeight',
3229    format: 'format',
3230    from: 'from',
3231    fx: 'fx',
3232    fy: 'fy',
3233    g1: 'g1',
3234    g2: 'g2',
3235    glyphname: 'glyphName',
3236    'glyph-name': 'glyphName',
3237    glyphorientationhorizontal: 'glyphOrientationHorizontal',
3238    'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
3239    glyphorientationvertical: 'glyphOrientationVertical',
3240    'glyph-orientation-vertical': 'glyphOrientationVertical',
3241    glyphref: 'glyphRef',
3242    gradienttransform: 'gradientTransform',
3243    gradientunits: 'gradientUnits',
3244    hanging: 'hanging',
3245    horizadvx: 'horizAdvX',
3246    'horiz-adv-x': 'horizAdvX',
3247    horizoriginx: 'horizOriginX',
3248    'horiz-origin-x': 'horizOriginX',
3249    ideographic: 'ideographic',
3250    imagerendering: 'imageRendering',
3251    'image-rendering': 'imageRendering',
3252    in2: 'in2',
3253    in: 'in',
3254    inlist: 'inlist',
3255    intercept: 'intercept',
3256    k1: 'k1',
3257    k2: 'k2',
3258    k3: 'k3',
3259    k4: 'k4',
3260    k: 'k',
3261    kernelmatrix: 'kernelMatrix',
3262    kernelunitlength: 'kernelUnitLength',
3263    kerning: 'kerning',
3264    keypoints: 'keyPoints',
3265    keysplines: 'keySplines',
3266    keytimes: 'keyTimes',
3267    lengthadjust: 'lengthAdjust',
3268    letterspacing: 'letterSpacing',
3269    'letter-spacing': 'letterSpacing',
3270    lightingcolor: 'lightingColor',
3271    'lighting-color': 'lightingColor',
3272    limitingconeangle: 'limitingConeAngle',
3273    local: 'local',
3274    markerend: 'markerEnd',
3275    'marker-end': 'markerEnd',
3276    markerheight: 'markerHeight',
3277    markermid: 'markerMid',
3278    'marker-mid': 'markerMid',
3279    markerstart: 'markerStart',
3280    'marker-start': 'markerStart',
3281    markerunits: 'markerUnits',
3282    markerwidth: 'markerWidth',
3283    mask: 'mask',
3284    maskcontentunits: 'maskContentUnits',
3285    maskunits: 'maskUnits',
3286    mathematical: 'mathematical',
3287    mode: 'mode',
3288    numoctaves: 'numOctaves',
3289    offset: 'offset',
3290    opacity: 'opacity',
3291    operator: 'operator',
3292    order: 'order',
3293    orient: 'orient',
3294    orientation: 'orientation',
3295    origin: 'origin',
3296    overflow: 'overflow',
3297    overlineposition: 'overlinePosition',
3298    'overline-position': 'overlinePosition',
3299    overlinethickness: 'overlineThickness',
3300    'overline-thickness': 'overlineThickness',
3301    paintorder: 'paintOrder',
3302    'paint-order': 'paintOrder',
3303    panose1: 'panose1',
3304    'panose-1': 'panose1',
3305    pathlength: 'pathLength',
3306    patterncontentunits: 'patternContentUnits',
3307    patterntransform: 'patternTransform',
3308    patternunits: 'patternUnits',
3309    pointerevents: 'pointerEvents',
3310    'pointer-events': 'pointerEvents',
3311    points: 'points',
3312    pointsatx: 'pointsAtX',
3313    pointsaty: 'pointsAtY',
3314    pointsatz: 'pointsAtZ',
3315    prefix: 'prefix',
3316    preservealpha: 'preserveAlpha',
3317    preserveaspectratio: 'preserveAspectRatio',
3318    primitiveunits: 'primitiveUnits',
3319    property: 'property',
3320    r: 'r',
3321    radius: 'radius',
3322    refx: 'refX',
3323    refy: 'refY',
3324    renderingintent: 'renderingIntent',
3325    'rendering-intent': 'renderingIntent',
3326    repeatcount: 'repeatCount',
3327    repeatdur: 'repeatDur',
3328    requiredextensions: 'requiredExtensions',
3329    requiredfeatures: 'requiredFeatures',
3330    resource: 'resource',
3331    restart: 'restart',
3332    result: 'result',
3333    results: 'results',
3334    rotate: 'rotate',
3335    rx: 'rx',
3336    ry: 'ry',
3337    scale: 'scale',
3338    security: 'security',
3339    seed: 'seed',
3340    shaperendering: 'shapeRendering',
3341    'shape-rendering': 'shapeRendering',
3342    slope: 'slope',
3343    spacing: 'spacing',
3344    specularconstant: 'specularConstant',
3345    specularexponent: 'specularExponent',
3346    speed: 'speed',
3347    spreadmethod: 'spreadMethod',
3348    startoffset: 'startOffset',
3349    stddeviation: 'stdDeviation',
3350    stemh: 'stemh',
3351    stemv: 'stemv',
3352    stitchtiles: 'stitchTiles',
3353    stopcolor: 'stopColor',
3354    'stop-color': 'stopColor',
3355    stopopacity: 'stopOpacity',
3356    'stop-opacity': 'stopOpacity',
3357    strikethroughposition: 'strikethroughPosition',
3358    'strikethrough-position': 'strikethroughPosition',
3359    strikethroughthickness: 'strikethroughThickness',
3360    'strikethrough-thickness': 'strikethroughThickness',
3361    string: 'string',
3362    stroke: 'stroke',
3363    strokedasharray: 'strokeDasharray',
3364    'stroke-dasharray': 'strokeDasharray',
3365    strokedashoffset: 'strokeDashoffset',
3366    'stroke-dashoffset': 'strokeDashoffset',
3367    strokelinecap: 'strokeLinecap',
3368    'stroke-linecap': 'strokeLinecap',
3369    strokelinejoin: 'strokeLinejoin',
3370    'stroke-linejoin': 'strokeLinejoin',
3371    strokemiterlimit: 'strokeMiterlimit',
3372    'stroke-miterlimit': 'strokeMiterlimit',
3373    strokewidth: 'strokeWidth',
3374    'stroke-width': 'strokeWidth',
3375    strokeopacity: 'strokeOpacity',
3376    'stroke-opacity': 'strokeOpacity',
3377    suppresscontenteditablewarning: 'suppressContentEditableWarning',
3378    suppresshydrationwarning: 'suppressHydrationWarning',
3379    surfacescale: 'surfaceScale',
3380    systemlanguage: 'systemLanguage',
3381    tablevalues: 'tableValues',
3382    targetx: 'targetX',
3383    targety: 'targetY',
3384    textanchor: 'textAnchor',
3385    'text-anchor': 'textAnchor',
3386    textdecoration: 'textDecoration',
3387    'text-decoration': 'textDecoration',
3388    textlength: 'textLength',
3389    textrendering: 'textRendering',
3390    'text-rendering': 'textRendering',
3391    to: 'to',
3392    transform: 'transform',
3393    typeof: 'typeof',
3394    u1: 'u1',
3395    u2: 'u2',
3396    underlineposition: 'underlinePosition',
3397    'underline-position': 'underlinePosition',
3398    underlinethickness: 'underlineThickness',
3399    'underline-thickness': 'underlineThickness',
3400    unicode: 'unicode',
3401    unicodebidi: 'unicodeBidi',
3402    'unicode-bidi': 'unicodeBidi',
3403    unicoderange: 'unicodeRange',
3404    'unicode-range': 'unicodeRange',
3405    unitsperem: 'unitsPerEm',
3406    'units-per-em': 'unitsPerEm',
3407    unselectable: 'unselectable',
3408    valphabetic: 'vAlphabetic',
3409    'v-alphabetic': 'vAlphabetic',
3410    values: 'values',
3411    vectoreffect: 'vectorEffect',
3412    'vector-effect': 'vectorEffect',
3413    version: 'version',
3414    vertadvy: 'vertAdvY',
3415    'vert-adv-y': 'vertAdvY',
3416    vertoriginx: 'vertOriginX',
3417    'vert-origin-x': 'vertOriginX',
3418    vertoriginy: 'vertOriginY',
3419    'vert-origin-y': 'vertOriginY',
3420    vhanging: 'vHanging',
3421    'v-hanging': 'vHanging',
3422    videographic: 'vIdeographic',
3423    'v-ideographic': 'vIdeographic',
3424    viewbox: 'viewBox',
3425    viewtarget: 'viewTarget',
3426    visibility: 'visibility',
3427    vmathematical: 'vMathematical',
3428    'v-mathematical': 'vMathematical',
3429    vocab: 'vocab',
3430    widths: 'widths',
3431    wordspacing: 'wordSpacing',
3432    'word-spacing': 'wordSpacing',
3433    writingmode: 'writingMode',
3434    'writing-mode': 'writingMode',
3435    x1: 'x1',
3436    x2: 'x2',
3437    x: 'x',
3438    xchannelselector: 'xChannelSelector',
3439    xheight: 'xHeight',
3440    'x-height': 'xHeight',
3441    xlinkactuate: 'xlinkActuate',
3442    'xlink:actuate': 'xlinkActuate',
3443    xlinkarcrole: 'xlinkArcrole',
3444    'xlink:arcrole': 'xlinkArcrole',
3445    xlinkhref: 'xlinkHref',
3446    'xlink:href': 'xlinkHref',
3447    xlinkrole: 'xlinkRole',
3448    'xlink:role': 'xlinkRole',
3449    xlinkshow: 'xlinkShow',
3450    'xlink:show': 'xlinkShow',
3451    xlinktitle: 'xlinkTitle',
3452    'xlink:title': 'xlinkTitle',
3453    xlinktype: 'xlinkType',
3454    'xlink:type': 'xlinkType',
3455    xmlbase: 'xmlBase',
3456    'xml:base': 'xmlBase',
3457    xmllang: 'xmlLang',
3458    'xml:lang': 'xmlLang',
3459    xmlns: 'xmlns',
3460    'xml:space': 'xmlSpace',
3461    xmlnsxlink: 'xmlnsXlink',
3462    'xmlns:xlink': 'xmlnsXlink',
3463    xmlspace: 'xmlSpace',
3464    y1: 'y1',
3465    y2: 'y2',
3466    y: 'y',
3467    ychannelselector: 'yChannelSelector',
3468    z: 'z',
3469    zoomandpan: 'zoomAndPan'
3470  };
3471
3472  var ariaProperties = {
3473    'aria-current': 0,
3474    // state
3475    'aria-description': 0,
3476    'aria-details': 0,
3477    'aria-disabled': 0,
3478    // state
3479    'aria-hidden': 0,
3480    // state
3481    'aria-invalid': 0,
3482    // state
3483    'aria-keyshortcuts': 0,
3484    'aria-label': 0,
3485    'aria-roledescription': 0,
3486    // Widget Attributes
3487    'aria-autocomplete': 0,
3488    'aria-checked': 0,
3489    'aria-expanded': 0,
3490    'aria-haspopup': 0,
3491    'aria-level': 0,
vendor: 20,018 bytes, lines 3492-4062
3492    'aria-modal': 0,
3493    'aria-multiline': 0,
3494    'aria-multiselectable': 0,
3495    'aria-orientation': 0,
3496    'aria-placeholder': 0,
3497    'aria-pressed': 0,
3498    'aria-readonly': 0,
3499    'aria-required': 0,
3500    'aria-selected': 0,
3501    'aria-sort': 0,
3502    'aria-valuemax': 0,
3503    'aria-valuemin': 0,
3504    'aria-valuenow': 0,
3505    'aria-valuetext': 0,
3506    // Live Region Attributes
3507    'aria-atomic': 0,
3508    'aria-busy': 0,
3509    'aria-live': 0,
3510    'aria-relevant': 0,
3511    // Drag-and-Drop Attributes
3512    'aria-dropeffect': 0,
3513    'aria-grabbed': 0,
3514    // Relationship Attributes
3515    'aria-activedescendant': 0,
3516    'aria-colcount': 0,
3517    'aria-colindex': 0,
3518    'aria-colspan': 0,
3519    'aria-controls': 0,
3520    'aria-describedby': 0,
3521    'aria-errormessage': 0,
3522    'aria-flowto': 0,
3523    'aria-labelledby': 0,
3524    'aria-owns': 0,
3525    'aria-posinset': 0,
3526    'aria-rowcount': 0,
3527    'aria-rowindex': 0,
3528    'aria-rowspan': 0,
3529    'aria-setsize': 0
3530  };
3531
3532  var warnedProperties = {};
3533  var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
3534  var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
3535
3536  function validateProperty(tagName, name) {
3537    {
3538      if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) {
3539        return true;
3540      }
3541
3542      if (rARIACamel.test(name)) {
3543        var ariaName = 'aria-' + name.slice(4).toLowerCase();
3544        var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM
3545        // DOM properties, then it is an invalid aria-* attribute.
3546
3547        if (correctName == null) {
3548          error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);
3549
3550          warnedProperties[name] = true;
3551          return true;
3552        } // aria-* attributes should be lowercase; suggest the lowercase version.
3553
3554
3555        if (name !== correctName) {
3556          error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);
3557
3558          warnedProperties[name] = true;
3559          return true;
3560        }
3561      }
3562
3563      if (rARIA.test(name)) {
3564        var lowerCasedName = name.toLowerCase();
3565        var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM
3566        // DOM properties, then it is an invalid aria-* attribute.
3567
3568        if (standardName == null) {
3569          warnedProperties[name] = true;
3570          return false;
3571        } // aria-* attributes should be lowercase; suggest the lowercase version.
3572
3573
3574        if (name !== standardName) {
3575          error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);
3576
3577          warnedProperties[name] = true;
3578          return true;
3579        }
3580      }
3581    }
3582
3583    return true;
3584  }
3585
3586  function warnInvalidARIAProps(type, props) {
3587    {
3588      var invalidProps = [];
3589
3590      for (var key in props) {
3591        var isValid = validateProperty(type, key);
3592
3593        if (!isValid) {
3594          invalidProps.push(key);
3595        }
3596      }
3597
3598      var unknownPropString = invalidProps.map(function (prop) {
3599        return '`' + prop + '`';
3600      }).join(', ');
3601
3602      if (invalidProps.length === 1) {
3603        error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type);
3604      } else if (invalidProps.length > 1) {
3605        error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type);
3606      }
3607    }
3608  }
3609
3610  function validateProperties(type, props) {
3611    if (isCustomComponent(type, props)) {
3612      return;
3613    }
3614
3615    warnInvalidARIAProps(type, props);
3616  }
3617
3618  var didWarnValueNull = false;
3619  function validateProperties$1(type, props) {
3620    {
3621      if (type !== 'input' && type !== 'textarea' && type !== 'select') {
3622        return;
3623      }
3624
3625      if (props != null && props.value === null && !didWarnValueNull) {
3626        didWarnValueNull = true;
3627
3628        if (type === 'select' && props.multiple) {
3629          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);
3630        } else {
3631          error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);
3632        }
3633      }
3634    }
3635  }
3636
3637  var validateProperty$1 = function () {};
3638
3639  {
3640    var warnedProperties$1 = {};
3641    var EVENT_NAME_REGEX = /^on./;
3642    var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
3643    var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
3644    var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
3645
3646    validateProperty$1 = function (tagName, name, value, eventRegistry) {
3647      if (hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {
3648        return true;
3649      }
3650
3651      var lowerCasedName = name.toLowerCase();
3652
3653      if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {
3654        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.');
3655
3656        warnedProperties$1[name] = true;
3657        return true;
3658      } // We can't rely on the event system being injected on the server.
3659
3660
3661      if (eventRegistry != null) {
3662        var registrationNameDependencies = eventRegistry.registrationNameDependencies,
3663            possibleRegistrationNames = eventRegistry.possibleRegistrationNames;
3664
3665        if (registrationNameDependencies.hasOwnProperty(name)) {
3666          return true;
3667        }
3668
3669        var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;
3670
3671        if (registrationName != null) {
3672          error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);
3673
3674          warnedProperties$1[name] = true;
3675          return true;
3676        }
3677
3678        if (EVENT_NAME_REGEX.test(name)) {
3679          error('Unknown event handler property `%s`. It will be ignored.', name);
3680
3681          warnedProperties$1[name] = true;
3682          return true;
3683        }
3684      } else if (EVENT_NAME_REGEX.test(name)) {
3685        // If no event plugins have been injected, we are in a server environment.
3686        // So we can't tell if the event name is correct for sure, but we can filter
3687        // out known bad ones like `onclick`. We can't suggest a specific replacement though.
3688        if (INVALID_EVENT_NAME_REGEX.test(name)) {
3689          error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);
3690        }
3691
3692        warnedProperties$1[name] = true;
3693        return true;
3694      } // Let the ARIA attribute hook validate ARIA attributes
3695
3696
3697      if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
3698        return true;
3699      }
3700
3701      if (lowerCasedName === 'innerhtml') {
3702        error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');
3703
3704        warnedProperties$1[name] = true;
3705        return true;
3706      }
3707
3708      if (lowerCasedName === 'aria') {
3709        error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');
3710
3711        warnedProperties$1[name] = true;
3712        return true;
3713      }
3714
3715      if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {
3716        error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);
3717
3718        warnedProperties$1[name] = true;
3719        return true;
3720      }
3721
3722      if (typeof value === 'number' && isNaN(value)) {
3723        error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);
3724
3725        warnedProperties$1[name] = true;
3726        return true;
3727      }
3728
3729      var propertyInfo = getPropertyInfo(name);
3730      var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.
3731
3732      if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
3733        var standardName = possibleStandardNames[lowerCasedName];
3734
3735        if (standardName !== name) {
3736          error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);
3737
3738          warnedProperties$1[name] = true;
3739          return true;
3740        }
3741      } else if (!isReserved && name !== lowerCasedName) {
3742        // Unknown attributes should have lowercase casing since that's how they
3743        // will be cased anyway with server rendering.
3744        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);
3745
3746        warnedProperties$1[name] = true;
3747        return true;
3748      }
3749
3750      if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
3751        if (value) {
3752          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);
3753        } else {
3754          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);
3755        }
3756
3757        warnedProperties$1[name] = true;
3758        return true;
3759      } // Now that we've validated casing, do not validate
3760      // data types for reserved props
3761
3762
3763      if (isReserved) {
3764        return true;
3765      } // Warn when a known attribute is a bad type
3766
3767
3768      if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
3769        warnedProperties$1[name] = true;
3770        return false;
3771      } // Warn when passing the strings 'false' or 'true' into a boolean prop
3772
3773
3774      if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {
3775        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);
3776
3777        warnedProperties$1[name] = true;
3778        return true;
3779      }
3780
3781      return true;
3782    };
3783  }
3784
3785  var warnUnknownProperties = function (type, props, eventRegistry) {
3786    {
3787      var unknownProps = [];
3788
3789      for (var key in props) {
3790        var isValid = validateProperty$1(type, key, props[key], eventRegistry);
3791
3792        if (!isValid) {
3793          unknownProps.push(key);
3794        }
3795      }
3796
3797      var unknownPropString = unknownProps.map(function (prop) {
3798        return '`' + prop + '`';
3799      }).join(', ');
3800
3801      if (unknownProps.length === 1) {
3802        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);
3803      } else if (unknownProps.length > 1) {
3804        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);
3805      }
3806    }
3807  };
3808
3809  function validateProperties$2(type, props, eventRegistry) {
3810    if (isCustomComponent(type, props)) {
3811      return;
3812    }
3813
3814    warnUnknownProperties(type, props, eventRegistry);
3815  }
3816
3817  var IS_EVENT_HANDLE_NON_MANAGED_NODE = 1;
3818  var IS_NON_DELEGATED = 1 << 1;
3819  var IS_CAPTURE_PHASE = 1 << 2;
3820  // set to LEGACY_FB_SUPPORT. LEGACY_FB_SUPPORT only gets set when
3821  // we call willDeferLaterForLegacyFBSupport, thus not bailing out
3822  // will result in endless cycles like an infinite loop.
3823  // We also don't want to defer during event replaying.
3824
3825  var SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS = IS_EVENT_HANDLE_NON_MANAGED_NODE | IS_NON_DELEGATED | IS_CAPTURE_PHASE;
3826
3827  // This exists to avoid circular dependency between ReactDOMEventReplaying
3828  // and DOMPluginEventSystem.
3829  var currentReplayingEvent = null;
3830  function setReplayingEvent(event) {
3831    {
3832      if (currentReplayingEvent !== null) {
3833        error('Expected currently replaying event to be null. This error ' + 'is likely caused by a bug in React. Please file an issue.');
3834      }
3835    }
3836
3837    currentReplayingEvent = event;
3838  }
3839  function resetReplayingEvent() {
3840    {
3841      if (currentReplayingEvent === null) {
3842        error('Expected currently replaying event to not be null. This error ' + 'is likely caused by a bug in React. Please file an issue.');
3843      }
3844    }
3845
3846    currentReplayingEvent = null;
3847  }
3848  function isReplayingEvent(event) {
3849    return event === currentReplayingEvent;
3850  }
3851
3852  /**
3853   * Gets the target node from a native browser event by accounting for
3854   * inconsistencies in browser DOM APIs.
3855   *
3856   * @param {object} nativeEvent Native browser event.
3857   * @return {DOMEventTarget} Target node.
3858   */
3859
3860  function getEventTarget(nativeEvent) {
3861    // Fallback to nativeEvent.srcElement for IE9
3862    // https://github.com/facebook/react/issues/12506
3863    var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963
3864
3865    if (target.correspondingUseElement) {
3866      target = target.correspondingUseElement;
3867    } // Safari may fire events on text nodes (Node.TEXT_NODE is 3).
3868    // @see http://www.quirksmode.org/js/events_properties.html
3869
3870
3871    return target.nodeType === TEXT_NODE ? target.parentNode : target;
3872  }
3873
3874  var restoreImpl = null;
3875  var restoreTarget = null;
3876  var restoreQueue = null;
3877
3878  function restoreStateOfTarget(target) {
3879    // We perform this translation at the end of the event loop so that we
3880    // always receive the correct fiber here
3881    var internalInstance = getInstanceFromNode(target);
3882
3883    if (!internalInstance) {
3884      // Unmounted
3885      return;
3886    }
3887
3888    if (typeof restoreImpl !== 'function') {
3889      throw new Error('setRestoreImplementation() needs to be called to handle a target for controlled ' + 'events. This error is likely caused by a bug in React. Please file an issue.');
3890    }
3891
3892    var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted.
3893
3894    if (stateNode) {
3895      var _props = getFiberCurrentPropsFromNode(stateNode);
3896
3897      restoreImpl(internalInstance.stateNode, internalInstance.type, _props);
3898    }
3899  }
3900
3901  function setRestoreImplementation(impl) {
3902    restoreImpl = impl;
3903  }
3904  function enqueueStateRestore(target) {
3905    if (restoreTarget) {
3906      if (restoreQueue) {
3907        restoreQueue.push(target);
3908      } else {
3909        restoreQueue = [target];
3910      }
3911    } else {
3912      restoreTarget = target;
3913    }
3914  }
3915  function needsStateRestore() {
3916    return restoreTarget !== null || restoreQueue !== null;
3917  }
3918  function restoreStateIfNeeded() {
3919    if (!restoreTarget) {
3920      return;
3921    }
3922
3923    var target = restoreTarget;
3924    var queuedTargets = restoreQueue;
3925    restoreTarget = null;
3926    restoreQueue = null;
3927    restoreStateOfTarget(target);
3928
3929    if (queuedTargets) {
3930      for (var i = 0; i < queuedTargets.length; i++) {
3931        restoreStateOfTarget(queuedTargets[i]);
3932      }
3933    }
3934  }
3935
3936  // the renderer. Such as when we're dispatching events or if third party
3937  // libraries need to call batchedUpdates. Eventually, this API will go away when
3938  // everything is batched by default. We'll then have a similar API to opt-out of
3939  // scheduled work and instead do synchronous work.
3940  // Defaults
3941
3942  var batchedUpdatesImpl = function (fn, bookkeeping) {
3943    return fn(bookkeeping);
3944  };
3945
3946  var flushSyncImpl = function () {};
3947
3948  var isInsideEventHandler = false;
3949
3950  function finishEventHandler() {
3951    // Here we wait until all updates have propagated, which is important
3952    // when using controlled components within layers:
3953    // https://github.com/facebook/react/issues/1698
3954    // Then we restore state of any controlled component.
3955    var controlledComponentsHavePendingUpdates = needsStateRestore();
3956
3957    if (controlledComponentsHavePendingUpdates) {
3958      // If a controlled event was fired, we may need to restore the state of
3959      // the DOM node back to the controlled value. This is necessary when React
3960      // bails out of the update without touching the DOM.
3961      // TODO: Restore state in the microtask, after the discrete updates flush,
3962      // instead of early flushing them here.
3963      flushSyncImpl();
3964      restoreStateIfNeeded();
3965    }
3966  }
3967
3968  function batchedUpdates(fn, a, b) {
3969    if (isInsideEventHandler) {
3970      // If we are currently inside another batch, we need to wait until it
3971      // fully completes before restoring state.
3972      return fn(a, b);
3973    }
3974
3975    isInsideEventHandler = true;
3976
3977    try {
3978      return batchedUpdatesImpl(fn, a, b);
3979    } finally {
3980      isInsideEventHandler = false;
3981      finishEventHandler();
3982    }
3983  } // TODO: Replace with flushSync
3984  function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushSyncImpl) {
3985    batchedUpdatesImpl = _batchedUpdatesImpl;
3986    flushSyncImpl = _flushSyncImpl;
3987  }
3988
3989  function isInteractive(tag) {
3990    return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
3991  }
3992
3993  function shouldPreventMouseEvent(name, type, props) {
3994    switch (name) {
3995      case 'onClick':
3996      case 'onClickCapture':
3997      case 'onDoubleClick':
3998      case 'onDoubleClickCapture':
3999      case 'onMouseDown':
4000      case 'onMouseDownCapture':
4001      case 'onMouseMove':
4002      case 'onMouseMoveCapture':
4003      case 'onMouseUp':
4004      case 'onMouseUpCapture':
4005      case 'onMouseEnter':
4006        return !!(props.disabled && isInteractive(type));
4007
4008      default:
4009        return false;
4010    }
4011  }
4012  /**
4013   * @param {object} inst The instance, which is the source of events.
4014   * @param {string} registrationName Name of listener (e.g. `onClick`).
4015   * @return {?function} The stored callback.
4016   */
4017
4018
4019  function getListener(inst, registrationName) {
4020    var stateNode = inst.stateNode;
4021
4022    if (stateNode === null) {
4023      // Work in progress (ex: onload events in incremental mode).
4024      return null;
4025    }
4026
4027    var props = getFiberCurrentPropsFromNode(stateNode);
4028
4029    if (props === null) {
4030      // Work in progress.
4031      return null;
4032    }
4033
4034    var listener = props[registrationName];
4035
4036    if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
4037      return null;
4038    }
4039
4040    if (listener && typeof listener !== 'function') {
4041      throw new Error("Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof listener + "` type.");
4042    }
4043
4044    return listener;
4045  }
4046
4047  var passiveBrowserEventsSupported = false; // Check if browser support events with passive listeners
4048  // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support
4049
4050  if (canUseDOM) {
4051    try {
4052      var options = {}; // $FlowFixMe: Ignore Flow complaining about needing a value
4053
4054      Object.defineProperty(options, 'passive', {
4055        get: function () {
4056          passiveBrowserEventsSupported = true;
4057        }
4058      });
4059      window.addEventListener('test', options, options);
4060      window.removeEventListener('test', options, options);
4061    } catch (e) {
4062      passiveBrowserEventsSupported = false;
4063    }
4064  }
4065
4066  function invokeGuardedCallbackProd(name, func, context, a, b, c, d, e, f) {
4067    var funcArgs = Array.prototype.slice.call(arguments, 3);
4068
4069    try {
4070      func.apply(context, funcArgs);
4071    } catch (error) {
4072      this.onError(error);
4073    }
4074  }
4075
4076  var invokeGuardedCallbackImpl = invokeGuardedCallbackProd;
4077
4078  {
4079    // In DEV mode, we swap out invokeGuardedCallback for a special version
4080    // that plays more nicely with the browser's DevTools. The idea is to preserve
4081    // "Pause on exceptions" behavior. Because React wraps all user-provided
4082    // functions in invokeGuardedCallback, and the production version of
4083    // invokeGuardedCallback uses a try-catch, all user exceptions are treated
4084    // like caught exceptions, and the DevTools won't pause unless the developer
4085    // takes the extra step of enabling pause on caught exceptions. This is
4086    // unintuitive, though, because even though React has caught the error, from
4087    // the developer's perspective, the error is uncaught.
4088    //
4089    // To preserve the expected "Pause on exceptions" behavior, we don't use a
4090    // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake
4091    // DOM node, and call the user-provided callback from inside an event handler
4092    // for that fake event. If the callback throws, the error is "captured" using
4093    // a global event handler. But because the error happens in a different
4094    // event loop context, it does not interrupt the normal program flow.
4095    // Effectively, this gives us try-catch behavior without actually using
4096    // try-catch. Neat!
4097    // Check that the browser supports the APIs we need to implement our special
4098    // DEV version of invokeGuardedCallback
4099    if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
4100      var fakeNode = document.createElement('react');
4101
4102      invokeGuardedCallbackImpl = function invokeGuardedCallbackDev(name, func, context, a, b, c, d, e, f) {
4103        // If document doesn't exist we know for sure we will crash in this method
4104        // when we call document.createEvent(). However this can cause confusing
4105        // errors: https://github.com/facebook/create-react-app/issues/3482
4106        // So we preemptively throw with a better message instead.
4107        if (typeof document === 'undefined' || document === null) {
4108          throw new Error('The `document` global was defined when React was initialized, but is not ' + 'defined anymore. This can happen in a test environment if a component ' + 'schedules an update from an asynchronous callback, but the test has already ' + 'finished running. To solve this, you can either unmount the component at ' + 'the end of your test (and ensure that any asynchronous operations get ' + 'canceled in `componentWillUnmount`), or you can change the test itself ' + 'to be asynchronous.');
4109        }
4110
4111        var evt = document.createEvent('Event');
4112        var didCall = false; // Keeps track of whether the user-provided callback threw an error. We
4113        // set this to true at the beginning, then set it to false right after
4114        // calling the function. If the function errors, `didError` will never be
4115        // set to false. This strategy works even if the browser is flaky and
4116        // fails to call our global error handler, because it doesn't rely on
4117        // the error event at all.
4118
4119        var didError = true; // Keeps track of the value of window.event so that we can reset it
4120        // during the callback to let user code access window.event in the
4121        // browsers that support it.
4122
4123        var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event
4124        // dispatching: https://github.com/facebook/react/issues/13688
4125
4126        var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event');
4127
4128        function restoreAfterDispatch() {
4129          // We immediately remove the callback from event listeners so that
4130          // nested `invokeGuardedCallback` calls do not clash. Otherwise, a
4131          // nested call would trigger the fake event handlers of any call higher
4132          // in the stack.
4133          fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the
4134          // window.event assignment in both IE <= 10 as they throw an error
4135          // "Member not found" in strict mode, and in Firefox which does not
4136          // support window.event.
4137
4138          if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {
4139            window.event = windowEvent;
4140          }
4141        } // Create an event handler for our fake event. We will synchronously
4142        // dispatch our fake event using `dispatchEvent`. Inside the handler, we
vendor: 22,215 bytes, lines 4143-4786
4143        // call the user-provided callback.
4144
4145
4146        var funcArgs = Array.prototype.slice.call(arguments, 3);
4147
4148        function callCallback() {
4149          didCall = true;
4150          restoreAfterDispatch();
4151          func.apply(context, funcArgs);
4152          didError = false;
4153        } // Create a global error event handler. We use this to capture the value
4154        // that was thrown. It's possible that this error handler will fire more
4155        // than once; for example, if non-React code also calls `dispatchEvent`
4156        // and a handler for that event throws. We should be resilient to most of
4157        // those cases. Even if our error event handler fires more than once, the
4158        // last error event is always used. If the callback actually does error,
4159        // we know that the last error event is the correct one, because it's not
4160        // possible for anything else to have happened in between our callback
4161        // erroring and the code that follows the `dispatchEvent` call below. If
4162        // the callback doesn't error, but the error event was fired, we know to
4163        // ignore it because `didError` will be false, as described above.
4164
4165
4166        var error; // Use this to track whether the error event is ever called.
4167
4168        var didSetError = false;
4169        var isCrossOriginError = false;
4170
4171        function handleWindowError(event) {
4172          error = event.error;
4173          didSetError = true;
4174
4175          if (error === null && event.colno === 0 && event.lineno === 0) {
4176            isCrossOriginError = true;
4177          }
4178
4179          if (event.defaultPrevented) {
4180            // Some other error handler has prevented default.
4181            // Browsers silence the error report if this happens.
4182            // We'll remember this to later decide whether to log it or not.
4183            if (error != null && typeof error === 'object') {
4184              try {
4185                error._suppressLogging = true;
4186              } catch (inner) {// Ignore.
4187              }
4188            }
4189          }
4190        } // Create a fake event type.
4191
4192
4193        var evtType = "react-" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers
4194
4195        window.addEventListener('error', handleWindowError);
4196        fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function
4197        // errors, it will trigger our global error handler.
4198
4199        evt.initEvent(evtType, false, false);
4200        fakeNode.dispatchEvent(evt);
4201
4202        if (windowEventDescriptor) {
4203          Object.defineProperty(window, 'event', windowEventDescriptor);
4204        }
4205
4206        if (didCall && didError) {
4207          if (!didSetError) {
4208            // The callback errored, but the error event never fired.
4209            // eslint-disable-next-line react-internal/prod-error-codes
4210            error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');
4211          } else if (isCrossOriginError) {
4212            // eslint-disable-next-line react-internal/prod-error-codes
4213            error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://reactjs.org/link/crossorigin-error for more information.');
4214          }
4215
4216          this.onError(error);
4217        } // Remove our event listeners
4218
4219
4220        window.removeEventListener('error', handleWindowError);
4221
4222        if (!didCall) {
4223          // Something went really wrong, and our event was not dispatched.
4224          // https://github.com/facebook/react/issues/16734
4225          // https://github.com/facebook/react/issues/16585
4226          // Fall back to the production implementation.
4227          restoreAfterDispatch();
4228          return invokeGuardedCallbackProd.apply(this, arguments);
4229        }
4230      };
4231    }
4232  }
4233
4234  var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;
4235
4236  var hasError = false;
4237  var caughtError = null; // Used by event system to capture/rethrow the first error.
4238
4239  var hasRethrowError = false;
4240  var rethrowError = null;
4241  var reporter = {
4242    onError: function (error) {
4243      hasError = true;
4244      caughtError = error;
4245    }
4246  };
4247  /**
4248   * Call a function while guarding against errors that happens within it.
4249   * Returns an error if it throws, otherwise null.
4250   *
4251   * In production, this is implemented using a try-catch. The reason we don't
4252   * use a try-catch directly is so that we can swap out a different
4253   * implementation in DEV mode.
4254   *
4255   * @param {String} name of the guard to use for logging or debugging
4256   * @param {Function} func The function to invoke
4257   * @param {*} context The context to use when calling the function
4258   * @param {...*} args Arguments for function
4259   */
4260
4261  function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {
4262    hasError = false;
4263    caughtError = null;
4264    invokeGuardedCallbackImpl$1.apply(reporter, arguments);
4265  }
4266  /**
4267   * Same as invokeGuardedCallback, but instead of returning an error, it stores
4268   * it in a global so it can be rethrown by `rethrowCaughtError` later.
4269   * TODO: See if caughtError and rethrowError can be unified.
4270   *
4271   * @param {String} name of the guard to use for logging or debugging
4272   * @param {Function} func The function to invoke
4273   * @param {*} context The context to use when calling the function
4274   * @param {...*} args Arguments for function
4275   */
4276
4277  function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {
4278    invokeGuardedCallback.apply(this, arguments);
4279
4280    if (hasError) {
4281      var error = clearCaughtError();
4282
4283      if (!hasRethrowError) {
4284        hasRethrowError = true;
4285        rethrowError = error;
4286      }
4287    }
4288  }
4289  /**
4290   * During execution of guarded functions we will capture the first error which
4291   * we will rethrow to be handled by the top level error handler.
4292   */
4293
4294  function rethrowCaughtError() {
4295    if (hasRethrowError) {
4296      var error = rethrowError;
4297      hasRethrowError = false;
4298      rethrowError = null;
4299      throw error;
4300    }
4301  }
4302  function hasCaughtError() {
4303    return hasError;
4304  }
4305  function clearCaughtError() {
4306    if (hasError) {
4307      var error = caughtError;
4308      hasError = false;
4309      caughtError = null;
4310      return error;
4311    } else {
4312      throw new Error('clearCaughtError was called but no error was captured. This error ' + 'is likely caused by a bug in React. Please file an issue.');
4313    }
4314  }
4315
4316  var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
4317  var _ReactInternals$Sched = ReactInternals.Scheduler,
4318      unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback,
4319      unstable_now = _ReactInternals$Sched.unstable_now,
4320      unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback,
4321      unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield,
4322      unstable_requestPaint = _ReactInternals$Sched.unstable_requestPaint,
4323      unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode,
4324      unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority,
4325      unstable_next = _ReactInternals$Sched.unstable_next,
4326      unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution,
4327      unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution,
4328      unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel,
4329      unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority,
4330      unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority,
4331      unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority,
4332      unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority,
4333      unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority,
4334      unstable_forceFrameRate = _ReactInternals$Sched.unstable_forceFrameRate,
4335      unstable_flushAllWithoutAsserting = _ReactInternals$Sched.unstable_flushAllWithoutAsserting,
4336      unstable_yieldValue = _ReactInternals$Sched.unstable_yieldValue,
4337      unstable_setDisableYieldValue = _ReactInternals$Sched.unstable_setDisableYieldValue;
4338
4339  /**
4340   * `ReactInstanceMap` maintains a mapping from a public facing stateful
4341   * instance (key) and the internal representation (value). This allows public
4342   * methods to accept the user facing instance as an argument and map them back
4343   * to internal methods.
4344   *
4345   * Note that this module is currently shared and assumed to be stateless.
4346   * If this becomes an actual Map, that will break.
4347   */
4348  function get(key) {
4349    return key._reactInternals;
4350  }
4351  function has(key) {
4352    return key._reactInternals !== undefined;
4353  }
4354  function set(key, value) {
4355    key._reactInternals = value;
4356  }
4357
4358  // Don't change these two values. They're used by React Dev Tools.
4359  var NoFlags =
4360  /*                      */
4361  0;
4362  var PerformedWork =
4363  /*                */
4364  1; // You can change the rest (and add more).
4365
4366  var Placement =
4367  /*                    */
4368  2;
4369  var Update =
4370  /*                       */
4371  4;
4372  var ChildDeletion =
4373  /*                */
4374  16;
4375  var ContentReset =
4376  /*                 */
4377  32;
4378  var Callback =
4379  /*                     */
4380  64;
4381  var DidCapture =
4382  /*                   */
4383  128;
4384  var ForceClientRender =
4385  /*            */
4386  256;
4387  var Ref =
4388  /*                          */
4389  512;
4390  var Snapshot =
4391  /*                     */
4392  1024;
4393  var Passive =
4394  /*                      */
4395  2048;
4396  var Hydrating =
4397  /*                    */
4398  4096;
4399  var Visibility =
4400  /*                   */
4401  8192;
4402  var StoreConsistency =
4403  /*             */
4404  16384;
4405  var LifecycleEffectMask = Passive | Update | Callback | Ref | Snapshot | StoreConsistency; // Union of all commit flags (flags with the lifetime of a particular commit)
4406
4407  var HostEffectMask =
4408  /*               */
4409  32767; // These are not really side effects, but we still reuse this field.
4410
4411  var Incomplete =
4412  /*                   */
4413  32768;
4414  var ShouldCapture =
4415  /*                */
4416  65536;
4417  var ForceUpdateForLegacySuspense =
4418  /* */
4419  131072;
4420  var Forked =
4421  /*                       */
4422  1048576; // Static tags describe aspects of a fiber that are not specific to a render,
4423  // e.g. a fiber uses a passive effect (even if there are no updates on this particular render).
4424  // This enables us to defer more work in the unmount case,
4425  // since we can defer traversing the tree during layout to look for Passive effects,
4426  // and instead rely on the static flag as a signal that there may be cleanup work.
4427
4428  var RefStatic =
4429  /*                    */
4430  2097152;
4431  var LayoutStatic =
4432  /*                 */
4433  4194304;
4434  var PassiveStatic =
4435  /*                */
4436  8388608; // These flags allow us to traverse to fibers that have effects on mount
4437  // without traversing the entire tree after every commit for
4438  // double invoking
4439
4440  var MountLayoutDev =
4441  /*               */
4442  16777216;
4443  var MountPassiveDev =
4444  /*              */
4445  33554432; // Groups of flags that are used in the commit phase to skip over trees that
4446  // don't contain effects, by checking subtreeFlags.
4447
4448  var BeforeMutationMask = // TODO: Remove Update flag from before mutation phase by re-landing Visibility
4449  // flag logic (see #20043)
4450  Update | Snapshot | ( 0);
4451  var MutationMask = Placement | Update | ChildDeletion | ContentReset | Ref | Hydrating | Visibility;
4452  var LayoutMask = Update | Callback | Ref | Visibility; // TODO: Split into PassiveMountMask and PassiveUnmountMask
4453
4454  var PassiveMask = Passive | ChildDeletion; // Union of tags that don't get reset on clones.
4455  // This allows certain concepts to persist without recalculating them,
4456  // e.g. whether a subtree contains passive effects or portals.
4457
4458  var StaticMask = LayoutStatic | PassiveStatic | RefStatic;
4459
4460  var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;
4461  function getNearestMountedFiber(fiber) {
4462    var node = fiber;
4463    var nearestMounted = fiber;
4464
4465    if (!fiber.alternate) {
4466      // If there is no alternate, this might be a new tree that isn't inserted
4467      // yet. If it is, then it will have a pending insertion effect on it.
4468      var nextNode = node;
4469
4470      do {
4471        node = nextNode;
4472
4473        if ((node.flags & (Placement | Hydrating)) !== NoFlags) {
4474          // This is an insertion or in-progress hydration. The nearest possible
4475          // mounted fiber is the parent but we need to continue to figure out
4476          // if that one is still mounted.
4477          nearestMounted = node.return;
4478        }
4479
4480        nextNode = node.return;
4481      } while (nextNode);
4482    } else {
4483      while (node.return) {
4484        node = node.return;
4485      }
4486    }
4487
4488    if (node.tag === HostRoot) {
4489      // TODO: Check if this was a nested HostRoot when used with
4490      // renderContainerIntoSubtree.
4491      return nearestMounted;
4492    } // If we didn't hit the root, that means that we're in an disconnected tree
4493    // that has been unmounted.
4494
4495
4496    return null;
4497  }
4498  function getSuspenseInstanceFromFiber(fiber) {
4499    if (fiber.tag === SuspenseComponent) {
4500      var suspenseState = fiber.memoizedState;
4501
4502      if (suspenseState === null) {
4503        var current = fiber.alternate;
4504
4505        if (current !== null) {
4506          suspenseState = current.memoizedState;
4507        }
4508      }
4509
4510      if (suspenseState !== null) {
4511        return suspenseState.dehydrated;
4512      }
4513    }
4514
4515    return null;
4516  }
4517  function getContainerFromFiber(fiber) {
4518    return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null;
4519  }
4520  function isFiberMounted(fiber) {
4521    return getNearestMountedFiber(fiber) === fiber;
4522  }
4523  function isMounted(component) {
4524    {
4525      var owner = ReactCurrentOwner.current;
4526
4527      if (owner !== null && owner.tag === ClassComponent) {
4528        var ownerFiber = owner;
4529        var instance = ownerFiber.stateNode;
4530
4531        if (!instance._warnedAboutRefsInRender) {
4532          error('%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentNameFromFiber(ownerFiber) || 'A component');
4533        }
4534
4535        instance._warnedAboutRefsInRender = true;
4536      }
4537    }
4538
4539    var fiber = get(component);
4540
4541    if (!fiber) {
4542      return false;
4543    }
4544
4545    return getNearestMountedFiber(fiber) === fiber;
4546  }
4547
4548  function assertIsMounted(fiber) {
4549    if (getNearestMountedFiber(fiber) !== fiber) {
4550      throw new Error('Unable to find node on an unmounted component.');
4551    }
4552  }
4553
4554  function findCurrentFiberUsingSlowPath(fiber) {
4555    var alternate = fiber.alternate;
4556
4557    if (!alternate) {
4558      // If there is no alternate, then we only need to check if it is mounted.
4559      var nearestMounted = getNearestMountedFiber(fiber);
4560
4561      if (nearestMounted === null) {
4562        throw new Error('Unable to find node on an unmounted component.');
4563      }
4564
4565      if (nearestMounted !== fiber) {
4566        return null;
4567      }
4568
4569      return fiber;
4570    } // If we have two possible branches, we'll walk backwards up to the root
4571    // to see what path the root points to. On the way we may hit one of the
4572    // special cases and we'll deal with them.
4573
4574
4575    var a = fiber;
4576    var b = alternate;
4577
4578    while (true) {
4579      var parentA = a.return;
4580
4581      if (parentA === null) {
4582        // We're at the root.
4583        break;
4584      }
4585
4586      var parentB = parentA.alternate;
4587
4588      if (parentB === null) {
4589        // There is no alternate. This is an unusual case. Currently, it only
4590        // happens when a Suspense component is hidden. An extra fragment fiber
4591        // is inserted in between the Suspense fiber and its children. Skip
4592        // over this extra fragment fiber and proceed to the next parent.
4593        var nextParent = parentA.return;
4594
4595        if (nextParent !== null) {
4596          a = b = nextParent;
4597          continue;
4598        } // If there's no parent, we're at the root.
4599
4600
4601        break;
4602      } // If both copies of the parent fiber point to the same child, we can
4603      // assume that the child is current. This happens when we bailout on low
4604      // priority: the bailed out fiber's child reuses the current child.
4605
4606
4607      if (parentA.child === parentB.child) {
4608        var child = parentA.child;
4609
4610        while (child) {
4611          if (child === a) {
4612            // We've determined that A is the current branch.
4613            assertIsMounted(parentA);
4614            return fiber;
4615          }
4616
4617          if (child === b) {
4618            // We've determined that B is the current branch.
4619            assertIsMounted(parentA);
4620            return alternate;
4621          }
4622
4623          child = child.sibling;
4624        } // We should never have an alternate for any mounting node. So the only
4625        // way this could possibly happen is if this was unmounted, if at all.
4626
4627
4628        throw new Error('Unable to find node on an unmounted component.');
4629      }
4630
4631      if (a.return !== b.return) {
4632        // The return pointer of A and the return pointer of B point to different
4633        // fibers. We assume that return pointers never criss-cross, so A must
4634        // belong to the child set of A.return, and B must belong to the child
4635        // set of B.return.
4636        a = parentA;
4637        b = parentB;
4638      } else {
4639        // The return pointers point to the same fiber. We'll have to use the
4640        // default, slow path: scan the child sets of each parent alternate to see
4641        // which child belongs to which set.
4642        //
4643        // Search parent A's child set
4644        var didFindChild = false;
4645        var _child = parentA.child;
4646
4647        while (_child) {
4648          if (_child === a) {
4649            didFindChild = true;
4650            a = parentA;
4651            b = parentB;
4652            break;
4653          }
4654
4655          if (_child === b) {
4656            didFindChild = true;
4657            b = parentA;
4658            a = parentB;
4659            break;
4660          }
4661
4662          _child = _child.sibling;
4663        }
4664
4665        if (!didFindChild) {
4666          // Search parent B's child set
4667          _child = parentB.child;
4668
4669          while (_child) {
4670            if (_child === a) {
4671              didFindChild = true;
4672              a = parentB;
4673              b = parentA;
4674              break;
4675            }
4676
4677            if (_child === b) {
4678              didFindChild = true;
4679              b = parentB;
4680              a = parentA;
4681              break;
4682            }
4683
4684            _child = _child.sibling;
4685          }
4686
4687          if (!didFindChild) {
4688            throw new Error('Child was not found in either parent set. This indicates a bug ' + 'in React related to the return pointer. Please file an issue.');
4689          }
4690        }
4691      }
4692
4693      if (a.alternate !== b) {
4694        throw new Error("Return fibers should always be each others' alternates. " + 'This error is likely caused by a bug in React. Please file an issue.');
4695      }
4696    } // If the root is not a host container, we're in a disconnected tree. I.e.
4697    // unmounted.
4698
4699
4700    if (a.tag !== HostRoot) {
4701      throw new Error('Unable to find node on an unmounted component.');
4702    }
4703
4704    if (a.stateNode.current === a) {
4705      // We've determined that A is the current branch.
4706      return fiber;
4707    } // Otherwise B has to be current branch.
4708
4709
4710    return alternate;
4711  }
4712  function findCurrentHostFiber(parent) {
4713    var currentParent = findCurrentFiberUsingSlowPath(parent);
4714    return currentParent !== null ? findCurrentHostFiberImpl(currentParent) : null;
4715  }
4716
4717  function findCurrentHostFiberImpl(node) {
4718    // Next we'll drill down this component to find the first HostComponent/Text.
4719    if (node.tag === HostComponent || node.tag === HostText) {
4720      return node;
4721    }
4722
4723    var child = node.child;
4724
4725    while (child !== null) {
4726      var match = findCurrentHostFiberImpl(child);
4727
4728      if (match !== null) {
4729        return match;
4730      }
4731
4732      child = child.sibling;
4733    }
4734
4735    return null;
4736  }
4737
4738  function findCurrentHostFiberWithNoPortals(parent) {
4739    var currentParent = findCurrentFiberUsingSlowPath(parent);
4740    return currentParent !== null ? findCurrentHostFiberWithNoPortalsImpl(currentParent) : null;
4741  }
4742
4743  function findCurrentHostFiberWithNoPortalsImpl(node) {
4744    // Next we'll drill down this component to find the first HostComponent/Text.
4745    if (node.tag === HostComponent || node.tag === HostText) {
4746      return node;
4747    }
4748
4749    var child = node.child;
4750
4751    while (child !== null) {
4752      if (child.tag !== HostPortal) {
4753        var match = findCurrentHostFiberWithNoPortalsImpl(child);
4754
4755        if (match !== null) {
4756          return match;
4757        }
4758      }
4759
4760      child = child.sibling;
4761    }
4762
4763    return null;
4764  }
4765
4766  // This module only exists as an ESM wrapper around the external CommonJS
4767  var scheduleCallback = unstable_scheduleCallback;
4768  var cancelCallback = unstable_cancelCallback;
4769  var shouldYield = unstable_shouldYield;
4770  var requestPaint = unstable_requestPaint;
4771  var now = unstable_now;
4772  var getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;
4773  var ImmediatePriority = unstable_ImmediatePriority;
4774  var UserBlockingPriority = unstable_UserBlockingPriority;
4775  var NormalPriority = unstable_NormalPriority;
4776  var LowPriority = unstable_LowPriority;
4777  var IdlePriority = unstable_IdlePriority;
4778  // this doesn't actually exist on the scheduler, but it *does*
4779  // on scheduler/unstable_mock, which we'll need for internal testing
4780  var unstable_yieldValue$1 = unstable_yieldValue;
4781  var unstable_setDisableYieldValue$1 = unstable_setDisableYieldValue;
4782
4783  var rendererID = null;
4784  var injectedHook = null;
4785  var injectedProfilingHooks = null;
4786  var hasLoggedError = false;
4787  var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';
4788  function injectInternals(internals) {
4789    if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
4790      // No DevTools
4791      return false;
4792    }
4793
4794    var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
4795
4796    if (hook.isDisabled) {
4797      // This isn't a real property on the hook, but it can be set to opt out
4798      // of DevTools integration and associated warnings and logs.
4799      // https://github.com/facebook/react/issues/3877
4800      return true;
4801    }
4802
4803    if (!hook.supportsFiber) {
4804      {
4805        error('The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://reactjs.org/link/react-devtools');
4806      } // DevTools exists, even though it doesn't support Fiber.
4807
4808
4809      return true;
4810    }
4811
4812    try {
4813      if (enableSchedulingProfiler) {
4814        // Conditionally inject these hooks only if Timeline profiler is supported by this build.
4815        // This gives DevTools a way to feature detect that isn't tied to version number
4816        // (since profiling and timeline are controlled by different feature flags).
4817        internals = assign({}, internals, {
4818          getLaneLabelMap: getLaneLabelMap,
4819          injectProfilingHooks: injectProfilingHooks
4820        });
4821      }
4822
4823      rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks.
4824
4825      injectedHook = hook;
4826    } catch (err) {
4827      // Catch all errors because it is unsafe to throw during initialization.
4828      {
4829        error('React instrumentation encountered an error: %s.', err);
4830      }
4831    }
4832
4833    if (hook.checkDCE) {
4834      // This is the real DevTools.
4835      return true;
4836    } else {
4837      // This is likely a hook installed by Fast Refresh runtime.
4838      return false;
4839    }
4840  }
4841  function onScheduleRoot(root, children) {
4842    {
4843      if (injectedHook && typeof injectedHook.onScheduleFiberRoot === 'function') {
4844        try {
4845          injectedHook.onScheduleFiberRoot(rendererID, root, children);
4846        } catch (err) {
4847          if ( !hasLoggedError) {
4848            hasLoggedError = true;
4849
4850            error('React instrumentation encountered an error: %s', err);
4851          }
4852        }
4853      }
4854    }
4855  }
4856  function onCommitRoot(root, eventPriority) {
4857    if (injectedHook && typeof injectedHook.onCommitFiberRoot === 'function') {
4858      try {
4859        var didError = (root.current.flags & DidCapture) === DidCapture;
4860
4861        if (enableProfilerTimer) {
4862          var schedulerPriority;
4863
4864          switch (eventPriority) {
4865            case DiscreteEventPriority:
4866              schedulerPriority = ImmediatePriority;
4867              break;
4868
4869            case ContinuousEventPriority:
4870              schedulerPriority = UserBlockingPriority;
4871              break;
4872
4873            case DefaultEventPriority:
4874              schedulerPriority = NormalPriority;
4875              break;
4876
4877            case IdleEventPriority:
4878              schedulerPriority = IdlePriority;
4879              break;
4880
4881            default:
4882              schedulerPriority = NormalPriority;
4883              break;
4884          }
4885
4886          injectedHook.onCommitFiberRoot(rendererID, root, schedulerPriority, didError);
4887        } else {
4888          injectedHook.onCommitFiberRoot(rendererID, root, undefined, didError);
4889        }
4890      } catch (err) {
4891        {
4892          if (!hasLoggedError) {
4893            hasLoggedError = true;
4894
4895            error('React instrumentation encountered an error: %s', err);
4896          }
4897        }
4898      }
4899    }
4900  }
4901  function onPostCommitRoot(root) {
4902    if (injectedHook && typeof injectedHook.onPostCommitFiberRoot === 'function') {
4903      try {
4904        injectedHook.onPostCommitFiberRoot(rendererID, root);
4905      } catch (err) {
4906        {
4907          if (!hasLoggedError) {
4908            hasLoggedError = true;
4909
4910            error('React instrumentation encountered an error: %s', err);
4911          }
4912        }
4913      }
4914    }
4915  }
4916  function onCommitUnmount(fiber) {
4917    if (injectedHook && typeof injectedHook.onCommitFiberUnmount === 'function') {
4918      try {
4919        injectedHook.onCommitFiberUnmount(rendererID, fiber);
4920      } catch (err) {
4921        {
4922          if (!hasLoggedError) {
4923            hasLoggedError = true;
4924
4925            error('React instrumentation encountered an error: %s', err);
4926          }
4927        }
4928      }
4929    }
4930  }
4931  function setIsStrictModeForDevtools(newIsStrictMode) {
4932    {
4933      if (typeof unstable_yieldValue$1 === 'function') {
4934        // We're in a test because Scheduler.unstable_yieldValue only exists
4935        // in SchedulerMock. To reduce the noise in strict mode tests,
4936        // suppress warnings and disable scheduler yielding during the double render
4937        unstable_setDisableYieldValue$1(newIsStrictMode);
4938        setSuppressWarning(newIsStrictMode);
4939      }
4940
4941      if (injectedHook && typeof injectedHook.setStrictMode === 'function') {
4942        try {
4943          injectedHook.setStrictMode(rendererID, newIsStrictMode);
4944        } catch (err) {
4945          {
4946            if (!hasLoggedError) {
4947              hasLoggedError = true;
4948
4949              error('React instrumentation encountered an error: %s', err);
4950            }
4951          }
4952        }
4953      }
4954    }
4955  } // Profiler API hooks
4956
4957  function injectProfilingHooks(profilingHooks) {
4958    injectedProfilingHooks = profilingHooks;
4959  }
4960
4961  function getLaneLabelMap() {
4962    {
4963      var map = new Map();
4964      var lane = 1;
4965
4966      for (var index = 0; index < TotalLanes; index++) {
4967        var label = getLabelForLane(lane);
4968        map.set(lane, label);
4969        lane *= 2;
4970      }
4971
4972      return map;
4973    }
4974  }
4975
4976  function markCommitStarted(lanes) {
4977    {
4978      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markCommitStarted === 'function') {
4979        injectedProfilingHooks.markCommitStarted(lanes);
4980      }
4981    }
4982  }
4983  function markCommitStopped() {
4984    {
4985      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markCommitStopped === 'function') {
4986        injectedProfilingHooks.markCommitStopped();
4987      }
4988    }
4989  }
4990  function markComponentRenderStarted(fiber) {
4991    {
4992      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentRenderStarted === 'function') {
4993        injectedProfilingHooks.markComponentRenderStarted(fiber);
4994      }
4995    }
4996  }
4997  function markComponentRenderStopped() {
4998    {
4999      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentRenderStopped === 'function') {
5000        injectedProfilingHooks.markComponentRenderStopped();
5001      }
5002    }
5003  }
5004  function markComponentPassiveEffectMountStarted(fiber) {
5005    {
5006      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectMountStarted === 'function') {
5007        injectedProfilingHooks.markComponentPassiveEffectMountStarted(fiber);
5008      }
5009    }
5010  }
5011  function markComponentPassiveEffectMountStopped() {
5012    {
5013      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectMountStopped === 'function') {
5014        injectedProfilingHooks.markComponentPassiveEffectMountStopped();
5015      }
5016    }
5017  }
5018  function markComponentPassiveEffectUnmountStarted(fiber) {
5019    {
5020      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectUnmountStarted === 'function') {
5021        injectedProfilingHooks.markComponentPassiveEffectUnmountStarted(fiber);
5022      }
5023    }
5024  }
5025  function markComponentPassiveEffectUnmountStopped() {
5026    {
5027      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectUnmountStopped === 'function') {
5028        injectedProfilingHooks.markComponentPassiveEffectUnmountStopped();
5029      }
5030    }
5031  }
5032  function markComponentLayoutEffectMountStarted(fiber) {
5033    {
5034      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectMountStarted === 'function') {
5035        injectedProfilingHooks.markComponentLayoutEffectMountStarted(fiber);
5036      }
5037    }
5038  }
5039  function markComponentLayoutEffectMountStopped() {
5040    {
5041      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectMountStopped === 'function') {
5042        injectedProfilingHooks.markComponentLayoutEffectMountStopped();
5043      }
5044    }
5045  }
5046  function markComponentLayoutEffectUnmountStarted(fiber) {
5047    {
5048      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectUnmountStarted === 'function') {
5049        injectedProfilingHooks.markComponentLayoutEffectUnmountStarted(fiber);
5050      }
5051    }
5052  }
5053  function markComponentLayoutEffectUnmountStopped() {
5054    {
5055      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectUnmountStopped === 'function') {
5056        injectedProfilingHooks.markComponentLayoutEffectUnmountStopped();
5057      }
5058    }
5059  }
5060  function markComponentErrored(fiber, thrownValue, lanes) {
5061    {
5062      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentErrored === 'function') {
5063        injectedProfilingHooks.markComponentErrored(fiber, thrownValue, lanes);
5064      }
5065    }
5066  }
5067  function markComponentSuspended(fiber, wakeable, lanes) {
5068    {
5069      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentSuspended === 'function') {
5070        injectedProfilingHooks.markComponentSuspended(fiber, wakeable, lanes);
5071      }
5072    }
5073  }
5074  function markLayoutEffectsStarted(lanes) {
5075    {
5076      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markLayoutEffectsStarted === 'function') {
5077        injectedProfilingHooks.markLayoutEffectsStarted(lanes);
5078      }
5079    }
5080  }
5081  function markLayoutEffectsStopped() {
5082    {
5083      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markLayoutEffectsStopped === 'function') {
5084        injectedProfilingHooks.markLayoutEffectsStopped();
5085      }
5086    }
5087  }
5088  function markPassiveEffectsStarted(lanes) {
5089    {
5090      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markPassiveEffectsStarted === 'function') {
5091        injectedProfilingHooks.markPassiveEffectsStarted(lanes);
5092      }
5093    }
5094  }
5095  function markPassiveEffectsStopped() {
5096    {
5097      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markPassiveEffectsStopped === 'function') {
5098        injectedProfilingHooks.markPassiveEffectsStopped();
5099      }
5100    }
5101  }
5102  function markRenderStarted(lanes) {
5103    {
5104      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderStarted === 'function') {
5105        injectedProfilingHooks.markRenderStarted(lanes);
5106      }
5107    }
5108  }
5109  function markRenderYielded() {
5110    {
5111      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderYielded === 'function') {
5112        injectedProfilingHooks.markRenderYielded();
5113      }
5114    }
5115  }
5116  function markRenderStopped() {
5117    {
5118      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderStopped === 'function') {
5119        injectedProfilingHooks.markRenderStopped();
5120      }
5121    }
5122  }
5123  function markRenderScheduled(lane) {
5124    {
5125      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderScheduled === 'function') {
5126        injectedProfilingHooks.markRenderScheduled(lane);
5127      }
5128    }
5129  }
5130  function markForceUpdateScheduled(fiber, lane) {
5131    {
5132      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markForceUpdateScheduled === 'function') {
5133        injectedProfilingHooks.markForceUpdateScheduled(fiber, lane);
5134      }
5135    }
5136  }
5137  function markStateUpdateScheduled(fiber, lane) {
5138    {
5139      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markStateUpdateScheduled === 'function') {
5140        injectedProfilingHooks.markStateUpdateScheduled(fiber, lane);
5141      }
5142    }
5143  }
5144
5145  var NoMode =
5146  /*                         */
5147  0; // TODO: Remove ConcurrentMode by reading from the root tag instead
5148
5149  var ConcurrentMode =
5150  /*                 */
5151  1;
5152  var ProfileMode =
5153  /*                    */
5154  2;
5155  var StrictLegacyMode =
5156  /*               */
5157  8;
5158  var StrictEffectsMode =
5159  /*              */
5160  16;
5161
5162  // TODO: This is pretty well supported by browsers. Maybe we can drop it.
5163  var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros.
5164  // Based on:
5165  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
5166
5167  var log = Math.log;
5168  var LN2 = Math.LN2;
5169
5170  function clz32Fallback(x) {
5171    var asUint = x >>> 0;
5172
5173    if (asUint === 0) {
5174      return 32;
5175    }
5176
5177    return 31 - (log(asUint) / LN2 | 0) | 0;
5178  }
5179
5180  // If those values are changed that package should be rebuilt and redeployed.
5181
5182  var TotalLanes = 31;
5183  var NoLanes =
5184  /*                        */
5185  0;
5186  var NoLane =
5187  /*                          */
5188  0;
5189  var SyncLane =
5190  /*                        */
5191  1;
5192  var InputContinuousHydrationLane =
5193  /*    */
5194  2;
5195  var InputContinuousLane =
5196  /*             */
5197  4;
5198  var DefaultHydrationLane =
5199  /*            */
5200  8;
5201  var DefaultLane =
5202  /*                     */
5203  16;
5204  var TransitionHydrationLane =
5205  /*                */
5206  32;
5207  var TransitionLanes =
5208  /*                       */
5209  4194240;
5210  var TransitionLane1 =
5211  /*                        */
5212  64;
5213  var TransitionLane2 =
5214  /*                        */
5215  128;
5216  var TransitionLane3 =
5217  /*                        */
5218  256;
5219  var TransitionLane4 =
5220  /*                        */
5221  512;
5222  var TransitionLane5 =
5223  /*                        */
5224  1024;
5225  var TransitionLane6 =
5226  /*                        */
5227  2048;
5228  var TransitionLane7 =
5229  /*                        */
5230  4096;
5231  var TransitionLane8 =
5232  /*                        */
5233  8192;
5234  var TransitionLane9 =
5235  /*                        */
5236  16384;
5237  var TransitionLane10 =
5238  /*                       */
5239  32768;
5240  var TransitionLane11 =
5241  /*                       */
5242  65536;
5243  var TransitionLane12 =
5244  /*                       */
5245  131072;
5246  var TransitionLane13 =
5247  /*                       */
5248  262144;
5249  var TransitionLane14 =
5250  /*                       */
5251  524288;
5252  var TransitionLane15 =
5253  /*                       */
5254  1048576;
5255  var TransitionLane16 =
5256  /*                       */
5257  2097152;
5258  var RetryLanes =
5259  /*                            */
5260  130023424;
5261  var RetryLane1 =
5262  /*                             */
5263  4194304;
5264  var RetryLane2 =
5265  /*                             */
5266  8388608;
5267  var RetryLane3 =
5268  /*                             */
5269  16777216;
5270  var RetryLane4 =
5271  /*                             */
5272  33554432;
5273  var RetryLane5 =
5274  /*                             */
5275  67108864;
5276  var SomeRetryLane = RetryLane1;
5277  var SelectiveHydrationLane =
5278  /*          */
5279  134217728;
5280  var NonIdleLanes =
5281  /*                          */
5282  268435455;
5283  var IdleHydrationLane =
5284  /*               */
5285  268435456;
5286  var IdleLane =
5287  /*                        */
5288  536870912;
5289  var OffscreenLane =
5290  /*                   */
5291  1073741824; // This function is used for the experimental timeline (react-devtools-timeline)
5292  // It should be kept in sync with the Lanes values above.
5293
5294  function getLabelForLane(lane) {
5295    {
5296      if (lane & SyncLane) {
5297        return 'Sync';
5298      }
5299
5300      if (lane & InputContinuousHydrationLane) {
5301        return 'InputContinuousHydration';
5302      }
5303
5304      if (lane & InputContinuousLane) {
5305        return 'InputContinuous';
5306      }
5307
5308      if (lane & DefaultHydrationLane) {
5309        return 'DefaultHydration';
5310      }
5311
5312      if (lane & DefaultLane) {
5313        return 'Default';
5314      }
5315
5316      if (lane & TransitionHydrationLane) {
5317        return 'TransitionHydration';
5318      }
5319
5320      if (lane & TransitionLanes) {
5321        return 'Transition';
5322      }
5323
5324      if (lane & RetryLanes) {
5325        return 'Retry';
5326      }
5327
5328      if (lane & SelectiveHydrationLane) {
5329        return 'SelectiveHydration';
5330      }
5331
5332      if (lane & IdleHydrationLane) {
5333        return 'IdleHydration';
5334      }
5335
5336      if (lane & IdleLane) {
5337        return 'Idle';
5338      }
5339
5340      if (lane & OffscreenLane) {
5341        return 'Offscreen';
5342      }
5343    }
5344  }
5345  var NoTimestamp = -1;
5346  var nextTransitionLane = TransitionLane1;
5347  var nextRetryLane = RetryLane1;
5348
5349  function getHighestPriorityLanes(lanes) {
5350    switch (getHighestPriorityLane(lanes)) {
5351      case SyncLane:
5352        return SyncLane;
5353
5354      case InputContinuousHydrationLane:
5355        return InputContinuousHydrationLane;
5356
5357      case InputContinuousLane:
5358        return InputContinuousLane;
5359
5360      case DefaultHydrationLane:
5361        return DefaultHydrationLane;
5362
5363      case DefaultLane:
5364        return DefaultLane;
5365
5366      case TransitionHydrationLane:
5367        return TransitionHydrationLane;
5368
5369      case TransitionLane1:
5370      case TransitionLane2:
5371      case TransitionLane3:
5372      case TransitionLane4:
5373      case TransitionLane5:
5374      case TransitionLane6:
5375      case TransitionLane7:
5376      case TransitionLane8:
5377      case TransitionLane9:
5378      case TransitionLane10:
5379      case TransitionLane11:
5380      case TransitionLane12:
5381      case TransitionLane13:
5382      case TransitionLane14:
5383      case TransitionLane15:
5384      case TransitionLane16:
5385        return lanes & TransitionLanes;
5386
5387      case RetryLane1:
5388      case RetryLane2:
5389      case RetryLane3:
5390      case RetryLane4:
5391      case RetryLane5:
5392        return lanes & RetryLanes;
5393
5394      case SelectiveHydrationLane:
5395        return SelectiveHydrationLane;
5396
5397      case IdleHydrationLane:
5398        return IdleHydrationLane;
5399
5400      case IdleLane:
5401        return IdleLane;
5402
5403      case OffscreenLane:
5404        return OffscreenLane;
5405
5406      default:
5407        {
5408          error('Should have found matching lanes. This is a bug in React.');
5409        } // This shouldn't be reachable, but as a fallback, return the entire bitmask.
5410
5411
5412        return lanes;
5413    }
5414  }
5415
5416  function getNextLanes(root, wipLanes) {
5417    // Early bailout if there's no pending work left.
5418    var pendingLanes = root.pendingLanes;
5419
5420    if (pendingLanes === NoLanes) {
5421      return NoLanes;
5422    }
5423
5424    var nextLanes = NoLanes;
5425    var suspendedLanes = root.suspendedLanes;
5426    var pingedLanes = root.pingedLanes;
5426 // Do not work on any idle work until all the non-idle work has finished,
5427    // even if the work is suspended.
5428
5429    var nonIdlePendingLanes = pendingLanes & NonIdleLanes;
5430
5431    if (nonIdlePendingLanes !== NoLanes) {
5432      var nonIdleUnblockedLanes = nonIdlePendingLanes & ~suspendedLanes;
5433
5434      if (nonIdleUnblockedLanes !== NoLanes) {
5435        nextLanes = getHighestPriorityLanes(nonIdleUnblockedLanes);
5436      } else {
5437        var nonIdlePingedLanes = nonIdlePendingLanes & pingedLanes;
5438
5439        if (nonIdlePingedLanes !== NoLanes) {
5440          nextLanes = getHighestPriorityLanes(nonIdlePingedLanes);
5441        }
5442      }
5443    } else {
5444      // The only remaining work is Idle.
5445      var unblockedLanes = pendingLanes & ~suspendedLanes;
5446
5447      if (unblockedLanes !== NoLanes) {
5448        nextLanes = getHighestPriorityLanes(unblockedLanes);
5449      } else {
5450        if (pingedLanes !== NoLanes) {
5451          nextLanes = getHighestPriorityLanes(pingedLanes);
5452        }
5453      }
5454    }
5455
5456    if (nextLanes === NoLanes) {
5457      // This should only be reachable if we're suspended
5458      // TODO: Consider warning in this path if a fallback timer is not scheduled.
5459      return NoLanes;
5460    } // If we're already in the middle of a render, switching lanes will interrupt
5461    // it and we'll lose our progress. We should only do this if the new lanes are
5462    // higher priority.
5463
5464
5465    if (wipLanes !== NoLanes && wipLanes !== nextLanes && // If we already suspended with a delay, then interrupting is fine. Don't
5466    // bother waiting until the root is complete.
5467    (wipLanes & suspendedLanes) === NoLanes) {
5468      var nextLane = getHighestPriorityLane(nextLanes);
5469      var wipLane = getHighestPriorityLane(wipLanes);
5470
5471      if ( // Tests whether the next lane is equal or lower priority than the wip
5472      // one. This works because the bits decrease in priority as you go left.
5473      nextLane >= wipLane || // Default priority updates should not interrupt transition updates. The
5474      // only difference between default updates and transition updates is that
5475      // default updates do not support refresh transitions.
5476      nextLane === DefaultLane && (wipLane & TransitionLanes) !== NoLanes) {
5477        // Keep working on the existing in-progress tree. Do not interrupt.
5478        return wipLanes;
5479      }
5480    }
5481
5482    if ((nextLanes & InputContinuousLane) !== NoLanes) {
5483      // When updates are sync by default, we entangle continuous priority updates
5484      // and default updates, so they render in the same batch. The only reason
5485      // they use separate lanes is because continuous updates should interrupt
5486      // transitions, but default updates should not.
5487      nextLanes |= pendingLanes & DefaultLane;
5488    } // Check for entangled lanes and add them to the batch.
5489    //
5490    // A lane is said to be entangled with another when it's not allowed to render
5491    // in a batch that does not also include the other lane. Typically we do this
5492    // when multiple updates have the same source, and we only want to respond to
5493    // the most recent event from that source.
5494    //
5495    // Note that we apply entanglements *after* checking for partial work above.
5496    // This means that if a lane is entangled during an interleaved event while
5497    // it's already rendering, we won't interrupt it. This is intentional, since
5498    // entanglement is usually "best effort": we'll try our best to render the
5499    // lanes in the same batch, but it's not worth throwing out partially
5500    // completed work in order to do it.
5501    // TODO: Reconsider this. The counter-argument is that the partial work
5502    // represents an intermediate state, which we don't want to show to the user.
5503    // And by spending extra time finishing it, we're increasing the amount of
5504    // time it takes to show the final state, which is what they are actually
5505    // waiting for.
5506    //
5507    // For those exceptions where entanglement is semantically important, like
5508    // useMutableSource, we should ensure that there is no partial work at the
5509    // time we apply the entanglement.
5510
5511
5512    var entangledLanes = root.entangledLanes;
5513
5514    if (entangledLanes !== NoLanes) {
5515      var entanglements = root.entanglements;
5516      var lanes = nextLanes & entangledLanes;
5517
5518      while (lanes > 0) {
5519        var index = pickArbitraryLaneIndex(lanes);
5520        var lane = 1 << index;
5521        nextLanes |= entanglements[index];
5522        lanes &= ~lane;
5523      }
5524    }
5525
5526    return nextLanes;
5527  }
5528  function getMostRecentEventTime(root, lanes) {
5529    var eventTimes = root.eventTimes;
5530    var mostRecentEventTime = NoTimestamp;
5531
5532    while (lanes > 0) {
5533      var index = pickArbitraryLaneIndex(lanes);
5534      var lane = 1 << index;
5535      var eventTime = eventTimes[index];
5536
5537      if (eventTime > mostRecentEventTime) {
5538        mostRecentEventTime = eventTime;
5539      }
5540
5541      lanes &= ~lane;
5542    }
5543
5544    return mostRecentEventTime;
5545  }
5546
5547  function computeExpirationTime(lane, currentTime) {
5548    switch (lane) {
5549      case SyncLane:
5550      case InputContinuousHydrationLane:
5551      case InputContinuousLane:
5552        // User interactions should expire slightly more quickly.
5553        //
5554        // NOTE: This is set to the corresponding constant as in Scheduler.js.
5555        // When we made it larger, a product metric in www regressed, suggesting
5556        // there's a user interaction that's being starved by a series of
5557        // synchronous updates. If that theory is correct, the proper solution is
5558        // to fix the starvation. However, this scenario supports the idea that
5559        // expiration times are an important safeguard when starvation
5560        // does happen.
5561        return currentTime + 250;
5562
5563      case DefaultHydrationLane:
5564      case DefaultLane:
5565      case TransitionHydrationLane:
5566      case TransitionLane1:
5567      case TransitionLane2:
5568      case TransitionLane3:
5569      case TransitionLane4:
5570      case TransitionLane5:
5571      case TransitionLane6:
5572      case TransitionLane7:
5573      case TransitionLane8:
5574      case TransitionLane9:
5575      case TransitionLane10:
5576      case TransitionLane11:
5577      case TransitionLane12:
5578      case TransitionLane13:
5579      case TransitionLane14:
5580      case TransitionLane15:
5581      case TransitionLane16:
5582        return currentTime + 5000;
5583
5584      case RetryLane1:
5585      case RetryLane2:
5586      case RetryLane3:
5587      case RetryLane4:
5588      case RetryLane5:
5589        // TODO: Retries should be allowed to expire if they are CPU bound for
5590        // too long, but when I made this change it caused a spike in browser
5591        // crashes. There must be some other underlying bug; not super urgent but
5592        // ideally should figure out why and fix it. Unfortunately we don't have
5593        // a repro for the crashes, only detected via production metrics.
5594        return NoTimestamp;
5595
5596      case SelectiveHydrationLane:
5597      case IdleHydrationLane:
5598      case IdleLane:
5599      case OffscreenLane:
5600        // Anything idle priority or lower should never expire.
5601        return NoTimestamp;
5602
5603      default:
5604        {
5605          error('Should have found matching lanes. This is a bug in React.');
5606        }
5607
5608        return NoTimestamp;
5609    }
5610  }
5611
5612  function markStarvedLanesAsExpired(root, currentTime) {
5613    // TODO: This gets called every time we yield. We can optimize by storing
5614    // the earliest expiration time on the root. Then use that to quickly bail out
5615    // of this function.
5616    var pendingLanes = root.pendingLanes;
5617    var suspendedLanes = root.suspendedLanes;
5618    var pingedLanes = root.pingedLanes;
5619    var expirationTimes = root.expirationTimes; // Iterate through the pending lanes and check if we've reached their
5620    // expiration time. If so, we'll assume the update is being starved and mark
5621    // it as expired to force it to finish.
5622
5623    var lanes = pendingLanes;
5624
5625    while (lanes > 0) {
5626      var index = pickArbitraryLaneIndex(lanes);
5627      var lane = 1 << index;
5628      var expirationTime = expirationTimes[index];
5629
5630      if (expirationTime === NoTimestamp) {
5631        // Found a pending lane with no expiration time. If it's not suspended, or
5632        // if it's pinged, assume it's CPU-bound. Compute a new expiration time
5633        // using the current time.
5634        if ((lane & suspendedLanes) === NoLanes || (lane & pingedLanes) !== NoLanes) {
5635          // Assumes timestamps are monotonically increasing.
5636          expirationTimes[index] = computeExpirationTime(lane, currentTime);
5637        }
5638      } else if (expirationTime <= currentTime) {
5639        // This lane expired
5640        root.expiredLanes |= lane;
5641      }
5642
5643      lanes &= ~lane;
5644    }
5645  } // This returns the highest priority pending lanes regardless of whether they
5646  // are suspended.
5647
5648  function getHighestPriorityPendingLanes(root) {
5649    return getHighestPriorityLanes(root.pendingLanes);
5650  }
5651  function getLanesToRetrySynchronouslyOnError(root) {
5652    var everythingButOffscreen = root.pendingLanes & ~OffscreenLane;
5653
5654    if (everythingButOffscreen !== NoLanes) {
5655      return everythingButOffscreen;
5656    }
5657
5658    if (everythingButOffscreen & OffscreenLane) {
5659      return OffscreenLane;
5660    }
5661
5662    return NoLanes;
5663  }
5664  function includesSyncLane(lanes) {
5665    return (lanes & SyncLane) !== NoLanes;
5666  }
5667  function includesNonIdleWork(lanes) {
5668    return (lanes & NonIdleLanes) !== NoLanes;
5669  }
5670  function includesOnlyRetries(lanes) {
5671    return (lanes & RetryLanes) === lanes;
5672  }
5673  function includesOnlyNonUrgentLanes(lanes) {
5674    var UrgentLanes = SyncLane | InputContinuousLane | DefaultLane;
5675    return (lanes & UrgentLanes) === NoLanes;
5676  }
5677  function includesOnlyTransitions(lanes) {
5678    return (lanes & TransitionLanes) === lanes;
5679  }
5680  function includesBlockingLane(root, lanes) {
5681
5682    var SyncDefaultLanes = InputContinuousHydrationLane | InputContinuousLane | DefaultHydrationLane | DefaultLane;
5683    return (lanes & SyncDefaultLanes) !== NoLanes;
5684  }
5685  function includesExpiredLane(root, lanes) {
5686    // This is a separate check from includesBlockingLane because a lane can
5687    // expire after a render has already started.
5688    return (lanes & root.expiredLanes) !== NoLanes;
5689  }
5690  function isTransitionLane(lane) {
5691    return (lane & TransitionLanes) !== NoLanes;
5692  }
5693  function claimNextTransitionLane() {
5694    // Cycle through the lanes, assigning each new transition to the next lane.
5695    // In most cases, this means every transition gets its own lane, until we
5696    // run out of lanes and cycle back to the beginning.
5697    var lane = nextTransitionLane;
5698    nextTransitionLane <<= 1;
5699
5700    if ((nextTransitionLane & TransitionLanes) === NoLanes) {
5701      nextTransitionLane = TransitionLane1;
5702    }
5703
5704    return lane;
5705  }
5706  function claimNextRetryLane() {
5707    var lane = nextRetryLane;
5708    nextRetryLane <<= 1;
5709
5710    if ((nextRetryLane & RetryLanes) === NoLanes) {
5711      nextRetryLane = RetryLane1;
5712    }
5713
5714    return lane;
5715  }
5716  function getHighestPriorityLane(lanes) {
5717    return lanes & -lanes;
5718  }
5719  function pickArbitraryLane(lanes) {
5720    // This wrapper function gets inlined. Only exists so to communicate that it
5721    // doesn't matter which bit is selected; you can pick any bit without
5722    // affecting the algorithms where its used. Here I'm using
5723    // getHighestPriorityLane because it requires the fewest operations.
5724    return getHighestPriorityLane(lanes);
5725  }
5726
5727  function pickArbitraryLaneIndex(lanes) {
5728    return 31 - clz32(lanes);
5729  }
5730
5731  function laneToIndex(lane) {
5732    return pickArbitraryLaneIndex(lane);
5733  }
5734
5735  function includesSomeLane(a, b) {
5736    return (a & b) !== NoLanes;
5737  }
5738  function isSubsetOfLanes(set, subset) {
5739    return (set & subset) === subset;
5740  }
5741  function mergeLanes(a, b) {
5742    return a | b;
5743  }
5744  function removeLanes(set, subset) {
5745    return set & ~subset;
5746  }
5747  function intersectLanes(a, b) {
5748    return a & b;
5749  } // Seems redundant, but it changes the type from a single lane (used for
5750  // updates) to a group of lanes (used for flushing work).
5751
5752  function laneToLanes(lane) {
5753    return lane;
5754  }
5755  function higherPriorityLane(a, b) {
5756    // This works because the bit ranges decrease in priority as you go left.
5757    return a !== NoLane && a < b ? a : b;
5758  }
5759  function createLaneMap(initial) {
5760    // Intentionally pushing one by one.
5761    // https://v8.dev/blog/elements-kinds#avoid-creating-holes
5762    var laneMap = [];
5763
5764    for (var i = 0; i < TotalLanes; i++) {
5765      laneMap.push(initial);
5766    }
5767
5768    return laneMap;
5769  }
5770  function markRootUpdated(root, updateLane, eventTime) {
5771    root.pendingLanes |= updateLane; // If there are any suspended transitions, it's possible this new update
5772    // could unblock them. Clear the suspended lanes so that we can try rendering
5773    // them again.
5774    //
5775    // TODO: We really only need to unsuspend only lanes that are in the
5776    // `subtreeLanes` of the updated fiber, or the update lanes of the return
5777    // path. This would exclude suspended updates in an unrelated sibling tree,
5778    // since there's no way for this update to unblock it.
5779    //
5780    // We don't do this if the incoming update is idle, because we never process
5781    // idle updates until after all the regular updates have finished; there's no
5782    // way it could unblock a transition.
5783
5784    if (updateLane !== IdleLane) {
5785      root.suspendedLanes = NoLanes;
5786      root.pingedLanes = NoLanes;
5787    }
5788
5789    var eventTimes = root.eventTimes;
5790    var index = laneToIndex(updateLane); // We can always overwrite an existing timestamp because we prefer the most
5791    // recent event, and we assume time is monotonically increasing.
5792
5793    eventTimes[index] = eventTime;
5794  }
5795  function markRootSuspended(root, suspendedLanes) {
5796    root.suspendedLanes |= suspendedLanes;
5797    root.pingedLanes &= ~suspendedLanes; // The suspended lanes are no longer CPU-bound. Clear their expiration times.
5798
5799    var expirationTimes = root.expirationTimes;
5800    var lanes = suspendedLanes;
5801
5802    while (lanes > 0) {
5803      var index = pickArbitraryLaneIndex(lanes);
5804      var lane = 1 << index;
5805      expirationTimes[index] = NoTimestamp;
5806      lanes &= ~lane;
5807    }
5808  }
5809  function markRootPinged(root, pingedLanes, eventTime) {
5810    root.pingedLanes |= root.suspendedLanes & pingedLanes;
5811  }
5812  function markRootFinished(root, remainingLanes) {
5813    var noLongerPendingLanes = root.pendingLanes & ~remainingLanes;
5814    root.pendingLanes = remainingLanes; // Let's try everything again
5815
5816    root.suspendedLanes = NoLanes;
5817    root.pingedLanes = NoLanes;
5818    root.expiredLanes &= remainingLanes;
5819    root.mutableReadLanes &= remainingLanes;
5820    root.entangledLanes &= remainingLanes;
5821    var entanglements = root.entanglements;
5822    var eventTimes = root.eventTimes;
5823    var expirationTimes = root.expirationTimes; // Clear the lanes that no longer have pending work
5824
5825    var lanes = noLongerPendingLanes;
5826
5827    while (lanes > 0) {
5828      var index = pickArbitraryLaneIndex(lanes);
5829      var lane = 1 << index;
5830      entanglements[index] = NoLanes;
5831      eventTimes[index] = NoTimestamp;
5832      expirationTimes[index] = NoTimestamp;
5833      lanes &= ~lane;
5834    }
5835  }
5836  function markRootEntangled(root, entangledLanes) {
5837    // In addition to entangling each of the given lanes with each other, we also
5838    // have to consider _transitive_ entanglements. For each lane that is already
5839    // entangled with *any* of the given lanes, that lane is now transitively
5840    // entangled with *all* the given lanes.
5841    //
5842    // Translated: If C is entangled with A, then entangling A with B also
5843    // entangles C with B.
5844    //
5845    // If this is hard to grasp, it might help to intentionally break this
5846    // function and look at the tests that fail in ReactTransition-test.js. Try
5847    // commenting out one of the conditions below.
5848    var rootEntangledLanes = root.entangledLanes |= entangledLanes;
5849    var entanglements = root.entanglements;
5850    var lanes = rootEntangledLanes;
5851
5852    while (lanes) {
5853      var index = pickArbitraryLaneIndex(lanes);
5854      var lane = 1 << index;
5855
5856      if ( // Is this one of the newly entangled lanes?
5857      lane & entangledLanes | // Is this lane transitively entangled with the newly entangled lanes?
5858      entanglements[index] & entangledLanes) {
5859        entanglements[index] |= entangledLanes;
5860      }
5861
5862      lanes &= ~lane;
5863    }
5864  }
5865  function getBumpedLaneForHydration(root, renderLanes) {
5866    var renderLane = getHighestPriorityLane(renderLanes);
5867    var lane;
5868
5869    switch (renderLane) {
5870      case InputContinuousLane:
5871        lane = InputContinuousHydrationLane;
5872        break;
5873
5874      case DefaultLane:
5875        lane = DefaultHydrationLane;
5876        break;
5877
5878      case TransitionLane1:
5879      case TransitionLane2:
5880      case TransitionLane3:
5881      case TransitionLane4:
5882      case TransitionLane5:
5883      case TransitionLane6:
5884      case TransitionLane7:
5885      case TransitionLane8:
5886      case TransitionLane9:
5887      case TransitionLane10:
5888      case TransitionLane11:
5889      case TransitionLane12:
5890      case TransitionLane13:
5891      case TransitionLane14:
5892      case TransitionLane15:
5893      case TransitionLane16:
5894      case RetryLane1:
5895      case RetryLane2:
5896      case RetryLane3:
5897      case RetryLane4:
5898      case RetryLane5:
5899        lane = TransitionHydrationLane;
5900        break;
5901
5902      case IdleLane:
5903        lane = IdleHydrationLane;
5904        break;
5905
5906      default:
5907        // Everything else is already either a hydration lane, or shouldn't
5908        // be retried at a hydration lane.
5909        lane = NoLane;
5910        break;
5911    } // Check if the lane we chose is suspended. If so, that indicates that we
5912    // already attempted and failed to hydrate at that level. Also check if we're
5913    // already rendering that lane, which is rare but could happen.
5914
5915
5916    if ((lane & (root.suspendedLanes | renderLanes)) !== NoLane) {
5917      // Give up trying to hydrate and fall back to client render.
5918      return NoLane;
5919    }
5920
5921    return lane;
5922  }
5923  function addFiberToLanesMap(root, fiber, lanes) {
5924
5925    if (!isDevToolsPresent) {
5926      return;
5927    }
5928
5929    var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap;
5930
5931    while (lanes > 0) {
5932      var index = laneToIndex(lanes);
5933      var lane = 1 << index;
5934      var updaters = pendingUpdatersLaneMap[index];
5935      updaters.add(fiber);
5936      lanes &= ~lane;
5937    }
5938  }
5939  function movePendingFibersToMemoized(root, lanes) {
5940
5941    if (!isDevToolsPresent) {
5942      return;
5943    }
5944
5945    var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap;
5946    var memoizedUpdaters = root.memoizedUpdaters;
5947
5948    while (lanes > 0) {
5949      var index = laneToIndex(lanes);
5950      var lane = 1 << index;
5951      var updaters = pendingUpdatersLaneMap[index];
5952
5953      if (updaters.size > 0) {
5954        updaters.forEach(function (fiber) {
5955          var alternate = fiber.alternate;
5956
5957          if (alternate === null || !memoizedUpdaters.has(alternate)) {
5958            memoizedUpdaters.add(fiber);
5959          }
5960        });
5961        updaters.clear();
5962      }
5963
5964      lanes &= ~lane;
5965    }
5966  }
5967  function getTransitionsForLanes(root, lanes) {
5968    {
5969      return null;
5970    }
5971  }
5972
5973  var DiscreteEventPriority = SyncLane;
5974  var ContinuousEventPriority = InputContinuousLane;
5975  var DefaultEventPriority = DefaultLane;
5976  var IdleEventPriority = IdleLane;
5977  var currentUpdatePriority = NoLane;
5978  function getCurrentUpdatePriority() {
5979    return currentUpdatePriority;
5980  }
5981  function setCurrentUpdatePriority(newPriority) {
5982    currentUpdatePriority = newPriority;
5983  }
5984  function runWithPriority(priority, fn) {
5985    var previousPriority = currentUpdatePriority;
5986
5987    try {
5988      currentUpdatePriority = priority;
5989      return fn();
5990    } finally {
5991      currentUpdatePriority = previousPriority;
5992    }
5993  }
5994  function higherEventPriority(a, b) {
5995    return a !== 0 && a < b ? a : b;
5996  }
5997  function lowerEventPriority(a, b) {
5998    return a === 0 || a > b ? a : b;
5999  }
6000  function isHigherEventPriority(a, b) {
6001    return a !== 0 && a < b;
6002  }
6003  function lanesToEventPriority(lanes) {
6004    var lane = getHighestPriorityLane(lanes);
6005
6006    if (!isHigherEventPriority(DiscreteEventPriority, lane)) {
6007      return DiscreteEventPriority;
6008    }
6009
6010    if (!isHigherEventPriority(ContinuousEventPriority, lane)) {
6011      return ContinuousEventPriority;
6012    }
6013
6014    if (includesNonIdleWork(lane)) {
6015      return DefaultEventPriority;
6016    }
6017
6018    return IdleEventPriority;
6019  }
6020
6021  // This is imported by the event replaying implementation in React DOM. It's
6022  // in a separate file to break a circular dependency between the renderer and
6023  // the reconciler.
6024  function isRootDehydrated(root) {
6025    var currentState = root.current.memoizedState;
6026    return currentState.isDehydrated;
6027  }
6028
6029  var _attemptSynchronousHydration;
6030
6031  function setAttemptSynchronousHydration(fn) {
6032    _attemptSynchronousHydration = fn;
6033  }
6034  function attemptSynchronousHydration(fiber) {
6035    _attemptSynchronousHydration(fiber);
6036  }
6037  var attemptContinuousHydration;
6038  function setAttemptContinuousHydration(fn) {
6039    attemptContinuousHydration = fn;
6040  }
6041  var attemptHydrationAtCurrentPriority;
6042  function setAttemptHydrationAtCurrentPriority(fn) {
6043    attemptHydrationAtCurrentPriority = fn;
6044  }
6045  var getCurrentUpdatePriority$1;
6046  function setGetCurrentUpdatePriority(fn) {
6047    getCurrentUpdatePriority$1 = fn;
6048  }
6049  var attemptHydrationAtPriority;
6050  function setAttemptHydrationAtPriority(fn) {
6051    attemptHydrationAtPriority = fn;
6052  } // TODO: Upgrade this definition once we're on a newer version of Flow that
6053  // has this definition built-in.
6054
6055  var hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed.
6056
6057  var queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout.
6058  // if the last target was dehydrated.
6059
6060  var queuedFocus = null;
6061  var queuedDrag = null;
6062  var queuedMouse = null; // For pointer events there can be one latest event per pointerId.
6063
6064  var queuedPointers = new Map();
6065  var queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too.
6066
6067  var queuedExplicitHydrationTargets = [];
6068  var discreteReplayableEvents = ['mousedown', 'mouseup', 'touchcancel', 'touchend', 'touchstart', 'auxclick', 'dblclick', 'pointercancel', 'pointerdown', 'pointerup', 'dragend', 'dragstart', 'drop', 'compositionend', 'compositionstart', 'keydown', 'ke
6068ypress', 'keyup', 'input', 'textInput', // Intentionally camelCase
6069  'copy', 'cut', 'paste', 'click', 'change', 'contextmenu', 'reset', 'submit'];
6070  function isDiscreteEventThatRequiresHydration(eventType) {
6071    return discreteReplayableEvents.indexOf(eventType) > -1;
6072  }
6073
6074  function createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6075    return {
6076      blockedOn: blockedOn,
6077      domEventName: domEventName,
6078      eventSystemFlags: eventSystemFlags,
6079      nativeEvent: nativeEvent,
6080      targetContainers: [targetContainer]
6081    };
6082  }
6083
6084  function clearIfContinuousEvent(domEventName, nativeEvent) {
6085    switch (domEventName) {
6086      case 'focusin':
6087      case 'focusout':
6088        queuedFocus = null;
6089        break;
6090
6091      case 'dragenter':
6092      case 'dragleave':
6093        queuedDrag = null;
6094        break;
6095
6096      case 'mouseover':
6097      case 'mouseout':
6098        queuedMouse = null;
6099        break;
6100
6101      case 'pointerover':
6102      case 'pointerout':
6103        {
6104          var pointerId = nativeEvent.pointerId;
6105          queuedPointers.delete(pointerId);
6106          break;
6107        }
6108
6109      case 'gotpointercapture':
6110      case 'lostpointercapture':
6111        {
6112          var _pointerId = nativeEvent.pointerId;
6113          queuedPointerCaptures.delete(_pointerId);
6114          break;
6115        }
6116    }
6117  }
6118
6119  function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6120    if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) {
6121      var queuedEvent = createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent);
6122
6123      if (blockedOn !== null) {
6124        var _fiber2 = getInstanceFromNode(blockedOn);
6125
6126        if (_fiber2 !== null) {
6127          // Attempt to increase the priority of this target.
6128          attemptContinuousHydration(_fiber2);
6129        }
6130      }
6131
6132      return queuedEvent;
6133    } // If we have already queued this exact event, then it's because
6134    // the different event systems have different DOM event listeners.
6135    // We can accumulate the flags, and the targetContainers, and
6136    // store a single event to be replayed.
6137
6138
6139    existingQueuedEvent.eventSystemFlags |= eventSystemFlags;
6140    var targetContainers = existingQueuedEvent.targetContainers;
6141
6142    if (targetContainer !== null && targetContainers.indexOf(targetContainer) === -1) {
6143      targetContainers.push(targetContainer);
6144    }
6145
6146    return existingQueuedEvent;
6147  }
6148
6149  function queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6150    // These set relatedTarget to null because the replayed event will be treated as if we
6151    // moved from outside the window (no target) onto the target once it hydrates.
6152    // Instead of mutating we could clone the event.
6153    switch (domEventName) {
6154      case 'focusin':
6155        {
6156          var focusEvent = nativeEvent;
6157          queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, domEventName, eventSystemFlags, targetContainer, focusEvent);
6158          return true;
6159        }
6160
6161      case 'dragenter':
6162        {
6163          var dragEvent = nativeEvent;
6164          queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, domEventName, eventSystemFlags, targetContainer, dragEvent);
6165          return true;
6166        }
6167
6168      case 'mouseover':
6169        {
6170          var mouseEvent = nativeEvent;
6171          queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, domEventName, eventSystemFlags, targetContainer, mouseEvent);
6172          return true;
6173        }
6174
6175      case 'pointerover':
6176        {
6177          var pointerEvent = nativeEvent;
6178          var pointerId = pointerEvent.pointerId;
6179          queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, pointerEvent));
6180          return true;
6181        }
6182
6183      case 'gotpointercapture':
6184        {
6185          var _pointerEvent = nativeEvent;
6186          var _pointerId2 = _pointerEvent.pointerId;
6187          queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, _pointerEvent));
6188          return true;
6189        }
6190    }
6191
6192    return false;
6193  } // Check if this target is unblocked. Returns true if it's unblocked.
6194
6195  function attemptExplicitHydrationTarget(queuedTarget) {
6196    // TODO: This function shares a lot of logic with findInstanceBlockingEvent.
6197    // Try to unify them. It's a bit tricky since it would require two return
6198    // values.
6199    var targetInst = getClosestInstanceFromNode(queuedTarget.target);
6200
6201    if (targetInst !== null) {
6202      var nearestMounted = getNearestMountedFiber(targetInst);
6203
6204      if (nearestMounted !== null) {
6205        var tag = nearestMounted.tag;
6206
6207        if (tag === SuspenseComponent) {
6208          var instance = getSuspenseInstanceFromFiber(nearestMounted);
6209
6210          if (instance !== null) {
6211            // We're blocked on hydrating this boundary.
6212            // Increase its priority.
6213            queuedTarget.blockedOn = instance;
6214            attemptHydrationAtPriority(queuedTarget.priority, function () {
6215              attemptHydrationAtCurrentPriority(nearestMounted);
6216            });
6217            return;
6218          }
6219        } else if (tag === HostRoot) {
6220          var root = nearestMounted.stateNode;
6221
6222          if (isRootDehydrated(root)) {
6223            queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of
6224            // a root other than sync.
6225
6226            return;
6227          }
6228        }
6229      }
6230    }
6231
6232    queuedTarget.blockedOn = null;
6233  }
6234
6235  function queueExplicitHydrationTarget(target) {
6236    // TODO: This will read the priority if it's dispatched by the React
6237    // event system but not native events. Should read window.event.type, like
6238    // we do for updates (getCurrentEventPriority).
6239    var updatePriority = getCurrentUpdatePriority$1();
6240    var queuedTarget = {
6241      blockedOn: null,
6242      target: target,
6243      priority: updatePriority
6244    };
6245    var i = 0;
6246
6247    for (; i < queuedExplicitHydrationTargets.length; i++) {
6248      // Stop once we hit the first target with lower priority than
6249      if (!isHigherEventPriority(updatePriority, queuedExplicitHydrationTargets[i].priority)) {
6250        break;
6251      }
6252    }
6253
6254    queuedExplicitHydrationTargets.splice(i, 0, queuedTarget);
6255
6256    if (i === 0) {
6257      attemptExplicitHydrationTarget(queuedTarget);
6258    }
6259  }
6260
6261  function attemptReplayContinuousQueuedEvent(queuedEvent) {
6262    if (queuedEvent.blockedOn !== null) {
6263      return false;
6264    }
6265
6266    var targetContainers = queuedEvent.targetContainers;
6267
6268    while (targetContainers.length > 0) {
6269      var targetContainer = targetContainers[0];
6270      var nextBlockedOn = findInstanceBlockingEvent(queuedEvent.domEventName, queuedEvent.eventSystemFlags, targetContainer, queuedEvent.nativeEvent);
6271
6272      if (nextBlockedOn === null) {
6273        {
6274          var nativeEvent = queuedEvent.nativeEvent;
6275          var nativeEventClone = new nativeEvent.constructor(nativeEvent.type, nativeEvent);
6276          setReplayingEvent(nativeEventClone);
6277          nativeEvent.target.dispatchEvent(nativeEventClone);
6278          resetReplayingEvent();
6279        }
6280      } else {
6281        // We're still blocked. Try again later.
6282        var _fiber3 = getInstanceFromNode(nextBlockedOn);
6283
6284        if (_fiber3 !== null) {
6285          attemptContinuousHydration(_fiber3);
6286        }
6287
6288        queuedEvent.blockedOn = nextBlockedOn;
6289        return false;
6290      } // This target container was successfully dispatched. Try the next.
6291
6292
6293      targetContainers.shift();
6294    }
6295
6296    return true;
6297  }
6298
6299  function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {
6300    if (attemptReplayContinuousQueuedEvent(queuedEvent)) {
6301      map.delete(key);
6302    }
6303  }
6304
6305  function replayUnblockedEvents() {
6306    hasScheduledReplayAttempt = false;
6307
6308
6309    if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) {
6310      queuedFocus = null;
6311    }
6312
6313    if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) {
6314      queuedDrag = null;
6315    }
6316
6317    if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) {
6318      queuedMouse = null;
6319    }
6320
6321    queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);
vendor: 14,844 bytes, lines 6322-6789
6322    queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);
6323  }
6324
6325  function scheduleCallbackIfUnblocked(queuedEvent, unblocked) {
6326    if (queuedEvent.blockedOn === unblocked) {
6327      queuedEvent.blockedOn = null;
6328
6329      if (!hasScheduledReplayAttempt) {
6330        hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are
6331        // now unblocked. This first might not actually be unblocked yet.
6332        // We could check it early to avoid scheduling an unnecessary callback.
6333
6334        unstable_scheduleCallback(unstable_NormalPriority, replayUnblockedEvents);
6335      }
6336    }
6337  }
6338
6339  function retryIfBlockedOn(unblocked) {
6340    // Mark anything that was blocked on this as no longer blocked
6341    // and eligible for a replay.
6342    if (queuedDiscreteEvents.length > 0) {
6343      scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's
6344      // worth it because we expect very few discrete events to queue up and once
6345      // we are actually fully unblocked it will be fast to replay them.
6346
6347      for (var i = 1; i < queuedDiscreteEvents.length; i++) {
6348        var queuedEvent = queuedDiscreteEvents[i];
6349
6350        if (queuedEvent.blockedOn === unblocked) {
6351          queuedEvent.blockedOn = null;
6352        }
6353      }
6354    }
6355
6356    if (queuedFocus !== null) {
6357      scheduleCallbackIfUnblocked(queuedFocus, unblocked);
6358    }
6359
6360    if (queuedDrag !== null) {
6361      scheduleCallbackIfUnblocked(queuedDrag, unblocked);
6362    }
6363
6364    if (queuedMouse !== null) {
6365      scheduleCallbackIfUnblocked(queuedMouse, unblocked);
6366    }
6367
6368    var unblock = function (queuedEvent) {
6369      return scheduleCallbackIfUnblocked(queuedEvent, unblocked);
6370    };
6371
6372    queuedPointers.forEach(unblock);
6373    queuedPointerCaptures.forEach(unblock);
6374
6375    for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) {
6376      var queuedTarget = queuedExplicitHydrationTargets[_i];
6377
6378      if (queuedTarget.blockedOn === unblocked) {
6379        queuedTarget.blockedOn = null;
6380      }
6381    }
6382
6383    while (queuedExplicitHydrationTargets.length > 0) {
6384      var nextExplicitTarget = queuedExplicitHydrationTargets[0];
6385
6386      if (nextExplicitTarget.blockedOn !== null) {
6387        // We're still blocked.
6388        break;
6389      } else {
6390        attemptExplicitHydrationTarget(nextExplicitTarget);
6391
6392        if (nextExplicitTarget.blockedOn === null) {
6393          // We're unblocked.
6394          queuedExplicitHydrationTargets.shift();
6395        }
6396      }
6397    }
6398  }
6399
6400  var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; // TODO: can we stop exporting these?
6401
6402  var _enabled = true; // This is exported in FB builds for use by legacy FB layer infra.
6403  // We'd like to remove this but it's not clear if this is safe.
6404
6405  function setEnabled(enabled) {
6406    _enabled = !!enabled;
6407  }
6408  function isEnabled() {
6409    return _enabled;
6410  }
6411  function createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags) {
6412    var eventPriority = getEventPriority(domEventName);
6413    var listenerWrapper;
6414
6415    switch (eventPriority) {
6416      case DiscreteEventPriority:
6417        listenerWrapper = dispatchDiscreteEvent;
6418        break;
6419
6420      case ContinuousEventPriority:
6421        listenerWrapper = dispatchContinuousEvent;
6422        break;
6423
6424      case DefaultEventPriority:
6425      default:
6426        listenerWrapper = dispatchEvent;
6427        break;
6428    }
6429
6430    return listenerWrapper.bind(null, domEventName, eventSystemFlags, targetContainer);
6431  }
6432
6433  function dispatchDiscreteEvent(domEventName, eventSystemFlags, container, nativeEvent) {
6434    var previousPriority = getCurrentUpdatePriority();
6435    var prevTransition = ReactCurrentBatchConfig.transition;
6436    ReactCurrentBatchConfig.transition = null;
6437
6438    try {
6439      setCurrentUpdatePriority(DiscreteEventPriority);
6440      dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
6441    } finally {
6442      setCurrentUpdatePriority(previousPriority);
6443      ReactCurrentBatchConfig.transition = prevTransition;
6444    }
6445  }
6446
6447  function dispatchContinuousEvent(domEventName, eventSystemFlags, container, nativeEvent) {
6448    var previousPriority = getCurrentUpdatePriority();
6449    var prevTransition = ReactCurrentBatchConfig.transition;
6450    ReactCurrentBatchConfig.transition = null;
6451
6452    try {
6453      setCurrentUpdatePriority(ContinuousEventPriority);
6454      dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
6455    } finally {
6456      setCurrentUpdatePriority(previousPriority);
6457      ReactCurrentBatchConfig.transition = prevTransition;
6458    }
6459  }
6460
6461  function dispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6462    if (!_enabled) {
6463      return;
6464    }
6465
6466    {
6467      dispatchEventWithEnableCapturePhaseSelectiveHydrationWithoutDiscreteEventReplay(domEventName, eventSystemFlags, targetContainer, nativeEvent);
6468    }
6469  }
6470
6471  function dispatchEventWithEnableCapturePhaseSelectiveHydrationWithoutDiscreteEventReplay(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6472    var blockedOn = findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent);
6473
6474    if (blockedOn === null) {
6475      dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer);
6476      clearIfContinuousEvent(domEventName, nativeEvent);
6477      return;
6478    }
6479
6480    if (queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)) {
6481      nativeEvent.stopPropagation();
6482      return;
6483    } // We need to clear only if we didn't queue because
6484    // queueing is accumulative.
6485
6486
6487    clearIfContinuousEvent(domEventName, nativeEvent);
6488
6489    if (eventSystemFlags & IS_CAPTURE_PHASE && isDiscreteEventThatRequiresHydration(domEventName)) {
6490      while (blockedOn !== null) {
6491        var fiber = getInstanceFromNode(blockedOn);
6492
6493        if (fiber !== null) {
6494          attemptSynchronousHydration(fiber);
6495        }
6496
6497        var nextBlockedOn = findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent);
6498
6499        if (nextBlockedOn === null) {
6500          dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer);
6501        }
6502
6503        if (nextBlockedOn === blockedOn) {
6504          break;
6505        }
6506
6507        blockedOn = nextBlockedOn;
6508      }
6509
6510      if (blockedOn !== null) {
6511        nativeEvent.stopPropagation();
6512      }
6513
6514      return;
6515    } // This is not replayable so we'll invoke it but without a target,
6516    // in case the event system needs to trace it.
6517
6518
6519    dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, null, targetContainer);
6520  }
6521
6522  var return_targetInst = null; // Returns a SuspenseInstance or Container if it's blocked.
6523  // The return_targetInst field above is conceptually part of the return value.
6524
6525  function findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
6526    // TODO: Warn if _enabled is false.
6527    return_targetInst = null;
6528    var nativeEventTarget = getEventTarget(nativeEvent);
6529    var targetInst = getClosestInstanceFromNode(nativeEventTarget);
6530
6531    if (targetInst !== null) {
6532      var nearestMounted = getNearestMountedFiber(targetInst);
6533
6534      if (nearestMounted === null) {
6535        // This tree has been unmounted already. Dispatch without a target.
6536        targetInst = null;
6537      } else {
6538        var tag = nearestMounted.tag;
6539
6540        if (tag === SuspenseComponent) {
6541          var instance = getSuspenseInstanceFromFiber(nearestMounted);
6542
6543          if (instance !== null) {
6544            // Queue the event to be replayed later. Abort dispatching since we
6545            // don't want this event dispatched twice through the event system.
6546            // TODO: If this is the first discrete event in the queue. Schedule an increased
6547            // priority for this boundary.
6548            return instance;
6549          } // This shouldn't happen, something went wrong but to avoid blocking
6550          // the whole system, dispatch the event without a target.
6551          // TODO: Warn.
6552
6553
6554          targetInst = null;
6555        } else if (tag === HostRoot) {
6556          var root = nearestMounted.stateNode;
6557
6558          if (isRootDehydrated(root)) {
6559            // If this happens during a replay something went wrong and it might block
6560            // the whole system.
6561            return getContainerFromFiber(nearestMounted);
6562          }
6563
6564          targetInst = null;
6565        } else if (nearestMounted !== targetInst) {
6566          // If we get an event (ex: img onload) before committing that
6567          // component's mount, ignore it for now (that is, treat it as if it was an
6568          // event on a non-React tree). We might also consider queueing events and
6569          // dispatching them after the mount.
6570          targetInst = null;
6571        }
6572      }
6573    }
6574
6575    return_targetInst = targetInst; // We're not blocked on anything.
6576
6577    return null;
6578  }
6579  function getEventPriority(domEventName) {
6580    switch (domEventName) {
6581      // Used by SimpleEventPlugin:
6582      case 'cancel':
6583      case 'click':
6584      case 'close':
6585      case 'contextmenu':
6586      case 'copy':
6587      case 'cut':
6588      case 'auxclick':
6589      case 'dblclick':
6590      case 'dragend':
6591      case 'dragstart':
6592      case 'drop':
6593      case 'focusin':
6594      case 'focusout':
6595      case 'input':
6596      case 'invalid':
6597      case 'keydown':
6598      case 'keypress':
6599      case 'keyup':
6600      case 'mousedown':
6601      case 'mouseup':
6602      case 'paste':
6603      case 'pause':
6604      case 'play':
6605      case 'pointercancel':
6606      case 'pointerdown':
6607      case 'pointerup':
6608      case 'ratechange':
6609      case 'reset':
6610      case 'resize':
6611      case 'seeked':
6612      case 'submit':
6613      case 'touchcancel':
6614      case 'touchend':
6615      case 'touchstart':
6616      case 'volumechange': // Used by polyfills:
6617      // eslint-disable-next-line no-fallthrough
6618
6619      case 'change':
6620      case 'selectionchange':
6621      case 'textInput':
6622      case 'compositionstart':
6623      case 'compositionend':
6624      case 'compositionupdate': // Only enableCreateEventHandleAPI:
6625      // eslint-disable-next-line no-fallthrough
6626
6627      case 'beforeblur':
6628      case 'afterblur': // Not used by React but could be by user code:
6629      // eslint-disable-next-line no-fallthrough
6630
6631      case 'beforeinput':
6632      case 'blur':
6633      case 'fullscreenchange':
6634      case 'focus':
6635      case 'hashchange':
6636      case 'popstate':
6637      case 'select':
6638      case 'selectstart':
6639        return DiscreteEventPriority;
6640
6641      case 'drag':
6642      case 'dragenter':
6643      case 'dragexit':
6644      case 'dragleave':
6645      case 'dragover':
6646      case 'mousemove':
6647      case 'mouseout':
6648      case 'mouseover':
6649      case 'pointermove':
6650      case 'pointerout':
6651      case 'pointerover':
6652      case 'scroll':
6653      case 'toggle':
6654      case 'touchmove':
6655      case 'wheel': // Not used by React but could be by user code:
6656      // eslint-disable-next-line no-fallthrough
6657
6658      case 'mouseenter':
6659      case 'mouseleave':
6660      case 'pointerenter':
6661      case 'pointerleave':
6662        return ContinuousEventPriority;
6663
6664      case 'message':
6665        {
6666          // We might be in the Scheduler callback.
6667          // Eventually this mechanism will be replaced by a check
6668          // of the current priority on the native scheduler.
6669          var schedulerPriority = getCurrentPriorityLevel();
6670
6671          switch (schedulerPriority) {
6672            case ImmediatePriority:
6673              return DiscreteEventPriority;
6674
6675            case UserBlockingPriority:
6676              return ContinuousEventPriority;
6677
6678            case NormalPriority:
6679            case LowPriority:
6680              // TODO: Handle LowSchedulerPriority, somehow. Maybe the same lane as hydration.
6681              return DefaultEventPriority;
6682
6683            case IdlePriority:
6684              return IdleEventPriority;
6685
6686            default:
6687              return DefaultEventPriority;
6688          }
6689        }
6690
6691      default:
6692        return DefaultEventPriority;
6693    }
6694  }
6695
6696  function addEventBubbleListener(target, eventType, listener) {
6697    target.addEventListener(eventType, listener, false);
6698    return listener;
6699  }
6700  function addEventCaptureListener(target, eventType, listener) {
6701    target.addEventListener(eventType, listener, true);
6702    return listener;
6703  }
6704  function addEventCaptureListenerWithPassiveFlag(target, eventType, listener, passive) {
6705    target.addEventListener(eventType, listener, {
6706      capture: true,
6707      passive: passive
6708    });
6709    return listener;
6710  }
6711  function addEventBubbleListenerWithPassiveFlag(target, eventType, listener, passive) {
6712    target.addEventListener(eventType, listener, {
6713      passive: passive
6714    });
6715    return listener;
6716  }
6717
6718  /**
6719   * These variables store information about text content of a target node,
6720   * allowing comparison of content before and after a given event.
6721   *
6722   * Identify the node where selection currently begins, then observe
6723   * both its text content and its current position in the DOM. Since the
6724   * browser may natively replace the target node during composition, we can
6725   * use its position to find its replacement.
6726   *
6727   *
6728   */
6729  var root = null;
6730  var startText = null;
6731  var fallbackText = null;
6732  function initialize(nativeEventTarget) {
6733    root = nativeEventTarget;
6734    startText = getText();
6735    return true;
6736  }
6737  function reset() {
6738    root = null;
6739    startText = null;
6740    fallbackText = null;
6741  }
6742  function getData() {
6743    if (fallbackText) {
6744      return fallbackText;
6745    }
6746
6747    var start;
6748    var startValue = startText;
6749    var startLength = startValue.length;
6750    var end;
6751    var endValue = getText();
6752    var endLength = endValue.length;
6753
6754    for (start = 0; start < startLength; start++) {
6755      if (startValue[start] !== endValue[start]) {
6756        break;
6757      }
6758    }
6759
6760    var minEnd = startLength - start;
6761
6762    for (end = 1; end <= minEnd; end++) {
6763      if (startValue[startLength - end] !== endValue[endLength - end]) {
6764        break;
6765      }
6766    }
6767
6768    var sliceTail = end > 1 ? 1 - end : undefined;
6769    fallbackText = endValue.slice(start, sliceTail);
6770    return fallbackText;
6771  }
6772  function getText() {
6773    if ('value' in root) {
6774      return root.value;
6775    }
6776
6777    return root.textContent;
6778  }
6779
6780  /**
6781   * `charCode` represents the actual "character code" and is safe to use with
6782   * `String.fromCharCode`. As such, only keys that correspond to printable
6783   * characters produce a valid `charCode`, the only exception to this is Enter.
6784   * The Tab-key is considered non-printable and does not have a `charCode`,
6785   * presumably because it does not produce a tab-character in browsers.
6786   *
6787   * @param {object} nativeEvent Native browser event.
6788   * @return {number} Normalized `charCode` property.
6789   */
6790  function getEventCharCode(nativeEvent) {
6791    var charCode;
6792    var keyCode = nativeEvent.keyCode;
6793
6794    if ('charCode' in nativeEvent) {
6795      charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`.
6796
6797      if (charCode === 0 && keyCode === 13) {
6798        charCode = 13;
6799      }
6800    } else {
6801      // IE8 does not implement `charCode`, but `keyCode` has the correct value.
6802      charCode = keyCode;
6803    } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux)
6804    // report Enter as charCode 10 when ctrl is pressed.
6805
6806
6807    if (charCode === 10) {
6808      charCode = 13;
6809    } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.
6810    // Must not discard the (non-)printable Enter-key.
6811
6812
6813    if (charCode >= 32 || charCode === 13) {
6814      return charCode;
6815    }
6816
6817    return 0;
6818  }
6819
6820  function functionThatReturnsTrue() {
6821    return true;
6822  }
6823
6824  function functionThatReturnsFalse() {
6825    return false;
6826  } // This is intentionally a factory so that we have different returned constructors.
6827  // If we had a single constructor, it would be megamorphic and engines would deopt.
6828
6829
6830  function createSyntheticEvent(Interface) {
6831    /**
6832     * Synthetic events are dispatched by event plugins, typically in response to a
6833     * top-level event delegation handler.
6834     *
6835     * These systems should generally use pooling to reduce the frequency of garbage
6836     * collection. The system should check `isPersistent` to determine whether the
6837     * event should be released into the pool after being dispatched. Users that
6838     * need a persisted event should invoke `persist`.
6839     *
6840     * Synthetic events (and subclasses) implement the DOM Level 3 Events API by
6841     * normalizing browser quirks. Subclasses do not necessarily have to implement a
6842     * DOM interface; custom application-specific events can also subclass this.
6843     */
6844    function SyntheticBaseEvent(reactName, reactEventType, targetInst, nativeEvent, nativeEventTarget) {
6845      this._reactName = reactName;
6846      this._targetInst = targetInst;
6847      this.type = reactEventType;
6848      this.nativeEvent = nativeEvent;
6849      this.target = nativeEventTarget;
6850      this.currentTarget = null;
6851
6852      for (var _propName in Interface) {
6853        if (!Interface.hasOwnProperty(_propName)) {
6854          continue;
6855        }
6856
6857        var normalize = Interface[_propName];
6858
6859        if (normalize) {
6860          this[_propName] = normalize(nativeEvent);
6861        } else {
6862          this[_propName] = nativeEvent[_propName];
6863        }
6864      }
6865
6866      var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;
6867
6868      if (defaultPrevented) {
6869        this.isDefaultPrevented = functionThatReturnsTrue;
6870      } else {
6871        this.isDefaultPrevented = functionThatReturnsFalse;
6872      }
6873
6874      this.isPropagationStopped = functionThatReturnsFalse;
6875      return this;
6876    }
6877
6878    assign(SyntheticBaseEvent.prototype, {
6879      preventDefault: function () {
6880        this.defaultPrevented = true;
6881        var event = this.nativeEvent;
6882
6883        if (!event) {
6884          return;
6885        }
6886
6887        if (event.preventDefault) {
6888          event.preventDefault(); // $FlowFixMe - flow is not aware of `unknown` in IE
6889        } else if (typeof event.returnValue !== 'unknown') {
6890          event.returnValue = false;
6891        }
6892
6893        this.isDefaultPrevented = functionThatReturnsTrue;
6894      },
6895      stopPropagation: function () {
6896        var event = this.nativeEvent;
6897
6898        if (!event) {
6899          return;
6900        }
6901
6902        if (event.stopPropagation) {
6903          event.stopPropagation(); // $FlowFixMe - flow is not aware of `unknown` in IE
6904        } else if (typeof event.cancelBubble !== 'unknown') {
6905          // The ChangeEventPlugin registers a "propertychange" event for
6906          // IE. This event does not support bubbling or cancelling, and
6907          // any references to cancelBubble throw "Member not found".  A
6908          // typeof check of "unknown" circumvents this issue (and is also
6909          // IE specific).
6910          event.cancelBubble = true;
6911        }
6912
6913        this.isPropagationStopped = functionThatReturnsTrue;
6914      },
6915
6916      /**
6917       * We release all dispatched `SyntheticEvent`s after each event loop, adding
6918       * them back into the pool. This allows a way to hold onto a reference that
6919       * won't be added back into the pool.
6920       */
6921      persist: function () {// Modern event system doesn't use pooling.
6922      },
6923
6924      /**
6925       * Checks if this event should be released back into the pool.
6926       *
6927       * @return {boolean} True if this should not be released, false otherwise.
6928       */
6929      isPersistent: functionThatReturnsTrue
6930    });
6931    return SyntheticBaseEvent;
6932  }
6933  /**
6934   * @interface Event
6935   * @see http://www.w3.org/TR/DOM-Level-3-Events/
6936   */
6937
6938
6939  var EventInterface = {
6940    eventPhase: 0,
6941    bubbles: 0,
6942    cancelable: 0,
6943    timeStamp: function (event) {
6944      return event.timeStamp || Date.now();
6945    },
6946    defaultPrevented: 0,
6947    isTrusted: 0
6948  };
6949  var SyntheticEvent = createSyntheticEvent(EventInterface);
6950
6951  var UIEventInterface = assign({}, EventInterface, {
6952    view: 0,
6953    detail: 0
6954  });
6955
6956  var SyntheticUIEvent = createSyntheticEvent(UIEventInterface);
6957  var lastMovementX;
6958  var lastMovementY;
6959  var lastMouseEvent;
6960
6961  function updateMouseMovementPolyfillState(event) {
6962    if (event !== lastMouseEvent) {
6963      if (lastMouseEvent && event.type === 'mousemove') {
6964        lastMovementX = event.screenX - lastMouseEvent.screenX;
6965        lastMovementY = event.screenY - lastMouseEvent.screenY;
6966      } else {
6967        lastMovementX = 0;
6968        lastMovementY = 0;
6969      }
6970
6971      lastMouseEvent = event;
6972    }
6973  }
6974  /**
6975   * @interface MouseEvent
6976   * @see http://www.w3.org/TR/DOM-Level-3-Events/
6977   */
6978
6979
6980  var MouseEventInterface = assign({}, UIEventInterface, {
6981    screenX: 0,
6982    screenY: 0,
6983    clientX: 0,
6984    clientY: 0,
6985    pageX: 0,
6986    pageY: 0,
6987    ctrlKey: 0,
6988    shiftKey: 0,
6989    altKey: 0,
6990    metaKey: 0,
6991    getModifierState: getEventModifierState,
6992    button: 0,
6993    buttons: 0,
6994    relatedTarget: function (event) {
6995      if (event.relatedTarget === undefined) return event.fromElement === event.srcElement ? event.toElement : event.fromElement;
6996      return event.relatedTarget;
6997    },
6998    movementX: function (event) {
6999      if ('movementX' in event) {
7000        return event.movementX;
7001      }
7002
7003      updateMouseMovementPolyfillState(event);
7004      return lastMovementX;
7005    },
7006    movementY: function (event) {
7007      if ('movementY' in event) {
7008        return event.movementY;
7009      } // Don't need to call updateMouseMovementPolyfillState() here
7010      // because it's guaranteed to have already run when movementX
7011      // was copied.
7012
7013
7014      return lastMovementY;
7015    }
7016  });
7017
7018  var SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface);
7019  /**
7020   * @interface DragEvent
7021   * @see http://www.w3.org/TR/DOM-Level-3-Events/
7022   */
7023
7024  var DragEventInterface = assign({}, MouseEventInterface, {
7025    dataTransfer: 0
7026  });
7027
7028  var SyntheticDragEvent = createSyntheticEvent(DragEventInterface);
7029  /**
7030   * @interface FocusEvent
7031   * @see http://www.w3.org/TR/DOM-Level-3-Events/
7032   */
7033
7034  var FocusEventInterface = assign({}, UIEventInterface, {
7035    relatedTarget: 0
7036  });
7037
7038  var SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface);
7039  /**
7040   * @interface Event
7041   * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface
7042   * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent
7043   */
7044
7045  var AnimationEventInterface = assign({}, EventInterface, {
7046    animationName: 0,
7047    elapsedTime: 0,
7048    pseudoElement: 0
7049  });
7050
7051  var SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface);
7052  /**
7053   * @interface Event
7054   * @see http://www.w3.org/TR/clipboard-apis/
7055   */
7056
7057  var ClipboardEventInterface = assign({}, EventInterface, {
7058    clipboardData: function (event) {
7059      return 'clipboardData' in event ? event.clipboardData : window.clipboardData;
7060    }
7061  });
7062
7063  var SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface);
7064  /**
7065   * @interface Event
7066   * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents
7067   */
7068
7069  var CompositionEventInterface = assign({}, EventInterface, {
7070    data: 0
7071  });
7072
7073  var SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface);
7074  /**
7075   * @interface Event
7076   * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105
7077   *      /#events-inputevents
7078   */
7079  // Happens to share the same list for now.
7080
7081  var SyntheticInputEvent = SyntheticCompositionEvent;
7082  /**
7083   * Normalization of deprecated HTML5 `key` values
7084   * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
7085   */
7086
7087  var normalizeKey = {
7088    Esc: 'Escape',
7089    Spacebar: ' ',
7090    Left: 'ArrowLeft',
7091    Up: 'ArrowUp',
7092    Right: 'ArrowRight',
7093    Down: 'ArrowDown',
7094    Del: 'Delete',
7095    Win: 'OS',
7096    Menu: 'ContextMenu',
7097    Apps: 'ContextMenu',
7098    Scroll: 'ScrollLock',
7099    MozPrintableKey: 'Unidentified'
7100  };
7101  /**
7102   * Translation from legacy `keyCode` to HTML5 `key`
7103   * Only special keys supported, all others depend on keyboard layout or browser
7104   * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
7105   */
7106
7107  var translateToKey = {
7108    '8': 'Backspace',
7109    '9': 'Tab',
7110    '12': 'Clear',
7111    '13': 'Enter',
7112    '16': 'Shift',
7113    '17': 'Control',
7114    '18': 'Alt',
7115    '19': 'Pause',
7116    '20': 'CapsLock',
7117    '27': 'Escape',
7118    '32': ' ',
7119    '33': 'PageUp',
7120    '34': 'PageDown',
7121    '35': 'End',
7122    '36': 'Home',
7123    '37': 'ArrowLeft',
7124    '38': 'ArrowUp',
7125    '39': 'ArrowRight',
7126    '40': 'ArrowDown',
7127    '45': 'Insert',
7128    '46': 'Delete',
7129    '112': 'F1',
7130    '113': 'F2',
7131    '114': 'F3',
7132    '115': 'F4',
7133    '116': 'F5',
7134    '117': 'F6',
7135    '118': 'F7',
7136    '119': 'F8',
7137    '120': 'F9',
7138    '121': 'F10',
7139    '122': 'F11',
7140    '123': 'F12',
7141    '144': 'NumLock',
7142    '145': 'ScrollLock',
7143    '224': 'Meta'
7144  };
7145  /**
7146   * @param {object} nativeEvent Native browser event.
7147   * @return {string} Normalized `key` property.
7148   */
7149
7150  function getEventKey(nativeEvent) {
7151    if (nativeEvent.key) {
7152      // Normalize inconsistent values reported by browsers due to
7153      // implementations of a working draft specification.
7154      // FireFox implements `key` but returns `MozPrintableKey` for all
7155      // printable characters (normalized to `Unidentified`), ignore it.
7156      var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
7157
7158      if (key !== 'Unidentified') {
7159        return key;
7160      }
7161    } // Browser does not implement `key`, polyfill as much of it as we can.
7162
7163
7164    if (nativeEvent.type === 'keypress') {
vendor: 1,742 bytes, lines 7165-7219
7165      var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can
7166      // thus be captured by `keypress`, no other non-printable key should.
7167
7168      return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);
7169    }
7170
7171    if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {
7172      // While user keyboard layout determines the actual meaning of each
7173      // `keyCode` value, almost all function keys have a universal value.
7174      return translateToKey[nativeEvent.keyCode] || 'Unidentified';
7175    }
7176
7177    return '';
7178  }
7179  /**
7180   * Translation from modifier key to the associated property in the event.
7181   * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers
7182   */
7183
7184
7185  var modifierKeyToProp = {
7186    Alt: 'altKey',
7187    Control: 'ctrlKey',
7188    Meta: 'metaKey',
7189    Shift: 'shiftKey'
7190  }; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support
7191  // getModifierState. If getModifierState is not supported, we map it to a set of
7192  // modifier keys exposed by the event. In this case, Lock-keys are not supported.
7193
7194  function modifierStateGetter(keyArg) {
7195    var syntheticEvent = this;
7196    var nativeEvent = syntheticEvent.nativeEvent;
7197
7198    if (nativeEvent.getModifierState) {
7199      return nativeEvent.getModifierState(keyArg);
7200    }
7201
7202    var keyProp = modifierKeyToProp[keyArg];
7203    return keyProp ? !!nativeEvent[keyProp] : false;
7204  }
7205
7206  function getEventModifierState(nativeEvent) {
7207    return modifierStateGetter;
7208  }
7209  /**
7210   * @interface KeyboardEvent
7211   * @see http://www.w3.org/TR/DOM-Level-3-Events/
7212   */
7213
7214
7215  var KeyboardEventInterface = assign({}, UIEventInterface, {
7216    key: getEventKey,
7217    code: 0,
7218    location: 0,
7219    ctrlKey: 0,
7220    shiftKey: 0,
7221    altKey: 0,
7222    metaKey: 0,
7223    repeat: 0,
7224    locale: 0,
7225    getModifierState: getEventModifierState,
7226    // Legacy Interface
7227    charCode: function (event) {
7228      // `charCode` is the result of a KeyPress event and represents the value of
7229      // the actual printable character.
7230      // KeyPress is deprecated, but its replacement is not yet final and not
7231      // implemented in any major browser. Only KeyPress has charCode.
7232      if (event.type === 'keypress') {
7233        return getEventCharCode(event);
7234      }
7235
7236      return 0;
7237    },
7238    keyCode: function (event) {
7239      // `keyCode` is the result of a KeyDown/Up event and represents the value of
7240      // physical keyboard key.
7241      // The actual meaning of the value depends on the users' keyboard layout
7242      // which cannot be detected. Assuming that it is a US keyboard layout
7243      // provides a surprisingly accurate mapping for US and European users.
7244      // Due to this, it is left to the user to implement at this time.
7245      if (event.type === 'keydown' || event.type === 'keyup') {
7246        return event.keyCode;
7247      }
7248
7249      return 0;
7250    },
7251    which: function (event) {
7252      // `which` is an alias for either `keyCode` or `charCode` depending on the
7253      // type of the event.
7254      if (event.type === 'keypress') {
7255        return getEventCharCode(event);
7256      }
7257
7258      if (event.type === 'keydown' || event.type === 'keyup') {
7259        return event.keyCode;
7260      }
7261
7262      return 0;
7263    }
7264  });
7265
7266  var SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface);
7267  /**
7268   * @interface PointerEvent
7269   * @see http://www.w3.org/TR/pointerevents/
7270   */
7271
7272  var PointerEventInterface = assign({}, MouseEventInterface, {
7273    pointerId: 0,
7274    width: 0,
7275    height: 0,
7276    pressure: 0,
7277    tangentialPressure: 0,
7278    tiltX: 0,
7279    tiltY: 0,
7280    twist: 0,
7281    pointerType: 0,
7282    isPrimary: 0
7283  });
7284
7285  var SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface);
7286  /**
7287   * @interface TouchEvent
7288   * @see http://www.w3.org/TR/touch-events/
7289   */
7290
7291  var TouchEventInterface = assign({}, UIEventInterface, {
7292    touches: 0,
7293    targetTouches: 0,
7294    changedTouches: 0,
7295    altKey: 0,
7296    metaKey: 0,
7297    ctrlKey: 0,
7298    shiftKey: 0,
7299    getModifierState: getEventModifierState
7300  });
7301
7302  var SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface);
7303  /**
7304   * @interface Event
7305   * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-
7306   * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent
7307   */
7308
7309  var TransitionEventInterface = assign({}, EventInterface, {
7310    propertyName: 0,
7311    elapsedTime: 0,
7312    pseudoElement: 0
7313  });
7314
7315  var SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface);
7316  /**
7317   * @interface WheelEvent
7318   * @see http://www.w3.org/TR/DOM-Level-3-Events/
7319   */
7320
7321  var WheelEventInterface = assign({}, MouseEventInterface, {
7322    deltaX: function (event) {
7323      return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
7324      'wheelDeltaX' in event ? -event.wheelDeltaX : 0;
7325    },
7326    deltaY: function (event) {
7327      return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).
7328      'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).
7329      'wheelDelta' in event ? -event.wheelDelta : 0;
7330    },
7331    deltaZ: 0,
7332    // Browsers without "deltaMode" is reporting in raw wheel delta where one
7333    // notch on the scroll is always +/- 120, roughly equivalent to pixels.
7334    // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or
7335    // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.
7336    deltaMode: 0
7337  });
7338
7339  var SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface);
7340
7341  var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
7342
7343  var START_KEYCODE = 229;
7344  var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;
7345  var documentMode = null;
7346
7347  if (canUseDOM && 'documentMode' in document) {
7348    documentMode = document.documentMode;
7349  } // Webkit offers a very useful `textInput` event that can be used to
7350  // directly represent `beforeInput`. The IE `textinput` event is not as
7351  // useful, so we don't use it.
7352
7353
7354  var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied
7355  // by the native compositionend event may be incorrect. Japanese ideographic
7356  // spaces, for instance (\u3000) are not recorded correctly.
7357
7358  var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
7359  var SPACEBAR_CODE = 32;
7360  var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
7361
7362  function registerEvents() {
7363    registerTwoPhaseEvent('onBeforeInput', ['compositionend', 'keypress', 'textInput', 'paste']);
7364    registerTwoPhaseEvent('onCompositionEnd', ['compositionend', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']);
7365    registerTwoPhaseEvent('onCompositionStart', ['compositionstart', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']);
7366    registerTwoPhaseEvent('onCompositionUpdate', ['compositionupdate', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']);
7367  } // Track whether we've ever handled a keypress on the space key.
7368
7369
7370  var hasSpaceKeypress = false;
7371  /**
7372   * Return whether a native keypress event is assumed to be a command.
7373   * This is required because Firefox fires `keypress` events for key commands
7374   * (cut, copy, select-all, etc.) even though no character is inserted.
7375   */
7376
7377  function isKeypressCommand(nativeEvent) {
7378    return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command.
7379    !(nativeEvent.ctrlKey && nativeEvent.altKey);
7380  }
7381  /**
7382   * Translate native top level events into event types.
7383   */
7384
7385
7386  function getCompositionEventType(domEventName) {
7387    switch (domEventName) {
7388      case 'compositionstart':
7389        return 'onCompositionStart';
7390
7391      case 'compositionend':
7392        return 'onCompositionEnd';
7393
7394      case 'compositionupdate':
7395        return 'onCompositionUpdate';
7396    }
7397  }
7398  /**
7399   * Does our fallback best-guess model think this event signifies that
7400   * composition has begun?
7401   */
7402
7403
7404  function isFallbackCompositionStart(domEventName, nativeEvent) {
7405    return domEventName === 'keydown' && nativeEvent.keyCode === START_KEYCODE;
7406  }
7407  /**
7408   * Does our fallback mode think that this event is the end of composition?
7409   */
7410
7411
7412  function isFallbackCompositionEnd(domEventName, nativeEvent) {
7413    switch (domEventName) {
7414      case 'keyup':
7415        // Command keys insert or clear IME input.
7416        return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
7417
7418      case 'keydown':
7419        // Expect IME keyCode on each keydown. If we get any other
7420        // code we must have exited earlier.
7421        return nativeEvent.keyCode !== START_KEYCODE;
7422
7423      case 'keypress':
7424      case 'mousedown':
7425      case 'focusout':
7426        // Events are not possible without cancelling IME.
7427        return true;
7428
7429      default:
7430        return false;
7431    }
7432  }
7433  /**
7434   * Google Input Tools provides composition data via a CustomEvent,
7435   * with the `data` property populated in the `detail` object. If this
7436   * is available on the event object, use it. If not, this is a plain
7437   * composition event and we have nothing special to extract.
7438   *
7439   * @param {object} nativeEvent
7440   * @return {?string}
7441   */
7442
7443
7444  function getDataFromCustomEvent(nativeEvent) {
7445    var detail = nativeEvent.detail;
7446
7447    if (typeof detail === 'object' && 'data' in detail) {
7448      return detail.data;
7449    }
7450
7451    return null;
7452  }
7453  /**
7454   * Check if a composition event was triggered by Korean IME.
7455   * Our fallback mode does not work well with IE's Korean IME,
7456   * so just use native composition events when Korean IME is used.
7457   * Although CompositionEvent.locale property is deprecated,
7458   * it is available in IE, where our fallback mode is enabled.
7459   *
7460   * @param {object} nativeEvent
7461   * @return {boolean}
7462   */
7463
7464
7465  function isUsingKoreanIME(nativeEvent) {
7466    return nativeEvent.locale === 'ko';
7467  } // Track the current IME composition status, if any.
7468
7469
7470  var isComposing = false;
7471  /**
7472   * @return {?object} A SyntheticCompositionEvent.
7473   */
7474
7475  function extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) {
7476    var eventType;
7477    var fallbackData;
7478
7479    if (canUseCompositionEvent) {
7480      eventType = getCompositionEventType(domEventName);
7481    } else if (!isComposing) {
7482      if (isFallbackCompositionStart(domEventName, nativeEvent)) {
7483        eventType = 'onCompositionStart';
7484      }
7485    } else if (isFallbackCompositionEnd(domEventName, nativeEvent)) {
7486      eventType = 'onCompositionEnd';
7487    }
7488
7489    if (!eventType) {
7490      return null;
7491    }
7492
7493    if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {
7494      // The current composition is stored statically and must not be
7495      // overwritten while composition continues.
7496      if (!isComposing && eventType === 'onCompositionStart') {
7497        isComposing = initialize(nativeEventTarget);
7498      } else if (eventType === 'onCompositionEnd') {
7499        if (isComposing) {
7500          fallbackData = getData();
7501        }
7502      }
7503    }
7504
7505    var listeners = accumulateTwoPhaseListeners(targetInst, eventType);
7506
7507    if (listeners.length > 0) {
7508      var event = new SyntheticCompositionEvent(eventType, domEventName, null, nativeEvent, nativeEventTarget);
7509      dispatchQueue.push({
7510        event: event,
7511        listeners: listeners
7512      });
7513
7514      if (fallbackData) {
7515        // Inject data generated from fallback path into the synthetic event.
7516        // This matches the property of native CompositionEventInterface.
7517        event.data = fallbackData;
7518      } else {
7519        var customData = getDataFromCustomEvent(nativeEvent);
7520
7521        if (customData !== null) {
7522          event.data = customData;
7523        }
7524      }
7525    }
7526  }
7527
7528  function getNativeBeforeInputChars(domEventName, nativeEvent) {
7529    switch (domEventName) {
7530      case 'compositionend':
7531        return getDataFromCustomEvent(nativeEvent);
7532
7533      case 'keypress':
7534        /**
7535         * If native `textInput` events are available, our goal is to make
7536         * use of them. However, there is a special case: the spacebar key.
7537         * In Webkit, preventing default on a spacebar `textInput` event
7538         * cancels character insertion, but it *also* causes the browser
7539         * to fall back to its default spacebar behavior of scrolling the
7540         * page.
7541         *
7542         * Tracking at:
7543         * https://code.google.com/p/chromium/issues/detail?id=355103
7544         *
7545         * To avoid this issue, use the keypress event as if no `textInput`
7546         * event is available.
7547         */
7548        var which = nativeEvent.which;
7549
7550        if (which !== SPACEBAR_CODE) {
7551          return null;
7552        }
7553
7554        hasSpaceKeypress = true;
7555        return SPACEBAR_CHAR;
7556
7557      case 'textInput':
7558        // Record the characters to be added to the DOM.
7559        var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled
7560        // it at the keypress level and bail immediately. Android Chrome
7561        // doesn't give us keycodes, so we need to ignore it.
7562
7563        if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
7564          return null;
7565        }
7566
7567        return chars;
7568
7569      default:
7570        // For other native event types, do nothing.
7571        return null;
7572    }
7573  }
7574  /**
7575   * For browsers that do not provide the `textInput` event, extract the
7576   * appropriate string to use for SyntheticInputEvent.
7577   */
7578
7579
7580  function getFallbackBeforeInputChars(domEventName, nativeEvent) {
7581    // If we are currently composing (IME) and using a fallback to do so,
7582    // try to extract the composed characters from the fallback object.
7583    // If composition event is available, we extract a string only at
7584    // compositionevent, otherwise extract it at fallback events.
7585    if (isComposing) {
7586      if (domEventName === 'compositionend' || !canUseCompositionEvent && isFallbackCompositionEnd(domEventName, nativeEvent)) {
7587        var chars = getData();
7588        reset();
7589        isComposing = false;
vendor: 4,852 bytes, lines 7590-7733
7590        return chars;
7591      }
7592
7593      return null;
7594    }
7595
7596    switch (domEventName) {
7597      case 'paste':
7598        // If a paste event occurs after a keypress, throw out the input
7599        // chars. Paste events should not lead to BeforeInput events.
7600        return null;
7601
7602      case 'keypress':
7603        /**
7604         * As of v27, Firefox may fire keypress events even when no character
7605         * will be inserted. A few possibilities:
7606         *
7607         * - `which` is `0`. Arrow keys, Esc key, etc.
7608         *
7609         * - `which` is the pressed key code, but no char is available.
7610         *   Ex: 'AltGr + d` in Polish. There is no modified character for
7611         *   this key combination and no character is inserted into the
7612         *   document, but FF fires the keypress for char code `100` anyway.
7613         *   No `input` event will occur.
7614         *
7615         * - `which` is the pressed key code, but a command combination is
7616         *   being used. Ex: `Cmd+C`. No character is inserted, and no
7617         *   `input` event will occur.
7618         */
7619        if (!isKeypressCommand(nativeEvent)) {
7620          // IE fires the `keypress` event when a user types an emoji via
7621          // Touch keyboard of Windows.  In such a case, the `char` property
7622          // holds an emoji character like `\uD83D\uDE0A`.  Because its length
7623          // is 2, the property `which` does not represent an emoji correctly.
7624          // In such a case, we directly return the `char` property instead of
7625          // using `which`.
7626          if (nativeEvent.char && nativeEvent.char.length > 1) {
7627            return nativeEvent.char;
7628          } else if (nativeEvent.which) {
7629            return String.fromCharCode(nativeEvent.which);
7630          }
7631        }
7632
7633        return null;
7634
7635      case 'compositionend':
7636        return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;
7637
7638      default:
7639        return null;
7640    }
7641  }
7642  /**
7643   * Extract a SyntheticInputEvent for `beforeInput`, based on either native
7644   * `textInput` or fallback behavior.
7645   *
7646   * @return {?object} A SyntheticInputEvent.
7647   */
7648
7649
7650  function extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) {
7651    var chars;
7652
7653    if (canUseTextInputEvent) {
7654      chars = getNativeBeforeInputChars(domEventName, nativeEvent);
7655    } else {
7656      chars = getFallbackBeforeInputChars(domEventName, nativeEvent);
7657    } // If no characters are being inserted, no BeforeInput event should
7658    // be fired.
7659
7660
7661    if (!chars) {
7662      return null;
7663    }
7664
7665    var listeners = accumulateTwoPhaseListeners(targetInst, 'onBeforeInput');
7666
7667    if (listeners.length > 0) {
7668      var event = new SyntheticInputEvent('onBeforeInput', 'beforeinput', null, nativeEvent, nativeEventTarget);
7669      dispatchQueue.push({
7670        event: event,
7671        listeners: listeners
7672      });
7673      event.data = chars;
7674    }
7675  }
7676  /**
7677   * Create an `onBeforeInput` event to match
7678   * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
7679   *
7680   * This event plugin is based on the native `textInput` event
7681   * available in Chrome, Safari, Opera, and IE. This event fires after
7682   * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
7683   *
7684   * `beforeInput` is spec'd but not implemented in any browsers, and
7685   * the `input` event does not provide any useful information about what has
7686   * actually been added, contrary to the spec. Thus, `textInput` is the best
7687   * available event to identify the characters that have actually been inserted
7688   * into the target node.
7689   *
7690   * This plugin is also responsible for emitting `composition` events, thus
7691   * allowing us to share composition fallback code for both `beforeInput` and
7692   * `composition` event types.
7693   */
7694
7695
7696  function extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
7697    extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
7698    extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
7699  }
7700
7701  /**
7702   * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
7703   */
7704  var supportedInputTypes = {
7705    color: true,
7706    date: true,
7707    datetime: true,
7708    'datetime-local': true,
7709    email: true,
7710    month: true,
7711    number: true,
7712    password: true,
7713    range: true,
7714    search: true,
7715    tel: true,
7716    text: true,
7717    time: true,
7718    url: true,
7719    week: true
7720  };
7721
7722  function isTextInputElement(elem) {
7723    var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
7724
7725    if (nodeName === 'input') {
7726      return !!supportedInputTypes[elem.type];
7727    }
7728
7729    if (nodeName === 'textarea') {
7730      return true;
7731    }
7732
7733    return false;
7734  }
7735
7736  /**
7737   * Checks if an event is supported in the current execution environment.
7738   *
7739   * NOTE: This will not work correctly for non-generic events such as `change`,
7740   * `reset`, `load`, `error`, and `select`.
7741   *
7742   * Borrows from Modernizr.
7743   *
7744   * @param {string} eventNameSuffix Event name, e.g. "click".
7745   * @return {boolean} True if the event is supported.
7746   * @internal
7747   * @license Modernizr 3.0.0pre (Custom Build) | MIT
7748   */
7749
7750  function isEventSupported(eventNameSuffix) {
7751    if (!canUseDOM) {
7752      return false;
7753    }
7754
7755    var eventName = 'on' + eventNameSuffix;
7756    var isSupported = (eventName in document);
7757
7758    if (!isSupported) {
7759      var element = document.createElement('div');
7760      element.setAttribute(eventName, 'return;');
7761      isSupported = typeof element[eventName] === 'function';
7762    }
7763
7764    return isSupported;
7765  }
7766
7767  function registerEvents$1() {
7768    registerTwoPhaseEvent('onChange', ['change', 'click', 'focusin', 'focusout', 'input', 'keydown', 'keyup', 'selectionchange']);
7769  }
7770
7771  function createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, target) {
7772    // Flag this event loop as needing state restore.
7773    enqueueStateRestore(target);
7774    var listeners = accumulateTwoPhaseListeners(inst, 'onChange');
7775
7776    if (listeners.length > 0) {
7777      var event = new SyntheticEvent('onChange', 'change', null, nativeEvent, target);
7778      dispatchQueue.push({
7779        event: event,
7780        listeners: listeners
7781      });
7782    }
7783  }
7784  /**
7785   * For IE shims
7786   */
7787
7788
7789  var activeElement = null;
7790  var activeElementInst = null;
7791  /**
7792   * SECTION: handle `change` event
7793   */
7794
7795  function shouldUseChangeEvent(elem) {
7796    var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
7797    return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
7798  }
7799
7800  function manualDispatchChangeEvent(nativeEvent) {
7801    var dispatchQueue = [];
7802    createAndAccumulateChangeEvent(dispatchQueue, activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the
7803    // other events and have it go through ReactBrowserEventEmitter. Since it
7804    // doesn't, we manually listen for the events and so we have to enqueue and
7805    // process the abstract event manually.
7806    //
7807    // Batching is necessary here in order to ensure that all event handlers run
7808    // before the next rerender (including event handlers attached to ancestor
7809    // elements instead of directly on the input). Without this, controlled
7810    // components don't work properly in conjunction with event bubbling because
7811    // the component is rerendered and the value reverted before all the event
7812    // handlers can run. See https://github.com/facebook/react/issues/708.
7813
7814    batchedUpdates(runEventInBatch, dispatchQueue);
7815  }
7816
7817  function runEventInBatch(dispatchQueue) {
vendor: 5,998 bytes, lines 7818-7993
7818    processDispatchQueue(dispatchQueue, 0);
7819  }
7820
7821  function getInstIfValueChanged(targetInst) {
7822    var targetNode = getNodeFromInstance(targetInst);
7823
7824    if (updateValueIfChanged(targetNode)) {
7825      return targetInst;
7826    }
7827  }
7828
7829  function getTargetInstForChangeEvent(domEventName, targetInst) {
7830    if (domEventName === 'change') {
7831      return targetInst;
7832    }
7833  }
7834  /**
7835   * SECTION: handle `input` event
7836   */
7837
7838
7839  var isInputEventSupported = false;
7840
7841  if (canUseDOM) {
7842    // IE9 claims to support the input event but fails to trigger it when
7843    // deleting text, so we ignore its input events.
7844    isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);
7845  }
7846  /**
7847   * (For IE <=9) Starts tracking propertychange events on the passed-in element
7848   * and override the value property so that we can distinguish user events from
7849   * value changes in JS.
7850   */
7851
7852
7853  function startWatchingForValueChange(target, targetInst) {
7854    activeElement = target;
7855    activeElementInst = targetInst;
7856    activeElement.attachEvent('onpropertychange', handlePropertyChange);
7857  }
7858  /**
7859   * (For IE <=9) Removes the event listeners from the currently-tracked element,
7860   * if any exists.
7861   */
7862
7863
7864  function stopWatchingForValueChange() {
7865    if (!activeElement) {
7866      return;
7867    }
7868
7869    activeElement.detachEvent('onpropertychange', handlePropertyChange);
7870    activeElement = null;
7871    activeElementInst = null;
7872  }
7873  /**
7874   * (For IE <=9) Handles a propertychange event, sending a `change` event if
7875   * the value of the active element has changed.
7876   */
7877
7878
7879  function handlePropertyChange(nativeEvent) {
7880    if (nativeEvent.propertyName !== 'value') {
7881      return;
7882    }
7883
7884    if (getInstIfValueChanged(activeElementInst)) {
7885      manualDispatchChangeEvent(nativeEvent);
7886    }
7887  }
7888
7889  function handleEventsForInputEventPolyfill(domEventName, target, targetInst) {
7890    if (domEventName === 'focusin') {
7891      // In IE9, propertychange fires for most input events but is buggy and
7892      // doesn't fire when text is deleted, but conveniently, selectionchange
7893      // appears to fire in all of the remaining cases so we catch those and
7894      // forward the event if the value has changed
7895      // In either case, we don't want to call the event handler if the value
7896      // is changed from JS so we redefine a setter for `.value` that updates
7897      // our activeElementValue variable, allowing us to ignore those changes
7898      //
7899      // stopWatching() should be a noop here but we call it just in case we
7900      // missed a blur event somehow.
7901      stopWatchingForValueChange();
7902      startWatchingForValueChange(target, targetInst);
7903    } else if (domEventName === 'focusout') {
7904      stopWatchingForValueChange();
7905    }
7906  } // For IE8 and IE9.
7907
7908
7909  function getTargetInstForInputEventPolyfill(domEventName, targetInst) {
7910    if (domEventName === 'selectionchange' || domEventName === 'keyup' || domEventName === 'keydown') {
7911      // On the selectionchange event, the target is just document which isn't
7912      // helpful for us so just check activeElement instead.
7913      //
7914      // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
7915      // propertychange on the first input event after setting `value` from a
7916      // script and fires only keydown, keypress, keyup. Catching keyup usually
7917      // gets it and catching keydown lets us fire an event for the first
7918      // keystroke if user does a key repeat (it'll be a little delayed: right
7919      // before the second keystroke). Other input methods (e.g., paste) seem to
7920      // fire selectionchange normally.
7921      return getInstIfValueChanged(activeElementInst);
7922    }
7923  }
7924  /**
7925   * SECTION: handle `click` event
7926   */
7927
7928
7929  function shouldUseClickEvent(elem) {
7930    // Use the `click` event to detect changes to checkbox and radio inputs.
7931    // This approach works across all browsers, whereas `change` does not fire
7932    // until `blur` in IE8.
7933    var nodeName = elem.nodeName;
7934    return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
7935  }
7936
7937  function getTargetInstForClickEvent(domEventName, targetInst) {
7938    if (domEventName === 'click') {
7939      return getInstIfValueChanged(targetInst);
7940    }
7941  }
7942
7943  function getTargetInstForInputOrChangeEvent(domEventName, targetInst) {
7944    if (domEventName === 'input' || domEventName === 'change') {
7945      return getInstIfValueChanged(targetInst);
7946    }
7947  }
7948
7949  function handleControlledInputBlur(node) {
7950    var state = node._wrapperState;
7951
7952    if (!state || !state.controlled || node.type !== 'number') {
7953      return;
7954    }
7955
7956    {
7957      // If controlled, assign the value attribute to the current value on blur
7958      setDefaultValue(node, 'number', node.value);
7959    }
7960  }
7961  /**
7962   * This plugin creates an `onChange` event that normalizes change events
7963   * across form elements. This event fires at a time when it's possible to
7964   * change the element's value without seeing a flicker.
7965   *
7966   * Supported elements are:
7967   * - input (see `isTextInputElement`)
7968   * - textarea
7969   * - select
7970   */
7971
7972
7973  function extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
7974    var targetNode = targetInst ? getNodeFromInstance(targetInst) : window;
7975    var getTargetInstFunc, handleEventFunc;
7976
7977    if (shouldUseChangeEvent(targetNode)) {
7978      getTargetInstFunc = getTargetInstForChangeEvent;
7979    } else if (isTextInputElement(targetNode)) {
7980      if (isInputEventSupported) {
7981        getTargetInstFunc = getTargetInstForInputOrChangeEvent;
7982      } else {
7983        getTargetInstFunc = getTargetInstForInputEventPolyfill;
7984        handleEventFunc = handleEventsForInputEventPolyfill;
7985      }
7986    } else if (shouldUseClickEvent(targetNode)) {
7987      getTargetInstFunc = getTargetInstForClickEvent;
7988    }
7989
7990    if (getTargetInstFunc) {
7991      var inst = getTargetInstFunc(domEventName, targetInst);
7992
7993      if (inst) {
7994        createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, nativeEventTarget);
7995        return;
7996      }
7997    }
7998
7999    if (handleEventFunc) {
8000      handleEventFunc(domEventName, targetNode, targetInst);
8001    } // When blurring, set the value attribute for number inputs
8002
8003
8004    if (domEventName === 'focusout') {
8005      handleControlledInputBlur(targetNode);
8006    }
8007  }
8008
8009  function registerEvents$2() {
8010    registerDirectEvent('onMouseEnter', ['mouseout', 'mouseover']);
8011    registerDirectEvent('onMouseLeave', ['mouseout', 'mouseover']);
8012    registerDirectEvent('onPointerEnter', ['pointerout', 'pointerover']);
8013    registerDirectEvent('onPointerLeave', ['pointerout', 'pointerover']);
8014  }
8015  /**
8016   * For almost every interaction we care about, there will be both a top-level
8017   * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
8018   * we do not extract duplicate events. However, moving the mouse into the
8019   * browser from outside will not fire a `mouseout` event. In this case, we use
8020   * the `mouseover` top-level event.
8021   */
8022
8023
8024  function extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
8025    var isOverEvent = domEventName === 'mouseover' || domEventName === 'pointerover';
8026    var isOutEvent = domEventName === 'mouseout' || domEventName === 'pointerout';
8027
8028    if (isOverEvent && !isReplayingEvent(nativeEvent)) {
8029      // If this is an over event with a target, we might have already dispatched
8030      // the event in the out event of the other target. If this is replayed,
8031      // then it's because we couldn't dispatch against this target previously
8032      // so we have to do it now instead.
8033      var related = nativeEvent.relatedTarget || nativeEvent.fromElement;
8034
8035      if (related) {
8036        // If the related node is managed by React, we can assume that we have
8037        // already dispatched the corresponding events during its mouseout.
8038        if (getClosestInstanceFromNode(related) || isContainerMarkedAsRoot(related)) {
8039          return;
8040        }
8041      }
8042    }
8043
8044    if (!isOutEvent && !isOverEvent) {
8045      // Must not be a mouse or pointer in or out - ignoring.
8046      return;
8047    }
8048
8049    var win; // TODO: why is this nullable in the types but we read from it?
8050
8051    if (nativeEventTarget.window === nativeEventTarget) {
8052      // `nativeEventTarget` is probably a window object.
8053      win = nativeEventTarget;
8054    } else {
8055      // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
8056      var doc = nativeEventTarget.ownerDocument;
8057
8058      if (doc) {
8059        win = doc.defaultView || doc.parentWindow;
8060      } else {
8061        win = window;
8062      }
8063    }
8064
8065    var from;
8066    var to;
8067
8068    if (isOutEvent) {
8069      var _related = nativeEvent.relatedTarget || nativeEvent.toElement;
8070
8071      from = targetInst;
8072      to = _related ? getClosestInstanceFromNode(_related) : null;
8073
8074      if (to !== null) {
8075        var nearestMounted = getNearestMountedFiber(to);
8076
8077        if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) {
8078          to = null;
8079        }
8080      }
8081    } else {
8082      // Moving to a node from outside the window.
8083      from = null;
8084      to = targetInst;
8085    }
8086
8087    if (from === to) {
8088      // Nothing pertains to our managed components.
8089      return;
8090    }
8091
8092    var SyntheticEventCtor = SyntheticMouseEvent;
8093    var leaveEventType = 'onMouseLeave';
8094    var enterEventType = 'onMouseEnter';
8095    var eventTypePrefix = 'mouse';
8096
8097    if (domEventName === 'pointerout' || domEventName === 'pointerover') {
8098      SyntheticEventCtor = SyntheticPointerEvent;
8099      leaveEventType = 'onPointerLeave';
8100      enterEventType = 'onPointerEnter';
8101      eventTypePrefix = 'pointer';
8102    }
8103
8104    var fromNode = from == null ? win : getNodeFromInstance(from);
8105    var toNode = to == null ? win : getNodeFromInstance(to);
8106    var leave = new SyntheticEventCtor(leaveEventType, eventTypePrefix + 'leave', from, nativeEvent, nativeEventTarget);
8107    leave.target = fromNode;
8108    leave.relatedTarget = toNode;
8109    var enter = null; // We should only process this nativeEvent if we are processing
8110    // the first ancestor. Next time, we will ignore the event.
8111
8112    var nativeTargetInst = getClosestInstanceFromNode(nativeEventTarget);
8113
8114    if (nativeTargetInst === targetInst) {
8115      var enterEvent = new SyntheticEventCtor(enterEventType, eventTypePrefix + 'enter', to, nativeEvent, nativeEventTarget);
8116      enterEvent.target = toNode;
8117      enterEvent.relatedTarget = fromNode;
8118      enter = enterEvent;
8119    }
8120
8121    accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leave, enter, from, to);
8122  }
8123
8124  /**
8125   * inlined Object.is polyfill to avoid requiring consumers ship their own
8126   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
8127   */
8128  function is(x, y) {
8129    return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
8130    ;
8131  }
8132
8133  var objectIs = typeof Object.is === 'function' ? Object.is : is;
8134
8135  /**
vendor: 13,868 bytes, lines 8136-8585
8136   * Performs equality by iterating through keys on an object and returning false
8137   * when any key has values which are not strictly equal between the arguments.
8138   * Returns true when the values of all keys are strictly equal.
8139   */
8140
8141  function shallowEqual(objA, objB) {
8142    if (objectIs(objA, objB)) {
8143      return true;
8144    }
8145
8146    if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
8147      return false;
8148    }
8149
8150    var keysA = Object.keys(objA);
8151    var keysB = Object.keys(objB);
8152
8153    if (keysA.length !== keysB.length) {
8154      return false;
8155    } // Test for A's keys different from B.
8156
8157
8158    for (var i = 0; i < keysA.length; i++) {
8159      var currentKey = keysA[i];
8160
8161      if (!hasOwnProperty.call(objB, currentKey) || !objectIs(objA[currentKey], objB[currentKey])) {
8162        return false;
8163      }
8164    }
8165
8166    return true;
8167  }
8168
8169  /**
8170   * Given any node return the first leaf node without children.
8171   *
8172   * @param {DOMElement|DOMTextNode} node
8173   * @return {DOMElement|DOMTextNode}
8174   */
8175
8176  function getLeafNode(node) {
8177    while (node && node.firstChild) {
8178      node = node.firstChild;
8179    }
8180
8181    return node;
8182  }
8183  /**
8184   * Get the next sibling within a container. This will walk up the
8185   * DOM if a node's siblings have been exhausted.
8186   *
8187   * @param {DOMElement|DOMTextNode} node
8188   * @return {?DOMElement|DOMTextNode}
8189   */
8190
8191
8192  function getSiblingNode(node) {
8193    while (node) {
8194      if (node.nextSibling) {
8195        return node.nextSibling;
8196      }
8197
8198      node = node.parentNode;
8199    }
8200  }
8201  /**
8202   * Get object describing the nodes which contain characters at offset.
8203   *
8204   * @param {DOMElement|DOMTextNode} root
8205   * @param {number} offset
8206   * @return {?object}
8207   */
8208
8209
8210  function getNodeForCharacterOffset(root, offset) {
8211    var node = getLeafNode(root);
8212    var nodeStart = 0;
8213    var nodeEnd = 0;
8214
8215    while (node) {
8216      if (node.nodeType === TEXT_NODE) {
8217        nodeEnd = nodeStart + node.textContent.length;
8218
8219        if (nodeStart <= offset && nodeEnd >= offset) {
8220          return {
8221            node: node,
8222            offset: offset - nodeStart
8223          };
8224        }
8225
8226        nodeStart = nodeEnd;
8227      }
8228
8229      node = getLeafNode(getSiblingNode(node));
8230    }
8231  }
8232
8233  /**
8234   * @param {DOMElement} outerNode
8235   * @return {?object}
8236   */
8237
8238  function getOffsets(outerNode) {
8239    var ownerDocument = outerNode.ownerDocument;
8240    var win = ownerDocument && ownerDocument.defaultView || window;
8241    var selection = win.getSelection && win.getSelection();
8242
8243    if (!selection || selection.rangeCount === 0) {
8244      return null;
8245    }
8246
8247    var anchorNode = selection.anchorNode,
8248        anchorOffset = selection.anchorOffset,
8249        focusNode = selection.focusNode,
8250        focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the
8251    // up/down buttons on an <input type="number">. Anonymous divs do not seem to
8252    // expose properties, triggering a "Permission denied error" if any of its
8253    // properties are accessed. The only seemingly possible way to avoid erroring
8254    // is to access a property that typically works for non-anonymous divs and
8255    // catch any error that may otherwise arise. See
8256    // https://bugzilla.mozilla.org/show_bug.cgi?id=208427
8257
8258    try {
8259      /* eslint-disable no-unused-expressions */
8260      anchorNode.nodeType;
8261      focusNode.nodeType;
8262      /* eslint-enable no-unused-expressions */
8263    } catch (e) {
8264      return null;
8265    }
8266
8267    return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);
8268  }
8269  /**
8270   * Returns {start, end} where `start` is the character/codepoint index of
8271   * (anchorNode, anchorOffset) within the textContent of `outerNode`, and
8272   * `end` is the index of (focusNode, focusOffset).
8273   *
8274   * Returns null if you pass in garbage input but we should probably just crash.
8275   *
8276   * Exported only for testing.
8277   */
8278
8279  function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {
8280    var length = 0;
8281    var start = -1;
8282    var end = -1;
8283    var indexWithinAnchor = 0;
8284    var indexWithinFocus = 0;
8285    var node = outerNode;
8286    var parentNode = null;
8287
8288    outer: while (true) {
8289      var next = null;
8290
8291      while (true) {
8292        if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {
8293          start = length + anchorOffset;
8294        }
8295
8296        if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {
8297          end = length + focusOffset;
8298        }
8299
8300        if (node.nodeType === TEXT_NODE) {
8301          length += node.nodeValue.length;
8302        }
8303
8304        if ((next = node.firstChild) === null) {
8305          break;
8306        } // Moving from `node` to its first child `next`.
8307
8308
8309        parentNode = node;
8310        node = next;
8311      }
8312
8313      while (true) {
8314        if (node === outerNode) {
8315          // If `outerNode` has children, this is always the second time visiting
8316          // it. If it has no children, this is still the first loop, and the only
8317          // valid selection is anchorNode and focusNode both equal to this node
8318          // and both offsets 0, in which case we will have handled above.
8319          break outer;
8320        }
8321
8322        if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {
8323          start = length;
8324        }
8325
8326        if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {
8327          end = length;
8328        }
8329
8330        if ((next = node.nextSibling) !== null) {
8331          break;
8332        }
8333
8334        node = parentNode;
8335        parentNode = node.parentNode;
8336      } // Moving from `node` to its next sibling `next`.
8337
8338
8339      node = next;
8340    }
8341
8342    if (start === -1 || end === -1) {
8343      // This should never happen. (Would happen if the anchor/focus nodes aren't
8344      // actually inside the passed-in node.)
8345      return null;
8346    }
8347
8348    return {
8349      start: start,
8350      end: end
8351    };
8352  }
8353  /**
8354   * In modern non-IE browsers, we can support both forward and backward
8355   * selections.
8356   *
8357   * Note: IE10+ supports the Selection object, but it does not support
8358   * the `extend` method, which means that even in modern IE, it's not possible
8359   * to programmatically create a backward selection. Thus, for all IE
8360   * versions, we use the old IE API to create our selections.
8361   *
8362   * @param {DOMElement|DOMTextNode} node
8363   * @param {object} offsets
8364   */
8365
8366  function setOffsets(node, offsets) {
8367    var doc = node.ownerDocument || document;
8368    var win = doc && doc.defaultView || window; // Edge fails with "Object expected" in some scenarios.
8369    // (For instance: TinyMCE editor used in a list component that supports pasting to add more,
8370    // fails when pasting 100+ items)
8371
8372    if (!win.getSelection) {
8373      return;
8374    }
8375
8376    var selection = win.getSelection();
8377    var length = node.textContent.length;
8378    var start = Math.min(offsets.start, length);
8379    var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method.
8380    // Flip backward selections, so we can set with a single range.
8381
8382    if (!selection.extend && start > end) {
8383      var temp = end;
8384      end = start;
8385      start = temp;
8386    }
8387
8388    var startMarker = getNodeForCharacterOffset(node, start);
8389    var endMarker = getNodeForCharacterOffset(node, end);
8390
8391    if (startMarker && endMarker) {
8392      if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {
8393        return;
8394      }
8395
8396      var range = doc.createRange();
8397      range.setStart(startMarker.node, startMarker.offset);
8398      selection.removeAllRanges();
8399
8400      if (start > end) {
8401        selection.addRange(range);
8402        selection.extend(endMarker.node, endMarker.offset);
8403      } else {
8404        range.setEnd(endMarker.node, endMarker.offset);
8405        selection.addRange(range);
8406      }
8407    }
8408  }
8409
8410  function isTextNode(node) {
8411    return node && node.nodeType === TEXT_NODE;
8412  }
8413
8414  function containsNode(outerNode, innerNode) {
8415    if (!outerNode || !innerNode) {
8416      return false;
8417    } else if (outerNode === innerNode) {
8418      return true;
8419    } else if (isTextNode(outerNode)) {
8420      return false;
8421    } else if (isTextNode(innerNode)) {
8422      return containsNode(outerNode, innerNode.parentNode);
8423    } else if ('contains' in outerNode) {
8424      return outerNode.contains(innerNode);
8425    } else if (outerNode.compareDocumentPosition) {
8426      return !!(outerNode.compareDocumentPosition(innerNode) & 16);
8427    } else {
8428      return false;
8429    }
8430  }
8431
8432  function isInDocument(node) {
8433    return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);
8434  }
8435
8436  function isSameOriginFrame(iframe) {
8437    try {
8438      // Accessing the contentDocument of a HTMLIframeElement can cause the browser
8439      // to throw, e.g. if it has a cross-origin src attribute.
8440      // Safari will show an error in the console when the access results in "Blocked a frame with origin". e.g:
8441      // iframe.contentDocument.defaultView;
8442      // A safety way is to access one of the cross origin properties: Window or Location
8443      // Which might result in "SecurityError" DOM Exception and it is compatible to Safari.
8444      // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl
8445      return typeof iframe.contentWindow.location.href === 'string';
8446    } catch (err) {
8447      return false;
8448    }
8449  }
8450
8451  function getActiveElementDeep() {
8452    var win = window;
8453    var element = getActiveElement();
8454
8455    while (element instanceof win.HTMLIFrameElement) {
8456      if (isSameOriginFrame(element)) {
8457        win = element.contentWindow;
8458      } else {
8459        return element;
8460      }
8461
8462      element = getActiveElement(win.document);
8463    }
8464
8465    return element;
8466  }
8467  /**
8468   * @ReactInputSelection: React input selection module. Based on Selection.js,
8469   * but modified to be suitable for react and has a couple of bug fixes (doesn't
8470   * assume buttons have range selections allowed).
8471   * Input selection module for React.
8472   */
8473
8474  /**
8475   * @hasSelectionCapabilities: we get the element types that support selection
8476   * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart`
8477   * and `selectionEnd` rows.
8478   */
8479
8480
8481  function hasSelectionCapabilities(elem) {
8482    var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
8483    return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true');
8484  }
8485  function getSelectionInformation() {
8486    var focusedElem = getActiveElementDeep();
8487    return {
8488      focusedElem: focusedElem,
8489      selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null
8490    };
8491  }
8492  /**
8493   * @restoreSelection: If any selection information was potentially lost,
8494   * restore it. This is useful when performing operations that could remove dom
8495   * nodes and place them back in, resulting in focus being lost.
8496   */
8497
8498  function restoreSelection(priorSelectionInformation) {
8499    var curFocusedElem = getActiveElementDeep();
8500    var priorFocusedElem = priorSelectionInformation.focusedElem;
8501    var priorSelectionRange = priorSelectionInformation.selectionRange;
8502
8503    if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
8504      if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {
8505        setSelection(priorFocusedElem, priorSelectionRange);
8506      } // Focusing a node can change the scroll position, which is undesirable
8507
8508
8509      var ancestors = [];
8510      var ancestor = priorFocusedElem;
8511
8512      while (ancestor = ancestor.parentNode) {
8513        if (ancestor.nodeType === ELEMENT_NODE) {
8514          ancestors.push({
8515            element: ancestor,
8516            left: ancestor.scrollLeft,
8517            top: ancestor.scrollTop
8518          });
8519        }
8520      }
8521
8522      if (typeof priorFocusedElem.focus === 'function') {
8523        priorFocusedElem.focus();
8524      }
8525
8526      for (var i = 0; i < ancestors.length; i++) {
8527        var info = ancestors[i];
8528        info.element.scrollLeft = info.left;
8529        info.element.scrollTop = info.top;
8530      }
8531    }
8532  }
8533  /**
8534   * @getSelection: Gets the selection bounds of a focused textarea, input or
8535   * contentEditable node.
8536   * -@input: Look up selection bounds of this input
8537   * -@return {start: selectionStart, end: selectionEnd}
8538   */
8539
8540  function getSelection(input) {
8541    var selection;
8542
8543    if ('selectionStart' in input) {
8544      // Modern browser with input or textarea.
8545      selection = {
8546        start: input.selectionStart,
8547        end: input.selectionEnd
8548      };
8549    } else {
8550      // Content editable or old IE textarea.
8551      selection = getOffsets(input);
8552    }
8553
8554    return selection || {
8555      start: 0,
8556      end: 0
8557    };
8558  }
8559  /**
8560   * @setSelection: Sets the selection bounds of a textarea or input and focuses
8561   * the input.
8562   * -@input     Set selection bounds of this input or textarea
8563   * -@offsets   Object of same form that is returned from get*
8564   */
8565
8566  function setSelection(input, offsets) {
8567    var start = offsets.start;
8568    var end = offsets.end;
8569
8570    if (end === undefined) {
8571      end = start;
8572    }
8573
8574    if ('selectionStart' in input) {
8575      input.selectionStart = start;
8576      input.selectionEnd = Math.min(end, input.value.length);
8577    } else {
8578      setOffsets(input, offsets);
8579    }
8580  }
8581
8582  var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11;
8583
8584  function registerEvents$3() {
8585    registerTwoPhaseEvent('onSelect', ['focusout', 'contextmenu', 'dragend', 'focusin', 'ke
8585ydown', 'keyup', 'mousedown', 'mouseup', 'selectionchange']);
8586  }
8587
8588  var activeElement$1 = null;
8589  var activeElementInst$1 = null;
8590  var lastSelection = null;
8591  var mouseDown = false;
8592  /**
8593   * Get an object which is a unique representation of the current selection.
8594   *
8595   * The return value will not be consistent across nodes or browsers, but
8596   * two identical selections on the same node will return identical objects.
8597   */
8598
8599  function getSelection$1(node) {
8600    if ('selectionStart' in node && hasSelectionCapabilities(node)) {
8601      return {
8602        start: node.selectionStart,
8603        end: node.selectionEnd
8604      };
8605    } else {
8606      var win = node.ownerDocument && node.ownerDocument.defaultView || window;
8607      var selection = win.getSelection();
8608      return {
8609        anchorNode: selection.anchorNode,
8610        anchorOffset: selection.anchorOffset,
8611        focusNode: selection.focusNode,
8612        focusOffset: selection.focusOffset
8613      };
8614    }
8615  }
8616  /**
8617   * Get document associated with the event target.
8618   */
8619
8620
8621  function getEventTargetDocument(eventTarget) {
8622    return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;
8623  }
8624  /**
8625   * Poll selection to see whether it's changed.
8626   *
8627   * @param {object} nativeEvent
8628   * @param {object} nativeEventTarget
8629   * @return {?SyntheticEvent}
8630   */
8631
8632
8633  function constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {
8634    // Ensure we have the right element, and that the user is not dragging a
8635    // selection (this matches native `select` event behavior). In HTML5, select
8636    // fires only on input and textarea thus if there's no focused element we
8637    // won't dispatch.
8638    var doc = getEventTargetDocument(nativeEventTarget);
8639
8640    if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) {
8641      return;
8642    } // Only fire when selection has actually changed.
8643
8644
8645    var currentSelection = getSelection$1(activeElement$1);
8646
8647    if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {
8648      lastSelection = currentSelection;
8649      var listeners = accumulateTwoPhaseListeners(activeElementInst$1, 'onSelect');
8650
8651      if (listeners.length > 0) {
8652        var event = new SyntheticEvent('onSelect', 'select', null, nativeEvent, nativeEventTarget);
8653        dispatchQueue.push({
8654          event: event,
8655          listeners: listeners
8656        });
8657        event.target = activeElement$1;
8658      }
8659    }
8660  }
8661  /**
8662   * This plugin creates an `onSelect` event that normalizes select events
8663   * across form elements.
8664   *
8665   * Supported elements are:
8666   * - input (see `isTextInputElement`)
8667   * - textarea
8668   * - contentEditable
8669   *
8670   * This differs from native browser implementations in the following ways:
8671   * - Fires on contentEditable fields as well as inputs.
8672   * - Fires for collapsed selection.
8673   * - Fires after user input.
8674   */
8675
8676
8677  function extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
8678    var targetNode = targetInst ? getNodeFromInstance(targetInst) : window;
8679
8680    switch (domEventName) {
8681      // Track the input node that has focus.
8682      case 'focusin':
8683        if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {
8684          activeElement$1 = targetNode;
8685          activeElementInst$1 = targetInst;
8686          lastSelection = null;
8687        }
8688
8689        break;
8690
8691      case 'focusout':
8692        activeElement$1 = null;
8693        activeElementInst$1 = null;
8694        lastSelection = null;
8695        break;
8696      // Don't fire the event while the user is dragging. This matches the
8697      // semantics of the native select event.
8698
8699      case 'mousedown':
8700        mouseDown = true;
8701        break;
8702
8703      case 'contextmenu':
8704      case 'mouseup':
8705      case 'dragend':
8706        mouseDown = false;
8707        constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);
8708        break;
8709      // Chrome and IE fire non-standard event when selection is changed (and
8710      // sometimes when it hasn't). IE's event fires out of order with respect
8711      // to key and input events on deletion, so we discard it.
8712      //
8713      // Firefox doesn't support selectionchange, so check selection status
8714      // after each key entry. The selection changes after keydown and before
8715      // keyup, but we check on keydown as well in the case of holding down a
8716      // key, when multiple keydown events are fired but only one keyup is.
8717      // This is also our approach for IE handling, for the reason above.
8718
8719      case 'selectionchange':
8720        if (skipSelectionChangeEvent) {
8721          break;
8722        }
8723
8724      // falls through
8725
8726      case 'keydown':
8727      case 'keyup':
vendor: 4,746 bytes, lines 8728-8847
8728        constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);
8729    }
8730  }
8731
8732  /**
8733   * Generate a mapping of standard vendor prefixes using the defined style property and event name.
8734   *
8735   * @param {string} styleProp
8736   * @param {string} eventName
8737   * @returns {object}
8738   */
8739
8740  function makePrefixMap(styleProp, eventName) {
8741    var prefixes = {};
8742    prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
8743    prefixes['Webkit' + styleProp] = 'webkit' + eventName;
8744    prefixes['Moz' + styleProp] = 'moz' + eventName;
8745    return prefixes;
8746  }
8747  /**
8748   * A list of event names to a configurable list of vendor prefixes.
8749   */
8750
8751
8752  var vendorPrefixes = {
8753    animationend: makePrefixMap('Animation', 'AnimationEnd'),
8754    animationiteration: makePrefixMap('Animation', 'AnimationIteration'),
8755    animationstart: makePrefixMap('Animation', 'AnimationStart'),
8756    transitionend: makePrefixMap('Transition', 'TransitionEnd')
8757  };
8758  /**
8759   * Event names that have already been detected and prefixed (if applicable).
8760   */
8761
8762  var prefixedEventNames = {};
8763  /**
8764   * Element to check for prefixes on.
8765   */
8766
8767  var style = {};
8768  /**
8769   * Bootstrap if a DOM exists.
8770   */
8771
8772  if (canUseDOM) {
8773    style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x,
8774    // the un-prefixed "animation" and "transition" properties are defined on the
8775    // style object but the events that fire will still be prefixed, so we need
8776    // to check if the un-prefixed events are usable, and if not remove them from the map.
8777
8778    if (!('AnimationEvent' in window)) {
8779      delete vendorPrefixes.animationend.animation;
8780      delete vendorPrefixes.animationiteration.animation;
8781      delete vendorPrefixes.animationstart.animation;
8782    } // Same as above
8783
8784
8785    if (!('TransitionEvent' in window)) {
8786      delete vendorPrefixes.transitionend.transition;
8787    }
8788  }
8789  /**
8790   * Attempts to determine the correct vendor prefixed event name.
8791   *
8792   * @param {string} eventName
8793   * @returns {string}
8794   */
8795
8796
8797  function getVendorPrefixedEventName(eventName) {
8798    if (prefixedEventNames[eventName]) {
8799      return prefixedEventNames[eventName];
8800    } else if (!vendorPrefixes[eventName]) {
8801      return eventName;
8802    }
8803
8804    var prefixMap = vendorPrefixes[eventName];
8805
8806    for (var styleProp in prefixMap) {
8807      if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
8808        return prefixedEventNames[eventName] = prefixMap[styleProp];
8809      }
8810    }
8811
8812    return eventName;
8813  }
8814
8815  var ANIMATION_END = getVendorPrefixedEventName('animationend');
8816  var ANIMATION_ITERATION = getVendorPrefixedEventName('animationiteration');
8817  var ANIMATION_START = getVendorPrefixedEventName('animationstart');
8818  var TRANSITION_END = getVendorPrefixedEventName('transitionend');
8819
8820  var topLevelEventsToReactNames = new Map(); // NOTE: Capitalization is important in this list!
8821  //
8822  // E.g. it needs "pointerDown", not "pointerdown".
8823  // This is because we derive both React name ("onPointerDown")
8824  // and DOM name ("pointerdown") from the same list.
8825  //
8826  // Exceptions that don't match this convention are listed separately.
8827  //
8828  // prettier-ignore
8829
8830  var simpleEventPluginEvents = ['abort', 'auxClick', 'cancel', 'canPlay', 'canPlayThrough', 'click', 'close', 'contextMenu', 'copy', 'cut', 'drag', 'dragEnd', 'dragEnter', 'dragExit', 'dragLeave', 'dragOver', 'dragStart', 'drop', 'durationChange', 'emptied', 'encrypted', 'ended', 'error', 'gotPointerCapture', 'input', 'invalid', 'keyDown', 'keyPress', 'keyUp', 'load', 'loadedData', 'loadedMetadata', 'loadStart', 'lostPointerCapture', 'mouseDown', 'mouseMove', 'mouseOut', 'mouseOver', 'mouseUp', 'paste', 'pause', 'play', 'playing', 'pointerCancel', 'pointerDown', 'pointerMove', 'pointerOut', 'pointerOver', 'pointerUp', 'progress', 'rateChange', 'reset', 'resize', 'seeked', 'seeking', 'stalled', 'submit', 'suspend', 'timeUpdate', 'touchCancel', 'touchEnd', 'touchStart', 'volumeChange', 'scroll', 'toggle', 'touchMove', 'waiting', 'wheel'];
8831
8832  function registerSimpleEvent(domEventName, reactName) {
8833    topLevelEventsToReactNames.set(domEventName, reactName);
8834    registerTwoPhaseEvent(reactName, [domEventName]);
8835  }
8836
8837  function registerSimpleEvents() {
8838    for (var i = 0; i < simpleEventPluginEvents.length; i++) {
8839      var eventName = simpleEventPluginEvents[i];
8840      var domEventName = eventName.toLowerCase();
8841      var capitalizedEvent = eventName[0].toUpperCase() + eventName.slice(1);
8842      registerSimpleEvent(domEventName, 'on' + capitalizedEvent);
8843    } // Special cases where event names don't match.
8844
8845
8846    registerSimpleEvent(ANIMATION_END, 'onAnimationEnd');
8847    registerSimpleEvent(ANIMATION_ITERATION, 'onAnimationIteration');
8848    registerSimpleEvent(ANIMATION_START, 'onAnimationStart');
8849    registerSimpleEvent('dblclick', 'onDoubleClick');
8850    registerSimpleEvent('focusin', 'onFocus');
8851    registerSimpleEvent('focusout', 'onBlur');
8852    registerSimpleEvent(TRANSITION_END, 'onTransitionEnd');
8853  }
8854
8855  function extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
8856    var reactName = topLevelEventsToReactNames.get(domEventName);
8857
8858    if (reactName === undefined) {
8859      return;
8860    }
8861
8862    var SyntheticEventCtor = SyntheticEvent;
8863    var reactEventType = domEventName;
8864
8865    switch (domEventName) {
8866      case 'keypress':
8867        // Firefox creates a keypress event for function keys too. This removes
8868        // the unwanted keypress events. Enter is however both printable and
8869        // non-printable. One would expect Tab to be as well (but it isn't).
8870        if (getEventCharCode(nativeEvent) === 0) {
8871          return;
8872        }
8873
8874      /* falls through */
8875
8876      case 'keydown':
8877      case 'keyup':
8878        SyntheticEventCtor = SyntheticKeyboardEvent;
8879        break;
8880
8881      case 'focusin':
8882        reactEventType = 'focus';
8883        SyntheticEventCtor = SyntheticFocusEvent;
8884        break;
8885
8886      case 'focusout':
8887        reactEventType = 'blur';
8888        SyntheticEventCtor = SyntheticFocusEvent;
8889        break;
8890
8891      case 'beforeblur':
8892      case 'afterblur':
8893        SyntheticEventCtor = SyntheticFocusEvent;
8894        break;
8895
8896      case 'click':
8897        // Firefox creates a click event on right mouse clicks. This removes the
8898        // unwanted click events.
8899        if (nativeEvent.button === 2) {
8900          return;
8901        }
8902
8903      /* falls through */
8904
8905      case 'auxclick':
8906      case 'dblclick':
8907      case 'mousedown':
8908      case 'mousemove':
8909      case 'mouseup': // TODO: Disabled elements should not respond to mouse events
8910
8911      /* falls through */
8912
8913      case 'mouseout':
8914      case 'mouseover':
8915      case 'contextmenu':
8916        SyntheticEventCtor = SyntheticMouseEvent;
8917        break;
8918
8919      case 'drag':
8920      case 'dragend':
8921      case 'dragenter':
8922      case 'dragexit':
8923      case 'dragleave':
8924      case 'dragover':
8925      case 'dragstart':
8926      case 'drop':
8927        SyntheticEventCtor = SyntheticDragEvent;
8928        break;
8929
8930      case 'touchcancel':
8931      case 'touchend':
8932      case 'touchmove':
8933      case 'touchstart':
8934        SyntheticEventCtor = SyntheticTouchEvent;
8935        break;
8936
8937      case ANIMATION_END:
8938      case ANIMATION_ITERATION:
8939      case ANIMATION_START:
8940        SyntheticEventCtor = SyntheticAnimationEvent;
8941        break;
8942
8943      case TRANSITION_END:
8944        SyntheticEventCtor = SyntheticTransitionEvent;
8945        break;
8946
8947      case 'scroll':
8948        SyntheticEventCtor = SyntheticUIEvent;
8949        break;
8950
8951      case 'wheel':
8952        SyntheticEventCtor = SyntheticWheelEvent;
8953        break;
8954
8955      case 'copy':
8956      case 'cut':
8957      case 'paste':
8958        SyntheticEventCtor = SyntheticClipboardEvent;
8959        break;
8960
8961      case 'gotpointercapture':
8962      case 'lostpointercapture':
8963      case 'pointercancel':
8964      case 'pointerdown':
8965      case 'pointermove':
8966      case 'pointerout':
8967      case 'pointerover':
8968      case 'pointerup':
8969        SyntheticEventCtor = SyntheticPointerEvent;
8970        break;
8971    }
8972
8973    var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0;
8974
8975    {
8976      // Some events don't bubble in the browser.
8977      // In the past, React has always bubbled them, but this can be surprising.
8978      // We're going to try aligning closer to the browser behavior by not bubbling
8979      // them in React either. We'll start by not bubbling onScroll, and then expand.
8980      var accumulateTargetOnly = !inCapturePhase && // TODO: ideally, we'd eventually add all events from
8981      // nonDelegatedEvents list in DOMPluginEventSystem.
8982      // Then we can remove this special list.
8983      // This is a breaking change that can wait until React 18.
8984      domEventName === 'scroll';
8985
8986      var _listeners = accumulateSinglePhaseListeners(targetInst, reactName, nativeEvent.type, inCapturePhase, accumulateTargetOnly);
8987
8988      if (_listeners.length > 0) {
8989        // Intentionally create event lazily.
8990        var _event = new SyntheticEventCtor(reactName, reactEventType, null, nativeEvent, nativeEventTarget);
8991
8992        dispatchQueue.push({
8993          event: _event,
8994          listeners: _listeners
8995        });
8996      }
8997    }
8998  }
8999
9000  // TODO: remove top-level side effect.
9001  registerSimpleEvents();
9002  registerEvents$2();
9003  registerEvents$1();
9004  registerEvents$3();
9005  registerEvents();
9006
9007  function extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
9008    // TODO: we should remove the concept of a "SimpleEventPlugin".
9009    // This is the basic functionality of the event system. All
9010    // the other plugins are essentially polyfills. So the plugin
9011    // should probably be inlined somewhere and have its logic
9012    // be core the to event system. This would potentially allow
9013    // us to ship builds of React without the polyfilled plugins below.
9014    extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
9015    var shouldProcessPolyfillPlugins = (eventSystemFlags & SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS) === 0; // We don't process these events unless we are in the
9016    // event's native "bubble" phase, which means that we're
9017    // not in the capture phase. That's because we emulate
9018    // the capture phase here still. This is a trade-off,
9019    // because in an ideal world we would not emulate and use
9020    // the phases properly, like we do with the SimpleEvent
9021    // plugin. However, the plugins below either expect
9022    // emulation (EnterLeave) or use state localized to that
9023    // plugin (BeforeInput, Change, Select). The state in
9024    // these modules complicates things, as you'll essentially
9025    // get the case where the capture phase event might change
9026    // state, only for the following bubble event to come in
9027    // later and not trigger anything as the state now
9028    // invalidates the heuristics of the event plugin. We
9029    // could alter all these plugins to work in such ways, but
9030    // that might cause other unknown side-effects that we
9031    // can't foresee right now.
9032
9033    if (shouldProcessPolyfillPlugins) {
9034      extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
9035      extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
9036      extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
9037      extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
9038    }
9039  } // List of events that need to be individually attached to media elements.
9040
9041
9042  var mediaEventTypes = ['abort', 'canplay', 'canplaythrough', 'durationchange', 'emptied', 'encrypted', 'ended', 'error', 'loadeddata', 'loadedmetadata', 'loadstart', 'pause', 'play', 'playing', 'progress', 'ratechange', 'resize', 'seeked', 'seeking', 'stalled', 'suspend', 'timeupdate', 'volumechange', 'waiting']; // We should not delegate these events to the container, but rather
9043  // set them on the actual target element itself. This is primarily
9044  // because these events do not consistently bubble in the DOM.
9045
9046  var nonDelegatedEvents = new Set(['cancel', 'close', 'invalid', 'load', 'scroll', 'toggle'].concat(mediaEventTypes));
9047
9048  function executeDispatch(event, listener, currentTarget) {
9049    var type = event.type || 'unknown-event';
9050    event.currentTarget = currentTarget;
9051    invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);
9052    event.currentTarget = null;
9053  }
9054
9055  function processDispatchQueueItemsInOrder(event, dispatchListeners, inCapturePhase) {
9056    var previousInstance;
9057
9058    if (inCapturePhase) {
9059      for (var i = dispatchListeners.length - 1; i >= 0; i--) {
9060        var _dispatchListeners$i = dispatchListeners[i],
9061            instance = _dispatchListeners$i.instance,
9062            currentTarget = _dispatchListeners$i.currentTarget,
9063            listener = _dispatchListeners$i.listener;
9064
9065        if (instance !== previousInstance && event.isPropagationStopped()) {
9066          return;
9067        }
9068
9069        executeDispatch(event, listener, currentTarget);
9070        previousInstance = instance;
9071      }
9072    } else {
9073      for (var _i = 0; _i < dispatchListeners.length; _i++) {
9074        var _dispatchListeners$_i = dispatchListeners[_i],
9075            _instance = _dispatchListeners$_i.instance,
9076            _currentTarget = _dispatchListeners$_i.currentTarget,
9077            _listener = _dispatchListeners$_i.listener;
9078
9079        if (_instance !== previousInstance && event.isPropagationStopped()) {
9080          return;
9081        }
9082
9083        executeDispatch(event, _listener, _currentTarget);
9084        previousInstance = _instance;
9085      }
9086    }
9087  }
9088
9089  function processDispatchQueue(dispatchQueue, eventSystemFlags) {
9090    var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0;
9091
9092    for (var i = 0; i < dispatchQueue.length; i++) {
9093      var _dispatchQueue$i = dispatchQueue[i],
9094          event = _dispatchQueue$i.event,
9095          listeners = _dispatchQueue$i.listeners;
9096      processDispatchQueueItemsInOrder(event, listeners, inCapturePhase); //  event system doesn't use pooling.
9097    } // This would be a good time to rethrow if any of the event handlers threw.
9098
9099
9100    rethrowCaughtError();
9101  }
9102
9103  function dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) {
9104    var nativeEventTarget = getEventTarget(nativeEvent);
9105    var dispatchQueue = [];
9106    extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
9107    processDispatchQueue(dispatchQueue, eventSystemFlags);
9108  }
9109
9110  function listenToNonDelegatedEvent(domEventName, targetElement) {
9111    {
9112      if (!nonDelegatedEvents.has(domEventName)) {
9113        error('Did not expect a listenToNonDelegatedEvent() call for "%s". ' + 'This is a bug in React. Please file an issue.', domEventName);
9114      }
9115    }
9116
9117    var isCapturePhaseListener = false;
9118    var listenerSet = getEventListenerSet(targetElement);
9119    var listenerSetKey = getListenerSetKey(domEventName, isCapturePhaseListener);
9120
9121    if (!listenerSet.has(listenerSetKey)) {
9122      addTrappedEventListener(targetElement, domEventName, IS_NON_DELEGATED, isCapturePhaseListener);
9123      listenerSet.add(listenerSetKey);
9124    }
9125  }
9126  function listenToNativeEvent(domEventName, isCapturePhaseListener, target) {
9127    {
9128      if (nonDelegatedEvents.has(domEventName) && !isCapturePhaseListener) {
9129        error('Did not expect a listenToNativeEvent() call for "%s" in the bubble phase. ' + 'This is a bug in React. Please file an issue.', domEventName);
9130      }
9131    }
9132
9133    var eventSystemFlags = 0;
9134
9135    if (isCapturePhaseListener) {
9136      eventSystemFlags |= IS_CAPTURE_PHASE;
9137    }
9138
9139    addTrappedEventListener(target, domEventName, eventSystemFlags, isCapturePhaseListener);
9140  } // This is only used by createEventHandle when the
9141  var listeningMarker = '_reactListening' + Math.random().toString(36).slice(2);
9142  function listenToAllSupportedEvents(rootContainerElement) {
9143    if (!rootContainerElement[listeningMarker]) {
9144      rootContainerElement[listeningMarker] = true;
9145      allNativeEvents.forEach(function (domEventName) {
9146        // We handle selectionchange separately because it
9147        // doesn't bubble and needs to be on the document.
9148        if (domEventName !== 'selectionchange') {
9149          if (!nonDelegatedEvents.has(domEventName)) {
9150            listenToNativeEvent(domEventName, false, rootContainerElement);
9151          }
9152
9153          listenToNativeEvent(domEventName, true, rootContainerElement);
9154        }
9155      });
9156      var ownerDocument = rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
9157
9158      if (ownerDocument !== null) {
9159        // The selectionchange event also needs deduplication
9160        // but it is attached to the document.
9161        if (!ownerDocument[listeningMarker]) {
9162          ownerDocument[listeningMarker] = true;
9163          listenToNativeEvent('selectionchange', false, ownerDocument);
9164        }
9165      }
9166    }
9167  }
9168
9169  function addTrappedEventListener(targetContainer, domEventName, eventSystemFlags, isCapturePhaseListener, isDeferredListenerForLegacyFBSupport) {
9170    var listener = createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags); // If passive option is not supported, then the event will be
9171    // active and not passive.
9172
9173    var isPassiveListener = undefined;
9174
9175    if (passiveBrowserEventsSupported) {
9176      // Browsers introduced an intervention, making these events
9177      // passive by default on document. React doesn't bind them
9178      // to document anymore, but changing this now would undo
9179      // the performance wins from the change. So we emulate
9180      // the existing behavior manually on the roots now.
9181      // https://github.com/facebook/react/issues/19651
9182      if (domEventName === 'touchstart' || domEventName === 'touchmove' || domEventName === 'wheel') {
9183        isPassiveListener = true;
9184      }
9185    }
9186
9187    targetContainer =  targetContainer;
9188    var unsubscribeListener; // When legacyFBSupport is enabled, it's for when we
9189
9190
9191    if (isCapturePhaseListener) {
9192      if (isPassiveListener !== undefined) {
9193        unsubscribeListener = addEventCaptureListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener);
9194      } else {
9195        unsubscribeListener = addEventCaptureListener(targetContainer, domEventName, listener);
9196      }
9197    } else {
9198      if (isPassiveListener !== undefined) {
9199        unsubscribeListener = addEventBubbleListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener);
9200      } else {
9201        unsubscribeListener = addEventBubbleListener(targetContainer, domEventName, listener);
9202      }
9203    }
9204  }
9205
9206  function isMatchingRootContainer(grandContainer, targetContainer) {
9207    return grandContainer === targetContainer || grandContainer.nodeType === COMMENT_NODE && grandContainer.parentNode === targetContainer;
9208  }
9209
9210  function dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) {
9211    var ancestorInst = targetInst;
9212
9213    if ((eventSystemFlags & IS_EVENT_HANDLE_NON_MANAGED_NODE) === 0 && (eventSystemFlags & IS_NON_DELEGATED) === 0) {
9214      var targetContainerNode = targetContainer; // If we are using the legacy FB support flag, we
9215
9216      if (targetInst !== null) {
9217        // The below logic attempts to work out if we need to change
9218        // the target fiber to a different ancestor. We had similar logic
9219        // in the legacy event system, except the big difference between
9220        // systems is that the modern event system now has an event listener
9221        // attached to each React Root and React Portal Root. Together,
9222        // the DOM nodes representing these roots are the "rootContainer".
9223        // To figure out which ancestor instance we should use, we traverse
9224        // up the fiber tree from the target instance and attempt to find
9225        // root boundaries that match that of our current "rootContainer".
9226        // If we find that "rootContainer", we find the parent fiber
9227        // sub-tree for that root and make that our ancestor instance.
9228        var node = targetInst;
9229
9230        mainLoop: while (true) {
9231          if (node === null) {
9232            return;
9233          }
9234
9235          var nodeTag = node.tag;
9236
9237          if (nodeTag === HostRoot || nodeTag === HostPortal) {
9238            var container = node.stateNode.containerInfo;
9239
9240            if (isMatchingRootContainer(container, targetContainerNode)) {
9241              break;
9242            }
9243
9244            if (nodeTag === HostPortal) {
9245              // The target is a portal, but it's not the rootContainer we're looking for.
9246              // Normally portals handle their own events all the way down to the root.
9247              // So we should be able to stop now. However, we don't know if this portal
9248              // was part of *our* root.
9249              var grandNode = node.return;
9250
9251              while (grandNode !== null) {
9252                var grandTag = grandNode.tag;
9253
9254                if (grandTag === HostRoot || grandTag === HostPortal) {
9255                  var grandContainer = grandNode.stateNode.containerInfo;
9256
9257                  if (isMatchingRootContainer(grandContainer, targetContainerNode)) {
9258                    // This is the rootContainer we're looking for and we found it as
9259                    // a parent of the Portal. That means we can ignore it because the
9260                    // Portal will bubble through to us.
9261                    return;
9262                  }
9263                }
9264
9265                grandNode = grandNode.return;
9266              }
9267            } // Now we need to find it's corresponding host fiber in the other
9268            // tree. To do this we can use getClosestInstanceFromNode, but we
9269            // need to validate that the fiber is a host instance, otherwise
9270            // we need to traverse up through the DOM till we find the correct
9271            // node that is from the other tree.
9272
9273
9274            while (container !== null) {
9275              var parentNode = getClosestInstanceFromNode(container);
9276
9277              if (parentNode === null) {
9278                return;
9279              }
9280
9281              var parentTag = parentNode.tag;
9282
9283              if (parentTag === HostComponent || parentTag === HostText) {
9284                node = ancestorInst = parentNode;
9285                continue mainLoop;
9286              }
9287
9288              container = container.parentNode;
9289            }
9290          }
9291
9292          node = node.return;
9293        }
9294      }
9295    }
9296
9297    batchedUpdates(function () {
9298      return dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, ancestorInst);
9299    });
9300  }
9301
9302  function createDispatchListener(instance, listener, currentTarget) {
9303    return {
9304      instance: instance,
9305      listener: listener,
9306      currentTarget: currentTarget
9307    };
9308  }
9309
9310  function accumulateSinglePhaseListeners(targetFiber, reactName, nativeEventType, inCapturePhase, accumulateTargetOnly, nativeEvent) {
9311    var captureName = reactName !== null ? reactName + 'Capture' : null;
9312    var reactEventName = inCapturePhase ? captureName : reactName;
9313    var listeners = [];
9314    var instance = targetFiber;
9315    var lastHostComponent = null; // Accumulate all instances and listeners via the target -> root path.
9316
9317    while (instance !== null) {
9318      var _instance2 = instance,
9319          stateNode = _instance2.stateNode,
9320          tag = _instance2.tag; // Handle listeners that are on HostComponents (i.e. <div>)
9321
9322      if (tag === HostComponent && stateNode !== null) {
9323        lastHostComponent = stateNode; // createEventHandle listeners
9324
9325
9326        if (reactEventName !== null) {
9327          var listener = getListener(instance, reactEventName);
9328
9329          if (listener != null) {
9330            listeners.push(createDispatchListener(instance, listener, lastHostComponent));
9331          }
9332        }
9333      } // If we are only accumulating events for the target, then we don't
9334      // continue to propagate through the React fiber tree to find other
9335      // listeners.
9336
9337
9338      if (accumulateTargetOnly) {
9339        break;
9340      } // If we are processing the onBeforeBlur event, then we need to take
9341
9342      instance = instance.return;
9343    }
9344
9345    return listeners;
9346  } // We should only use this function for:
9347  // - BeforeInputEventPlugin
9348  // - ChangeEventPlugin
9349  // - SelectEventPlugin
9350  // This is because we only process these plugins
9351  // in the bubble phase, so we need to accumulate two
9352  // phase event listeners (via emulation).
9353
9354  function accumulateTwoPhaseListeners(targetFiber, reactName) {
9355    var captureName = reactName + 'Capture';
9356    var listeners = [];
9357    var instance = targetFiber; // Accumulate all instances and listeners via the target -> root path.
9358
9359    while (instance !== null) {
9360      var _instance3 = instance,
9361          stateNode = _instance3.stateNode,
9362          tag = _instance3.tag; // Handle listeners that are on HostComponents (i.e. <div>)
9363
9364      if (tag === HostComponent && stateNode !== null) {
9365        var currentTarget = stateNode;
9366        var captureListener = getListener(instance, captureName);
9367
9368        if (captureListener != null) {
9369          listeners.unshift(createDispatchListener(instance, captureListener, currentTarget));
9370        }
9371
9372        var bubbleListener = getListener(instance, reactName);
9373
9374        if (bubbleListener != null) {
9375          listeners.push(createDispatchListener(instance, bubbleListener, currentTarget));
9376        }
9377      }
9378
9379      instance = instance.return;
9380    }
9381
9382    return listeners;
9383  }
9384
9385  function getParent(inst) {
9386    if (inst === null) {
9387      return null;
9388    }
9389
9390    do {
9391      inst = inst.return; // TODO: If this is a HostRoot we might want to bail out.
9392      // That is depending on if we want nested subtrees (layers) to bubble
9393      // events to their parent. We could also go through parentNode on the
9394      // host node but that wouldn't work for React Native and doesn't let us
9395      // do the portal feature.
9396    } while (inst && inst.tag !== HostComponent);
9397
9398    if (inst) {
9399      return inst;
9400    }
9401
9402    return null;
9403  }
9404  /**
9405   * Return the lowest common ancestor of A and B, or null if they are in
9406   * different trees.
9407   */
9408
9409
9410  function getLowestCommonAncestor(instA, instB) {
9411    var nodeA = instA;
9412    var nodeB = instB;
9413    var depthA = 0;
9414
9415    for (var tempA = nodeA; tempA; tempA = getParent(tempA)) {
9416      depthA++;
9417    }
9418
9419    var depthB = 0;
9420
9421    for (var tempB = nodeB; tempB; tempB = getParent(tempB)) {
9422      depthB++;
9423    } // If A is deeper, crawl up.
9424
9425
9426    while (depthA - depthB > 0) {
9427      nodeA = getParent(nodeA);
9428      depthA--;
9429    } // If B is deeper, crawl up.
9430
9431
9432    while (depthB - depthA > 0) {
9433      nodeB = getParent(nodeB);
9434      depthB--;
9435    } // Walk in lockstep until we find a match.
9436
9437
9438    var depth = depthA;
9439
9440    while (depth--) {
9441      if (nodeA === nodeB || nodeB !== null && nodeA === nodeB.alternate) {
9442        return nodeA;
9443      }
9444
9445      nodeA = getParent(nodeA);
9446      nodeB = getParent(nodeB);
9447    }
9448
9449    return null;
9450  }
9451
9452  function accumulateEnterLeaveListenersForEvent(dispatchQueue, event, target, common, inCapturePhase) {
9453    var registrationName = event._reactName;
9454    var listeners = [];
9455    var instance = target;
9456
9457    while (instance !== null) {
9458      if (instance === common) {
9459        break;
9460      }
9461
9462      var _instance4 = instance,
9463          alternate = _instance4.alternate,
9464          stateNode = _instance4.stateNode,
9465          tag = _instance4.tag;
9466
9467      if (alternate !== null && alternate === common) {
9468        break;
9469      }
9470
9471      if (tag === HostComponent && stateNode !== null) {
9472        var currentTarget = stateNode;
9473
9474        if (inCapturePhase) {
9475          var captureListener = getListener(instance, registrationName);
9476
9477          if (captureListener != null) {
9478            listeners.unshift(createDispatchListener(instance, captureListener, currentTarget));
9479          }
9480        } else if (!inCapturePhase) {
9481          var bubbleListener = getListener(instance, registrationName);
9482
9483          if (bubbleListener != null) {
9484            listeners.push(createDispatchListener(instance, bubbleListener, currentTarget));
9485          }
9486        }
9487      }
9488
9489      instance = instance.return;
9490    }
9491
9492    if (listeners.length !== 0) {
9493      dispatchQueue.push({
9494        event: event,
9495        listeners: listeners
9496      });
9497    }
9498  } // We should only use this function for:
9499  // - EnterLeaveEventPlugin
9500  // This is because we only process this plugin
9501  // in the bubble phase, so we need to accumulate two
9502  // phase event listeners.
9503
9504
9505  function accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leaveEvent, enterEvent, from, to) {
9506    var common = from && to ? getLowestCommonAncestor(from, to) : null;
9507
9508    if (from !== null) {
9509      accumulateEnterLeaveListenersForEvent(dispatchQueue, leaveEvent, from, common, false);
9510    }
9511
9512    if (to !== null && enterEvent !== null) {
9513      accumulateEnterLeaveListenersForEvent(dispatchQueue, enterEvent, to, common, true);
9514    }
9515  }
9516  function getListenerSetKey(domEventName, capture) {
9517    return domEventName + "__" + (capture ? 'capture' : 'bubble');
9518  }
9519
9520  var didWarnInvalidHydration = false;
9521  var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';
9522  var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';
9523  var SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';
9524  var AUTOFOCUS = 'autoFocus';
9525  var CHILDREN = 'children';
9526  var STYLE = 'style';
9527  var HTML$1 = '__html';
9528  var warnedUnknownTags;
9529  var validatePropertiesInDevelopment;
9530  var warnForPropDifference;
9531  var warnForExtraAttributes;
9532  var warnForInvalidEventListener;
9533  var canDiffStyleForHydrationWarning;
9534  var normalizeHTML;
9535
9536  {
9537    warnedUnknownTags = {
9538      // There are working polyfills for <dialog>. Let people use it.
9539      dialog: true,
9540      // Electron ships a custom <webview> tag to display external web content in
9541      // an isolated frame and process.
9542      // This tag is not present in non Electron environments such as JSDom which
9543      // is often used for testing purposes.
9544      // @see https://electronjs.org/docs/api/webview-tag
9545      webview: true
9546    };
9547
9548    validatePropertiesInDevelopment = function (type, props) {
9549      validateProperties(type, props);
9550      validateProperties$1(type, props);
9551      validateProperties$2(type, props, {
9552        registrationNameDependencies: registrationNameDependencies,
9553        possibleRegistrationNames: possibleRegistrationNames
9554      });
9555    }; // IE 11 parses & normalizes the style attribute as opposed to other
9556    // browsers. It adds spaces and sorts the properties in some
9557    // non-alphabetical order. Handling that would require sorting CSS
9558    // properties in the client & server versions or applying
9559    // `expectedStyle` to a temporary DOM node to read its `style` attribute
9560    // normalized. Since it only affects IE, we're skipping style warnings
9561    // in that browser completely in favor of doing all that work.
9562    // See https://github.com/facebook/react/issues/11807
9563
9564
9565    canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode;
9566
9567    warnForPropDifference = function (propName, serverValue, clientValue) {
vendor: 72,327 bytes, lines 9568-11542
9568      if (didWarnInvalidHydration) {
9569        return;
9570      }
9571
9572      var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);
9573      var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);
9574
9575      if (normalizedServerValue === normalizedClientValue) {
9576        return;
9577      }
9578
9579      didWarnInvalidHydration = true;
9580
9581      error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));
9582    };
9583
9584    warnForExtraAttributes = function (attributeNames) {
9585      if (didWarnInvalidHydration) {
9586        return;
9587      }
9588
9589      didWarnInvalidHydration = true;
9590      var names = [];
9591      attributeNames.forEach(function (name) {
9592        names.push(name);
9593      });
9594
9595      error('Extra attributes from the server: %s', names);
9596    };
9597
9598    warnForInvalidEventListener = function (registrationName, listener) {
9599      if (listener === false) {
9600        error('Expected `%s` listener to be a function, instead got `false`.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName);
9601      } else {
9602        error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener);
9603      }
9604    }; // Parse the HTML and read it back to normalize the HTML string so that it
9605    // can be used for comparison.
9606
9607
9608    normalizeHTML = function (parent, html) {
9609      // We could have created a separate document here to avoid
9610      // re-initializing custom elements if they exist. But this breaks
9611      // how <noscript> is being handled. So we use the same document.
9612      // See the discussion in https://github.com/facebook/react/pull/11157.
9613      var testElement = parent.namespaceURI === HTML_NAMESPACE ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);
9614      testElement.innerHTML = html;
9615      return testElement.innerHTML;
9616    };
9617  } // HTML parsing normalizes CR and CRLF to LF.
9618  // It also can turn \u0000 into \uFFFD inside attributes.
9619  // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream
9620  // If we have a mismatch, it might be caused by that.
9621  // We will still patch up in this case but not fire the warning.
9622
9623
9624  var NORMALIZE_NEWLINES_REGEX = /\r\n?/g;
9625  var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g;
9626
9627  function normalizeMarkupForTextOrAttribute(markup) {
9628    {
9629      checkHtmlStringCoercion(markup);
9630    }
9631
9632    var markupString = typeof markup === 'string' ? markup : '' + markup;
9633    return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');
9634  }
9635
9636  function checkForUnmatchedText(serverText, clientText, isConcurrentMode, shouldWarnDev) {
9637    var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);
9638    var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);
9639
9640    if (normalizedServerText === normalizedClientText) {
9641      return;
9642    }
9643
9644    if (shouldWarnDev) {
9645      {
9646        if (!didWarnInvalidHydration) {
9647          didWarnInvalidHydration = true;
9648
9649          error('Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText);
9650        }
9651      }
9652    }
9653
9654    if (isConcurrentMode && enableClientRenderFallbackOnTextMismatch) {
9655      // In concurrent roots, we throw when there's a text mismatch and revert to
9656      // client rendering, up to the nearest Suspense boundary.
9657      throw new Error('Text content does not match server-rendered HTML.');
9658    }
9659  }
9660
9661  function getOwnerDocumentFromRootContainer(rootContainerElement) {
9662    return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
9663  }
9664
9665  function noop() {}
9666
9667  function trapClickOnNonInteractiveElement(node) {
9668    // Mobile Safari does not fire properly bubble click events on
9669    // non-interactive elements, which means delegated click listeners do not
9670    // fire. The workaround for this bug involves attaching an empty click
9671    // listener on the target node.
9672    // https://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
9673    // Just set it using the onclick property so that we don't have to manage any
9674    // bookkeeping for it. Not sure if we need to clear it when the listener is
9675    // removed.
9676    // TODO: Only do this for the relevant Safaris maybe?
9677    node.onclick = noop;
9678  }
9679
9680  function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {
9681    for (var propKey in nextProps) {
9682      if (!nextProps.hasOwnProperty(propKey)) {
9683        continue;
9684      }
9685
9686      var nextProp = nextProps[propKey];
9687
9688      if (propKey === STYLE) {
9689        {
9690          if (nextProp) {
9691            // Freeze the next style object so that we can assume it won't be
9692            // mutated. We have already warned for this in the past.
9693            Object.freeze(nextProp);
9694          }
9695        } // Relies on `updateStylesByID` not mutating `styleUpdates`.
9696
9697
9698        setValueForStyles(domElement, nextProp);
9699      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
9700        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
9701
9702        if (nextHtml != null) {
9703          setInnerHTML(domElement, nextHtml);
9704        }
9705      } else if (propKey === CHILDREN) {
9706        if (typeof nextProp === 'string') {
9707          // Avoid setting initial textContent when the text is empty. In IE11 setting
9708          // textContent on a <textarea> will cause the placeholder to not
9709          // show within the <textarea> until it has been focused and blurred again.
9710          // https://github.com/facebook/react/issues/6731#issuecomment-254874553
9711          var canSetTextContent = tag !== 'textarea' || nextProp !== '';
9712
9713          if (canSetTextContent) {
9714            setTextContent(domElement, nextProp);
9715          }
9716        } else if (typeof nextProp === 'number') {
9717          setTextContent(domElement, '' + nextProp);
9718        }
9719      } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) {
9720        if (nextProp != null) {
9721          if ( typeof nextProp !== 'function') {
9722            warnForInvalidEventListener(propKey, nextProp);
9723          }
9724
9725          if (propKey === 'onScroll') {
9726            listenToNonDelegatedEvent('scroll', domElement);
9727          }
9728        }
9729      } else if (nextProp != null) {
9730        setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);
9731      }
9732    }
9733  }
9734
9735  function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {
9736    // TODO: Handle wasCustomComponentTag
9737    for (var i = 0; i < updatePayload.length; i += 2) {
9738      var propKey = updatePayload[i];
9739      var propValue = updatePayload[i + 1];
9740
9741      if (propKey === STYLE) {
9742        setValueForStyles(domElement, propValue);
9743      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
9744        setInnerHTML(domElement, propValue);
9745      } else if (propKey === CHILDREN) {
9746        setTextContent(domElement, propValue);
9747      } else {
9748        setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);
9749      }
9750    }
9751  }
9752
9753  function createElement(type, props, rootContainerElement, parentNamespace) {
9754    var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML
9755    // tags get no namespace.
9756
9757    var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);
9758    var domElement;
9759    var namespaceURI = parentNamespace;
9760
9761    if (namespaceURI === HTML_NAMESPACE) {
9762      namespaceURI = getIntrinsicNamespace(type);
9763    }
9764
9765    if (namespaceURI === HTML_NAMESPACE) {
9766      {
9767        isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to
9768        // allow <SVG> or <mATH>.
9769
9770        if (!isCustomComponentTag && type !== type.toLowerCase()) {
9771          error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type);
9772        }
9773      }
9774
9775      if (type === 'script') {
9776        // Create the script via .innerHTML so its "parser-inserted" flag is
9777        // set to true and it does not execute
9778        var div = ownerDocument.createElement('div');
9779
9780        div.innerHTML = '<script><' + '/script>'; // eslint-disable-line
9781        // This is guaranteed to yield a script element.
9782
9783        var firstChild = div.firstChild;
9784        domElement = div.removeChild(firstChild);
9785      } else if (typeof props.is === 'string') {
9786        // $FlowIssue `createElement` should be updated for Web Components
9787        domElement = ownerDocument.createElement(type, {
9788          is: props.is
9789        });
9790      } else {
9791        // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.
9792        // See discussion in https://github.com/facebook/react/pull/6896
9793        // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240
9794        domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size`
9795        // attributes on `select`s needs to be added before `option`s are inserted.
9796        // This prevents:
9797        // - a bug where the `select` does not scroll to the correct option because singular
9798        //  `select` elements automatically pick the first item #13222
9799        // - a bug where the `select` set the first item as selected despite the `size` attribute #14239
9800        // See https://github.com/facebook/react/issues/13222
9801        // and https://github.com/facebook/react/issues/14239
9802
9803        if (type === 'select') {
9804          var node = domElement;
9805
9806          if (props.multiple) {
9807            node.multiple = true;
9808          } else if (props.size) {
9809            // Setting a size greater than 1 causes a select to behave like `multiple=true`, where
9810            // it is possible that no option is selected.
9811            //
9812            // This is only necessary when a select in "single selection mode".
9813            node.size = props.size;
9814          }
9815        }
9816      }
9817    } else {
9818      domElement = ownerDocument.createElementNS(namespaceURI, type);
9819    }
9820
9821    {
9822      if (namespaceURI === HTML_NAMESPACE) {
9823        if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !hasOwnProperty.call(warnedUnknownTags, type)) {
9824          warnedUnknownTags[type] = true;
9825
9826          error('The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);
9827        }
9828      }
9829    }
9830
9831    return domElement;
9832  }
9833  function createTextNode(text, rootContainerElement) {
9834    return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);
9835  }
9836  function setInitialProperties(domElement, tag, rawProps, rootContainerElement) {
9837    var isCustomComponentTag = isCustomComponent(tag, rawProps);
9838
9839    {
9840      validatePropertiesInDevelopment(tag, rawProps);
9841    } // TODO: Make sure that we check isMounted before firing any of these events.
9842
9843
9844    var props;
9845
9846    switch (tag) {
9847      case 'dialog':
9848        listenToNonDelegatedEvent('cancel', domElement);
9849        listenToNonDelegatedEvent('close', domElement);
9850        props = rawProps;
9851        break;
9852
9853      case 'iframe':
9854      case 'object':
9855      case 'embed':
9856        // We listen to this event in case to ensure emulated bubble
9857        // listeners still fire for the load event.
9858        listenToNonDelegatedEvent('load', domElement);
9859        props = rawProps;
9860        break;
9861
9862      case 'video':
9863      case 'audio':
9864        // We listen to these events in case to ensure emulated bubble
9865        // listeners still fire for all the media events.
9866        for (var i = 0; i < mediaEventTypes.length; i++) {
9867          listenToNonDelegatedEvent(mediaEventTypes[i], domElement);
9868        }
9869
9870        props = rawProps;
9871        break;
9872
9873      case 'source':
9874        // We listen to this event in case to ensure emulated bubble
9875        // listeners still fire for the error event.
9876        listenToNonDelegatedEvent('error', domElement);
9877        props = rawProps;
9878        break;
9879
9880      case 'img':
9881      case 'image':
9882      case 'link':
9883        // We listen to these events in case to ensure emulated bubble
9884        // listeners still fire for error and load events.
9885        listenToNonDelegatedEvent('error', domElement);
9886        listenToNonDelegatedEvent('load', domElement);
9887        props = rawProps;
9888        break;
9889
9890      case 'details':
9891        // We listen to this event in case to ensure emulated bubble
9892        // listeners still fire for the toggle event.
9893        listenToNonDelegatedEvent('toggle', domElement);
9894        props = rawProps;
9895        break;
9896
9897      case 'input':
9898        initWrapperState(domElement, rawProps);
9899        props = getHostProps(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
9900        // listeners still fire for the invalid event.
9901
9902        listenToNonDelegatedEvent('invalid', domElement);
9903        break;
9904
9905      case 'option':
9906        validateProps(domElement, rawProps);
9907        props = rawProps;
9908        break;
9909
9910      case 'select':
9911        initWrapperState$1(domElement, rawProps);
9912        props = getHostProps$1(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
9913        // listeners still fire for the invalid event.
9914
9915        listenToNonDelegatedEvent('invalid', domElement);
9916        break;
9917
9918      case 'textarea':
9919        initWrapperState$2(domElement, rawProps);
9920        props = getHostProps$2(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
9921        // listeners still fire for the invalid event.
9922
9923        listenToNonDelegatedEvent('invalid', domElement);
9924        break;
9925
9926      default:
9927        props = rawProps;
9928    }
9929
9930    assertValidProps(tag, props);
9931    setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);
9932
9933    switch (tag) {
9934      case 'input':
9935        // TODO: Make sure we check if this is still unmounted or do any clean
9936        // up necessary since we never stop tracking anymore.
9937        track(domElement);
9938        postMountWrapper(domElement, rawProps, false);
9939        break;
9940
9941      case 'textarea':
9942        // TODO: Make sure we check if this is still unmounted or do any clean
9943        // up necessary since we never stop tracking anymore.
9944        track(domElement);
9945        postMountWrapper$3(domElement);
9946        break;
9947
9948      case 'option':
9949        postMountWrapper$1(domElement, rawProps);
9950        break;
9951
9952      case 'select':
9953        postMountWrapper$2(domElement, rawProps);
9954        break;
9955
9956      default:
9957        if (typeof props.onClick === 'function') {
9958          // TODO: This cast may not be sound for SVG, MathML or custom elements.
9959          trapClickOnNonInteractiveElement(domElement);
9960        }
9961
9962        break;
9963    }
9964  } // Calculate the diff between the two objects.
9965
9966  function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {
9967    {
9968      validatePropertiesInDevelopment(tag, nextRawProps);
9969    }
9970
9971    var updatePayload = null;
9972    var lastProps;
9973    var nextProps;
9974
9975    switch (tag) {
9976      case 'input':
9977        lastProps = getHostProps(domElement, lastRawProps);
9978        nextProps = getHostProps(domElement, nextRawProps);
9979        updatePayload = [];
9980        break;
9981
9982      case 'select':
9983        lastProps = getHostProps$1(domElement, lastRawProps);
9984        nextProps = getHostProps$1(domElement, nextRawProps);
9985        updatePayload = [];
9986        break;
9987
9988      case 'textarea':
9989        lastProps = getHostProps$2(domElement, lastRawProps);
9990        nextProps = getHostProps$2(domElement, nextRawProps);
9991        updatePayload = [];
9992        break;
9993
9994      default:
9995        lastProps = lastRawProps;
9996        nextProps = nextRawProps;
9997
9998        if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {
9999          // TODO: This cast may not be sound for SVG, MathML or custom elements.
10000          trapClickOnNonInteractiveElement(domElement);
10001        }
10002
10003        break;
10004    }
10005
10006    assertValidProps(tag, nextProps);
10007    var propKey;
10008    var styleName;
10009    var styleUpdates = null;
10010
10011    for (propKey in lastProps) {
10012      if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
10013        continue;
10014      }
10015
10016      if (propKey === STYLE) {
10017        var lastStyle = lastProps[propKey];
10018
10019        for (styleName in lastStyle) {
10020          if (lastStyle.hasOwnProperty(styleName)) {
10021            if (!styleUpdates) {
10022              styleUpdates = {};
10023            }
10024
10025            styleUpdates[styleName] = '';
10026          }
10027        }
10028      } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) {
10029        // This is a special case. If any listener updates we need to ensure
10030        // that the "current" fiber pointer gets updated so we need a commit
10031        // to update this element.
10032        if (!updatePayload) {
10033          updatePayload = [];
10034        }
10035      } else {
10036        // For all other deleted properties we add it to the queue. We use
10037        // the allowed property list in the commit phase instead.
10038        (updatePayload = updatePayload || []).push(propKey, null);
10039      }
10040    }
10041
10042    for (propKey in nextProps) {
10043      var nextProp = nextProps[propKey];
10044      var lastProp = lastProps != null ? lastProps[propKey] : undefined;
10045
10046      if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
10047        continue;
10048      }
10049
10050      if (propKey === STYLE) {
10051        {
10052          if (nextProp) {
10053            // Freeze the next style object so that we can assume it won't be
10054            // mutated. We have already warned for this in the past.
10055            Object.freeze(nextProp);
10056          }
10057        }
10058
10059        if (lastProp) {
10060          // Unset styles on `lastProp` but not on `nextProp`.
10061          for (styleName in lastProp) {
10062            if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
10063              if (!styleUpdates) {
10064                styleUpdates = {};
10065              }
10066
10067              styleUpdates[styleName] = '';
10068            }
10069          } // Update styles that changed since `lastProp`.
10070
10071
10072          for (styleName in nextProp) {
10073            if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
10074              if (!styleUpdates) {
10075                styleUpdates = {};
10076              }
10077
10078              styleUpdates[styleName] = nextProp[styleName];
10079            }
10080          }
10081        } else {
10082          // Relies on `updateStylesByID` not mutating `styleUpdates`.
10083          if (!styleUpdates) {
10084            if (!updatePayload) {
10085              updatePayload = [];
10086            }
10087
10088            updatePayload.push(propKey, styleUpdates);
10089          }
10090
10091          styleUpdates = nextProp;
10092        }
10093      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
10094        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
10095        var lastHtml = lastProp ? lastProp[HTML$1] : undefined;
10096
10097        if (nextHtml != null) {
10098          if (lastHtml !== nextHtml) {
10099            (updatePayload = updatePayload || []).push(propKey, nextHtml);
10100          }
10101        }
10102      } else if (propKey === CHILDREN) {
10103        if (typeof nextProp === 'string' || typeof nextProp === 'number') {
10104          (updatePayload = updatePayload || []).push(propKey, '' + nextProp);
10105        }
10106      } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) {
10107        if (nextProp != null) {
10108          // We eagerly listen to this even though we haven't committed yet.
10109          if ( typeof nextProp !== 'function') {
10110            warnForInvalidEventListener(propKey, nextProp);
10111          }
10112
10113          if (propKey === 'onScroll') {
10114            listenToNonDelegatedEvent('scroll', domElement);
10115          }
10116        }
10117
10118        if (!updatePayload && lastProp !== nextProp) {
10119          // This is a special case. If any listener updates we need to ensure
10120          // that the "current" props pointer gets updated so we need a commit
10121          // to update this element.
10122          updatePayload = [];
10123        }
10124      } else {
10125        // For any other property we always add it to the queue and then we
10126        // filter it out using the allowed property list during the commit.
10127        (updatePayload = updatePayload || []).push(propKey, nextProp);
10128      }
10129    }
10130
10131    if (styleUpdates) {
10132      {
10133        validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]);
10134      }
10135
10136      (updatePayload = updatePayload || []).push(STYLE, styleUpdates);
10137    }
10138
10139    return updatePayload;
10140  } // Apply the diff.
10141
10142  function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {
10143    // Update checked *before* name.
10144    // In the middle of an update, it is possible to have multiple checked.
10145    // When a checked radio tries to change name, browser makes another radio's checked false.
10146    if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {
10147      updateChecked(domElement, nextRawProps);
10148    }
10149
10150    var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);
10151    var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff.
10152
10153    updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props
10154    // changed.
10155
10156    switch (tag) {
10157      case 'input':
10158        // Update the wrapper around inputs *after* updating props. This has to
10159        // happen after `updateDOMProperties`. Otherwise HTML5 input validations
10160        // raise warnings and prevent the new value from being assigned.
10161        updateWrapper(domElement, nextRawProps);
10162        break;
10163
10164      case 'textarea':
10165        updateWrapper$1(domElement, nextRawProps);
10166        break;
10167
10168      case 'select':
10169        // <select> value update needs to occur after <option> children
10170        // reconciliation
10171        postUpdateWrapper(domElement, nextRawProps);
10172        break;
10173    }
10174  }
10175
10176  function getPossibleStandardName(propName) {
10177    {
10178      var lowerCasedName = propName.toLowerCase();
10179
10180      if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {
10181        return null;
10182      }
10183
10184      return possibleStandardNames[lowerCasedName] || null;
10185    }
10186  }
10187
10188  function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement, isConcurrentMode, shouldWarnDev) {
10189    var isCustomComponentTag;
10190    var extraAttributeNames;
10191
10192    {
10193      isCustomComponentTag = isCustomComponent(tag, rawProps);
10194      validatePropertiesInDevelopment(tag, rawProps);
10195    } // TODO: Make sure that we check isMounted before firing any of these events.
10196
10197
10198    switch (tag) {
10199      case 'dialog':
10200        listenToNonDelegatedEvent('cancel', domElement);
10201        listenToNonDelegatedEvent('close', domElement);
10202        break;
10203
10204      case 'iframe':
10205      case 'object':
10206      case 'embed':
10207        // We listen to this event in case to ensure emulated bubble
10208        // listeners still fire for the load event.
10209        listenToNonDelegatedEvent('load', domElement);
10210        break;
10211
10212      case 'video':
10213      case 'audio':
10214        // We listen to these events in case to ensure emulated bubble
10215        // listeners still fire for all the media events.
10216        for (var i = 0; i < mediaEventTypes.length; i++) {
10217          listenToNonDelegatedEvent(mediaEventTypes[i], domElement);
10218        }
10219
10220        break;
10221
10222      case 'source':
10223        // We listen to this event in case to ensure emulated bubble
10224        // listeners still fire for the error event.
10225        listenToNonDelegatedEvent('error', domElement);
10226        break;
10227
10228      case 'img':
10229      case 'image':
10230      case 'link':
10231        // We listen to these events in case to ensure emulated bubble
10232        // listeners still fire for error and load events.
10233        listenToNonDelegatedEvent('error', domElement);
10234        listenToNonDelegatedEvent('load', domElement);
10235        break;
10236
10237      case 'details':
10238        // We listen to this event in case to ensure emulated bubble
10239        // listeners still fire for the toggle event.
10240        listenToNonDelegatedEvent('toggle', domElement);
10241        break;
10242
10243      case 'input':
10244        initWrapperState(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
10245        // listeners still fire for the invalid event.
10246
10247        listenToNonDelegatedEvent('invalid', domElement);
10248        break;
10249
10250      case 'option':
10251        validateProps(domElement, rawProps);
10252        break;
10253
10254      case 'select':
10255        initWrapperState$1(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
10256        // listeners still fire for the invalid event.
10257
10258        listenToNonDelegatedEvent('invalid', domElement);
10259        break;
10260
10261      case 'textarea':
10262        initWrapperState$2(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
10263        // listeners still fire for the invalid event.
10264
10265        listenToNonDelegatedEvent('invalid', domElement);
10266        break;
10267    }
10268
10269    assertValidProps(tag, rawProps);
10270
10271    {
10272      extraAttributeNames = new Set();
10273      var attributes = domElement.attributes;
10274
10275      for (var _i = 0; _i < attributes.length; _i++) {
10276        var name = attributes[_i].name.toLowerCase();
10277
10278        switch (name) {
10279          // Controlled attributes are not validated
10280          // TODO: Only ignore them on controlled tags.
10281          case 'value':
10282            break;
10283
10284          case 'checked':
10285            break;
10286
10287          case 'selected':
10288            break;
10289
10290          default:
10291            // Intentionally use the original name.
10292            // See discussion in https://github.com/facebook/react/pull/10676.
10293            extraAttributeNames.add(attributes[_i].name);
10294        }
10295      }
10296    }
10297
10298    var updatePayload = null;
10299
10300    for (var propKey in rawProps) {
10301      if (!rawProps.hasOwnProperty(propKey)) {
10302        continue;
10303      }
10304
10305      var nextProp = rawProps[propKey];
10306
10307      if (propKey === CHILDREN) {
10308        // For text content children we compare against textContent. This
10309        // might match additional HTML that is hidden when we read it using
10310        // textContent. E.g. "foo" will match "f<span>oo</span>" but that still
10311        // satisfies our requirement. Our requirement is not to produce perfect
10312        // HTML and attributes. Ideally we should preserve structure but it's
10313        // ok not to if the visible content is still enough to indicate what
10314        // even listeners these nodes might be wired up to.
10315        // TODO: Warn if there is more than a single textNode as a child.
10316        // TODO: Should we use domElement.firstChild.nodeValue to compare?
10317        if (typeof nextProp === 'string') {
10318          if (domElement.textContent !== nextProp) {
10319            if (rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
10320              checkForUnmatchedText(domElement.textContent, nextProp, isConcurrentMode, shouldWarnDev);
10321            }
10322
10323            updatePayload = [CHILDREN, nextProp];
10324          }
10325        } else if (typeof nextProp === 'number') {
10326          if (domElement.textContent !== '' + nextProp) {
10327            if (rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
10328              checkForUnmatchedText(domElement.textContent, nextProp, isConcurrentMode, shouldWarnDev);
10329            }
10330
10331            updatePayload = [CHILDREN, '' + nextProp];
10332          }
10333        }
10334      } else if (registrationNameDependencies.hasOwnProperty(propKey)) {
10335        if (nextProp != null) {
10336          if ( typeof nextProp !== 'function') {
10337            warnForInvalidEventListener(propKey, nextProp);
10338          }
10339
10340          if (propKey === 'onScroll') {
10341            listenToNonDelegatedEvent('scroll', domElement);
10342          }
10343        }
10344      } else if (shouldWarnDev && true && // Convince Flow we've calculated it (it's DEV-only in this method.)
10345      typeof isCustomComponentTag === 'boolean') {
10346        // Validate that the properties correspond to their expected values.
10347        var serverValue = void 0;
10348        var propertyInfo = isCustomComponentTag && enableCustomElementPropertySupport ? null : getPropertyInfo(propKey);
10349
10350        if (rawProps[SUPPRESS_HYDRATION_WARNING] === true) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated
10351        // TODO: Only ignore them on controlled tags.
10352        propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
10353          var serverHTML = domElement.innerHTML;
10354          var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
10355
10356          if (nextHtml != null) {
10357            var expectedHTML = normalizeHTML(domElement, nextHtml);
10358
10359            if (expectedHTML !== serverHTML) {
10360              warnForPropDifference(propKey, serverHTML, expectedHTML);
10361            }
10362          }
10363        } else if (propKey === STYLE) {
10364          // $FlowFixMe - Should be inferred as not undefined.
10365          extraAttributeNames.delete(propKey);
10366
10367          if (canDiffStyleForHydrationWarning) {
10368            var expectedStyle = createDangerousStringForStyles(nextProp);
10369            serverValue = domElement.getAttribute('style');
10370
10371            if (expectedStyle !== serverValue) {
10372              warnForPropDifference(propKey, serverValue, expectedStyle);
10373            }
10374          }
10375        } else if (isCustomComponentTag && !enableCustomElementPropertySupport) {
10376          // $FlowFixMe - Should be inferred as not undefined.
10377          extraAttributeNames.delete(propKey.toLowerCase());
10378          serverValue = getValueForAttribute(domElement, propKey, nextProp);
10379
10380          if (nextProp !== serverValue) {
10381            warnForPropDifference(propKey, serverValue, nextProp);
10382          }
10383        } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {
10384          var isMismatchDueToBadCasing = false;
10385
10386          if (propertyInfo !== null) {
10387            // $FlowFixMe - Should be inferred as not undefined.
10388            extraAttributeNames.delete(propertyInfo.attributeName);
10389            serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);
10390          } else {
10391            var ownNamespace = parentNamespace;
10392
10393            if (ownNamespace === HTML_NAMESPACE) {
10394              ownNamespace = getIntrinsicNamespace(tag);
10395            }
10396
10397            if (ownNamespace === HTML_NAMESPACE) {
10398              // $FlowFixMe - Should be inferred as not undefined.
10399              extraAttributeNames.delete(propKey.toLowerCase());
10400            } else {
10401              var standardName = getPossibleStandardName(propKey);
10402
10403              if (standardName !== null && standardName !== propKey) {
10404                // If an SVG prop is supplied with bad casing, it will
10405                // be successfully parsed from HTML, but will produce a mismatch
10406                // (and would be incorrectly rendered on the client).
10407                // However, we already warn about bad casing elsewhere.
10408                // So we'll skip the misleading extra mismatch warning in this case.
10409                isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined.
10410
10411                extraAttributeNames.delete(standardName);
10412              } // $FlowFixMe - Should be inferred as not undefined.
10413
10414
10415              extraAttributeNames.delete(propKey);
10416            }
10417
10418            serverValue = getValueForAttribute(domElement, propKey, nextProp);
10419          }
10420
10421          var dontWarnCustomElement = enableCustomElementPropertySupport  ;
10422
10423          if (!dontWarnCustomElement && nextProp !== serverValue && !isMismatchDueToBadCasing) {
10424            warnForPropDifference(propKey, serverValue, nextProp);
10425          }
10426        }
10427      }
10428    }
10429
10430    {
10431      if (shouldWarnDev) {
10432        if ( // $FlowFixMe - Should be inferred as not undefined.
10433        extraAttributeNames.size > 0 && rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
10434          // $FlowFixMe - Should be inferred as not undefined.
10435          warnForExtraAttributes(extraAttributeNames);
10436        }
10437      }
10438    }
10439
10440    switch (tag) {
10441      case 'input':
10442        // TODO: Make sure we check if this is still unmounted or do any clean
10443        // up necessary since we never stop tracking anymore.
10444        track(domElement);
10445        postMountWrapper(domElement, rawProps, true);
10446        break;
10447
10448      case 'textarea':
10449        // TODO: Make sure we check if this is still unmounted or do any clean
10450        // up necessary since we never stop tracking anymore.
10451        track(domElement);
10452        postMountWrapper$3(domElement);
10453        break;
10454
10455      case 'select':
10456      case 'option':
10457        // For input and textarea we current always set the value property at
10458        // post mount to force it to diverge from attributes. However, for
10459        // option and select we don't quite do the same thing and select
10460        // is not resilient to the DOM state changing so we don't do that here.
10461        // TODO: Consider not doing this for input and textarea.
10462        break;
10463
10464      default:
10465        if (typeof rawProps.onClick === 'function') {
10466          // TODO: This cast may not be sound for SVG, MathML or custom elements.
10467          trapClickOnNonInteractiveElement(domElement);
10468        }
10469
10470        break;
10471    }
10472
10473    return updatePayload;
10474  }
10475  function diffHydratedText(textNode, text, isConcurrentMode) {
10476    var isDifferent = textNode.nodeValue !== text;
10477    return isDifferent;
10478  }
10479  function warnForDeletedHydratableElement(parentNode, child) {
10480    {
10481      if (didWarnInvalidHydration) {
10482        return;
10483      }
10484
10485      didWarnInvalidHydration = true;
10486
10487      error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());
10488    }
10489  }
10490  function warnForDeletedHydratableText(parentNode, child) {
10491    {
10492      if (didWarnInvalidHydration) {
10493        return;
10494      }
10495
10496      didWarnInvalidHydration = true;
10497
10498      error('Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());
10499    }
10500  }
10501  function warnForInsertedHydratedElement(parentNode, tag, props) {
10502    {
10503      if (didWarnInvalidHydration) {
10504        return;
10505      }
10506
10507      didWarnInvalidHydration = true;
10508
10509      error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());
10510    }
10511  }
10512  function warnForInsertedHydratedText(parentNode, text) {
10513    {
10514      if (text === '') {
10515        // We expect to insert empty text nodes since they're not represented in
10516        // the HTML.
10517        // TODO: Remove this special case if we can just avoid inserting empty
10518        // text nodes.
10519        return;
10520      }
10521
10522      if (didWarnInvalidHydration) {
10523        return;
10524      }
10525
10526      didWarnInvalidHydration = true;
10527
10528      error('Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase());
10529    }
10530  }
10531  function restoreControlledState$3(domElement, tag, props) {
10532    switch (tag) {
10533      case 'input':
10534        restoreControlledState(domElement, props);
10535        return;
10536
10537      case 'textarea':
10538        restoreControlledState$2(domElement, props);
10539        return;
10540
10541      case 'select':
10542        restoreControlledState$1(domElement, props);
10543        return;
10544    }
10545  }
10546
10547  var validateDOMNesting = function () {};
10548
10549  var updatedAncestorInfo = function () {};
10550
10551  {
10552    // This validation code was written based on the HTML5 parsing spec:
10553    // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
10554    //
10555    // Note: this does not catch all invalid nesting, nor does it try to (as it's
10556    // not clear what practical benefit doing so provides); instead, we warn only
10557    // for cases where the parser will give a parse tree differing from what React
10558    // intended. For example, <b><div></div></b> is invalid but we don't warn
10559    // because it still parses correctly; we do warn for other cases like nested
10560    // <p> tags where the beginning of the second element implicitly closes the
10561    // first, causing a confusing mess.
10562    // https://html.spec.whatwg.org/multipage/syntax.html#special
10563    var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
10564
10565    var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
10566    // TODO: Distinguish by namespace here -- for <title>, including it here
10567    // errs on the side of fewer warnings
10568    'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
10569
10570    var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
10571
10572    var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];
10573    var emptyAncestorInfo = {
10574      current: null,
10575      formTag: null,
10576      aTagInScope: null,
10577      buttonTagInScope: null,
10578      nobrTagInScope: null,
10579      pTagInButtonScope: null,
10580      listItemTagAutoclosing: null,
10581      dlItemTagAutoclosing: null
10582    };
10583
10584    updatedAncestorInfo = function (oldInfo, tag) {
10585      var ancestorInfo = assign({}, oldInfo || emptyAncestorInfo);
10586
10587      var info = {
10588        tag: tag
10589      };
10590
10591      if (inScopeTags.indexOf(tag) !== -1) {
10592        ancestorInfo.aTagInScope = null;
10593        ancestorInfo.buttonTagInScope = null;
10594        ancestorInfo.nobrTagInScope = null;
10595      }
10596
10597      if (buttonScopeTags.indexOf(tag) !== -1) {
10598        ancestorInfo.pTagInButtonScope = null;
10599      } // See rules for 'li', 'dd', 'dt' start tags in
10600      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
10601
10602
10603      if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {
10604        ancestorInfo.listItemTagAutoclosing = null;
10605        ancestorInfo.dlItemTagAutoclosing = null;
10606      }
10607
10608      ancestorInfo.current = info;
10609
10610      if (tag === 'form') {
10611        ancestorInfo.formTag = info;
10612      }
10613
10614      if (tag === 'a') {
10615        ancestorInfo.aTagInScope = info;
10616      }
10617
10618      if (tag === 'button') {
10619        ancestorInfo.buttonTagInScope = info;
10620      }
10621
10622      if (tag === 'nobr') {
10623        ancestorInfo.nobrTagInScope = info;
10624      }
10625
10626      if (tag === 'p') {
10627        ancestorInfo.pTagInButtonScope = info;
10628      }
10629
10630      if (tag === 'li') {
10631        ancestorInfo.listItemTagAutoclosing = info;
10632      }
10633
10634      if (tag === 'dd' || tag === 'dt') {
10635        ancestorInfo.dlItemTagAutoclosing = info;
10636      }
10637
10638      return ancestorInfo;
10639    };
10640    /**
10641     * Returns whether
10642     */
10643
10644
10645    var isTagValidWithParent = function (tag, parentTag) {
10646      // First, let's check if we're in an unusual parsing mode...
10647      switch (parentTag) {
10648        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect
10649        case 'select':
10650          return tag === 'option' || tag === 'optgroup' || tag === '#text';
10651
10652        case 'optgroup':
10653          return tag === 'option' || tag === '#text';
10654        // Strictly speaking, seeing an <option> doesn't mean we're in a <select>
10655        // but
10656
10657        case 'option':
10658          return tag === '#text';
10659        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd
10660        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption
10661        // No special behavior since these rules fall back to "in body" mode for
10662        // all except special table nodes which cause bad parsing behavior anyway.
10663        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr
10664
10665        case 'tr':
10666          return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';
10667        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody
10668
10669        case 'tbody':
10670        case 'thead':
10671        case 'tfoot':
10672          return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';
10673        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup
10674
10675        case 'colgroup':
10676          return tag === 'col' || tag === 'template';
10677        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable
10678
10679        case 'table':
10680          return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';
10681        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead
10682
10683        case 'head':
10684          return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';
10685        // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element
10686
10687        case 'html':
10688          return tag === 'head' || tag === 'body' || tag === 'frameset';
10689
10690        case 'frameset':
10691          return tag === 'frame';
10692
10693        case '#document':
10694          return tag === 'html';
10695      } // Probably in the "in body" parsing mode, so we outlaw only tag combos
10696      // where the parsing rules cause implicit opens or closes to be added.
10697      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
10698
10699
10700      switch (tag) {
10701        case 'h1':
10702        case 'h2':
10703        case 'h3':
10704        case 'h4':
10705        case 'h5':
10706        case 'h6':
10707          return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';
10708
10709        case 'rp':
10710        case 'rt':
10711          return impliedEndTags.indexOf(parentTag) === -1;
10712
10713        case 'body':
10714        case 'caption':
10715        case 'col':
10716        case 'colgroup':
10717        case 'frameset':
10718        case 'frame':
10719        case 'head':
10720        case 'html':
10721        case 'tbody':
10722        case 'td':
10723        case 'tfoot':
10724        case 'th':
10725        case 'thead':
10726        case 'tr':
10727          // These tags are only valid with a few parents that have special child
10728          // parsing rules -- if we're down here, then none of those matched and
10729          // so we allow it only if we don't know what the parent is, as all other
10730          // cases are invalid.
10731          return parentTag == null;
10732      }
10733
10734      return true;
10735    };
10736    /**
10737     * Returns whether
10738     */
10739
10740
10741    var findInvalidAncestorForTag = function (tag, ancestorInfo) {
10742      switch (tag) {
10743        case 'address':
10744        case 'article':
10745        case 'aside':
10746        case 'blockquote':
10747        case 'center':
10748        case 'details':
10749        case 'dialog':
10750        case 'dir':
10751        case 'div':
10752        case 'dl':
10753        case 'fieldset':
10754        case 'figcaption':
10755        case 'figure':
10756        case 'footer':
10757        case 'header':
10758        case 'hgroup':
10759        case 'main':
10760        case 'menu':
10761        case 'nav':
10762        case 'ol':
10763        case 'p':
10764        case 'section':
10765        case 'summary':
10766        case 'ul':
10767        case 'pre':
10768        case 'listing':
10769        case 'table':
10770        case 'hr':
10771        case 'xmp':
10772        case 'h1':
10773        case 'h2':
10774        case 'h3':
10775        case 'h4':
10776        case 'h5':
10777        case 'h6':
10778          return ancestorInfo.pTagInButtonScope;
10779
10780        case 'form':
10781          return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
10782
10783        case 'li':
10784          return ancestorInfo.listItemTagAutoclosing;
10785
10786        case 'dd':
10787        case 'dt':
10788          return ancestorInfo.dlItemTagAutoclosing;
10789
10790        case 'button':
10791          return ancestorInfo.buttonTagInScope;
10792
10793        case 'a':
10794          // Spec says something about storing a list of markers, but it sounds
10795          // equivalent to this check.
10796          return ancestorInfo.aTagInScope;
10797
10798        case 'nobr':
10799          return ancestorInfo.nobrTagInScope;
10800      }
10801
10802      return null;
10803    };
10804
10805    var didWarn$1 = {};
10806
10807    validateDOMNesting = function (childTag, childText, ancestorInfo) {
10808      ancestorInfo = ancestorInfo || emptyAncestorInfo;
10809      var parentInfo = ancestorInfo.current;
10810      var parentTag = parentInfo && parentInfo.tag;
10811
10812      if (childText != null) {
10813        if (childTag != null) {
10814          error('validateDOMNesting: when childText is passed, childTag should be null');
10815        }
10816
10817        childTag = '#text';
10818      }
10819
10820      var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;
10821      var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
10822      var invalidParentOrAncestor = invalidParent || invalidAncestor;
10823
10824      if (!invalidParentOrAncestor) {
10825        return;
10826      }
10827
10828      var ancestorTag = invalidParentOrAncestor.tag;
10829      var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag;
10830
10831      if (didWarn$1[warnKey]) {
10832        return;
10833      }
10834
10835      didWarn$1[warnKey] = true;
10836      var tagDisplayName = childTag;
10837      var whitespaceInfo = '';
10838
10839      if (childTag === '#text') {
10840        if (/\S/.test(childText)) {
10841          tagDisplayName = 'Text nodes';
10842        } else {
10843          tagDisplayName = 'Whitespace text nodes';
10844          whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.';
10845        }
10846      } else {
10847        tagDisplayName = '<' + childTag + '>';
10848      }
10849
10850      if (invalidParent) {
10851        var info = '';
10852
10853        if (ancestorTag === 'table' && childTag === 'tr') {
10854          info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.';
10855        }
10856
10857        error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info);
10858      } else {
10859        error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag);
10860      }
10861    };
10862  }
10863
10864  var SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';
10865  var SUSPENSE_START_DATA = '$';
10866  var SUSPENSE_END_DATA = '/$';
10867  var SUSPENSE_PENDING_START_DATA = '$?';
10868  var SUSPENSE_FALLBACK_START_DATA = '$!';
10869  var STYLE$1 = 'style';
10870  var eventsEnabled = null;
10871  var selectionInformation = null;
10872  function getRootHostContext(rootContainerInstance) {
10873    var type;
10874    var namespace;
10875    var nodeType = rootContainerInstance.nodeType;
10876
10877    switch (nodeType) {
10878      case DOCUMENT_NODE:
10879      case DOCUMENT_FRAGMENT_NODE:
10880        {
10881          type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';
10882          var root = rootContainerInstance.documentElement;
10883          namespace = root ? root.namespaceURI : getChildNamespace(null, '');
10884          break;
10885        }
10886
10887      default:
10888        {
10889          var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;
10890          var ownNamespace = container.namespaceURI || null;
10891          type = container.tagName;
10892          namespace = getChildNamespace(ownNamespace, type);
10893          break;
10894        }
10895    }
10896
10897    {
10898      var validatedTag = type.toLowerCase();
10899      var ancestorInfo = updatedAncestorInfo(null, validatedTag);
10900      return {
10901        namespace: namespace,
10902        ancestorInfo: ancestorInfo
10903      };
10904    }
10905  }
10906  function getChildHostContext(parentHostContext, type, rootContainerInstance) {
10907    {
10908      var parentHostContextDev = parentHostContext;
10909      var namespace = getChildNamespace(parentHostContextDev.namespace, type);
10910      var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);
10911      return {
10912        namespace: namespace,
10913        ancestorInfo: ancestorInfo
10914      };
10915    }
10916  }
10917  function getPublicInstance(instance) {
10918    return instance;
10919  }
10920  function prepareForCommit(containerInfo) {
10921    eventsEnabled = isEnabled();
10922    selectionInformation = getSelectionInformation();
10923    var activeInstance = null;
10924
10925    setEnabled(false);
10926    return activeInstance;
10927  }
10928  function resetAfterCommit(containerInfo) {
10929    restoreSelection(selectionInformation);
10930    setEnabled(eventsEnabled);
10931    eventsEnabled = null;
10932    selectionInformation = null;
10933  }
10934  function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
10935    var parentNamespace;
10936
10937    {
10938      // TODO: take namespace into account when validating.
10939      var hostContextDev = hostContext;
10940      validateDOMNesting(type, null, hostContextDev.ancestorInfo);
10941
10942      if (typeof props.children === 'string' || typeof props.children === 'number') {
10943        var string = '' + props.children;
10944        var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
10945        validateDOMNesting(null, string, ownAncestorInfo);
10946      }
10947
10948      parentNamespace = hostContextDev.namespace;
10949    }
10950
10951    var domElement = createElement(type, props, rootContainerInstance, parentNamespace);
10952    precacheFiberNode(internalInstanceHandle, domElement);
10953    updateFiberProps(domElement, props);
10954    return domElement;
10955  }
10956  function appendInitialChild(parentInstance, child) {
10957    parentInstance.appendChild(child);
10958  }
10959  function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {
10960    setInitialProperties(domElement, type, props, rootContainerInstance);
10961
10962    switch (type) {
10963      case 'button':
10964      case 'input':
10965      case 'select':
10966      case 'textarea':
10967        return !!props.autoFocus;
10968
10969      case 'img':
10970        return true;
10971
10972      default:
10973        return false;
10974    }
10975  }
10976  function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
10977    {
10978      var hostContextDev = hostContext;
10979
10980      if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {
10981        var string = '' + newProps.children;
10982        var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
10983        validateDOMNesting(null, string, ownAncestorInfo);
10984      }
10985    }
10986
10987    return diffProperties(domElement, type, oldProps, newProps);
10988  }
10989  function shouldSetTextContent(type, props) {
10990    return type === 'textarea' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;
10991  }
10992  function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {
10993    {
10994      var hostContextDev = hostContext;
10995      validateDOMNesting(null, text, hostContextDev.ancestorInfo);
10996    }
10997
10998    var textNode = createTextNode(text, rootContainerInstance);
10999    precacheFiberNode(internalInstanceHandle, textNode);
11000    return textNode;
11001  }
11002  function getCurrentEventPriority() {
11003    var currentEvent = window.event;
11004
11005    if (currentEvent === undefined) {
11006      return DefaultEventPriority;
11007    }
11008
11009    return getEventPriority(currentEvent.type);
11010  }
11011  // if a component just imports ReactDOM (e.g. for findDOMNode).
11012  // Some environments might not have setTimeout or clearTimeout.
11013
11014  var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;
11015  var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;
11016  var noTimeout = -1;
11017  var localPromise = typeof Promise === 'function' ? Promise : undefined; // -------------------
11018  var scheduleMicrotask = typeof queueMicrotask === 'function' ? queueMicrotask : typeof localPromise !== 'undefined' ? function (callback) {
11019    return localPromise.resolve(null).then(callback).catch(handleErrorInNextTick);
11020  } : scheduleTimeout; // TODO: Determine the best fallback here.
11021
11022  function handleErrorInNextTick(error) {
11023    setTimeout(function () {
11024      throw error;
11025    });
11026  } // -------------------
11027  function commitMount(domElement, type, newProps, internalInstanceHandle) {
11028    // Despite the naming that might imply otherwise, this method only
11029    // fires if there is an `Update` effect scheduled during mounting.
11030    // This happens if `finalizeInitialChildren` returns `true` (which it
11031    // does to implement the `autoFocus` attribute on the client). But
11032    // there are also other cases when this might happen (such as patching
11033    // up text content during hydration mismatch). So we'll check this again.
11034    switch (type) {
11035      case 'button':
11036      case 'input':
11037      case 'select':
11038      case 'textarea':
11039        if (newProps.autoFocus) {
11040          domElement.focus();
11041        }
11042
11043        return;
11044
11045      case 'img':
11046        {
11047          if (newProps.src) {
11048            domElement.src = newProps.src;
11049          }
11050
11051          return;
11052        }
11053    }
11054  }
11055  function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
11056    // Apply the diff to the DOM node.
11057    updateProperties(domElement, updatePayload, type, oldProps, newProps); // Update the props handle so that we know which props are the ones with
11058    // with current event handlers.
11059
11060    updateFiberProps(domElement, newProps);
11061  }
11062  function resetTextContent(domElement) {
11063    setTextContent(domElement, '');
11064  }
11065  function commitTextUpdate(textInstance, oldText, newText) {
11066    textInstance.nodeValue = newText;
11067  }
11068  function appendChild(parentInstance, child) {
11069    parentInstance.appendChild(child);
11070  }
11071  function appendChildToContainer(container, child) {
11072    var parentNode;
11073
11074    if (container.nodeType === COMMENT_NODE) {
11075      parentNode = container.parentNode;
11076      parentNode.insertBefore(child, container);
11077    } else {
11078      parentNode = container;
11079      parentNode.appendChild(child);
11080    } // This container might be used for a portal.
11081    // If something inside a portal is clicked, that click should bubble
11082    // through the React tree. However, on Mobile Safari the click would
11083    // never bubble through the *DOM* tree unless an ancestor with onclick
11084    // event exists. So we wouldn't see it and dispatch it.
11085    // This is why we ensure that non React root containers have inline onclick
11086    // defined.
11087    // https://github.com/facebook/react/issues/11918
11088
11089
11090    var reactRootContainer = container._reactRootContainer;
11091
11092    if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {
11093      // TODO: This cast may not be sound for SVG, MathML or custom elements.
11094      trapClickOnNonInteractiveElement(parentNode);
11095    }
11096  }
11097  function insertBefore(parentInstance, child, beforeChild) {
11098    parentInstance.insertBefore(child, beforeChild);
11099  }
11100  function insertInContainerBefore(container, child, beforeChild) {
11101    if (container.nodeType === COMMENT_NODE) {
11102      container.parentNode.insertBefore(child, beforeChild);
11103    } else {
11104      container.insertBefore(child, beforeChild);
11105    }
11106  }
11107
11108  function removeChild(parentInstance, child) {
11109    parentInstance.removeChild(child);
11110  }
11111  function removeChildFromContainer(container, child) {
11112    if (container.nodeType === COMMENT_NODE) {
11113      container.parentNode.removeChild(child);
11114    } else {
11115      container.removeChild(child);
11116    }
11117  }
11118  function clearSuspenseBoundary(parentInstance, suspenseInstance) {
11119    var node = suspenseInstance; // Delete all nodes within this suspense boundary.
11120    // There might be nested nodes so we need to keep track of how
11121    // deep we are and only break out when we're back on top.
11122
11123    var depth = 0;
11124
11125    do {
11126      var nextNode = node.nextSibling;
11127      parentInstance.removeChild(node);
11128
11129      if (nextNode && nextNode.nodeType === COMMENT_NODE) {
11130        var data = nextNode.data;
11131
11132        if (data === SUSPENSE_END_DATA) {
11133          if (depth === 0) {
11134            parentInstance.removeChild(nextNode); // Retry if any event replaying was blocked on this.
11135
11136            retryIfBlockedOn(suspenseInstance);
11137            return;
11138          } else {
11139            depth--;
11140          }
11141        } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_PENDING_START_DATA || data === SUSPENSE_FALLBACK_START_DATA) {
11142          depth++;
11143        }
11144      }
11145
11146      node = nextNode;
11147    } while (node); // TODO: Warn, we didn't find the end comment boundary.
11148    // Retry if any event replaying was blocked on this.
11149
11150
11151    retryIfBlockedOn(suspenseInstance);
11152  }
11153  function clearSuspenseBoundaryFromContainer(container, suspenseInstance) {
11154    if (container.nodeType === COMMENT_NODE) {
11155      clearSuspenseBoundary(container.parentNode, suspenseInstance);
11156    } else if (container.nodeType === ELEMENT_NODE) {
11157      clearSuspenseBoundary(container, suspenseInstance);
11158    } // Retry if any event replaying was blocked on this.
11159
11160
11161    retryIfBlockedOn(container);
11162  }
11163  function hideInstance(instance) {
11164    // TODO: Does this work for all element types? What about MathML? Should we
11165    // pass host context to this method?
11166    instance = instance;
11167    var style = instance.style;
11168
11169    if (typeof style.setProperty === 'function') {
11170      style.setProperty('display', 'none', 'important');
11171    } else {
11172      style.display = 'none';
11173    }
11174  }
11175  function hideTextInstance(textInstance) {
11176    textInstance.nodeValue = '';
11177  }
11178  function unhideInstance(instance, props) {
11179    instance = instance;
11180    var styleProp = props[STYLE$1];
11181    var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;
11182    instance.style.display = dangerousStyleValue('display', display);
11183  }
11184  function unhideTextInstance(textInstance, text) {
11185    textInstance.nodeValue = text;
11186  }
11187  function clearContainer(container) {
11188    if (container.nodeType === ELEMENT_NODE) {
11189      container.textContent = '';
11190    } else if (container.nodeType === DOCUMENT_NODE) {
11191      if (container.documentElement) {
11192        container.removeChild(container.documentElement);
11193      }
11194    }
11195  } // -------------------
11196  function canHydrateInstance(instance, type, props) {
11197    if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {
11198      return null;
11199    } // This has now been refined to an element node.
11200
11201
11202    return instance;
11203  }
11204  function canHydrateTextInstance(instance, text) {
11205    if (text === '' || instance.nodeType !== TEXT_NODE) {
11206      // Empty strings are not parsed by HTML so there won't be a correct match here.
11207      return null;
11208    } // This has now been refined to a text node.
11209
11210
11211    return instance;
11212  }
11213  function canHydrateSuspenseInstance(instance) {
11214    if (instance.nodeType !== COMMENT_NODE) {
11215      // Empty strings are not parsed by HTML so there won't be a correct match here.
11216      return null;
11217    } // This has now been refined to a suspense node.
11218
11219
11220    return instance;
11221  }
11222  function isSuspenseInstancePending(instance) {
11223    return instance.data === SUSPENSE_PENDING_START_DATA;
11224  }
11225  function isSuspenseInstanceFallback(instance) {
11226    return instance.data === SUSPENSE_FALLBACK_START_DATA;
11227  }
11228  function getSuspenseInstanceFallbackErrorDetails(instance) {
11229    var dataset = instance.nextSibling && instance.nextSibling.dataset;
11230    var digest, message, stack;
11231
11232    if (dataset) {
11233      digest = dataset.dgst;
11234
11235      {
11236        message = dataset.msg;
11237        stack = dataset.stck;
11238      }
11239    }
11240
11241    {
11242      return {
11243        message: message,
11244        digest: digest,
11245        stack: stack
11246      };
11247    } // let value = {message: undefined, hash: undefined};
11248    // const nextSibling = instance.nextSibling;
11249    // if (nextSibling) {
11250    //   const dataset = ((nextSibling: any): HTMLTemplateElement).dataset;
11251    //   value.message = dataset.msg;
11252    //   value.hash = dataset.hash;
11253    //   if (true) {
11254    //     value.stack = dataset.stack;
11255    //   }
11256    // }
11257    // return value;
11258
11259  }
11260  function registerSuspenseInstanceRetry(instance, callback) {
11261    instance._reactRetry = callback;
11262  }
11263
11264  function getNextHydratable(node) {
11265    // Skip non-hydratable nodes.
11266    for (; node != null; node = node.nextSibling) {
11267      var nodeType = node.nodeType;
11268
11269      if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) {
11270        break;
11271      }
11272
11273      if (nodeType === COMMENT_NODE) {
11274        var nodeData = node.data;
11275
11276        if (nodeData === SUSPENSE_START_DATA || nodeData === SUSPENSE_FALLBACK_START_DATA || nodeData === SUSPENSE_PENDING_START_DATA) {
11277          break;
11278        }
11279
11280        if (nodeData === SUSPENSE_END_DATA) {
11281          return null;
11282        }
11283      }
11284    }
11285
11286    return node;
11287  }
11288
11289  function getNextHydratableSibling(instance) {
11290    return getNextHydratable(instance.nextSibling);
11291  }
11292  function getFirstHydratableChild(parentInstance) {
11293    return getNextHydratable(parentInstance.firstChild);
11294  }
11295  function getFirstHydratableChildWithinContainer(parentContainer) {
11296    return getNextHydratable(parentContainer.firstChild);
11297  }
11298  function getFirstHydratableChildWithinSuspenseInstance(parentInstance) {
11299    return getNextHydratable(parentInstance.nextSibling);
11300  }
11301  function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle, shouldWarnDev) {
11302    precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events
11303    // get attached.
11304
11305    updateFiberProps(instance, props);
11306    var parentNamespace;
11307
11308    {
11309      var hostContextDev = hostContext;
11310      parentNamespace = hostContextDev.namespace;
11311    } // TODO: Temporary hack to check if we're in a concurrent root. We can delete
11312    // when the legacy root API is removed.
11313
11314
11315    var isConcurrentMode = (internalInstanceHandle.mode & ConcurrentMode) !== NoMode;
11316    return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance, isConcurrentMode, shouldWarnDev);
11317  }
11318  function hydrateTextInstance(textInstance, text, internalInstanceHandle, shouldWarnDev) {
11319    precacheFiberNode(internalInstanceHandle, textInstance); // TODO: Temporary hack to check if we're in a concurrent root. We can delete
11320    // when the legacy root API is removed.
11321
11322    var isConcurrentMode = (internalInstanceHandle.mode & ConcurrentMode) !== NoMode;
11323    return diffHydratedText(textInstance, text);
11324  }
11325  function hydrateSuspenseInstance(suspenseInstance, internalInstanceHandle) {
11326    precacheFiberNode(internalInstanceHandle, suspenseInstance);
11327  }
11328  function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {
11329    var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary.
11330    // There might be nested nodes so we need to keep track of how
11331    // deep we are and only break out when we're back on top.
11332
11333    var depth = 0;
11334
11335    while (node) {
11336      if (node.nodeType === COMMENT_NODE) {
11337        var data = node.data;
11338
11339        if (data === SUSPENSE_END_DATA) {
11340          if (depth === 0) {
11341            return getNextHydratableSibling(node);
11342          } else {
11343            depth--;
11344          }
11345        } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
11346          depth++;
11347        }
11348      }
11349
11350      node = node.nextSibling;
11351    } // TODO: Warn, we didn't find the end comment boundary.
11352
11353
11354    return null;
11355  } // Returns the SuspenseInstance if this node is a direct child of a
11356  // SuspenseInstance. I.e. if its previous sibling is a Comment with
11357  // SUSPENSE_x_START_DATA. Otherwise, null.
11358
11359  function getParentSuspenseInstance(targetInstance) {
11360    var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary.
11361    // There might be nested nodes so we need to keep track of how
11362    // deep we are and only break out when we're back on top.
11363
11364    var depth = 0;
11365
11366    while (node) {
11367      if (node.nodeType === COMMENT_NODE) {
11368        var data = node.data;
11369
11370        if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
11371          if (depth === 0) {
11372            return node;
11373          } else {
11374            depth--;
11375          }
11376        } else if (data === SUSPENSE_END_DATA) {
11377          depth++;
11378        }
11379      }
11380
11381      node = node.previousSibling;
11382    }
11383
11384    return null;
11385  }
11386  function commitHydratedContainer(container) {
11387    // Retry if any event replaying was blocked on this.
11388    retryIfBlockedOn(container);
11389  }
11390  function commitHydratedSuspenseInstance(suspenseInstance) {
11391    // Retry if any event replaying was blocked on this.
11392    retryIfBlockedOn(suspenseInstance);
11393  }
11394  function shouldDeleteUnhydratedTailInstances(parentType) {
11395    return parentType !== 'head' && parentType !== 'body';
11396  }
11397  function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text, isConcurrentMode) {
11398    var shouldWarnDev = true;
11399    checkForUnmatchedText(textInstance.nodeValue, text, isConcurrentMode, shouldWarnDev);
11400  }
11401  function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text, isConcurrentMode) {
11402    if (parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
11403      var shouldWarnDev = true;
11404      checkForUnmatchedText(textInstance.nodeValue, text, isConcurrentMode, shouldWarnDev);
11405    }
11406  }
11407  function didNotHydrateInstanceWithinContainer(parentContainer, instance) {
11408    {
11409      if (instance.nodeType === ELEMENT_NODE) {
11410        warnForDeletedHydratableElement(parentContainer, instance);
11411      } else if (instance.nodeType === COMMENT_NODE) ; else {
11412        warnForDeletedHydratableText(parentContainer, instance);
11413      }
11414    }
11415  }
11416  function didNotHydrateInstanceWithinSuspenseInstance(parentInstance, instance) {
11417    {
11418      // $FlowFixMe: Only Element or Document can be parent nodes.
11419      var parentNode = parentInstance.parentNode;
11420
11421      if (parentNode !== null) {
11422        if (instance.nodeType === ELEMENT_NODE) {
11423          warnForDeletedHydratableElement(parentNode, instance);
11424        } else if (instance.nodeType === COMMENT_NODE) ; else {
11425          warnForDeletedHydratableText(parentNode, instance);
11426        }
11427      }
11428    }
11429  }
11430  function didNotHydrateInstance(parentType, parentProps, parentInstance, instance, isConcurrentMode) {
11431    {
11432      if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
11433        if (instance.nodeType === ELEMENT_NODE) {
11434          warnForDeletedHydratableElement(parentInstance, instance);
11435        } else if (instance.nodeType === COMMENT_NODE) ; else {
11436          warnForDeletedHydratableText(parentInstance, instance);
11437        }
11438      }
11439    }
11440  }
11441  function didNotFindHydratableInstanceWithinContainer(parentContainer, type, props) {
11442    {
11443      warnForInsertedHydratedElement(parentContainer, type);
11444    }
11445  }
11446  function didNotFindHydratableTextInstanceWithinContainer(parentContainer, text) {
11447    {
11448      warnForInsertedHydratedText(parentContainer, text);
11449    }
11450  }
11451  function didNotFindHydratableInstanceWithinSuspenseInstance(parentInstance, type, props) {
11452    {
11453      // $FlowFixMe: Only Element or Document can be parent nodes.
11454      var parentNode = parentInstance.parentNode;
11455      if (parentNode !== null) warnForInsertedHydratedElement(parentNode, type);
11456    }
11457  }
11458  function didNotFindHydratableTextInstanceWithinSuspenseInstance(parentInstance, text) {
11459    {
11460      // $FlowFixMe: Only Element or Document can be parent nodes.
11461      var parentNode = parentInstance.parentNode;
11462      if (parentNode !== null) warnForInsertedHydratedText(parentNode, text);
11463    }
11464  }
11465  function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props, isConcurrentMode) {
11466    {
11467      if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
11468        warnForInsertedHydratedElement(parentInstance, type);
11469      }
11470    }
11471  }
11472  function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text, isConcurrentMode) {
11473    {
11474      if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
11475        warnForInsertedHydratedText(parentInstance, text);
11476      }
11477    }
11478  }
11479  function errorHydratingContainer(parentContainer) {
11480    {
11481      // TODO: This gets logged by onRecoverableError, too, so we should be
11482      // able to remove it.
11483      error('An error occurred during hydration. The server HTML was replaced with client content in <%s>.', parentContainer.nodeName.toLowerCase());
11484    }
11485  }
11486  function preparePortalMount(portalInstance) {
11487    listenToAllSupportedEvents(portalInstance);
11488  }
11489
11490  var randomKey = Math.random().toString(36).slice(2);
11491  var internalInstanceKey = '__reactFiber$' + randomKey;
11492  var internalPropsKey = '__reactProps$' + randomKey;
11493  var internalContainerInstanceKey = '__reactContainer$' + randomKey;
11494  var internalEventHandlersKey = '__reactEvents$' + randomKey;
11495  var internalEventHandlerListenersKey = '__reactListeners$' + randomKey;
11496  var internalEventHandlesSetKey = '__reactHandles$' + randomKey;
11497  function detachDeletedInstance(node) {
11498    // TODO: This function is only called on host components. I don't think all of
11499    // these fields are relevant.
11500    delete node[internalInstanceKey];
11501    delete node[internalPropsKey];
11502    delete node[internalEventHandlersKey];
11503    delete node[internalEventHandlerListenersKey];
11504    delete node[internalEventHandlesSetKey];
11505  }
11506  function precacheFiberNode(hostInst, node) {
11507    node[internalInstanceKey] = hostInst;
11508  }
11509  function markContainerAsRoot(hostRoot, node) {
11510    node[internalContainerInstanceKey] = hostRoot;
11511  }
11512  function unmarkContainerAsRoot(node) {
11513    node[internalContainerInstanceKey] = null;
11514  }
11515  function isContainerMarkedAsRoot(node) {
11516    return !!node[internalContainerInstanceKey];
11517  } // Given a DOM node, return the closest HostComponent or HostText fiber ancestor.
11518  // If the target node is part of a hydrated or not yet rendered subtree, then
11519  // this may also return a SuspenseComponent or HostRoot to indicate that.
11520  // Conceptually the HostRoot fiber is a child of the Container node. So if you
11521  // pass the Container node as the targetNode, you will not actually get the
11522  // HostRoot back. To get to the HostRoot, you need to pass a child of it.
11523  // The same thing applies to Suspense boundaries.
11524
11525  function getClosestInstanceFromNode(targetNode) {
11526    var targetInst = targetNode[internalInstanceKey];
11527
11528    if (targetInst) {
11529      // Don't return HostRoot or SuspenseComponent here.
11530      return targetInst;
11531    } // If the direct event target isn't a React owned DOM node, we need to look
11532    // to see if one of its parents is a React owned DOM node.
11533
11534
11535    var parentNode = targetNode.parentNode;
11536
11537    while (parentNode) {
11538      // We'll check if this is a container root that could include
11539      // React nodes in the future. We need to check this first because
11540      // if we're a child of a dehydrated container, we need to first
11541      // find that inner container before moving on to finding the parent
11542      // instance. Note that we don't check this field on  the targetNode
11543      // itself because the fibers are conceptually between the container
11544      // node and the first child. It isn't surrounding the container node.
11545      // If it's not a container, we check if it's an instance.
11546      targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey];
11547
11548      if (targetInst) {
11549        // Since this wasn't the direct target of the event, we might have
11550        // stepped past dehydrated DOM nodes to get here. However they could
11551        // also have been non-React nodes. We need to answer which one.
11552        // If we the instance doesn't have any children, then there can't be
11553        // a nested suspense boundary within it. So we can use this as a fast
11554        // bailout. Most of the time, when people add non-React children to
11555        // the tree, it is using a ref to a child-less DOM node.
11556        // Normally we'd only need to check one of the fibers because if it
11557        // has ever gone from having children to deleting them or vice versa
11558        // it would have deleted the dehydrated boundary nested inside already.
11559        // However, since the HostRoot starts out with an alternate it might
11560        // have one on the alternate so we need to check in case this was a
11561        // root.
11562        var alternate = targetInst.alternate;
11563
11564        if (targetInst.child !== null || alternate !== null && alternate.child !== null) {
11565          // Next we need to figure out if the node that skipped past is
11566          // nested within a dehydrated boundary and if so, which one.
11567          var suspenseInstance = getParentSuspenseInstance(targetNode);
11568
11569          while (suspenseInstance !== null) {
11570            // We found a suspense instance. That means that we haven't
11571            // hydrated it yet. Even though we leave the comments in the
11572            // DOM after hydrating, and there are boundaries in the DOM
11573            // that could already be hydrated, we wouldn't have found them
11574            // through this pass since if the target is hydrated it would
11575            // have had an internalInstanceKey on it.
11576            // Let's get the fiber associated with the SuspenseComponent
11577            // as the deepest instance.
11578            var targetSuspenseInst = suspenseInstance[internalInstanceKey];
11579
11580            if (targetSuspenseInst) {
11581              return targetSuspenseInst;
11582            } // If we don't find a Fiber on the comment, it might be because
11583            // we haven't gotten to hydrate it yet. There might still be a
11584            // parent boundary that hasn't above this one so we need to find
11585            // the outer most that is known.
11586
11587
11588            suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent
11589            // host component also hasn't hydrated yet. We can return it
11590            // below since it will bail out on the isMounted check later.
11591          }
11592        }
11593
11594        return targetInst;
11595      }
11596
11597      targetNode = parentNode;
11598      parentNode = targetNode.parentNode;
11599    }
11600
11601    return null;
11602  }
11603  /**
11604   * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
11605   * instance, or null if the node was not rendered by this React.
11606   */
11607
11608  function getInstanceFromNode(node) {
11609    var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];
11610
11611    if (inst) {
11612      if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) {
11613        return inst;
11614      } else {
11615        return null;
11616      }
11617    }
11618
11619    return null;
11620  }
11621  /**
11622   * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
11623   * DOM node.
11624   */
11625
11626  function getNodeFromInstance(inst) {
11627    if (inst.tag === HostComponent || inst.tag === HostText) {
11628      // In Fiber this, is just the state node right now. We assume it will be
11629      // a host component or host text.
11630      return inst.stateNode;
11631    } // Without this first invariant, passing a non-DOM-component triggers the next
11632    // invariant for a missing parent, which is super confusing.
11633
11634
11635    throw new Error('getNodeFromInstance: Invalid argument.');
11636  }
11637  function getFiberCurrentPropsFromNode(node) {
11638    return node[internalPropsKey] || null;
11639  }
11640  function updateFiberProps(node, props) {
11641    node[internalPropsKey] = props;
11642  }
11643  function getEventListenerSet(node) {
11644    var elementListenerSet = node[internalEventHandlersKey];
11645
11646    if (elementListenerSet === undefined) {
11647      elementListenerSet = node[internalEventHandlersKey] = new Set();
11648    }
11649
11650    return elementListenerSet;
11651  }
11652
11653  var loggedTypeFailures = {};
11654  var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
11655
11656  function setCurrentlyValidatingElement(element) {
11657    {
11658      if (element) {
11659        var owner = element._owner;
11660        var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
11661        ReactDebugCurrentFrame$1.setExtraStackFrame(stack);
11662      } else {
11663        ReactDebugCurrentFrame$1.setExtraStackFrame(null);
11664      }
11665    }
11666  }
11667
11668  function checkPropTypes(typeSpecs, values, location, componentName, element) {
11669    {
11670      // $FlowFixMe This is okay but Flow doesn't know it.
11671      var has = Function.call.bind(hasOwnProperty);
11672
11673      for (var typeSpecName in typeSpecs) {
11674        if (has(typeSpecs, typeSpecName)) {
11675          var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to
11676          // fail the render phase where it didn't fail before. So we log it.
11677          // After these have been cleaned up, we'll let them throw.
11678
11679          try {
11680            // This is intentionally an invariant that gets caught. It's the same
11681            // behavior as without this statement except with a better message.
11682            if (typeof typeSpecs[typeSpecName] !== 'function') {
11683              // eslint-disable-next-line react-internal/prod-error-codes
11684              var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invali
vendor: 6,139 bytes, lines 11684-11889
11684d; ' + '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`.');
11685              err.name = 'Invariant Violation';
11686              throw err;
11687            }
11688
11689            error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
11690          } catch (ex) {
11691            error$1 = ex;
11692          }
11693
11694          if (error$1 && !(error$1 instanceof Error)) {
11695            setCurrentlyValidatingElement(element);
11696
11697            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);
11698
11699            setCurrentlyValidatingElement(null);
11700          }
11701
11702          if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
11703            // Only monitor this failure once because there tends to be a lot of the
11704            // same error.
11705            loggedTypeFailures[error$1.message] = true;
11706            setCurrentlyValidatingElement(element);
11707
11708            error('Failed %s type: %s', location, error$1.message);
11709
11710            setCurrentlyValidatingElement(null);
11711          }
11712        }
11713      }
11714    }
11715  }
11716
11717  var valueStack = [];
11718  var fiberStack;
11719
11720  {
11721    fiberStack = [];
11722  }
11723
11724  var index = -1;
11725
11726  function createCursor(defaultValue) {
11727    return {
11728      current: defaultValue
11729    };
11730  }
11731
11732  function pop(cursor, fiber) {
11733    if (index < 0) {
11734      {
11735        error('Unexpected pop.');
11736      }
11737
11738      return;
11739    }
11740
11741    {
11742      if (fiber !== fiberStack[index]) {
11743        error('Unexpected Fiber popped.');
11744      }
11745    }
11746
11747    cursor.current = valueStack[index];
11748    valueStack[index] = null;
11749
11750    {
11751      fiberStack[index] = null;
11752    }
11753
11754    index--;
11755  }
11756
11757  function push(cursor, value, fiber) {
11758    index++;
11759    valueStack[index] = cursor.current;
11760
11761    {
11762      fiberStack[index] = fiber;
11763    }
11764
11765    cursor.current = value;
11766  }
11767
11768  var warnedAboutMissingGetChildContext;
11769
11770  {
11771    warnedAboutMissingGetChildContext = {};
11772  }
11773
11774  var emptyContextObject = {};
11775
11776  {
11777    Object.freeze(emptyContextObject);
11778  } // A cursor to the current merged context object on the stack.
11779
11780
11781  var contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed.
11782
11783  var didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack.
11784  // We use this to get access to the parent context after we have already
11785  // pushed the next context provider, and now need to merge their contexts.
11786
11787  var previousContext = emptyContextObject;
11788
11789  function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {
11790    {
11791      if (didPushOwnContextIfProvider && isContextProvider(Component)) {
11792        // If the fiber is a context provider itself, when we read its context
11793        // we may have already pushed its own child context on the stack. A context
11794        // provider should not "see" its own child context. Therefore we read the
11795        // previous (parent) context instead for a context provider.
11796        return previousContext;
11797      }
11798
11799      return contextStackCursor.current;
11800    }
11801  }
11802
11803  function cacheContext(workInProgress, unmaskedContext, maskedContext) {
11804    {
11805      var instance = workInProgress.stateNode;
11806      instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;
11807      instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
11808    }
11809  }
11810
11811  function getMaskedContext(workInProgress, unmaskedContext) {
11812    {
11813      var type = workInProgress.type;
11814      var contextTypes = type.contextTypes;
11815
11816      if (!contextTypes) {
11817        return emptyContextObject;
11818      } // Avoid recreating masked context unless unmasked context has changed.
11819      // Failing to do this will result in unnecessary calls to componentWillReceiveProps.
11820      // This may trigger infinite loops if componentWillReceiveProps calls setState.
11821
11822
11823      var instance = workInProgress.stateNode;
11824
11825      if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {
11826        return instance.__reactInternalMemoizedMaskedChildContext;
11827      }
11828
11829      var context = {};
11830
11831      for (var key in contextTypes) {
11832        context[key] = unmaskedContext[key];
11833      }
11834
11835      {
11836        var name = getComponentNameFromFiber(workInProgress) || 'Unknown';
11837        checkPropTypes(contextTypes, context, 'context', name);
11838      } // Cache unmasked context so we can avoid recreating masked context unless necessary.
11839      // Context is created before the class component is instantiated so check for instance.
11840
11841
11842      if (instance) {
11843        cacheContext(workInProgress, unmaskedContext, context);
11844      }
11845
11846      return context;
11847    }
11848  }
11849
11850  function hasContextChanged() {
11851    {
11852      return didPerformWorkStackCursor.current;
11853    }
11854  }
11855
11856  function isContextProvider(type) {
11857    {
11858      var childContextTypes = type.childContextTypes;
11859      return childContextTypes !== null && childContextTypes !== undefined;
11860    }
11861  }
11862
11863  function popContext(fiber) {
11864    {
11865      pop(didPerformWorkStackCursor, fiber);
11866      pop(contextStackCursor, fiber);
11867    }
11868  }
11869
11870  function popTopLevelContextObject(fiber) {
11871    {
11872      pop(didPerformWorkStackCursor, fiber);
11873      pop(contextStackCursor, fiber);
11874    }
11875  }
11876
11877  function pushTopLevelContextObject(fiber, context, didChange) {
11878    {
11879      if (contextStackCursor.current !== emptyContextObject) {
11880        throw new Error('Unexpected context found on stack. ' + 'This error is likely caused by a bug in React. Please file an issue.');
11881      }
11882
11883      push(contextStackCursor, context, fiber);
11884      push(didPerformWorkStackCursor, didChange, fiber);
11885    }
11886  }
11887
11888  function processChildContext(fiber, type, parentContext) {
11889    {
11890      var instance = fiber.stateNode;
11891      var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future.
11892      // It has only been added in Fiber to match the (unintentional) behavior in Stack.
11893
11894      if (typeof instance.getChildContext !== 'function') {
11895        {
11896          var componentName = getComponentNameFromFiber(fiber) || 'Unknown';
11897
11898          if (!warnedAboutMissingGetChildContext[componentName]) {
11899            warnedAboutMissingGetChildContext[componentName] = true;
11900
11901            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);
11902          }
11903        }
11904
11905        return parentContext;
11906      }
11907
11908      var childContext = instance.getChildContext();
11909
11910      for (var contextKey in childContext) {
11911        if (!(contextKey in childContextTypes)) {
11912          throw new Error((getComponentNameFromFiber(fiber) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes.");
11913        }
11914      }
11915
11916      {
11917        var name = getComponentNameFromFiber(fiber) || 'Unknown';
11918        checkPropTypes(childContextTypes, childContext, 'child context', name);
11919      }
11920
11921      return assign({}, parentContext, childContext);
11922    }
11923  }
11924
11925  function pushContextProvider(workInProgress) {
11926    {
11927      var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity.
11928      // If the instance does not exist yet, we will push null at first,
11929      // and replace it on the stack later when invalidating the context.
11930
11931      var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later.
11932      // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.
11933
11934      previousContext = contextStackCursor.current;
11935      push(contextStackCursor, memoizedMergedChildContext, workInProgress);
11936      push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);
11937      return true;
11938    }
11939  }
11940
11941  function invalidateContextProvider(workInProgress, type, didChange) {
11942    {
11943      var instance = workInProgress.stateNode;
11944
11945      if (!instance) {
11946        throw new Error('Expected to have an instance by this point. ' + 'This error is likely caused by a bug in React. Please file an issue.');
11947      }
11948
11949      if (didChange) {
11950        // Merge parent and own context.
11951        // Skip this if we're not updating due to sCU.
11952        // This avoids unnecessarily recomputing memoized values.
11953        var mergedContext = processChildContext(workInProgress, type, previousContext);
11954        instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one.
11955        // It is important to unwind the context in the reverse order.
11956
11957        pop(didPerformWorkStackCursor, workInProgress);
11958        pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed.
11959
11960        push(contextStackCursor, mergedContext, workInProgress);
11961        push(didPerformWorkStackCursor, didChange, workInProgress);
11962      } else {
11963        pop(didPerformWorkStackCursor, workInProgress);
11964        push(didPerformWorkStackCursor, didChange, workInProgress);
11965      }
11966    }
11967  }
11968
11969  function findCurrentUnmaskedContext(fiber) {
11970    {
11971      // Currently this is only used with renderSubtreeIntoContainer; not sure if it
11972      // makes sense elsewhere
11973      if (!isFiberMounted(fiber) || fiber.tag !== ClassComponent) {
11974        throw new Error('Expected subtree parent to be a mounted class component. ' + 'This error is likely caused by a bug in React. Please file an issue.');
11975      }
11976
11977      var node = fiber;
11978
11979      do {
11980        switch (node.tag) {
11981          case HostRoot:
11982            return node.stateNode.context;
11983
11984          case ClassComponent:
11985            {
11986              var Component = node.type;
11987
11988              if (isContextProvider(Component)) {
11989                return node.stateNode.__reactInternalMemoizedMergedChildContext;
11990              }
11991
11992              break;
11993            }
11994        }
11995
11996        node = node.return;
11997      } while (node !== null);
11998
11999      throw new Error('Found unexpected detached subtree parent. ' + 'This error is likely caused by a bug in React. Please file an issue.');
12000    }
12001  }
12002
12003  var LegacyRoot = 0;
12004  var ConcurrentRoot = 1;
12005
12006  var syncQueue = null;
12007  var includesLegacySyncCallbacks = false;
12008  var isFlushingSyncQueue = false;
12009  function scheduleSyncCallback(callback) {
12010    // Push this callback into an internal queue. We'll flush these either in
12011    // the next tick, or earlier if something calls `flushSyncCallbackQueue`.
12012    if (syncQueue === null) {
12013      syncQueue = [callback];
12014    } else {
12015      // Push onto existing queue. Don't need to schedule a callback because
12016      // we already scheduled one when we created the queue.
12017      syncQueue.push(callback);
12018    }
12019  }
12020  function scheduleLegacySyncCallback(callback) {
12021    includesLegacySyncCallbacks = true;
12022    scheduleSyncCallback(callback);
12023  }
12024  function flushSyncCallbacksOnlyInLegacyMode() {
12025    // Only flushes the queue if there's a legacy sync callback scheduled.
12026    // TODO: There's only a single type of callback: performSyncOnWorkOnRoot. So
12027    // it might make more sense for the queue to be a list of roots instead of a
12028    // list of generic callbacks. Then we can have two: one for legacy roots, one
12029    // for concurrent roots. And this method would only flush the legacy ones.
12030    if (includesLegacySyncCallbacks) {
12031      flushSyncCallbacks();
12032    }
12033  }
12034  function flushSyncCallbacks() {
12035    if (!isFlushingSyncQueue && syncQueue !== null) {
12036      // Prevent re-entrance.
12037      isFlushingSyncQueue = true;
12038      var i = 0;
12039      var previousUpdatePriority = getCurrentUpdatePriority();
12040
12041      try {
12042        var isSync = true;
12043        var queue = syncQueue; // TODO: Is this necessary anymore? The only user code that runs in this
12044        // queue is in the render or commit phases.
12045
12046        setCurrentUpdatePriority(DiscreteEventPriority);
12047
12048        for (; i < queue.length; i++) {
12049          var callback = queue[i];
12050
12051          do {
12052            callback = callback(isSync);
12053          } while (callback !== null);
12054        }
12055
12056        syncQueue = null;
12057        includesLegacySyncCallbacks = false;
12058      } catch (error) {
12059        // If something throws, leave the remaining callbacks on the queue.
12060        if (syncQueue !== null) {
12061          syncQueue = syncQueue.slice(i + 1);
12062        } // Resume flushing in the next tick
12063
12064
12065        scheduleCallback(ImmediatePriority, flushSyncCallbacks);
12066        throw error;
12067      } finally {
12068        setCurrentUpdatePriority(previousUpdatePriority);
12069        isFlushingSyncQueue = false;
12070      }
12071    }
12072
12073    return null;
12074  }
12075
12076  // TODO: Use the unified fiber stack module instead of this local one?
12077  // Intentionally not using it yet to derisk the initial implementation, because
12078  // the way we push/pop these values is a bit unusual. If there's a mistake, I'd
12079  // rather the ids be wrong than crash the whole reconciler.
12080  var forkStack = [];
12081  var forkStackIndex = 0;
12082  var treeForkProvider = null;
12083  var treeForkCount = 0;
12084  var idStack = [];
12085  var idStackIndex = 0;
12086  var treeContextProvider = null;
12087  var treeContextId = 1;
12088  var treeContextOverflow = '';
12089  function isForkedChild(workInProgress) {
12090    warnIfNotHydrating();
12091    return (workInProgress.flags & Forked) !== NoFlags;
12092  }
12093  function getForksAtLevel(workInProgress) {
12094    warnIfNotHydrating();
12095    return treeForkCount;
12096  }
12097  function getTreeId() {
12098    var overflow = treeContextOverflow;
12099    var idWithLeadingBit = treeContextId;
12100    var id = idWithLeadingBit & ~getLeadingBit(idWithLeadingBit);
12101    return id.toString(32) + overflow;
12102  }
12103  function pushTreeFork(workInProgress, totalChildren) {
12104    // This is called right after we reconcile an array (or iterator) of child
12105    // fibers, because that's the only place where we know how many children in
12106    // the whole set without doing extra work later, or storing addtional
12107    // information on the fiber.
12108    //
12109    // That's why this function is separate from pushTreeId — it's called during
12110    // the render phase of the fork parent, not the child, which is where we push
12111    // the other context values.
12112    //
12113    // In the Fizz implementation this is much simpler because the child is
12114    // rendered in the same callstack as the parent.
12115    //
12116    // It might be better to just add a `forks` field to the Fiber type. It would
12117    // make this module simpler.
12118    warnIfNotHydrating();
12119    forkStack[forkStackIndex++] = treeForkCount;
12120    forkStack[forkStackIndex++] = treeForkProvider;
12121    treeForkProvider = workInProgress;
12122    treeForkCount = totalChildren;
12123  }
12124  function pushTreeId(workInProgress, totalChildren, index) {
12125    warnIfNotHydrating();
12126    idStack[idStackIndex++] = treeContextId;
12127    idStack[idStackIndex++] = treeContextOverflow;
12128    idStack[idStackIndex++] = treeContextProvider;
12129    treeContextProvider = workInProgress;
12130    var baseIdWithLeadingBit = treeContextId;
12131    var baseOverflow = treeContextOverflow; // The leftmost 1 marks the end of the sequence, non-inclusive. It's not part
12132    // of the id; we use it to account for leading 0s.
12133
12134    var baseLength = getBitLength(baseIdWithLeadingBit) - 1;
12135    var baseId = baseIdWithLeadingBit & ~(1 << baseLength);
12136    var slot = index + 1;
12137    var length = getBitLength(totalChildren) + baseLength; // 30 is the max length we can store without overflowing, taking into
12138    // consideration the leading 1 we use to mark the end of the sequence.
12139
12140    if (length > 30) {
12141      // We overflowed the bitwise-safe range. Fall back to slower algorithm.
12142      // This branch assumes the length of the base id is greater than 5; it won't
12143      // work for smaller ids, because you need 5 bits per character.
12144      //
12145      // We encode the id in multiple steps: first the base id, then the
12146      // remaining digits.
12147      //
12148      // Each 5 bit sequence corresponds to a single base 32 character. So for
12149      // example, if the current id is 23 bits long, we can convert 20 of those
12150      // bits into a string of 4 characters, with 3 bits left over.
12151      //
12152      // First calculate how many bits in the base id represent a complete
12153      // sequence of characters.
12154      var numberOfOverflowBits = baseLength - baseLength % 5; // Then create a bitmask that selects only those bits.
12155
12156      var newOverflowBits = (1 << numberOfOverflowBits) - 1; // Select the bits, and convert them to a base 32 string.
12157
12158      var newOverflow = (baseId & newOverflowBits).toString(32); // Now we can remove those bits from the base id.
12159
12160      var restOfBaseId = baseId >> numberOfOverflowBits;
12161      var restOfBaseLength = baseLength - numberOfOverflowBits; // Finally, encode the rest of the bits using the normal algorithm. Because
12162      // we made more room, this time it won't overflow.
12163
12164      var restOfLength = getBitLength(totalChildren) + restOfBaseLength;
12165      var restOfNewBits = slot << restOfBaseLength;
12166      var id = restOfNewBits | restOfBaseId;
12167      var overflow = newOverflow + baseOverflow;
12168      treeContextId = 1 << restOfLength | id;
12169      treeContextOverflow = overflow;
12170    } else {
12171      // Normal path
12172      var newBits = slot << baseLength;
12173
12174      var _id = newBits | baseId;
12175
12176      var _overflow = baseOverflow;
12177      treeContextId = 1 << length | _id;
12178      treeContextOverflow = _overflow;
12179    }
12180  }
12181  function pushMaterializedTreeId(workInProgress) {
12182    warnIfNotHydrating(); // This component materialized an id. This will affect any ids that appear
12183    // in its children.
12184
12185    var returnFiber = workInProgress.return;
12186
12187    if (returnFiber !== null) {
12188      var numberOfForks = 1;
12189      var slotIndex = 0;
12190      pushTreeFork(workInProgress, numberOfForks);
12191      pushTreeId(workInProgress, numberOfForks, slotIndex);
12192    }
12193  }
12194
12195  function getBitLength(number) {
12196    return 32 - clz32(number);
12197  }
12198
12199  function getLeadingBit(id) {
12200    return 1 << getBitLength(id) - 1;
12201  }
12202
12203  function popTreeContext(workInProgress) {
12204    // Restore the previous values.
12205    // This is a bit more complicated than other context-like modules in Fiber
12206    // because the same Fiber may appear on the stack multiple times and for
12207    // different reasons. We have to keep popping until the work-in-progress is
12208    // no longer at the top of the stack.
12209    while (workInProgress === treeForkProvider) {
12210      treeForkProvider = forkStack[--forkStackIndex];
12211      forkStack[forkStackIndex] = null;
12212      treeForkCount = forkStack[--forkStackIndex];
12213      forkStack[forkStackIndex] = null;
12214    }
12215
12216    while (workInProgress === treeContextProvider) {
12217      treeContextProvider = idStack[--idStackIndex];
12218      idStack[idStackIndex] = null;
12219      treeContextOverflow = idStack[--idStackIndex];
12220      idStack[idStackIndex] = null;
12221      treeContextId = idStack[--idStackIndex];
12222      idStack[idStackIndex] = null;
12223    }
12224  }
12225  function getSuspendedTreeContext() {
12226    warnIfNotHydrating();
12227
12228    if (treeContextProvider !== null) {
12229      return {
12230        id: treeContextId,
12231        overflow: treeContextOverflow
12232      };
12233    } else {
12234      return null;
12235    }
12236  }
12237  function restoreSuspendedTreeContext(workInProgress, suspendedContext) {
12238    warnIfNotHydrating();
12239    idStack[idStackIndex++] = treeContextId;
12240    idStack[idStackIndex++] = treeContextOverflow;
12241    idStack[idStackIndex++] = treeContextProvider;
12242    treeContextId = suspendedContext.id;
12243    treeContextOverflow = suspendedContext.overflow;
12244    treeContextProvider = workInProgress;
12245  }
12246
12247  function warnIfNotHydrating() {
12248    {
12249      if (!getIsHydrating()) {
12250        error('Expected to be hydrating. This is a bug in React. Please file ' + 'an issue.');
12251      }
12252    }
12253  }
12254
12255  // This may have been an insertion or a hydration.
12256
12257  var hydrationParentFiber = null;
12258  var nextHydratableInstance = null;
12259  var isHydrating = false; // This flag allows for warning supression when we expect there to be mismatches
12260  // due to earlier mismatches or a suspended fiber.
12261
12262  var didSuspendOrErrorDEV = false; // Hydration errors that were thrown inside this boundary
12263
12264  var hydrationErrors = null;
12265
12266  function warnIfHydrating() {
12267    {
12268      if (isHydrating) {
12269        error('We should not be hydrating here. This is a bug in React. Please file a bug.');
12270      }
12271    }
12272  }
12273
12274  function markDidThrowWhileHydratingDEV() {
12275    {
12276      didSuspendOrErrorDEV = true;
12277    }
12278  }
12279  function didSuspendOrErrorWhileHydratingDEV() {
12280    {
12281      return didSuspendOrErrorDEV;
12282    }
12283  }
12284
12285  function enterHydrationState(fiber) {
12286
12287    var parentInstance = fiber.stateNode.containerInfo;
12288    nextHydratableInstance = getFirstHydratableChildWithinContainer(parentInstance);
12289    hydrationParentFiber = fiber;
12290    isHydrating = true;
12291    hydrationErrors = null;
12292    didSuspendOrErrorDEV = false;
12293    return true;
12294  }
12295
12296  function reenterHydrationStateFromDehydratedSuspenseInstance(fiber, suspenseInstance, treeContext) {
12297
12298    nextHydratableInstance = getFirstHydratableChildWithinSuspenseInstance(suspenseInstance);
12299    hydrationParentFiber = fiber;
12300    isHydrating = true;
12301    hydrationErrors = null;
12302    didSuspendOrErrorDEV = false;
12303
12304    if (treeContext !== null) {
12305      restoreSuspendedTreeContext(fiber, treeContext);
12306    }
12307
12308    return true;
12309  }
12310
12311  function warnUnhydratedInstance(returnFiber, instance) {
12312    {
12313      switch (returnFiber.tag) {
12314        case HostRoot:
12315          {
12316            didNotHydrateInstanceWithinContainer(returnFiber.stateNode.containerInfo, instance);
12317            break;
12318          }
12319
12320        case HostComponent:
12321          {
12322            var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
12323            didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance, // TODO: Delete this argument when we remove the legacy root API.
12324            isConcurrentMode);
12325            break;
12326          }
12327
12328        case SuspenseComponent:
12329          {
12330            var suspenseState = returnFiber.memoizedState;
12331            if (suspenseState.dehydrated !== null) didNotHydrateInstanceWithinSuspenseInstance(suspenseState.dehydrated, instance);
12332            break;
12333          }
12334      }
12335    }
12336  }
12337
12338  function deleteHydratableInstance(returnFiber, instance) {
12339    warnUnhydratedInstance(returnFiber, instance);
12340    var childToDelete = createFiberFromHostInstanceForDeletion();
12341    childToDelete.stateNode = instance;
12342    childToDelete.return = returnFiber;
12343    var deletions = returnFiber.deletions;
12344
12345    if (deletions === null) {
12346      returnFiber.deletions = [childToDelete];
12347      returnFiber.flags |= ChildDeletion;
12348    } else {
12349      deletions.push(childToDelete);
12350    }
12351  }
12352
12353  function warnNonhydratedInstance(returnFiber, fiber) {
12354    {
12355      if (didSuspendOrErrorDEV) {
12356        // Inside a boundary that already suspended. We're currently rendering the
12357        // siblings of a suspended node. The mismatch may be due to the missing
12358        // data, so it's probably a false positive.
12359        return;
12360      }
12361
12362      switch (returnFiber.tag) {
12363        case HostRoot:
12364          {
12365            var parentContainer = returnFiber.stateNode.containerInfo;
12366
12367            switch (fiber.tag) {
12368              case HostComponent:
12369                var type = fiber.type;
12370                var props = fiber.pendingProps;
12371                didNotFindHydratableInstanceWithinContainer(parentContainer, type);
12372                break;
12373
12374              case HostText:
12375                var text = fiber.pendingProps;
12376                didNotFindHydratableTextInstanceWithinContainer(parentContainer, text);
12377                break;
12378            }
12379
12380            break;
12381          }
12382
12383        case HostComponent:
12384          {
12385            var parentType = returnFiber.type;
12386            var parentProps = returnFiber.memoizedProps;
12387            var parentInstance = returnFiber.stateNode;
12388
12389            switch (fiber.tag) {
12390              case HostComponent:
12391                {
12392                  var _type = fiber.type;
12393                  var _props = fiber.pendingProps;
12394                  var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
12395                  didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props, // TODO: Delete this argument when we remove the legacy root API.
12396                  isConcurrentMode);
12397                  break;
12398                }
12399
12400              case HostText:
12401                {
12402                  var _text = fiber.pendingProps;
12403
12404                  var _isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
12405
12406                  didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text, // TODO: Delete this argument when we remove the legacy root API.
12407                  _isConcurrentMode);
12408                  break;
12409                }
12410            }
12411
12412            break;
12413          }
12414
12415        case SuspenseComponent:
12416          {
12417            var suspenseState = returnFiber.memoizedState;
12418            var _parentInstance = suspenseState.dehydrated;
12419            if (_parentInstance !== null) switch (fiber.tag) {
12420              case HostComponent:
12421                var _type2 = fiber.type;
12422                var _props2 = fiber.pendingProps;
12423                didNotFindHydratableInstanceWithinSuspenseInstance(_parentInstance, _type2);
12424                break;
12425
12426              case HostText:
12427                var _text2 = fiber.pendingProps;
12428                didNotFindHydratableTextInstanceWithinSuspenseInstance(_parentInstance, _text2);
12429                break;
12430            }
12431            break;
12432          }
12433
12434        default:
12435          return;
12436      }
12437    }
12438  }
12439
12440  function insertNonHydratedInstance(returnFiber, fiber) {
12441    fiber.flags = fiber.flags & ~Hydrating | Placement;
12442    warnNonhydratedInstance(returnFiber, fiber);
12443  }
12444
12445  function tryHydrate(fiber, nextInstance) {
12446    switch (fiber.tag) {
12447      case HostComponent:
12448        {
12449          var type = fiber.type;
12450          var props = fiber.pendingProps;
12451          var instance = canHydrateInstance(nextInstance, type);
12452
12453          if (instance !== null) {
12454            fiber.stateNode = instance;
12455            hydrationParentFiber = fiber;
12456            nextHydratableInstance = getFirstHydratableChild(instance);
12457            return true;
12458          }
12459
12460          return false;
12461        }
12462
12463      case HostText:
12464        {
12465          var text = fiber.pendingProps;
12466          var textInstance = canHydrateTextInstance(nextInstance, text);
12467
12468          if (textInstance !== null) {
12469            fiber.stateNode = textInstance;
12470            hydrationParentFiber = fiber; // Text Instances don't have children so there's nothing to hydrate.
12471
12472            nextHydratableInstance = null;
12473            return true;
12474          }
12475
12476          return false;
12477        }
12478
12479      case SuspenseComponent:
12480        {
12481          var suspenseInstance = canHydrateSuspenseInstance(nextInstance);
12482
12483          if (suspenseInstance !== null) {
12484            var suspenseState = {
12485              dehydrated: suspenseInstance,
12486              treeContext: getSuspendedTreeContext(),
12487              retryLane: OffscreenLane
12488            };
12489            fiber.memoizedState = suspenseState; // Store the dehydrated fragment as a child fiber.
12490            // This simplifies the code for getHostSibling and deleting nodes,
12491            // since it doesn't have to consider all Suspense boundaries and
12492            // check if they're dehydrated ones or not.
12493
12494            var dehydratedFragment = createFiberFromDehydratedFragment(suspenseInstance);
12495            dehydratedFragment.return = fiber;
12496            fiber.child = dehydratedFragment;
12497            hydrationParentFiber = fiber; // While a Suspense Instance does have children, we won't step into
12498            // it during the first pass. Instead, we'll reenter it later.
12499
12500            nextHydratableInstance = null;
12501            return true;
12502          }
12503
12504          return false;
12505        }
12506
12507      default:
12508        return false;
12509    }
12510  }
12511
12512  function shouldClientRenderOnMismatch(fiber) {
12513    return (fiber.mode & ConcurrentMode) !== NoMode && (fiber.flags & DidCapture) === NoFlags;
12514  }
12515
12516  function throwOnHydrationMismatch(fiber) {
12517    throw new Error('Hydration failed because the initial UI does not match what was ' + 'rendered on the server.');
12518  }
12519
12520  function tryToClaimNextHydratableInstance(fiber) {
12521    if (!isHydrating) {
12522      return;
12523    }
12524
12525    var nextInstance = nextHydratableInstance;
12526
12527    if (!nextInstance) {
12528      if (shouldClientRenderOnMismatch(fiber)) {
12529        warnNonhydratedInstance(hydrationParentFiber, fiber);
12530        throwOnHydrationMismatch();
12531      } // Nothing to hydrate. Make it an insertion.
12532
12533
12534      insertNonHydratedInstance(hydrationParentFiber, fiber);
12535      isHydrating = false;
12536      hydrationParentFiber = fiber;
12537      return;
12538    }
12539
12540    var firstAttemptedInstance = nextInstance;
12541
12542    if (!tryHydrate(fiber, nextInstance)) {
12543      if (shouldClientRenderOnMismatch(fiber)) {
12544        warnNonhydratedInstance(hydrationParentFiber, fiber);
12545        throwOnHydrationMismatch();
12546      } // If we can't hydrate this instance let's try the next one.
12547      // We use this as a heuristic. It's based on intuition and not data so it
12548      // might be flawed or unnecessary.
12549
12550
12551      nextInstance = getNextHydratableSibling(firstAttemptedInstance);
12552      var prevHydrationParentFiber = hydrationParentFiber;
12553
12554      if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
12555        // Nothing to hydrate. Make it an insertion.
12556        insertNonHydratedInstance(hydrationParentFiber, fiber);
12557        isHydrating = false;
12558        hydrationParentFiber = fiber;
12559        return;
12560      } // We matched the next one, we'll now assume that the first one was
12561      // superfluous and we'll delete it. Since we can't eagerly delete it
12562      // we'll have to schedule a deletion. To do that, this node needs a dummy
12563      // fiber associated with it.
12564
12565
12566      deleteHydratableInstance(prevHydrationParentFiber, firstAttemptedInstance);
12567    }
12568  }
12569
12570  function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
12571
12572    var instance = fiber.stateNode;
12573    var shouldWarnIfMismatchDev = !didSuspendOrErrorDEV;
12574    var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber, shouldWarnIfMismatchDev); // TODO: Type this specific to this type of component.
12575
12576    fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there
12577    // is a new ref we mark this as an update.
12578
12579    if (updatePayload !== null) {
12580      return true;
12581    }
12582
12583    return false;
12584  }
12585
12586  function prepareToHydrateHostTextInstance(fiber) {
12587
12588    var textInstance = fiber.stateNode;
12589    var textContent = fiber.memoizedProps;
12590    var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
12591
12592    if (shouldUpdate) {
12593      // We assume that prepareToHydrateHostTextInstance is called in a context where the
12594      // hydration parent is the parent host component of this host text.
12595      var returnFiber = hydrationParentFiber;
12596
12597      if (returnFiber !== null) {
12598        switch (returnFiber.tag) {
12599          case HostRoot:
12600            {
12601              var parentContainer = returnFiber.stateNode.containerInfo;
12602              var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
12603              didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent, // TODO: Delete this argument when we remove the legacy root API.
12604              isConcurrentMode);
12605              break;
12606            }
12607
12608          case HostComponent:
12609            {
12610              var parentType = returnFiber.type;
12611              var parentProps = returnFiber.memoizedProps;
12612              var parentInstance = returnFiber.stateNode;
12613
12614              var _isConcurrentMode2 = (returnFiber.mode & ConcurrentMode) !== NoMode;
12615
12616              didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent, // TODO: Delete this argument when we remove the legacy root API.
12617              _isConcurrentMode2);
12618              break;
12619            }
12620        }
12621      }
12622    }
12623
12624    return shouldUpdate;
12625  }
12626
12627  function prepareToHydrateHostSuspenseInstance(fiber) {
12628
12629    var suspenseState = fiber.memoizedState;
12630    var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
12631
12632    if (!suspenseInstance) {
12633      throw new Error('Expected to have a hydrated suspense instance. ' + 'This error is likely caused by a bug in React. Please file an issue.');
12634    }
12635
12636    hydrateSuspenseInstance(suspenseInstance, fiber);
12637  }
12638
12639  function skipPastDehydratedSuspenseInstance(fiber) {
12640
12641    var suspenseState = fiber.memoizedState;
12642    var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
12643
12644    if (!suspenseInstance) {
12645      throw new Error('Expected to have a hydrated suspense instance. ' + 'This error is likely caused by a bug in React. Please file an issue.');
12646    }
12647
12648    return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);
12649  }
12650
12651  function popToNextHostParent(fiber) {
12652    var parent = fiber.return;
12653
12654    while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) {
12655      parent = parent.return;
12656    }
12657
12658    hydrationParentFiber = parent;
12659  }
12660
12661  function popHydrationState(fiber) {
12662
12663    if (fiber !== hydrationParentFiber) {
12664      // We're deeper than the current hydration context, inside an inserted
12665      // tree.
12666      return false;
12667    }
12668
12669    if (!isHydrating) {
12670      // If we're not currently hydrating but we're in a hydration context, then
12671      // we were an insertion and now need to pop up reenter hydration of our
12672      // siblings.
12673      popToNextHostParent(fiber);
12674      isHydrating = true;
12675      return false;
12676    } // If we have any remaining hydratable nodes, we need to delete them now.
12677    // We only do this deeper than head and body since they tend to have random
12678    // other nodes in them. We also ignore components with pure text content in
12679    // side of them. We also don't delete anything inside the root container.
12680
12681
12682    if (fiber.tag !== HostRoot && (fiber.tag !== HostComponent || shouldDeleteUnhydratedTailInstances(fiber.type) && !shouldSetTextContent(fiber.type, fiber.memoizedProps))) {
12683      var nextInstance = nextHydratableInstance;
12684
12685      if (nextInstance) {
12686        if (shouldClientRenderOnMismatch(fiber)) {
12687          warnIfUnhydratedTailNodes(fiber);
12688          throwOnHydrationMismatch();
12689        } else {
12690          while (nextInstance) {
12691            deleteHydratableInstance(fiber, nextInstance);
12692            nextInstance = getNextHydratableSibling(nextInstance);
12693          }
12694        }
12695      }
12696    }
12697
12698    popToNextHostParent(fiber);
12699
12700    if (fiber.tag === SuspenseComponent) {
vendor: 4,487 bytes, lines 12701-12835
12701      nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber);
12702    } else {
12703      nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;
12704    }
12705
12706    return true;
12707  }
12708
12709  function hasUnhydratedTailNodes() {
12710    return isHydrating && nextHydratableInstance !== null;
12711  }
12712
12713  function warnIfUnhydratedTailNodes(fiber) {
12714    var nextInstance = nextHydratableInstance;
12715
12716    while (nextInstance) {
12717      warnUnhydratedInstance(fiber, nextInstance);
12718      nextInstance = getNextHydratableSibling(nextInstance);
12719    }
12720  }
12721
12722  function resetHydrationState() {
12723
12724    hydrationParentFiber = null;
12725    nextHydratableInstance = null;
12726    isHydrating = false;
12727    didSuspendOrErrorDEV = false;
12728  }
12729
12730  function upgradeHydrationErrorsToRecoverable() {
12731    if (hydrationErrors !== null) {
12732      // Successfully completed a forced client render. The errors that occurred
12733      // during the hydration attempt are now recovered. We will log them in
12734      // commit phase, once the entire tree has finished.
12735      queueRecoverableErrors(hydrationErrors);
12736      hydrationErrors = null;
12737    }
12738  }
12739
12740  function getIsHydrating() {
12741    return isHydrating;
12742  }
12743
12744  function queueHydrationError(error) {
12745    if (hydrationErrors === null) {
12746      hydrationErrors = [error];
12747    } else {
12748      hydrationErrors.push(error);
12749    }
12750  }
12751
12752  var ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig;
12753  var NoTransition = null;
12754  function requestCurrentTransition() {
12755    return ReactCurrentBatchConfig$1.transition;
12756  }
12757
12758  var ReactStrictModeWarnings = {
12759    recordUnsafeLifecycleWarnings: function (fiber, instance) {},
12760    flushPendingUnsafeLifecycleWarnings: function () {},
12761    recordLegacyContextWarning: function (fiber, instance) {},
12762    flushLegacyContextWarning: function () {},
12763    discardPendingWarnings: function () {}
12764  };
12765
12766  {
12767    var findStrictRoot = function (fiber) {
12768      var maybeStrictRoot = null;
12769      var node = fiber;
12770
12771      while (node !== null) {
12772        if (node.mode & StrictLegacyMode) {
12773          maybeStrictRoot = node;
12774        }
12775
12776        node = node.return;
12777      }
12778
12779      return maybeStrictRoot;
12780    };
12781
12782    var setToSortedString = function (set) {
12783      var array = [];
12784      set.forEach(function (value) {
12785        array.push(value);
12786      });
12787      return array.sort().join(', ');
12788    };
12789
12790    var pendingComponentWillMountWarnings = [];
12791    var pendingUNSAFE_ComponentWillMountWarnings = [];
12792    var pendingComponentWillReceivePropsWarnings = [];
12793    var pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
12794    var pendingComponentWillUpdateWarnings = [];
12795    var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about.
12796
12797    var didWarnAboutUnsafeLifecycles = new Set();
12798
12799    ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {
12800      // Dedupe strategy: Warn once per component.
12801      if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {
12802        return;
12803      }
12804
12805      if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components.
12806      instance.componentWillMount.__suppressDeprecationWarning !== true) {
12807        pendingComponentWillMountWarnings.push(fiber);
12808      }
12809
12810      if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillMount === 'function') {
12811        pendingUNSAFE_ComponentWillMountWarnings.push(fiber);
12812      }
12813
12814      if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
12815        pendingComponentWillReceivePropsWarnings.push(fiber);
12816      }
12817
12818      if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
12819        pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber);
12820      }
12821
12822      if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
12823        pendingComponentWillUpdateWarnings.push(fiber);
12824      }
12825
12826      if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillUpdate === 'function') {
12827        pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber);
12828      }
12829    };
12830
12831    ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {
12832      // We do an initial pass to gather component names
12833      var componentWillMountUniqueNames = new Set();
12834
12835      if (pendingComponentWillMountWarnings.length > 0) {
12836        pendingComponentWillMountWarnings.forEach(function (fiber) {
12837          componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12838          didWarnAboutUnsafeLifecycles.add(fiber.type);
12839        });
12840        pendingComponentWillMountWarnings = [];
12841      }
12842
12843      var UNSAFE_componentWillMountUniqueNames = new Set();
12844
12845      if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) {
12846        pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) {
12847          UNSAFE_componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12848          didWarnAboutUnsafeLifecycles.add(fiber.type);
12849        });
12850        pendingUNSAFE_ComponentWillMountWarnings = [];
12851      }
12852
12853      var componentWillReceivePropsUniqueNames = new Set();
12854
12855      if (pendingComponentWillReceivePropsWarnings.length > 0) {
12856        pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {
12857          componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12858          didWarnAboutUnsafeLifecycles.add(fiber.type);
12859        });
12860        pendingComponentWillReceivePropsWarnings = [];
12861      }
12862
12863      var UNSAFE_componentWillReceivePropsUniqueNames = new Set();
12864
12865      if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) {
vendor: 8,361 bytes, lines 12866-13006
12866        pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) {
12867          UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12868          didWarnAboutUnsafeLifecycles.add(fiber.type);
12869        });
12870        pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
12871      }
12872
12873      var componentWillUpdateUniqueNames = new Set();
12874
12875      if (pendingComponentWillUpdateWarnings.length > 0) {
12876        pendingComponentWillUpdateWarnings.forEach(function (fiber) {
12877          componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12878          didWarnAboutUnsafeLifecycles.add(fiber.type);
12879        });
12880        pendingComponentWillUpdateWarnings = [];
12881      }
12882
12883      var UNSAFE_componentWillUpdateUniqueNames = new Set();
12884
12885      if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) {
12886        pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) {
12887          UNSAFE_componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12888          didWarnAboutUnsafeLifecycles.add(fiber.type);
12889        });
12890        pendingUNSAFE_ComponentWillUpdateWarnings = [];
12891      } // Finally, we flush all the warnings
12892      // UNSAFE_ ones before the deprecated ones, since they'll be 'louder'
12893
12894
12895      if (UNSAFE_componentWillMountUniqueNames.size > 0) {
12896        var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);
12897
12898        error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '\nPlease update the following components: %s', sortedNames);
12899      }
12900
12901      if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) {
12902        var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames);
12903
12904        error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, " + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n' + '\nPlease update the following components: %s', _sortedNames);
12905      }
12906
12907      if (UNSAFE_componentWillUpdateUniqueNames.size > 0) {
12908        var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames);
12909
12910        error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '\nPlease update the following components: %s', _sortedNames2);
12911      }
12912
12913      if (componentWillMountUniqueNames.size > 0) {
12914        var _sortedNames3 = setToSortedString(componentWillMountUniqueNames);
12915
12916        warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames3);
12917      }
12918
12919      if (componentWillReceivePropsUniqueNames.size > 0) {
12920        var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames);
12921
12922        warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, refactor your " + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames4);
12923      }
12924
12925      if (componentWillUpdateUniqueNames.size > 0) {
12926        var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames);
12927
12928        warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames5);
12929      }
12930    };
12931
12932    var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about.
12933
12934    var didWarnAboutLegacyContext = new Set();
12935
12936    ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {
12937      var strictRoot = findStrictRoot(fiber);
12938
12939      if (strictRoot === null) {
12940        error('Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.');
12941
12942        return;
12943      } // Dedup strategy: Warn once per component.
12944
12945
12946      if (didWarnAboutLegacyContext.has(fiber.type)) {
12947        return;
12948      }
12949
12950      var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);
12951
12952      if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {
12953        if (warningsForRoot === undefined) {
12954          warningsForRoot = [];
12955          pendingLegacyContextWarning.set(strictRoot, warningsForRoot);
12956        }
12957
12958        warningsForRoot.push(fiber);
12959      }
12960    };
12961
12962    ReactStrictModeWarnings.flushLegacyContextWarning = function () {
12963      pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {
12964        if (fiberArray.length === 0) {
12965          return;
12966        }
12967
12968        var firstFiber = fiberArray[0];
12969        var uniqueNames = new Set();
12970        fiberArray.forEach(function (fiber) {
12971          uniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
12972          didWarnAboutLegacyContext.add(fiber.type);
12973        });
12974        var sortedNames = setToSortedString(uniqueNames);
12975
12976        try {
12977          setCurrentFiber(firstFiber);
12978
12979          error('Legacy context API has been detected within a strict-mode tree.' + '\n\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here: https://reactjs.org/link/legacy-context', sortedNames);
12980        } finally {
12981          resetCurrentFiber();
12982        }
12983      });
12984    };
12985
12986    ReactStrictModeWarnings.discardPendingWarnings = function () {
12987      pendingComponentWillMountWarnings = [];
12988      pendingUNSAFE_ComponentWillMountWarnings = [];
12989      pendingComponentWillReceivePropsWarnings = [];
12990      pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
12991      pendingComponentWillUpdateWarnings = [];
12992      pendingUNSAFE_ComponentWillUpdateWarnings = [];
12993      pendingLegacyContextWarning = new Map();
12994    };
12995  }
12996
12997  var didWarnAboutMaps;
12998  var didWarnAboutGenerators;
12999  var didWarnAboutStringRefs;
13000  var ownerHasKeyUseWarning;
13001  var ownerHasFunctionTypeWarning;
13002
13003  var warnForMissingKey = function (child, returnFiber) {};
13004
13005  {
13006    didWarnAboutMaps = false;
13007    didWarnAboutGenerators = false;
13008    didWarnAboutStringRefs = {};
13009    /**
13010     * Warn if there's no key explicitly set on dynamic arrays of children or
13011     * object keys are not valid. This allows us to keep track of children between
13012     * updates.
13013     */
13014
13015    ownerHasKeyUseWarning = {};
13016    ownerHasFunctionTypeWarning = {};
13017
13018    warnForMissingKey = function (child, returnFiber) {
13019      if (child === null || typeof child !== 'object') {
13020        return;
13021      }
13022
13023      if (!child._store || child._store.validated || child.key != null) {
13024        return;
13025      }
13026
13027      if (typeof child._store !== 'object') {
13028        throw new Error('React Component in warnForMissingKey should have a _store. ' + 'This error is likely caused by a bug in React. Please file an issue.');
13029      }
13030
13031      child._store.validated = true;
13032      var componentName = getComponentNameFromFiber(returnFiber) || 'Component';
13033
13034      if (ownerHasKeyUseWarning[componentName]) {
13035        return;
13036      }
13037
13038      ownerHasKeyUseWarning[componentName] = true;
13039
13040      error('Each child in a list should have a unique ' + '"key" prop. See https://reactjs.org/link/warning-keys for ' + 'more information.');
13041    };
13042  }
13043
13044  function isReactClass(type) {
13045    return type.prototype && type.prototype.isReactComponent;
13046  }
13047
13048  function coerceRef(returnFiber, current, element) {
13049    var mixedRef = element.ref;
13050
13051    if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {
13052      {
13053        // TODO: Clean this up once we turn on the string ref warning for
13054        // everyone, because the strict mode case will no longer be relevant
13055        if ((returnFiber.mode & StrictLegacyMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs
13056        // because these cannot be automatically converted to an arrow function
13057        // using a codemod. Therefore, we don't have to warn about string refs again.
13058        !(element._owner && element._self && element._owner.stateNode !== element._self) && // Will already throw with "Function components cannot have string refs"
13059        !(element._owner && element._owner.tag !== ClassComponent) && // Will already warn with "Function components cannot be given refs"
13060        !(typeof element.type === 'function' && !isReactClass(element.type)) && // Will already throw with "Element ref was specified as a string (someStringRef) but no owner was set"
13061        element._owner) {
13062          var componentName = getComponentNameFromFiber(returnFiber) || 'Component';
13063
13064          if (!didWarnAboutStringRefs[componentName]) {
13065            {
13066              error('Component "%s" contains the string ref "%s". Support for string refs ' + 'will be removed in a future major release. We recommend using ' + 'useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, mixedRef);
13067            }
13068
13069            didWarnAboutStringRefs[componentName] = true;
13070          }
13071        }
13072      }
13073
13074      if (element._owner) {
13075        var owner = element._owner;
13076        var inst;
13077
13078        if (owner) {
13079          var ownerFiber = owner;
13080
13081          if (ownerFiber.tag !== ClassComponent) {
13082            throw new Error('Function components cannot have string refs. ' + 'We recommend using useRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref');
13083          }
13084
13085          inst = ownerFiber.stateNode;
13086        }
13087
13088        if (!inst) {
13089          throw new Error("Missing owner for string ref " + mixedRef + ". This error is likely caused by a " + 'bug in React. Please file an issue.');
13090        } // Assigning this to a const so Flow knows it won't change in the closure
13091
13092
13093        var resolvedInst = inst;
13094
13095        {
13096          checkPropStringCoercion(mixedRef, 'ref');
13097        }
13098
13099        var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref
13100
13101        if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) {
13102          return current.ref;
13103        }
13104
13105        var ref = function (value) {
13106          var refs = resolvedInst.refs;
13107
13108          if (value === null) {
13109            delete refs[stringRef];
13110          } else {
13111            refs[stringRef] = value;
13112          }
13113        };
13114
13115        ref._stringRef = stringRef;
13116        return ref;
13117      } else {
13118        if (typeof mixedRef !== 'string') {
13119          throw new Error('Expected ref to be a function, a string, an object returned by React.createRef(), or null.');
13120        }
13121
13122        if (!element._owner) {
13123          throw new Error("Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of" + ' the following reasons:\n' + '1. You may be adding a ref to a function component\n' + "2. You may be adding a ref to a component that was not created inside a component's render method\n" + '3. You have multiple copies of React loaded\n' + 'See https://reactjs.org/link/refs-must-have-owner for more information.');
13124        }
13125      }
13126    }
13127
13128    return mixedRef;
13129  }
13130
13131  function throwOnInvalidObjectType(returnFiber, newChild) {
13132    var childString = Object.prototype.toString.call(newChild);
13133    throw new Error("Objects are not valid as a React child (found: " + (childString === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : childString) + "). " + 'If you meant to render a collection of children, use an array ' + 'instead.');
13134  }
13135
13136  function warnOnFunctionType(returnFiber) {
13137    {
13138      var componentName = getComponentNameFromFiber(returnFiber) || 'Component';
13139
13140      if (ownerHasFunctionTypeWarning[componentName]) {
13141        return;
13142      }
13143
13144      ownerHasFunctionTypeWarning[componentName] = true;
13145
13146      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.');
13147    }
13148  }
13149
13150  function resolveLazy(lazyType) {
13151    var payload = lazyType._payload;
13152    var init = lazyType._init;
13153    return init(payload);
13154  } // This wrapper function exists because I expect to clone the code in each path
13155  // to be able to optimize each path individually by branching early. This needs
13156  // a compiler or we can do it manually. Helpers that don't need this branching
13157  // live outside of this function.
13158
13159
13160  function ChildReconciler(shouldTrackSideEffects) {
13161    function deleteChild(returnFiber, childToDelete) {
13162      if (!shouldTrackSideEffects) {
13163        // Noop.
13164        return;
13165      }
13166
13167      var deletions = returnFiber.deletions;
13168
13169      if (deletions === null) {
13170        returnFiber.deletions = [childToDelete];
13171        returnFiber.flags |= ChildDeletion;
13172      } else {
vendor: 12,333 bytes, lines 13173-13545
13173        deletions.push(childToDelete);
13174      }
13175    }
13176
13177    function deleteRemainingChildren(returnFiber, currentFirstChild) {
13178      if (!shouldTrackSideEffects) {
13179        // Noop.
13180        return null;
13181      } // TODO: For the shouldClone case, this could be micro-optimized a bit by
13182      // assuming that after the first child we've already added everything.
13183
13184
13185      var childToDelete = currentFirstChild;
13186
13187      while (childToDelete !== null) {
13188        deleteChild(returnFiber, childToDelete);
13189        childToDelete = childToDelete.sibling;
13190      }
13191
13192      return null;
13193    }
13194
13195    function mapRemainingChildren(returnFiber, currentFirstChild) {
13196      // Add the remaining children to a temporary map so that we can find them by
13197      // keys quickly. Implicit (null) keys get added to this set with their index
13198      // instead.
13199      var existingChildren = new Map();
13200      var existingChild = currentFirstChild;
13201
13202      while (existingChild !== null) {
13203        if (existingChild.key !== null) {
13204          existingChildren.set(existingChild.key, existingChild);
13205        } else {
13206          existingChildren.set(existingChild.index, existingChild);
13207        }
13208
13209        existingChild = existingChild.sibling;
13210      }
13211
13212      return existingChildren;
13213    }
13214
13215    function useFiber(fiber, pendingProps) {
13216      // We currently set sibling to null and index to 0 here because it is easy
13217      // to forget to do before returning it. E.g. for the single child case.
13218      var clone = createWorkInProgress(fiber, pendingProps);
13219      clone.index = 0;
13220      clone.sibling = null;
13221      return clone;
13222    }
13223
13224    function placeChild(newFiber, lastPlacedIndex, newIndex) {
13225      newFiber.index = newIndex;
13226
13227      if (!shouldTrackSideEffects) {
13228        // During hydration, the useId algorithm needs to know which fibers are
13229        // part of a list of children (arrays, iterators).
13230        newFiber.flags |= Forked;
13231        return lastPlacedIndex;
13232      }
13233
13234      var current = newFiber.alternate;
13235
13236      if (current !== null) {
13237        var oldIndex = current.index;
13238
13239        if (oldIndex < lastPlacedIndex) {
13240          // This is a move.
13241          newFiber.flags |= Placement;
13242          return lastPlacedIndex;
13243        } else {
13244          // This item can stay in place.
13245          return oldIndex;
13246        }
13247      } else {
13248        // This is an insertion.
13249        newFiber.flags |= Placement;
13250        return lastPlacedIndex;
13251      }
13252    }
13253
13254    function placeSingleChild(newFiber) {
13255      // This is simpler for the single child case. We only need to do a
13256      // placement for inserting new children.
13257      if (shouldTrackSideEffects && newFiber.alternate === null) {
13258        newFiber.flags |= Placement;
13259      }
13260
13261      return newFiber;
13262    }
13263
13264    function updateTextNode(returnFiber, current, textContent, lanes) {
13265      if (current === null || current.tag !== HostText) {
13266        // Insert
13267        var created = createFiberFromText(textContent, returnFiber.mode, lanes);
13268        created.return = returnFiber;
13269        return created;
13270      } else {
13271        // Update
13272        var existing = useFiber(current, textContent);
13273        existing.return = returnFiber;
13274        return existing;
13275      }
13276    }
13277
13278    function updateElement(returnFiber, current, element, lanes) {
13279      var elementType = element.type;
13280
13281      if (elementType === REACT_FRAGMENT_TYPE) {
13282        return updateFragment(returnFiber, current, element.props.children, lanes, element.key);
13283      }
13284
13285      if (current !== null) {
13286        if (current.elementType === elementType || ( // Keep this check inline so it only runs on the false path:
13287         isCompatibleFamilyForHotReloading(current, element) ) || // Lazy types should reconcile their resolved type.
13288        // We need to do this after the Hot Reloading check above,
13289        // because hot reloading has different semantics than prod because
13290        // it doesn't resuspend. So we can't let the call below suspend.
13291        typeof elementType === 'object' && elementType !== null && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === current.type) {
13292          // Move based on index
13293          var existing = useFiber(current, element.props);
13294          existing.ref = coerceRef(returnFiber, current, element);
13295          existing.return = returnFiber;
13296
13297          {
13298            existing._debugSource = element._source;
13299            existing._debugOwner = element._owner;
13300          }
13301
13302          return existing;
13303        }
13304      } // Insert
13305
13306
13307      var created = createFiberFromElement(element, returnFiber.mode, lanes);
13308      created.ref = coerceRef(returnFiber, current, element);
13309      created.return = returnFiber;
13310      return created;
13311    }
13312
13313    function updatePortal(returnFiber, current, portal, lanes) {
13314      if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {
13315        // Insert
13316        var created = createFiberFromPortal(portal, returnFiber.mode, lanes);
13317        created.return = returnFiber;
13318        return created;
13319      } else {
13320        // Update
13321        var existing = useFiber(current, portal.children || []);
13322        existing.return = returnFiber;
13323        return existing;
13324      }
13325    }
13326
13327    function updateFragment(returnFiber, current, fragment, lanes, key) {
13328      if (current === null || current.tag !== Fragment) {
13329        // Insert
13330        var created = createFiberFromFragment(fragment, returnFiber.mode, lanes, key);
13331        created.return = returnFiber;
13332        return created;
13333      } else {
13334        // Update
13335        var existing = useFiber(current, fragment);
13336        existing.return = returnFiber;
13337        return existing;
13338      }
13339    }
13340
13341    function createChild(returnFiber, newChild, lanes) {
13342      if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
13343        // Text nodes don't have keys. If the previous node is implicitly keyed
13344        // we can continue to replace it without aborting even if it is not a text
13345        // node.
13346        var created = createFiberFromText('' + newChild, returnFiber.mode, lanes);
13347        created.return = returnFiber;
13348        return created;
13349      }
13350
13351      if (typeof newChild === 'object' && newChild !== null) {
13352        switch (newChild.$$typeof) {
13353          case REACT_ELEMENT_TYPE:
13354            {
13355              var _created = createFiberFromElement(newChild, returnFiber.mode, lanes);
13356
13357              _created.ref = coerceRef(returnFiber, null, newChild);
13358              _created.return = returnFiber;
13359              return _created;
13360            }
13361
13362          case REACT_PORTAL_TYPE:
13363            {
13364              var _created2 = createFiberFromPortal(newChild, returnFiber.mode, lanes);
13365
13366              _created2.return = returnFiber;
13367              return _created2;
13368            }
13369
13370          case REACT_LAZY_TYPE:
13371            {
13372              var payload = newChild._payload;
13373              var init = newChild._init;
13374              return createChild(returnFiber, init(payload), lanes);
13375            }
13376        }
13377
13378        if (isArray(newChild) || getIteratorFn(newChild)) {
13379          var _created3 = createFiberFromFragment(newChild, returnFiber.mode, lanes, null);
13380
13381          _created3.return = returnFiber;
13382          return _created3;
13383        }
13384
13385        throwOnInvalidObjectType(returnFiber, newChild);
13386      }
13387
13388      {
13389        if (typeof newChild === 'function') {
13390          warnOnFunctionType(returnFiber);
13391        }
13392      }
13393
13394      return null;
13395    }
13396
13397    function updateSlot(returnFiber, oldFiber, newChild, lanes) {
13398      // Update the fiber if the keys match, otherwise return null.
13399      var key = oldFiber !== null ? oldFiber.key : null;
13400
13401      if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
13402        // Text nodes don't have keys. If the previous node is implicitly keyed
13403        // we can continue to replace it without aborting even if it is not a text
13404        // node.
13405        if (key !== null) {
13406          return null;
13407        }
13408
13409        return updateTextNode(returnFiber, oldFiber, '' + newChild, lanes);
13410      }
13411
13412      if (typeof newChild === 'object' && newChild !== null) {
13413        switch (newChild.$$typeof) {
13414          case REACT_ELEMENT_TYPE:
13415            {
13416              if (newChild.key === key) {
13417                return updateElement(returnFiber, oldFiber, newChild, lanes);
13418              } else {
13419                return null;
13420              }
13421            }
13422
13423          case REACT_PORTAL_TYPE:
13424            {
13425              if (newChild.key === key) {
13426                return updatePortal(returnFiber, oldFiber, newChild, lanes);
13427              } else {
13428                return null;
13429              }
13430            }
13431
13432          case REACT_LAZY_TYPE:
13433            {
13434              var payload = newChild._payload;
13435              var init = newChild._init;
13436              return updateSlot(returnFiber, oldFiber, init(payload), lanes);
13437            }
13438        }
13439
13440        if (isArray(newChild) || getIteratorFn(newChild)) {
13441          if (key !== null) {
13442            return null;
13443          }
13444
13445          return updateFragment(returnFiber, oldFiber, newChild, lanes, null);
13446        }
13447
13448        throwOnInvalidObjectType(returnFiber, newChild);
13449      }
13450
13451      {
13452        if (typeof newChild === 'function') {
13453          warnOnFunctionType(returnFiber);
13454        }
13455      }
13456
13457      return null;
13458    }
13459
13460    function updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes) {
13461      if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
13462        // Text nodes don't have keys, so we neither have to check the old nor
13463        // new node for the key. If both are text nodes, they match.
13464        var matchedFiber = existingChildren.get(newIdx) || null;
13465        return updateTextNode(returnFiber, matchedFiber, '' + newChild, lanes);
13466      }
13467
13468      if (typeof newChild === 'object' && newChild !== null) {
13469        switch (newChild.$$typeof) {
13470          case REACT_ELEMENT_TYPE:
13471            {
13472              var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
13473
13474              return updateElement(returnFiber, _matchedFiber, newChild, lanes);
13475            }
13476
13477          case REACT_PORTAL_TYPE:
13478            {
13479              var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
13480
13481              return updatePortal(returnFiber, _matchedFiber2, newChild, lanes);
13482            }
13483
13484          case REACT_LAZY_TYPE:
13485            var payload = newChild._payload;
13486            var init = newChild._init;
13487            return updateFromMap(existingChildren, returnFiber, newIdx, init(payload), lanes);
13488        }
13489
13490        if (isArray(newChild) || getIteratorFn(newChild)) {
13491          var _matchedFiber3 = existingChildren.get(newIdx) || null;
13492
13493          return updateFragment(returnFiber, _matchedFiber3, newChild, lanes, null);
13494        }
13495
13496        throwOnInvalidObjectType(returnFiber, newChild);
13497      }
13498
13499      {
13500        if (typeof newChild === 'function') {
13501          warnOnFunctionType(returnFiber);
13502        }
13503      }
13504
13505      return null;
13506    }
13507    /**
13508     * Warns if there is a duplicate or missing key
13509     */
13510
13511
13512    function warnOnInvalidKey(child, knownKeys, returnFiber) {
13513      {
13514        if (typeof child !== 'object' || child === null) {
13515          return knownKeys;
13516        }
13517
13518        switch (child.$$typeof) {
13519          case REACT_ELEMENT_TYPE:
13520          case REACT_PORTAL_TYPE:
13521            warnForMissingKey(child, returnFiber);
13522            var key = child.key;
13523
13524            if (typeof key !== 'string') {
13525              break;
13526            }
13527
13528            if (knownKeys === null) {
13529              knownKeys = new Set();
13530              knownKeys.add(key);
13531              break;
13532            }
13533
13534            if (!knownKeys.has(key)) {
13535              knownKeys.add(key);
13536              break;
13537            }
13538
13539            error('Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key);
13540
13541            break;
13542
13543          case REACT_LAZY_TYPE:
13544            var payload = child._payload;
13545            var init = child._init;
13546            warnOnInvalidKey(init(payload), knownKeys, returnFiber);
13547            break;
13548        }
13549      }
13550
13551      return knownKeys;
13552    }
13553
13554    function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, lanes) {
13555      // This algorithm can't optimize by searching from both ends since we
13556      // don't have backpointers on fibers. I'm trying to see how far we can get
13557      // with that model. If it ends up not being worth the tradeoffs, we can
13558      // add it later.
13559      // Even with a two ended optimization, we'd want to optimize for the case
13560      // where there are few changes and brute force the comparison instead of
13561      // going for the Map. It'd like to explore hitting that path first in
13562      // forward-only mode and only go for the Map once we notice that we need
13563      // lots of look ahead. This doesn't handle reversal as well as two ended
13564      // search but that's unusual. Besides, for the two ended optimization to
13565      // work on Iterables, we'd need to copy the whole set.
13566      // In this first iteration, we'll just live with hitting the bad case
13567      // (adding everything to a Map) in for every insert/move.
13568      // If you change this code, also update reconcileChildrenIterator() which
13569      // uses the same algorithm.
13570      {
13571        // First, validate keys.
13572        var knownKeys = null;
13573
13574        for (var i = 0; i < newChildren.length; i++) {
13575          var child = newChildren[i];
vendor: 4,611 bytes, lines 13576-13707
13576          knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber);
13577        }
13578      }
13579
13580      var resultingFirstChild = null;
13581      var previousNewFiber = null;
13582      var oldFiber = currentFirstChild;
13583      var lastPlacedIndex = 0;
13584      var newIdx = 0;
13585      var nextOldFiber = null;
13586
13587      for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
13588        if (oldFiber.index > newIdx) {
13589          nextOldFiber = oldFiber;
13590          oldFiber = null;
13591        } else {
13592          nextOldFiber = oldFiber.sibling;
13593        }
13594
13595        var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], lanes);
13596
13597        if (newFiber === null) {
13598          // TODO: This breaks on empty slots like null children. That's
13599          // unfortunate because it triggers the slow path all the time. We need
13600          // a better way to communicate whether this was a miss or null,
13601          // boolean, undefined, etc.
13602          if (oldFiber === null) {
13603            oldFiber = nextOldFiber;
13604          }
13605
13606          break;
13607        }
13608
13609        if (shouldTrackSideEffects) {
13610          if (oldFiber && newFiber.alternate === null) {
13611            // We matched the slot, but we didn't reuse the existing fiber, so we
13612            // need to delete the existing child.
13613            deleteChild(returnFiber, oldFiber);
13614          }
13615        }
13616
13617        lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
13618
13619        if (previousNewFiber === null) {
13620          // TODO: Move out of the loop. This only happens for the first run.
13621          resultingFirstChild = newFiber;
13622        } else {
13623          // TODO: Defer siblings if we're not at the right index for this slot.
13624          // I.e. if we had null values before, then we want to defer this
13625          // for each null value. However, we also don't want to call updateSlot
13626          // with the previous one.
13627          previousNewFiber.sibling = newFiber;
13628        }
13629
13630        previousNewFiber = newFiber;
13631        oldFiber = nextOldFiber;
13632      }
13633
13634      if (newIdx === newChildren.length) {
13635        // We've reached the end of the new children. We can delete the rest.
13636        deleteRemainingChildren(returnFiber, oldFiber);
13637
13638        if (getIsHydrating()) {
13639          var numberOfForks = newIdx;
13640          pushTreeFork(returnFiber, numberOfForks);
13641        }
13642
13643        return resultingFirstChild;
13644      }
13645
13646      if (oldFiber === null) {
13647        // If we don't have any more existing children we can choose a fast path
13648        // since the rest will all be insertions.
13649        for (; newIdx < newChildren.length; newIdx++) {
13650          var _newFiber = createChild(returnFiber, newChildren[newIdx], lanes);
13651
13652          if (_newFiber === null) {
13653            continue;
13654          }
13655
13656          lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);
13657
13658          if (previousNewFiber === null) {
13659            // TODO: Move out of the loop. This only happens for the first run.
13660            resultingFirstChild = _newFiber;
13661          } else {
13662            previousNewFiber.sibling = _newFiber;
13663          }
13664
13665          previousNewFiber = _newFiber;
13666        }
13667
13668        if (getIsHydrating()) {
13669          var _numberOfForks = newIdx;
13670          pushTreeFork(returnFiber, _numberOfForks);
13671        }
13672
13673        return resultingFirstChild;
13674      } // Add all children to a key map for quick lookups.
13675
13676
13677      var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.
13678
13679      for (; newIdx < newChildren.length; newIdx++) {
13680        var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], lanes);
13681
13682        if (_newFiber2 !== null) {
13683          if (shouldTrackSideEffects) {
13684            if (_newFiber2.alternate !== null) {
13685              // The new fiber is a work in progress, but if there exists a
13686              // current, that means that we reused the fiber. We need to delete
13687              // it from the child list so that we don't add it to the deletion
13688              // list.
13689              existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);
13690            }
13691          }
13692
13693          lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);
13694
13695          if (previousNewFiber === null) {
13696            resultingFirstChild = _newFiber2;
13697          } else {
13698            previousNewFiber.sibling = _newFiber2;
13699          }
13700
13701          previousNewFiber = _newFiber2;
13702        }
13703      }
13704
13705      if (shouldTrackSideEffects) {
13706        // Any existing children that weren't consumed above were deleted. We need
13707        // to add them to the deletion list.
13708        existingChildren.forEach(function (child) {
13709          return deleteChild(returnFiber, child);
13710        });
13711      }
13712
13713      if (getIsHydrating()) {
13714        var _numberOfForks2 = newIdx;
13715        pushTreeFork(returnFiber, _numberOfForks2);
13716      }
13717
13718      return resultingFirstChild;
13719    }
13720
13721    function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, lanes) {
13722      // This is the same implementation as reconcileChildrenArray(),
13723      // but using the iterator instead.
13724      var iteratorFn = getIteratorFn(newChildrenIterable);
13725
13726      if (typeof iteratorFn !== 'function') {
13727        throw new Error('An object is not an iterable. This error is likely caused by a bug in ' + 'React. Please file an issue.');
13728      }
13729
13730      {
13731        // We don't support rendering Generators because it's a mutation.
13732        // See https://github.com/facebook/react/issues/12995
13733        if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag
13734        newChildrenIterable[Symbol.toStringTag] === 'Generator') {
13735          if (!didWarnAboutGenerators) {
13736            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.');
13737          }
13738
13739          didWarnAboutGenerators = true;
13740        } // Warn about using Maps as children
13741
13742
13743        if (newChildrenIterable.entries === iteratorFn) {
13744          if (!didWarnAboutMaps) {
13745            error('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.');
13746          }
13747
13748          didWarnAboutMaps = true;
13749        } // First, validate keys.
13750        // We'll get a different iterator later for the main pass.
13751
13752
13753        var _newChildren = iteratorFn.call(newChildrenIterable);
13754
13755        if (_newChildren) {
13756          var knownKeys = null;
13757
13758          var _step = _newChildren.next();
13759
13760          for (; !_step.done; _step = _newChildren.next()) {
13761            var child = _step.value;
vendor: 21,672 bytes, lines 13762-14376
13762            knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber);
13763          }
13764        }
13765      }
13766
13767      var newChildren = iteratorFn.call(newChildrenIterable);
13768
13769      if (newChildren == null) {
13770        throw new Error('An iterable object provided no iterator.');
13771      }
13772
13773      var resultingFirstChild = null;
13774      var previousNewFiber = null;
13775      var oldFiber = currentFirstChild;
13776      var lastPlacedIndex = 0;
13777      var newIdx = 0;
13778      var nextOldFiber = null;
13779      var step = newChildren.next();
13780
13781      for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {
13782        if (oldFiber.index > newIdx) {
13783          nextOldFiber = oldFiber;
13784          oldFiber = null;
13785        } else {
13786          nextOldFiber = oldFiber.sibling;
13787        }
13788
13789        var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);
13790
13791        if (newFiber === null) {
13792          // TODO: This breaks on empty slots like null children. That's
13793          // unfortunate because it triggers the slow path all the time. We need
13794          // a better way to communicate whether this was a miss or null,
13795          // boolean, undefined, etc.
13796          if (oldFiber === null) {
13797            oldFiber = nextOldFiber;
13798          }
13799
13800          break;
13801        }
13802
13803        if (shouldTrackSideEffects) {
13804          if (oldFiber && newFiber.alternate === null) {
13805            // We matched the slot, but we didn't reuse the existing fiber, so we
13806            // need to delete the existing child.
13807            deleteChild(returnFiber, oldFiber);
13808          }
13809        }
13810
13811        lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
13812
13813        if (previousNewFiber === null) {
13814          // TODO: Move out of the loop. This only happens for the first run.
13815          resultingFirstChild = newFiber;
13816        } else {
13817          // TODO: Defer siblings if we're not at the right index for this slot.
13818          // I.e. if we had null values before, then we want to defer this
13819          // for each null value. However, we also don't want to call updateSlot
13820          // with the previous one.
13821          previousNewFiber.sibling = newFiber;
13822        }
13823
13824        previousNewFiber = newFiber;
13825        oldFiber = nextOldFiber;
13826      }
13827
13828      if (step.done) {
13829        // We've reached the end of the new children. We can delete the rest.
13830        deleteRemainingChildren(returnFiber, oldFiber);
13831
13832        if (getIsHydrating()) {
13833          var numberOfForks = newIdx;
13834          pushTreeFork(returnFiber, numberOfForks);
13835        }
13836
13837        return resultingFirstChild;
13838      }
13839
13840      if (oldFiber === null) {
13841        // If we don't have any more existing children we can choose a fast path
13842        // since the rest will all be insertions.
13843        for (; !step.done; newIdx++, step = newChildren.next()) {
13844          var _newFiber3 = createChild(returnFiber, step.value, lanes);
13845
13846          if (_newFiber3 === null) {
13847            continue;
13848          }
13849
13850          lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);
13851
13852          if (previousNewFiber === null) {
13853            // TODO: Move out of the loop. This only happens for the first run.
13854            resultingFirstChild = _newFiber3;
13855          } else {
13856            previousNewFiber.sibling = _newFiber3;
13857          }
13858
13859          previousNewFiber = _newFiber3;
13860        }
13861
13862        if (getIsHydrating()) {
13863          var _numberOfForks3 = newIdx;
13864          pushTreeFork(returnFiber, _numberOfForks3);
13865        }
13866
13867        return resultingFirstChild;
13868      } // Add all children to a key map for quick lookups.
13869
13870
13871      var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.
13872
13873      for (; !step.done; newIdx++, step = newChildren.next()) {
13874        var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, lanes);
13875
13876        if (_newFiber4 !== null) {
13877          if (shouldTrackSideEffects) {
13878            if (_newFiber4.alternate !== null) {
13879              // The new fiber is a work in progress, but if there exists a
13880              // current, that means that we reused the fiber. We need to delete
13881              // it from the child list so that we don't add it to the deletion
13882              // list.
13883              existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);
13884            }
13885          }
13886
13887          lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);
13888
13889          if (previousNewFiber === null) {
13890            resultingFirstChild = _newFiber4;
13891          } else {
13892            previousNewFiber.sibling = _newFiber4;
13893          }
13894
13895          previousNewFiber = _newFiber4;
13896        }
13897      }
13898
13899      if (shouldTrackSideEffects) {
13900        // Any existing children that weren't consumed above were deleted. We need
13901        // to add them to the deletion list.
13902        existingChildren.forEach(function (child) {
13903          return deleteChild(returnFiber, child);
13904        });
13905      }
13906
13907      if (getIsHydrating()) {
13908        var _numberOfForks4 = newIdx;
13909        pushTreeFork(returnFiber, _numberOfForks4);
13910      }
13911
13912      return resultingFirstChild;
13913    }
13914
13915    function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, lanes) {
13916      // There's no need to check for keys on text nodes since we don't have a
13917      // way to define them.
13918      if (currentFirstChild !== null && currentFirstChild.tag === HostText) {
13919        // We already have an existing node so let's just update it and delete
13920        // the rest.
13921        deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
13922        var existing = useFiber(currentFirstChild, textContent);
13923        existing.return = returnFiber;
13924        return existing;
13925      } // The existing first child is not a text node so we need to create one
13926      // and delete the existing ones.
13927
13928
13929      deleteRemainingChildren(returnFiber, currentFirstChild);
13930      var created = createFiberFromText(textContent, returnFiber.mode, lanes);
13931      created.return = returnFiber;
13932      return created;
13933    }
13934
13935    function reconcileSingleElement(returnFiber, currentFirstChild, element, lanes) {
13936      var key = element.key;
13937      var child = currentFirstChild;
13938
13939      while (child !== null) {
13940        // TODO: If key === null and child.key === null, then this only applies to
13941        // the first item in the list.
13942        if (child.key === key) {
13943          var elementType = element.type;
13944
13945          if (elementType === REACT_FRAGMENT_TYPE) {
13946            if (child.tag === Fragment) {
13947              deleteRemainingChildren(returnFiber, child.sibling);
13948              var existing = useFiber(child, element.props.children);
13949              existing.return = returnFiber;
13950
13951              {
13952                existing._debugSource = element._source;
13953                existing._debugOwner = element._owner;
13954              }
13955
13956              return existing;
13957            }
13958          } else {
13959            if (child.elementType === elementType || ( // Keep this check inline so it only runs on the false path:
13960             isCompatibleFamilyForHotReloading(child, element) ) || // Lazy types should reconcile their resolved type.
13961            // We need to do this after the Hot Reloading check above,
13962            // because hot reloading has different semantics than prod because
13963            // it doesn't resuspend. So we can't let the call below suspend.
13964            typeof elementType === 'object' && elementType !== null && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === child.type) {
13965              deleteRemainingChildren(returnFiber, child.sibling);
13966
13967              var _existing = useFiber(child, element.props);
13968
13969              _existing.ref = coerceRef(returnFiber, child, element);
13970              _existing.return = returnFiber;
13971
13972              {
13973                _existing._debugSource = element._source;
13974                _existing._debugOwner = element._owner;
13975              }
13976
13977              return _existing;
13978            }
13979          } // Didn't match.
13980
13981
13982          deleteRemainingChildren(returnFiber, child);
13983          break;
13984        } else {
13985          deleteChild(returnFiber, child);
13986        }
13987
13988        child = child.sibling;
13989      }
13990
13991      if (element.type === REACT_FRAGMENT_TYPE) {
13992        var created = createFiberFromFragment(element.props.children, returnFiber.mode, lanes, element.key);
13993        created.return = returnFiber;
13994        return created;
13995      } else {
13996        var _created4 = createFiberFromElement(element, returnFiber.mode, lanes);
13997
13998        _created4.ref = coerceRef(returnFiber, currentFirstChild, element);
13999        _created4.return = returnFiber;
14000        return _created4;
14001      }
14002    }
14003
14004    function reconcileSinglePortal(returnFiber, currentFirstChild, portal, lanes) {
14005      var key = portal.key;
14006      var child = currentFirstChild;
14007
14008      while (child !== null) {
14009        // TODO: If key === null and child.key === null, then this only applies to
14010        // the first item in the list.
14011        if (child.key === key) {
14012          if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
14013            deleteRemainingChildren(returnFiber, child.sibling);
14014            var existing = useFiber(child, portal.children || []);
14015            existing.return = returnFiber;
14016            return existing;
14017          } else {
14018            deleteRemainingChildren(returnFiber, child);
14019            break;
14020          }
14021        } else {
14022          deleteChild(returnFiber, child);
14023        }
14024
14025        child = child.sibling;
14026      }
14027
14028      var created = createFiberFromPortal(portal, returnFiber.mode, lanes);
14029      created.return = returnFiber;
14030      return created;
14031    } // This API will tag the children with the side-effect of the reconciliation
14032    // itself. They will be added to the side-effect list as we pass through the
14033    // children and the parent.
14034
14035
14036    function reconcileChildFibers(returnFiber, currentFirstChild, newChild, lanes) {
14037      // This function is not recursive.
14038      // If the top level item is an array, we treat it as a set of children,
14039      // not as a fragment. Nested arrays on the other hand will be treated as
14040      // fragment nodes. Recursion happens at the normal flow.
14041      // Handle top level unkeyed fragments as if they were arrays.
14042      // This leads to an ambiguity between <>{[...]}</> and <>...</>.
14043      // We treat the ambiguous cases above the same.
14044      var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;
14045
14046      if (isUnkeyedTopLevelFragment) {
14047        newChild = newChild.props.children;
14048      } // Handle object types
14049
14050
14051      if (typeof newChild === 'object' && newChild !== null) {
14052        switch (newChild.$$typeof) {
14053          case REACT_ELEMENT_TYPE:
14054            return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, lanes));
14055
14056          case REACT_PORTAL_TYPE:
14057            return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, lanes));
14058
14059          case REACT_LAZY_TYPE:
14060            var payload = newChild._payload;
14061            var init = newChild._init; // TODO: This function is supposed to be non-recursive.
14062
14063            return reconcileChildFibers(returnFiber, currentFirstChild, init(payload), lanes);
14064        }
14065
14066        if (isArray(newChild)) {
14067          return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, lanes);
14068        }
14069
14070        if (getIteratorFn(newChild)) {
14071          return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, lanes);
14072        }
14073
14074        throwOnInvalidObjectType(returnFiber, newChild);
14075      }
14076
14077      if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
14078        return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, lanes));
14079      }
14080
14081      {
14082        if (typeof newChild === 'function') {
14083          warnOnFunctionType(returnFiber);
14084        }
14085      } // Remaining cases are all treated as empty.
14086
14087
14088      return deleteRemainingChildren(returnFiber, currentFirstChild);
14089    }
14090
14091    return reconcileChildFibers;
14092  }
14093
14094  var reconcileChildFibers = ChildReconciler(true);
14095  var mountChildFibers = ChildReconciler(false);
14096  function cloneChildFibers(current, workInProgress) {
14097    if (current !== null && workInProgress.child !== current.child) {
14098      throw new Error('Resuming work not yet implemented.');
14099    }
14100
14101    if (workInProgress.child === null) {
14102      return;
14103    }
14104
14105    var currentChild = workInProgress.child;
14106    var newChild = createWorkInProgress(currentChild, currentChild.pendingProps);
14107    workInProgress.child = newChild;
14108    newChild.return = workInProgress;
14109
14110    while (currentChild.sibling !== null) {
14111      currentChild = currentChild.sibling;
14112      newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps);
14113      newChild.return = workInProgress;
14114    }
14115
14116    newChild.sibling = null;
14117  } // Reset a workInProgress child set to prepare it for a second pass.
14118
14119  function resetChildFibers(workInProgress, lanes) {
14120    var child = workInProgress.child;
14121
14122    while (child !== null) {
14123      resetWorkInProgress(child, lanes);
14124      child = child.sibling;
14125    }
14126  }
14127
14128  var valueCursor = createCursor(null);
14129  var rendererSigil;
14130
14131  {
14132    // Use this to detect multiple renderers using the same context
14133    rendererSigil = {};
14134  }
14135
14136  var currentlyRenderingFiber = null;
14137  var lastContextDependency = null;
14138  var lastFullyObservedContext = null;
14139  var isDisallowedContextReadInDEV = false;
14140  function resetContextDependencies() {
14141    // This is called right before React yields execution, to ensure `readContext`
14142    // cannot be called outside the render phase.
14143    currentlyRenderingFiber = null;
14144    lastContextDependency = null;
14145    lastFullyObservedContext = null;
14146
14147    {
14148      isDisallowedContextReadInDEV = false;
14149    }
14150  }
14151  function enterDisallowedContextReadInDEV() {
14152    {
14153      isDisallowedContextReadInDEV = true;
14154    }
14155  }
14156  function exitDisallowedContextReadInDEV() {
14157    {
14158      isDisallowedContextReadInDEV = false;
14159    }
14160  }
14161  function pushProvider(providerFiber, context, nextValue) {
14162    {
14163      push(valueCursor, context._currentValue, providerFiber);
14164      context._currentValue = nextValue;
14165
14166      {
14167        if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {
14168          error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');
14169        }
14170
14171        context._currentRenderer = rendererSigil;
14172      }
14173    }
14174  }
14175  function popProvider(context, providerFiber) {
14176    var currentValue = valueCursor.current;
14177    pop(valueCursor, providerFiber);
14178
14179    {
14180      {
14181        context._currentValue = currentValue;
14182      }
14183    }
14184  }
14185  function scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) {
14186    // Update the child lanes of all the ancestors, including the alternates.
14187    var node = parent;
14188
14189    while (node !== null) {
14190      var alternate = node.alternate;
14191
14192      if (!isSubsetOfLanes(node.childLanes, renderLanes)) {
14193        node.childLanes = mergeLanes(node.childLanes, renderLanes);
14194
14195        if (alternate !== null) {
14196          alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes);
14197        }
14198      } else if (alternate !== null && !isSubsetOfLanes(alternate.childLanes, renderLanes)) {
14199        alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes);
14200      }
14201
14202      if (node === propagationRoot) {
14203        break;
14204      }
14205
14206      node = node.return;
14207    }
14208
14209    {
14210      if (node !== propagationRoot) {
14211        error('Expected to find the propagation root when scheduling context work. ' + 'This error is likely caused by a bug in React. Please file an issue.');
14212      }
14213    }
14214  }
14215  function propagateContextChange(workInProgress, context, renderLanes) {
14216    {
14217      propagateContextChange_eager(workInProgress, context, renderLanes);
14218    }
14219  }
14220
14221  function propagateContextChange_eager(workInProgress, context, renderLanes) {
14222
14223    var fiber = workInProgress.child;
14224
14225    if (fiber !== null) {
14226      // Set the return pointer of the child to the work-in-progress fiber.
14227      fiber.return = workInProgress;
14228    }
14229
14230    while (fiber !== null) {
14231      var nextFiber = void 0; // Visit this fiber.
14232
14233      var list = fiber.dependencies;
14234
14235      if (list !== null) {
14236        nextFiber = fiber.child;
14237        var dependency = list.firstContext;
14238
14239        while (dependency !== null) {
14240          // Check if the context matches.
14241          if (dependency.context === context) {
14242            // Match! Schedule an update on this fiber.
14243            if (fiber.tag === ClassComponent) {
14244              // Schedule a force update on the work-in-progress.
14245              var lane = pickArbitraryLane(renderLanes);
14246              var update = createUpdate(NoTimestamp, lane);
14247              update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the
14248              // update to the current fiber, too, which means it will persist even if
14249              // this render is thrown away. Since it's a race condition, not sure it's
14250              // worth fixing.
14251              // Inlined `enqueueUpdate` to remove interleaved update check
14252
14253              var updateQueue = fiber.updateQueue;
14254
14255              if (updateQueue === null) ; else {
14256                var sharedQueue = updateQueue.shared;
14257                var pending = sharedQueue.pending;
14258
14259                if (pending === null) {
14260                  // This is the first update. Create a circular list.
14261                  update.next = update;
14262                } else {
14263                  update.next = pending.next;
14264                  pending.next = update;
14265                }
14266
14267                sharedQueue.pending = update;
14268              }
14269            }
14270
14271            fiber.lanes = mergeLanes(fiber.lanes, renderLanes);
14272            var alternate = fiber.alternate;
14273
14274            if (alternate !== null) {
14275              alternate.lanes = mergeLanes(alternate.lanes, renderLanes);
14276            }
14277
14278            scheduleContextWorkOnParentPath(fiber.return, renderLanes, workInProgress); // Mark the updated lanes on the list, too.
14279
14280            list.lanes = mergeLanes(list.lanes, renderLanes); // Since we already found a match, we can stop traversing the
14281            // dependency list.
14282
14283            break;
14284          }
14285
14286          dependency = dependency.next;
14287        }
14288      } else if (fiber.tag === ContextProvider) {
14289        // Don't scan deeper if this is a matching provider
14290        nextFiber = fiber.type === workInProgress.type ? null : fiber.child;
14291      } else if (fiber.tag === DehydratedFragment) {
14292        // If a dehydrated suspense boundary is in this subtree, we don't know
14293        // if it will have any context consumers in it. The best we can do is
14294        // mark it as having updates.
14295        var parentSuspense = fiber.return;
14296
14297        if (parentSuspense === null) {
14298          throw new Error('We just came from a parent so we must have had a parent. This is a bug in React.');
14299        }
14300
14301        parentSuspense.lanes = mergeLanes(parentSuspense.lanes, renderLanes);
14302        var _alternate = parentSuspense.alternate;
14303
14304        if (_alternate !== null) {
14305          _alternate.lanes = mergeLanes(_alternate.lanes, renderLanes);
14306        } // This is intentionally passing this fiber as the parent
14307        // because we want to schedule this fiber as having work
14308        // on its children. We'll use the childLanes on
14309        // this fiber to indicate that a context has changed.
14310
14311
14312        scheduleContextWorkOnParentPath(parentSuspense, renderLanes, workInProgress);
14313        nextFiber = fiber.sibling;
14314      } else {
14315        // Traverse down.
14316        nextFiber = fiber.child;
14317      }
14318
14319      if (nextFiber !== null) {
14320        // Set the return pointer of the child to the work-in-progress fiber.
14321        nextFiber.return = fiber;
14322      } else {
14323        // No child. Traverse to next sibling.
14324        nextFiber = fiber;
14325
14326        while (nextFiber !== null) {
14327          if (nextFiber === workInProgress) {
14328            // We're back to the root of this subtree. Exit.
14329            nextFiber = null;
14330            break;
14331          }
14332
14333          var sibling = nextFiber.sibling;
14334
14335          if (sibling !== null) {
14336            // Set the return pointer of the sibling to the work-in-progress fiber.
14337            sibling.return = nextFiber.return;
14338            nextFiber = sibling;
14339            break;
14340          } // No more siblings. Traverse up.
14341
14342
14343          nextFiber = nextFiber.return;
14344        }
14345      }
14346
14347      fiber = nextFiber;
14348    }
14349  }
14350  function prepareToReadContext(workInProgress, renderLanes) {
14351    currentlyRenderingFiber = workInProgress;
14352    lastContextDependency = null;
14353    lastFullyObservedContext = null;
14354    var dependencies = workInProgress.dependencies;
14355
14356    if (dependencies !== null) {
14357      {
14358        var firstContext = dependencies.firstContext;
14359
14360        if (firstContext !== null) {
14361          if (includesSomeLane(dependencies.lanes, renderLanes)) {
14362            // Context list has a pending update. Mark that this fiber performed work.
14363            markWorkInProgressReceivedUpdate();
14364          } // Reset the work-in-progress list
14365
14366
14367          dependencies.firstContext = null;
14368        }
14369      }
14370    }
14371  }
14372  function readContext(context) {
14373    {
14374      // This warning would fire if you read context inside a Hook like useMemo.
14375      // Unlike the class check below, it's not enforced in production for perf.
14376      if (isDisallowedContextReadInDEV) {
14377        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().');
14378      }
14379    }
14380
14381    var value =  context._currentValue ;
14382
14383    if (lastFullyObservedContext === context) ; else {
14384      var contextItem = {
14385        context: context,
14386        memoizedValue: value,
14387        next: null
14388      };
14389
14390      if (lastContextDependency === null) {
14391        if (currentlyRenderingFiber === null) {
14392          throw new 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().');
14393        } // This is the first dependency for this component. Create a new list.
14394
14395
14396        lastContextDependency = contextItem;
14397        currentlyRenderingFiber.dependencies = {
14398          lanes: NoLanes,
14399          firstContext: contextItem
14400        };
14401      } else {
14402        // Append a new context item.
14403        lastContextDependency = lastContextDependency.next = contextItem;
14404      }
14405    }
14406
14407    return value;
14408  }
14409
14410  // render. When this render exits, either because it finishes or because it is
14411  // interrupted, the interleaved updates will be transferred onto the main part
14412  // of the queue.
14413
14414  var concurrentQueues = null;
14415  function pushConcurrentUpdateQueue(queue) {
14416    if (concurrentQueues === null) {
14417      concurrentQueues = [queue];
14418    } else {
14419      concurrentQueues.push(queue);
14420    }
14421  }
14422  function finishQueueingConcurrentUpdates() {
14423    // Transfer the interleaved updates onto the main queue. Each queue has a
14424    // `pending` field and an `interleaved` field. When they are not null, they
14425    // point to the last node in a circular linked list. We need to append the
14426    // interleaved list to the end of the pending list by joining them into a
14427    // single, circular list.
14428    if (concurrentQueues !== null) {
14429      for (var i = 0; i < concurrentQueues.length; i++) {
14430        var queue = concurrentQueues[i];
14431        var lastInterleavedUpdate = queue.interleaved;
14432
14433        if (lastInterleavedUpdate !== null) {
14434          queue.interleaved = null;
14435          var firstInterleavedUpdate = lastInterleavedUpdate.next;
14436          var lastPendingUpdate = queue.pending;
14437
14438          if (lastPendingUpdate !== null) {
14439            var firstPendingUpdate = lastPendingUpdate.next;
14440            lastPendingUpdate.next = firstInterleavedUpdate;
14441            lastInterleavedUpdate.next = firstPendingUpdate;
14442          }
14443
14444          queue.pending = lastInterleavedUpdate;
14445        }
14446      }
14447
14448      concurrentQueues = null;
14449    }
14450  }
14451  function enqueueConcurrentHookUpdate(fiber, queue, update, lane) {
14452    var interleaved = queue.interleaved;
14453
14454    if (interleaved === null) {
14455      // This is the first update. Create a circular list.
14456      update.next = update; // At the end of the current render, this queue's interleaved updates will
14457      // be transferred to the pending queue.
14458
14459      pushConcurrentUpdateQueue(queue);
14460    } else {
14461      update.next = interleaved.next;
14462      interleaved.next = update;
14463    }
14464
14465    queue.interleaved = update;
14466    return markUpdateLaneFromFiberToRoot(fiber, lane);
14467  }
14468  function enqueueConcurrentHookUpdateAndEagerlyBailout(fiber, queue, update, lane) {
14469    var interleaved = queue.interleaved;
14470
14471    if (interleaved === null) {
14472      // This is the first update. Create a circular list.
14473      update.next = update; // At the end of the current render, this queue's interleaved updates will
14474      // be transferred to the pending queue.
14475
14476      pushConcurrentUpdateQueue(queue);
14477    } else {
14478      update.next = interleaved.next;
14479      interleaved.next = update;
14480    }
14481
14482    queue.interleaved = update;
14483  }
14484  function enqueueConcurrentClassUpdate(fiber, queue, update, lane) {
14485    var interleaved = queue.interleaved;
14486
14487    if (interleaved === null) {
14488      // This is the first update. Create a circular list.
14489      update.next = update; // At the end of the current render, this queue's interleaved updates will
14490      // be transferred to the pending queue.
14491
14492      pushConcurrentUpdateQueue(queue);
14493    } else {
14494      update.next = interleaved.next;
14495      interleaved.next = update;
14496    }
14497
14498    queue.interleaved = update;
14499    return markUpdateLaneFromFiberToRoot(fiber, lane);
14500  }
14501  function enqueueConcurrentRenderForLane(fiber, lane) {
14502    return markUpdateLaneFromFiberToRoot(fiber, lane);
14503  } // Calling this function outside this module should only be done for backwards
14504  // compatibility and should always be accompanied by a warning.
14505
14506  var unsafe_markUpdateLaneFromFiberToRoot = markUpdateLaneFromFiberToRoot;
14507
14508  function markUpdateLaneFromFiberToRoot(sourceFiber, lane) {
14509    // Update the source fiber's lanes
14510    sourceFiber.lanes = mergeLanes(sourceFiber.lanes, lane);
14511    var alternate = sourceFiber.alternate;
14512
14513    if (alternate !== null) {
14514      alternate.lanes = mergeLanes(alternate.lanes, lane);
14515    }
14516
14517    {
14518      if (alternate === null && (sourceFiber.flags & (Placement | Hydrating)) !== NoFlags) {
14519        warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber);
14520      }
14521    } // Walk the parent path to the root and update the child lanes.
14522
14523
14524    var node = sourceFiber;
14525    var parent = sourceFiber.return;
14526
14527    while (parent !== null) {
14528      parent.childLanes = mergeLanes(parent.childLanes, lane);
14529      alternate = parent.alternate;
14530
14531      if (alternate !== null) {
14532        alternate.childLanes = mergeLanes(alternate.childLanes, lane);
14533      } else {
14534        {
14535          if ((parent.flags & (Placement | Hydrating)) !== NoFlags) {
14536            warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber);
14537          }
14538        }
14539      }
14540
14541      node = parent;
14542      parent = parent.return;
14543    }
14544
14545    if (node.tag === HostRoot) {
14546      var root = node.stateNode;
14547      return root;
14548    } else {
14549      return null;
14550    }
14551  }
14552
14553  var UpdateState = 0;
14554  var ReplaceState = 1;
14555  var ForceUpdate = 2;
14556  var CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`.
14557  // It should only be read right after calling `processUpdateQueue`, via
14558  // `checkHasForceUpdateAfterProcessing`.
14559
14560  var hasForceUpdate = false;
14561  var didWarnUpdateInsideUpdate;
14562  var currentlyProcessingQueue;
14563
14564  {
14565    didWarnUpdateInsideUpdate = false;
14566    currentlyProcessingQueue = null;
14567  }
14568
14569  function initializeUpdateQueue(fiber) {
14570    var queue = {
14571      baseState: fiber.memoizedState,
14572      firstBaseUpdate: null,
14573      lastBaseUpdate: null,
14574      shared: {
14575        pending: null,
14576        interleaved: null,
14577        lanes: NoLanes
14578      },
14579      effects: null
14580    };
14581    fiber.updateQueue = queue;
14582  }
14583  function cloneUpdateQueue(current, workInProgress) {
14584    // Clone the update queue from current. Unless it's already a clone.
14585    var queue = workInProgress.updateQueue;
14586    var currentQueue = current.updateQueue;
14587
14588    if (queue === currentQueue) {
14589      var clone = {
14590        baseState: currentQueue.baseState,
14591        firstBaseUpdate: currentQueue.firstBaseUpdate,
14592        lastBaseUpdate: currentQueue.lastBaseUpdate,
14593        shared: currentQueue.shared,
14594        effects: currentQueue.effects
14595      };
14596      workInProgress.updateQueue = clone;
14597    }
14598  }
14599  function createUpdate(eventTime, lane) {
14600    var update = {
14601      eventTime: eventTime,
14602      lane: lane,
14603      tag: UpdateState,
14604      payload: null,
14605      callback: null,
14606      next: null
14607    };
14608    return update;
14609  }
14610  function enqueueUpdate(fiber, update, lane) {
14611    var updateQueue = fiber.updateQueue;
14612
14613    if (updateQueue === null) {
14614      // Only occurs if the fiber has been unmounted.
14615      return null;
14616    }
14617
14618    var sharedQueue = updateQueue.shared;
14619
14620    {
14621      if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) {
14622        error('An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.');
14623
14624        didWarnUpdateInsideUpdate = true;
14625      }
14626    }
14627
14628    if (isUnsafeClassRenderPhaseUpdate()) {
14629      // This is an unsafe render phase update. Add directly to the update
14630      // queue so we can process it immediately during the current render.
14631      var pending = sharedQueue.pending;
14632
14633      if (pending === null) {
14634        // This is the first update. Create a circular list.
14635        update.next = update;
14636      } else {
14637        update.next = pending.next;
14638        pending.next = update;
14639      }
14640
14641      sharedQueue.pending = update; // Update the childLanes even though we're most likely already rendering
14642      // this fiber. This is for backwards compatibility in the case where you
14643      // update a different component during render phase than the one that is
14644      // currently renderings (a pattern that is accompanied by a warning).
14645
14646      return unsafe_markUpdateLaneFromFiberToRoot(fiber, lane);
14647    } else {
14648      return enqueueConcurrentClassUpdate(fiber, sharedQueue, update, lane);
14649    }
14650  }
14651  function entangleTransitions(root, fiber, lane) {
14652    var updateQueue = fiber.updateQueue;
14653
14654    if (updateQueue === null) {
14655      // Only occurs if the fiber has been unmounted.
14656      return;
14657    }
14658
14659    var sharedQueue = updateQueue.shared;
14660
14661    if (isTransitionLane(lane)) {
14662      var queueLanes = sharedQueue.lanes; // If any entangled lanes are no longer pending on the root, then they must
14663      // have finished. We can remove them from the shared queue, which represents
14664      // a superset of the actually pending lanes. In some cases we may entangle
14665      // more than we need to, but that's OK. In fact it's worse if we *don't*
14666      // entangle when we should.
14667
14668      queueLanes = intersectLanes(queueLanes, root.pendingLanes); // Entangle the new transition lane with the other transition lanes.
14669
14670      var newQueueLanes = mergeLanes(queueLanes, lane);
14671      sharedQueue.lanes = newQueueLanes; // Even if queue.lanes already include lane, we don't know for certain if
14672      // the lane finished since the last time we entangled it. So we need to
14673      // entangle it again, just to be sure.
14674
14675      markRootEntangled(root, newQueueLanes);
14676    }
14677  }
14678  function enqueueCapturedUpdate(workInProgress, capturedUpdate) {
14679    // Captured updates are updates that are thrown by a child during the render
14680    // phase. They should be discarded if the render is aborted. Therefore,
14681    // we should only put them on the work-in-progress queue, not the current one.
14682    var queue = workInProgress.updateQueue; // Check if the work-in-progress queue is a clone.
14683
14684    var current = workInProgress.alternate;
14685
14686    if (current !== null) {
14687      var currentQueue = current.updateQueue;
14688
14689      if (queue === currentQueue) {
14690        // The work-in-progress queue is the same as current. This happens when
14691        // we bail out on a parent fiber that then captures an error thrown by
14692        // a child. Since we want to append the update only to the work-in
14693        // -progress queue, we need to clone the updates. We usually clone during
14694        // processUpdateQueue, but that didn't happen in this case because we
14695        // skipped over the parent when we bailed out.
14696        var newFirst = null;
14697        var newLast = null;
14698        var firstBaseUpdate = queue.firstBaseUpdate;
14699
14700        if (firstBaseUpdate !== null) {
14701          // Loop through the updates and clone them.
14702          var update = firstBaseUpdate;
14703
14704          do {
14705            var clone = {
14706              eventTime: update.eventTime,
14707              lane: update.lane,
14708              tag: update.tag,
14709              payload: update.payload,
14710              callback: update.callback,
14711              next: null
14712            };
14713
14714            if (newLast === null) {
14715              newFirst = newLast = clone;
14716            } else {
14717              newLast.next = clone;
14718              newLast = clone;
14719            }
14720
14721            update = update.next;
14722          } while (update !== null); // Append the captured update the end of the cloned list.
14723
14724
14725          if (newLast === null) {
14726            newFirst = newLast = capturedUpdate;
14727          } else {
14728            newLast.next = capturedUpdate;
14729            newLast = capturedUpdate;
14730          }
14731        } else {
14732          // There are no base updates.
14733          newFirst = newLast = capturedUpdate;
14734        }
14735
14736        queue = {
14737          baseState: currentQueue.baseState,
14738          firstBaseUpdate: newFirst,
14739          lastBaseUpdate: newLast,
14740          shared: currentQueue.shared,
14741          effects: currentQueue.effects
14742        };
14743        workInProgress.updateQueue = queue;
14744        return;
14745      }
14746    } // Append the update to the end of the list.
14747
14748
14749    var lastBaseUpdate = queue.lastBaseUpdate;
14750
14751    if (lastBaseUpdate === null) {
14752      queue.firstBaseUpdate = capturedUpdate;
14753    } else {
14754      lastBaseUpdate.next = capturedUpdate;
14755    }
14756
14757    queue.lastBaseUpdate = capturedUpdate;
14758  }
14759
14760  function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {
14761    switch (update.tag) {
14762      case ReplaceState:
14763        {
14764          var payload = update.payload;
14765
14766          if (typeof payload === 'function') {
14767            // Updater function
14768            {
14769              enterDisallowedContextReadInDEV();
14770            }
14771
14772            var nextState = payload.call(instance, prevState, nextProps);
14773
14774            {
14775              if ( workInProgress.mode & StrictLegacyMode) {
14776                setIsStrictModeForDevtools(true);
14777
14778                try {
14779                  payload.call(instance, prevState, nextProps);
14780                } finally {
14781                  setIsStrictModeForDevtools(false);
14782                }
14783              }
14784
14785              exitDisallowedContextReadInDEV();
14786            }
14787
14788            return nextState;
14789          } // State object
14790
14791
14792          return payload;
14793        }
14794
14795      case CaptureUpdate:
14796        {
14797          workInProgress.flags = workInProgress.flags & ~ShouldCapture | DidCapture;
14798        }
14799      // Intentional fallthrough
14800
14801      case UpdateState:
14802        {
14803          var _payload = update.payload;
14804          var partialState;
14805
14806          if (typeof _payload === 'function') {
14807            // Updater function
14808            {
14809              enterDisallowedContextReadInDEV();
14810            }
14811
14812            partialState = _payload.call(instance, prevState, nextProps);
14813
14814            {
14815              if ( workInProgress.mode & StrictLegacyMode) {
14816                setIsStrictModeForDevtools(true);
14817
14818                try {
14819                  _payload.call(instance, prevState, nextProps);
14820                } finally {
14821                  setIsStrictModeForDevtools(false);
14822                }
14823              }
14824
14825              exitDisallowedContextReadInDEV();
14826            }
14827          } else {
14828            // Partial state object
14829            partialState = _payload;
14830          }
14831
14832          if (partialState === null || partialState === undefined) {
14833            // Null and undefined are treated as no-ops.
14834            return prevState;
14835          } // Merge the partial state and the previous state.
14836
14837
14838          return assign({}, prevState, partialState);
14839        }
14840
14841      case ForceUpdate:
14842        {
14843          hasForceUpdate = true;
14844          return prevState;
14845        }
14846    }
14847
14848    return prevState;
14849  }
14850
14851  function processUpdateQueue(workInProgress, props, instance, renderLanes) {
14852    // This is always non-null on a ClassComponent or HostRoot
14853    var queue = workInProgress.updateQueue;
14854    hasForceUpdate = false;
vendor: 4,124 bytes, lines 14855-14964
14855
14856    {
14857      currentlyProcessingQueue = queue.shared;
14858    }
14859
14860    var firstBaseUpdate = queue.firstBaseUpdate;
14861    var lastBaseUpdate = queue.lastBaseUpdate; // Check if there are pending updates. If so, transfer them to the base queue.
14862
14863    var pendingQueue = queue.shared.pending;
14864
14865    if (pendingQueue !== null) {
14866      queue.shared.pending = null; // The pending queue is circular. Disconnect the pointer between first
14867      // and last so that it's non-circular.
14868
14869      var lastPendingUpdate = pendingQueue;
14870      var firstPendingUpdate = lastPendingUpdate.next;
14871      lastPendingUpdate.next = null; // Append pending updates to base queue
14872
14873      if (lastBaseUpdate === null) {
14874        firstBaseUpdate = firstPendingUpdate;
14875      } else {
14876        lastBaseUpdate.next = firstPendingUpdate;
14877      }
14878
14879      lastBaseUpdate = lastPendingUpdate; // If there's a current queue, and it's different from the base queue, then
14880      // we need to transfer the updates to that queue, too. Because the base
14881      // queue is a singly-linked list with no cycles, we can append to both
14882      // lists and take advantage of structural sharing.
14883      // TODO: Pass `current` as argument
14884
14885      var current = workInProgress.alternate;
14886
14887      if (current !== null) {
14888        // This is always non-null on a ClassComponent or HostRoot
14889        var currentQueue = current.updateQueue;
14890        var currentLastBaseUpdate = currentQueue.lastBaseUpdate;
14891
14892        if (currentLastBaseUpdate !== lastBaseUpdate) {
14893          if (currentLastBaseUpdate === null) {
14894            currentQueue.firstBaseUpdate = firstPendingUpdate;
14895          } else {
14896            currentLastBaseUpdate.next = firstPendingUpdate;
14897          }
14898
14899          currentQueue.lastBaseUpdate = lastPendingUpdate;
14900        }
14901      }
14902    } // These values may change as we process the queue.
14903
14904
14905    if (firstBaseUpdate !== null) {
14906      // Iterate through the list of updates to compute the result.
14907      var newState = queue.baseState; // TODO: Don't need to accumulate this. Instead, we can remove renderLanes
14908      // from the original lanes.
14909
14910      var newLanes = NoLanes;
14911      var newBaseState = null;
14912      var newFirstBaseUpdate = null;
14913      var newLastBaseUpdate = null;
14914      var update = firstBaseUpdate;
14915
14916      do {
14917        var updateLane = update.lane;
14918        var updateEventTime = update.eventTime;
14919
14920        if (!isSubsetOfLanes(renderLanes, updateLane)) {
14921          // Priority is insufficient. Skip this update. If this is the first
14922          // skipped update, the previous update/state is the new base
14923          // update/state.
14924          var clone = {
14925            eventTime: updateEventTime,
14926            lane: updateLane,
14927            tag: update.tag,
14928            payload: update.payload,
14929            callback: update.callback,
14930            next: null
14931          };
14932
14933          if (newLastBaseUpdate === null) {
14934            newFirstBaseUpdate = newLastBaseUpdate = clone;
14935            newBaseState = newState;
14936          } else {
14937            newLastBaseUpdate = newLastBaseUpdate.next = clone;
14938          } // Update the remaining priority in the queue.
14939
14940
14941          newLanes = mergeLanes(newLanes, updateLane);
14942        } else {
14943          // This update does have sufficient priority.
14944          if (newLastBaseUpdate !== null) {
14945            var _clone = {
14946              eventTime: updateEventTime,
14947              // This update is going to be committed so we never want uncommit
14948              // it. Using NoLane works because 0 is a subset of all bitmasks, so
14949              // this will never be skipped by the check above.
14950              lane: NoLane,
14951              tag: update.tag,
14952              payload: update.payload,
14953              callback: update.callback,
14954              next: null
14955            };
14956            newLastBaseUpdate = newLastBaseUpdate.next = _clone;
14957          } // Process this update.
14958
14959
14960          newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance);
14961          var callback = update.callback;
14962
14963          if (callback !== null && // If the update was already committed, we should not queue its
14964          // callback again.
14965          update.lane !== NoLane) {
14966            workInProgress.flags |= Callback;
14967            var effects = queue.effects;
14968
14969            if (effects === null) {
14970              queue.effects = [update];
14971            } else {
14972              effects.push(update);
14973            }
14974          }
14975        }
14976
14977        update = update.next;
14978
14979        if (update === null) {
14980          pendingQueue = queue.shared.pending;
14981
14982          if (pendingQueue === null) {
14983            break;
14984          } else {
14985            // An update was scheduled from inside a reducer. Add the new
14986            // pending updates to the end of the list and keep processing.
14987            var _lastPendingUpdate = pendingQueue; // Intentionally unsound. Pending updates form a circular list, but we
14988            // unravel them when transferring them to the base queue.
14989
14990            var _firstPendingUpdate = _lastPendingUpdate.next;
14991            _lastPendingUpdate.next = null;
14992            update = _firstPendingUpdate;
14993            queue.lastBaseUpdate = _lastPendingUpdate;
14994            queue.shared.pending = null;
14995          }
14996        }
14997      } while (true);
14998
14999      if (newLastBaseUpdate === null) {
15000        newBaseState = newState;
15001      }
15002
15003      queue.baseState = newBaseState;
15004      queue.firstBaseUpdate = newFirstBaseUpdate;
15005      queue.lastBaseUpdate = newLastBaseUpdate; // Interleaved updates are stored on a separate queue. We aren't going to
15006      // process them during this render, but we do need to track which lanes
15007      // are remaining.
15008
15009      var lastInterleaved = queue.shared.interleaved;
15010
15011      if (lastInterleaved !== null) {
15012        var interleaved = lastInterleaved;
15013
15014        do {
15015          newLanes = mergeLanes(newLanes, interleaved.lane);
15016          interleaved = interleaved.next;
15017        } while (interleaved !== lastInterleaved);
15018      } else if (firstBaseUpdate === null) {
15019        // `queue.lanes` is used for entangling transitions. We can set it back to
15020        // zero once the queue is empty.
15021        queue.shared.lanes = NoLanes;
15022      } // Set the remaining expiration time to be whatever is remaining in the queue.
15023      // This should be fine because the only two other things that contribute to
15024      // expiration time are props and context. We're already in the middle of the
15025      // begin phase by the time we start processing the queue, so we've already
15026      // dealt with the props. Context in components that specify
15027      // shouldComponentUpdate is tricky; but we'll have to account for
15028      // that regardless.
15029
15030
15031      markSkippedUpdateLanes(newLanes);
15032      workInProgress.lanes = newLanes;
15033      workInProgress.memoizedState = newState;
15034    }
15035
15036    {
15037      currentlyProcessingQueue = null;
15038    }
15039  }
15040
15041  function callCallback(callback, context) {
15042    if (typeof callback !== 'function') {
15043      throw new Error('Invalid argument passed as callback. Expected a function. Instead ' + ("received: " + callback));
15044    }
15045
15046    callback.call(context);
15047  }
15048
15049  function resetHasForceUpdateBeforeProcessing() {
15050    hasForceUpdate = false;
15051  }
15052  function checkHasForceUpdateAfterProcessing() {
15053    return hasForceUpdate;
15054  }
15055  function commitUpdateQueue(finishedWork, finishedQueue, instance) {
15056    // Commit the effects
15057    var effects = finishedQueue.effects;
15058    finishedQueue.effects = null;
15059
15060    if (effects !== null) {
15061      for (var i = 0; i < effects.length; i++) {
15062        var effect = effects[i];
15063        var callback = effect.callback;
15064
15065        if (callback !== null) {
15066          effect.callback = null;
15067          callCallback(callback, instance);
15068        }
15069      }
15070    }
15071  }
15072
15073  var NO_CONTEXT = {};
15074  var contextStackCursor$1 = createCursor(NO_CONTEXT);
15075  var contextFiberStackCursor = createCursor(NO_CONTEXT);
15076  var rootInstanceStackCursor = createCursor(NO_CONTEXT);
15077
15078  function requiredContext(c) {
15079    if (c === NO_CONTEXT) {
15080      throw new Error('Expected host context to exist. This error is likely caused by a bug ' + 'in React. Please file an issue.');
15081    }
15082
15083    return c;
15084  }
15085
15086  function getRootHostContainer() {
15087    var rootInstance = requiredContext(rootInstanceStackCursor.current);
15088    return rootInstance;
15089  }
15090
15091  function pushHostContainer(fiber, nextRootInstance) {
15092    // Push current root instance onto the stack;
15093    // This allows us to reset root when portals are popped.
15094    push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it.
15095    // This enables us to pop only Fibers that provide unique contexts.
15096
15097    push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack.
15098    // However, we can't just call getRootHostContext() and push it because
15099    // we'd have a different number of entries on the stack depending on
vendor: 13,863 bytes, lines 15100-15472
15100    // whether getRootHostContext() throws somewhere in renderer code or not.
15101    // So we push an empty value first. This lets us safely unwind on errors.
15102
15103    push(contextStackCursor$1, NO_CONTEXT, fiber);
15104    var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it.
15105
15106    pop(contextStackCursor$1, fiber);
15107    push(contextStackCursor$1, nextRootContext, fiber);
15108  }
15109
15110  function popHostContainer(fiber) {
15111    pop(contextStackCursor$1, fiber);
15112    pop(contextFiberStackCursor, fiber);
15113    pop(rootInstanceStackCursor, fiber);
15114  }
15115
15116  function getHostContext() {
15117    var context = requiredContext(contextStackCursor$1.current);
15118    return context;
15119  }
15120
15121  function pushHostContext(fiber) {
15122    var rootInstance = requiredContext(rootInstanceStackCursor.current);
15123    var context = requiredContext(contextStackCursor$1.current);
15124    var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique.
15125
15126    if (context === nextContext) {
15127      return;
15128    } // Track the context and the Fiber that provided it.
15129    // This enables us to pop only Fibers that provide unique contexts.
15130
15131
15132    push(contextFiberStackCursor, fiber, fiber);
15133    push(contextStackCursor$1, nextContext, fiber);
15134  }
15135
15136  function popHostContext(fiber) {
15137    // Do not pop unless this Fiber provided the current context.
15138    // pushHostContext() only pushes Fibers that provide unique contexts.
15139    if (contextFiberStackCursor.current !== fiber) {
15140      return;
15141    }
15142
15143    pop(contextStackCursor$1, fiber);
15144    pop(contextFiberStackCursor, fiber);
15145  }
15146
15147  var DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is
15148  // inherited deeply down the subtree. The upper bits only affect
15149  // this immediate suspense boundary and gets reset each new
15150  // boundary or suspense list.
15151
15152  var SubtreeSuspenseContextMask = 1; // Subtree Flags:
15153  // InvisibleParentSuspenseContext indicates that one of our parent Suspense
15154  // boundaries is not currently showing visible main content.
15155  // Either because it is already showing a fallback or is not mounted at all.
15156  // We can use this to determine if it is desirable to trigger a fallback at
15157  // the parent. If not, then we might need to trigger undesirable boundaries
15158  // and/or suspend the commit to avoid hiding the parent content.
15159
15160  var InvisibleParentSuspenseContext = 1; // Shallow Flags:
15161  // ForceSuspenseFallback can be used by SuspenseList to force newly added
15162  // items into their fallback state during one of the render passes.
15163
15164  var ForceSuspenseFallback = 2;
15165  var suspenseStackCursor = createCursor(DefaultSuspenseContext);
15166  function hasSuspenseContext(parentContext, flag) {
15167    return (parentContext & flag) !== 0;
15168  }
15169  function setDefaultShallowSuspenseContext(parentContext) {
15170    return parentContext & SubtreeSuspenseContextMask;
15171  }
15172  function setShallowSuspenseContext(parentContext, shallowContext) {
15173    return parentContext & SubtreeSuspenseContextMask | shallowContext;
15174  }
15175  function addSubtreeSuspenseContext(parentContext, subtreeContext) {
15176    return parentContext | subtreeContext;
15177  }
15178  function pushSuspenseContext(fiber, newContext) {
15179    push(suspenseStackCursor, newContext, fiber);
15180  }
15181  function popSuspenseContext(fiber) {
15182    pop(suspenseStackCursor, fiber);
15183  }
15184
15185  function shouldCaptureSuspense(workInProgress, hasInvisibleParent) {
15186    // If it was the primary children that just suspended, capture and render the
15187    // fallback. Otherwise, don't capture and bubble to the next boundary.
15188    var nextState = workInProgress.memoizedState;
15189
15190    if (nextState !== null) {
15191      if (nextState.dehydrated !== null) {
15192        // A dehydrated boundary always captures.
15193        return true;
15194      }
15195
15196      return false;
15197    }
15198
15199    var props = workInProgress.memoizedProps; // Regular boundaries always capture.
15200
15201    {
15202      return true;
15203    } // If it's a boundary we should avoid, then we prefer to bubble up to the
15204  }
15205  function findFirstSuspended(row) {
15206    var node = row;
15207
15208    while (node !== null) {
15209      if (node.tag === SuspenseComponent) {
15210        var state = node.memoizedState;
15211
15212        if (state !== null) {
15213          var dehydrated = state.dehydrated;
15214
15215          if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) {
15216            return node;
15217          }
15218        }
15219      } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't
15220      // keep track of whether it suspended or not.
15221      node.memoizedProps.revealOrder !== undefined) {
15222        var didSuspend = (node.flags & DidCapture) !== NoFlags;
15223
15224        if (didSuspend) {
15225          return node;
15226        }
15227      } else if (node.child !== null) {
15228        node.child.return = node;
15229        node = node.child;
15230        continue;
15231      }
15232
15233      if (node === row) {
15234        return null;
15235      }
15236
15237      while (node.sibling === null) {
15238        if (node.return === null || node.return === row) {
15239          return null;
15240        }
15241
15242        node = node.return;
15243      }
15244
15245      node.sibling.return = node.return;
15246      node = node.sibling;
15247    }
15248
15249    return null;
15250  }
15251
15252  var NoFlags$1 =
15253  /*   */
15254  0; // Represents whether effect should fire.
15255
15256  var HasEffect =
15257  /* */
15258  1; // Represents the phase in which the effect (not the clean-up) fires.
15259
15260  var Insertion =
15261  /*  */
15262  2;
15263  var Layout =
15264  /*    */
15265  4;
15266  var Passive$1 =
15267  /*   */
15268  8;
15269
15270  // and should be reset before starting a new render.
15271  // This tracks which mutable sources need to be reset after a render.
15272
15273  var workInProgressSources = [];
15274  function resetWorkInProgressVersions() {
15275    for (var i = 0; i < workInProgressSources.length; i++) {
15276      var mutableSource = workInProgressSources[i];
15277
15278      {
15279        mutableSource._workInProgressVersionPrimary = null;
15280      }
15281    }
15282
15283    workInProgressSources.length = 0;
15284  }
15285  // This ensures that the version used for server rendering matches the one
15286  // that is eventually read during hydration.
15287  // If they don't match there's a potential tear and a full deopt render is required.
15288
15289  function registerMutableSourceForHydration(root, mutableSource) {
15290    var getVersion = mutableSource._getVersion;
15291    var version = getVersion(mutableSource._source); // TODO Clear this data once all pending hydration work is finished.
15292    // Retaining it forever may interfere with GC.
15293
15294    if (root.mutableSourceEagerHydrationData == null) {
15295      root.mutableSourceEagerHydrationData = [mutableSource, version];
15296    } else {
15297      root.mutableSourceEagerHydrationData.push(mutableSource, version);
15298    }
15299  }
15300
15301  var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher,
15302      ReactCurrentBatchConfig$2 = ReactSharedInternals.ReactCurrentBatchConfig;
15303  var didWarnAboutMismatchedHooksForComponent;
15304  var didWarnUncachedGetSnapshot;
15305
15306  {
15307    didWarnAboutMismatchedHooksForComponent = new Set();
15308  }
15309
15310  // These are set right before calling the component.
15311  var renderLanes = NoLanes; // The work-in-progress fiber. I've named it differently to distinguish it from
15312  // the work-in-progress hook.
15313
15314  var currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The
15315  // current hook list is the list that belongs to the current fiber. The
15316  // work-in-progress hook list is a new list that will be added to the
15317  // work-in-progress fiber.
15318
15319  var currentHook = null;
15320  var workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This
15321  // does not get reset if we do another render pass; only when we're completely
15322  // finished evaluating this component. This is an optimization so we know
15323  // whether we need to clear render phase updates after a throw.
15324
15325  var didScheduleRenderPhaseUpdate = false; // Where an update was scheduled only during the current render pass. This
15326  // gets reset after each attempt.
15327  // TODO: Maybe there's some way to consolidate this with
15328  // `didScheduleRenderPhaseUpdate`. Or with `numberOfReRenders`.
15329
15330  var didScheduleRenderPhaseUpdateDuringThisPass = false; // Counts the number of useId hooks in this component.
15331
15332  var localIdCounter = 0; // Used for ids that are generated completely client-side (i.e. not during
15333  // hydration). This counter is global, so client ids are not stable across
15334  // render attempts.
15335
15336  var globalClientIdCounter = 0;
15337  var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook
15338
15339  var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders.
15340  // The list stores the order of hooks used during the initial render (mount).
15341  // Subsequent renders (updates) reference this list.
15342
15343  var hookTypesDev = null;
15344  var hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore
15345  // the dependencies for Hooks that need them (e.g. useEffect or useMemo).
15346  // When true, such Hooks will always be "remounted". Only used during hot reload.
15347
15348  var ignorePreviousDependencies = false;
15349
15350  function mountHookTypesDev() {
15351    {
15352      var hookName = currentHookNameInDev;
15353
15354      if (hookTypesDev === null) {
15355        hookTypesDev = [hookName];
15356      } else {
15357        hookTypesDev.push(hookName);
15358      }
15359    }
15360  }
15361
15362  function updateHookTypesDev() {
15363    {
15364      var hookName = currentHookNameInDev;
15365
15366      if (hookTypesDev !== null) {
15367        hookTypesUpdateIndexDev++;
15368
15369        if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {
15370          warnOnHookMismatchInDev(hookName);
15371        }
15372      }
15373    }
15374  }
15375
15376  function checkDepsAreArrayDev(deps) {
15377    {
15378      if (deps !== undefined && deps !== null && !isArray(deps)) {
15379        // Verify deps, but only on mount to avoid extra checks.
15380        // It's unlikely their type would change as usually you define them inline.
15381        error('%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps);
15382      }
15383    }
15384  }
15385
15386  function warnOnHookMismatchInDev(currentHookName) {
15387    {
15388      var componentName = getComponentNameFromFiber(currentlyRenderingFiber$1);
15389
15390      if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {
15391        didWarnAboutMismatchedHooksForComponent.add(componentName);
15392
15393        if (hookTypesDev !== null) {
15394          var table = '';
15395          var secondColumnStart = 30;
15396
15397          for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {
15398            var oldHookName = hookTypesDev[i];
15399            var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;
15400            var row = i + 1 + ". " + oldHookName; // Extra space so second column lines up
15401            // lol @ IE not supporting String#repeat
15402
15403            while (row.length < secondColumnStart) {
15404              row += ' ';
15405            }
15406
15407            row += newHookName + '\n';
15408            table += row;
15409          }
15410
15411          error('React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://reactjs.org/link/rules-of-hooks\n\n' + '   Previous render            Next render\n' + '   ------------------------------------------------------\n' + '%s' + '   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n', componentName, table);
15412        }
15413      }
15414    }
15415  }
15416
15417  function throwInvalidHookError() {
15418    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.');
15419  }
15420
15421  function areHookInputsEqual(nextDeps, prevDeps) {
15422    {
15423      if (ignorePreviousDependencies) {
15424        // Only true when this component is being hot reloaded.
15425        return false;
15426      }
15427    }
15428
15429    if (prevDeps === null) {
15430      {
15431        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);
15432      }
15433
15434      return false;
15435    }
15436
15437    {
15438      // Don't bother comparing lengths in prod because these arrays should be
15439      // passed inline.
15440      if (nextDeps.length !== prevDeps.length) {
15441        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, "[" + prevDeps.join(', ') + "]", "[" + nextDeps.join(', ') + "]");
15442      }
15443    }
15444
15445    for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
15446      if (objectIs(nextDeps[i], prevDeps[i])) {
15447        continue;
15448      }
15449
15450      return false;
15451    }
15452
15453    return true;
15454  }
15455
15456  function renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderLanes) {
15457    renderLanes = nextRenderLanes;
15458    currentlyRenderingFiber$1 = workInProgress;
15459
15460    {
15461      hookTypesDev = current !== null ? current._debugHookTypes : null;
15462      hookTypesUpdateIndexDev = -1; // Used for hot reloading:
15463
15464      ignorePreviousDependencies = current !== null && current.type !== workInProgress.type;
15465    }
15466
15467    workInProgress.memoizedState = null;
15468    workInProgress.updateQueue = null;
15469    workInProgress.lanes = NoLanes; // The following should have already been reset
15470    // currentHook = null;
15471    // workInProgressHook = null;
15472    // didScheduleRenderPhaseUpdate = false;
15473    // localIdCounter = 0;
15474    // TODO Warn if no hooks are used at all during mount, then some are used during update.
15475    // Currently we will identify the update render as a mount because memoizedState === null.
15476    // This is tricky because it's valid for certain types of components (e.g. React.lazy)
15477    // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used.
15478    // Non-stateful hooks (e.g. context) don't get added to memoizedState,
15479    // so memoizedState would be null during updates and mounts.
15480
15481    {
15482      if (current !== null && current.memoizedState !== null) {
15483        ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV;
15484      } else if (hookTypesDev !== null) {
15485        // This dispatcher handles an edge case where a component is updating,
15486        // but no stateful hooks have been used.
15487        // We want to match the production code behavior (which will use HooksDispatcherOnMount),
15488        // but with the extra DEV validation to ensure hooks ordering hasn't changed.
15489        // This dispatcher does that.
15490        ReactCurrentDispatcher$1.current = HooksDispatcherOnMountWithHookTypesInDEV;
15491      } else {
15492        ReactCurrentDispatcher$1.current = HooksDispatcherOnMountInDEV;
15493      }
15494    }
15495
15496    var children = Component(props, secondArg); // Check if there was a render phase update
15497
15498    if (didScheduleRenderPhaseUpdateDuringThisPass) {
15499      // Keep rendering in a loop for as long as render phase updates continue to
15500      // be scheduled. Use a counter to prevent infinite loops.
15501      var numberOfReRenders = 0;
15502
15503      do {
15504        didScheduleRenderPhaseUpdateDuringThisPass = false;
15505        localIdCounter = 0;
15506
15507        if (numberOfReRenders >= RE_RENDER_LIMIT) {
15508          throw new Error('Too many re-renders. React limits the number of renders to prevent ' + 'an infinite loop.');
15509        }
15510
15511        numberOfReRenders += 1;
15512
15513        {
15514          // Even when hot reloading, allow dependencies to stabilize
15515          // after first render to prevent infinite render phase updates.
15516          ignorePreviousDependencies = false;
15517        } // Start over from the beginning of the list
15518
15519
15520        currentHook = null;
15521        workInProgressHook = null;
15522        workInProgress.updateQueue = null;
15523
15524        {
15525          // Also validate hook order for cascading updates.
15526          hookTypesUpdateIndexDev = -1;
15527        }
15528
15529        ReactCurrentDispatcher$1.current =  HooksDispatcherOnRerenderInDEV ;
15530        children = Component(props, secondArg);
15531      } while (didScheduleRenderPhaseUpdateDuringThisPass);
15532    } // We can assume the previous dispatcher is always this one, since we set it
15533    // at the beginning of the render phase and there's no re-entrance.
15534
15535
15536    ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
15537
15538    {
15539      workInProgress._debugHookTypes = hookTypesDev;
15540    } // This check uses currentHook so that it works the same in DEV and prod bundles.
15541    // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.
15542
15543
15544    var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;
15545    renderLanes = NoLanes;
15546    currentlyRenderingFiber$1 = null;
15547    currentHook = null;
15548    workInProgressHook = null;
15549
15550    {
15551      currentHookNameInDev = null;
15552      hookTypesDev = null;
15553      hookTypesUpdateIndexDev = -1; // Confirm that a static flag was not added or removed since the last
15554      // render. If this fires, it suggests that we incorrectly reset the static
15555      // flags in some other part of the codebase. This has happened before, for
15556      // example, in the SuspenseList implementation.
15557
15558      if (current !== null && (current.flags & StaticMask) !== (workInProgress.flags & StaticMask) && // Disable this warning in legacy mode, because legacy Suspense is weird
15559      // and creates false positives. To make this work in legacy mode, we'd
15560      // need to mark fibers that commit in an incomplete state, somehow. For
15561      // now I'll disable the warning that most of the bugs that would trigger
15562      // it are either exclusive to concurrent mode or exist in both.
15563      (current.mode & ConcurrentMode) !== NoMode) {
15564        error('Internal React error: Expected static flag was missing. Please ' + 'notify the React team.');
15565      }
15566    }
15567
15568    didScheduleRenderPhaseUpdate = false; // This is reset by checkDidRenderIdHook
15569    // localIdCounter = 0;
15570
15571    if (didRenderTooFewHooks) {
15572      throw new Error('Rendered fewer hooks than expected. This may be caused by an accidental ' + 'early return statement.');
15573    }
15574
15575    return children;
15576  }
15577  function checkDidRenderIdHook() {
15578    // This should be called immediately after every renderWithHooks call.
15579    // Conceptually, it's part of the return value of renderWithHooks; it's only a
15580    // separate function to avoid using an array tuple.
15581    var didRenderIdHook = localIdCounter !== 0;
15582    localIdCounter = 0;
15583    return didRenderIdHook;
15584  }
15585  function bailoutHooks(current, workInProgress, lanes) {
15586    workInProgress.updateQueue = current.updateQueue; // TODO: Don't need to reset the flags here, because they're reset in the
15587    // complete phase (bubbleProperties).
15588
15589    if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
15590      workInProgress.flags &= ~(MountPassiveDev | MountLayoutDev | Passive | Update);
15591    } else {
15592      workInProgress.flags &= ~(Passive | Update);
15593    }
15594
15595    current.lanes = removeLanes(current.lanes, lanes);
15596  }
15597  function resetHooksAfterThrow() {
15598    // We can assume the previous dispatcher is always this one, since we set it
15599    // at the beginning of the render phase and there's no re-entrance.
vendor: 11,583 bytes, lines 15600-15954
15600    ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
15601
15602    if (didScheduleRenderPhaseUpdate) {
15603      // There were render phase updates. These are only valid for this render
15604      // phase, which we are now aborting. Remove the updates from the queues so
15605      // they do not persist to the next render. Do not remove updates from hooks
15606      // that weren't processed.
15607      //
15608      // Only reset the updates from the queue if it has a clone. If it does
15609      // not have a clone, that means it wasn't processed, and the updates were
15610      // scheduled before we entered the render phase.
15611      var hook = currentlyRenderingFiber$1.memoizedState;
15612
15613      while (hook !== null) {
15614        var queue = hook.queue;
15615
15616        if (queue !== null) {
15617          queue.pending = null;
15618        }
15619
15620        hook = hook.next;
15621      }
15622
15623      didScheduleRenderPhaseUpdate = false;
15624    }
15625
15626    renderLanes = NoLanes;
15627    currentlyRenderingFiber$1 = null;
15628    currentHook = null;
15629    workInProgressHook = null;
15630
15631    {
15632      hookTypesDev = null;
15633      hookTypesUpdateIndexDev = -1;
15634      currentHookNameInDev = null;
15635      isUpdatingOpaqueValueInRenderPhase = false;
15636    }
15637
15638    didScheduleRenderPhaseUpdateDuringThisPass = false;
15639    localIdCounter = 0;
15640  }
15641
15642  function mountWorkInProgressHook() {
15643    var hook = {
15644      memoizedState: null,
15645      baseState: null,
15646      baseQueue: null,
15647      queue: null,
15648      next: null
15649    };
15650
15651    if (workInProgressHook === null) {
15652      // This is the first hook in the list
15653      currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook;
15654    } else {
15655      // Append to the end of the list
15656      workInProgressHook = workInProgressHook.next = hook;
15657    }
15658
15659    return workInProgressHook;
15660  }
15661
15662  function updateWorkInProgressHook() {
15663    // This function is used both for updates and for re-renders triggered by a
15664    // render phase update. It assumes there is either a current hook we can
15665    // clone, or a work-in-progress hook from a previous render pass that we can
15666    // use as a base. When we reach the end of the base list, we must switch to
15667    // the dispatcher used for mounts.
15668    var nextCurrentHook;
15669
15670    if (currentHook === null) {
15671      var current = currentlyRenderingFiber$1.alternate;
15672
15673      if (current !== null) {
15674        nextCurrentHook = current.memoizedState;
15675      } else {
15676        nextCurrentHook = null;
15677      }
15678    } else {
15679      nextCurrentHook = currentHook.next;
15680    }
15681
15682    var nextWorkInProgressHook;
15683
15684    if (workInProgressHook === null) {
15685      nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState;
15686    } else {
15687      nextWorkInProgressHook = workInProgressHook.next;
15688    }
15689
15690    if (nextWorkInProgressHook !== null) {
15691      // There's already a work-in-progress. Reuse it.
15692      workInProgressHook = nextWorkInProgressHook;
15693      nextWorkInProgressHook = workInProgressHook.next;
15694      currentHook = nextCurrentHook;
15695    } else {
15696      // Clone from the current hook.
15697      if (nextCurrentHook === null) {
15698        throw new Error('Rendered more hooks than during the previous render.');
15699      }
15700
15701      currentHook = nextCurrentHook;
15702      var newHook = {
15703        memoizedState: currentHook.memoizedState,
15704        baseState: currentHook.baseState,
15705        baseQueue: currentHook.baseQueue,
15706        queue: currentHook.queue,
15707        next: null
15708      };
15709
15710      if (workInProgressHook === null) {
15711        // This is the first hook in the list.
15712        currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook;
15713      } else {
15714        // Append to the end of the list.
15715        workInProgressHook = workInProgressHook.next = newHook;
15716      }
15717    }
15718
15719    return workInProgressHook;
15720  }
15721
15722  function createFunctionComponentUpdateQueue() {
15723    return {
15724      lastEffect: null,
15725      stores: null
15726    };
15727  }
15728
15729  function basicStateReducer(state, action) {
15730    // $FlowFixMe: Flow doesn't like mixed types
15731    return typeof action === 'function' ? action(state) : action;
15732  }
15733
15734  function mountReducer(reducer, initialArg, init) {
15735    var hook = mountWorkInProgressHook();
15736    var initialState;
15737
15738    if (init !== undefined) {
15739      initialState = init(initialArg);
15740    } else {
15741      initialState = initialArg;
15742    }
15743
15744    hook.memoizedState = hook.baseState = initialState;
15745    var queue = {
15746      pending: null,
15747      interleaved: null,
15748      lanes: NoLanes,
15749      dispatch: null,
15750      lastRenderedReducer: reducer,
15751      lastRenderedState: initialState
15752    };
15753    hook.queue = queue;
15754    var dispatch = queue.dispatch = dispatchReducerAction.bind(null, currentlyRenderingFiber$1, queue);
15755    return [hook.memoizedState, dispatch];
15756  }
15757
15758  function updateReducer(reducer, initialArg, init) {
15759    var hook = updateWorkInProgressHook();
15760    var queue = hook.queue;
15761
15762    if (queue === null) {
15763      throw new Error('Should have a queue. This is likely a bug in React. Please file an issue.');
15764    }
15765
15766    queue.lastRenderedReducer = reducer;
15767    var current = currentHook; // The last rebase update that is NOT part of the base state.
15768
15769    var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet.
15770
15771    var pendingQueue = queue.pending;
15772
15773    if (pendingQueue !== null) {
15774      // We have new updates that haven't been processed yet.
15775      // We'll add them to the base queue.
15776      if (baseQueue !== null) {
15777        // Merge the pending queue and the base queue.
15778        var baseFirst = baseQueue.next;
15779        var pendingFirst = pendingQueue.next;
15780        baseQueue.next = pendingFirst;
15781        pendingQueue.next = baseFirst;
15782      }
15783
15784      {
15785        if (current.baseQueue !== baseQueue) {
15786          // Internal invariant that should never happen, but feasibly could in
15787          // the future if we implement resuming, or some form of that.
15788          error('Internal error: Expected work-in-progress queue to be a clone. ' + 'This is a bug in React.');
15789        }
15790      }
15791
15792      current.baseQueue = baseQueue = pendingQueue;
15793      queue.pending = null;
15794    }
15795
15796    if (baseQueue !== null) {
15797      // We have a queue to process.
15798      var first = baseQueue.next;
15799      var newState = current.baseState;
15800      var newBaseState = null;
15801      var newBaseQueueFirst = null;
15802      var newBaseQueueLast = null;
15803      var update = first;
15804
15805      do {
15806        var updateLane = update.lane;
15807
15808        if (!isSubsetOfLanes(renderLanes, updateLane)) {
15809          // Priority is insufficient. Skip this update. If this is the first
15810          // skipped update, the previous update/state is the new base
15811          // update/state.
15812          var clone = {
15813            lane: updateLane,
15814            action: update.action,
15815            hasEagerState: update.hasEagerState,
15816            eagerState: update.eagerState,
15817            next: null
15818          };
15819
15820          if (newBaseQueueLast === null) {
15821            newBaseQueueFirst = newBaseQueueLast = clone;
15822            newBaseState = newState;
15823          } else {
15824            newBaseQueueLast = newBaseQueueLast.next = clone;
15825          } // Update the remaining priority in the queue.
15826          // TODO: Don't need to accumulate this. Instead, we can remove
15827          // renderLanes from the original lanes.
15828
15829
15830          currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, updateLane);
15831          markSkippedUpdateLanes(updateLane);
15832        } else {
15833          // This update does have sufficient priority.
15834          if (newBaseQueueLast !== null) {
15835            var _clone = {
15836              // This update is going to be committed so we never want uncommit
15837              // it. Using NoLane works because 0 is a subset of all bitmasks, so
15838              // this will never be skipped by the check above.
15839              lane: NoLane,
15840              action: update.action,
15841              hasEagerState: update.hasEagerState,
15842              eagerState: update.eagerState,
15843              next: null
15844            };
15845            newBaseQueueLast = newBaseQueueLast.next = _clone;
15846          } // Process this update.
15847
15848
15849          if (update.hasEagerState) {
15850            // If this update is a state update (not a reducer) and was processed eagerly,
15851            // we can use the eagerly computed state
15852            newState = update.eagerState;
15853          } else {
15854            var action = update.action;
15855            newState = reducer(newState, action);
15856          }
15857        }
15858
15859        update = update.next;
15860      } while (update !== null && update !== first);
15861
15862      if (newBaseQueueLast === null) {
15863        newBaseState = newState;
15864      } else {
15865        newBaseQueueLast.next = newBaseQueueFirst;
15866      } // Mark that the fiber performed work, but only if the new state is
15867      // different from the current state.
15868
15869
15870      if (!objectIs(newState, hook.memoizedState)) {
15871        markWorkInProgressReceivedUpdate();
15872      }
15873
15874      hook.memoizedState = newState;
15875      hook.baseState = newBaseState;
15876      hook.baseQueue = newBaseQueueLast;
15877      queue.lastRenderedState = newState;
15878    } // Interleaved updates are stored on a separate queue. We aren't going to
15879    // process them during this render, but we do need to track which lanes
15880    // are remaining.
15881
15882
15883    var lastInterleaved = queue.interleaved;
15884
15885    if (lastInterleaved !== null) {
15886      var interleaved = lastInterleaved;
15887
15888      do {
15889        var interleavedLane = interleaved.lane;
15890        currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, interleavedLane);
15891        markSkippedUpdateLanes(interleavedLane);
15892        interleaved = interleaved.next;
15893      } while (interleaved !== lastInterleaved);
15894    } else if (baseQueue === null) {
15895      // `queue.lanes` is used for entangling transitions. We can set it back to
15896      // zero once the queue is empty.
15897      queue.lanes = NoLanes;
15898    }
15899
15900    var dispatch = queue.dispatch;
15901    return [hook.memoizedState, dispatch];
15902  }
15903
15904  function rerenderReducer(reducer, initialArg, init) {
15905    var hook = updateWorkInProgressHook();
15906    var queue = hook.queue;
15907
15908    if (queue === null) {
15909      throw new Error('Should have a queue. This is likely a bug in React. Please file an issue.');
15910    }
15911
15912    queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous
15913    // work-in-progress hook.
15914
15915    var dispatch = queue.dispatch;
15916    var lastRenderPhaseUpdate = queue.pending;
15917    var newState = hook.memoizedState;
15918
15919    if (lastRenderPhaseUpdate !== null) {
15920      // The queue doesn't persist past this render pass.
15921      queue.pending = null;
15922      var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next;
15923      var update = firstRenderPhaseUpdate;
15924
15925      do {
15926        // Process this render phase update. We don't have to check the
15927        // priority because it will always be the same as the current
15928        // render's.
15929        var action = update.action;
15930        newState = reducer(newState, action);
15931        update = update.next;
15932      } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is
15933      // different from the current state.
15934
15935
15936      if (!objectIs(newState, hook.memoizedState)) {
15937        markWorkInProgressReceivedUpdate();
15938      }
15939
15940      hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to
15941      // the base state unless the queue is empty.
15942      // TODO: Not sure if this is the desired semantics, but it's what we
15943      // do for gDSFP. I can't remember why.
15944
15945      if (hook.baseQueue === null) {
15946        hook.baseState = newState;
15947      }
15948
15949      queue.lastRenderedState = newState;
15950    }
15951
15952    return [newState, dispatch];
15953  }
15954
15955  function mountMutableSource(source, getSnapshot, subscribe) {
15956    {
15957      return undefined;
15958    }
15959  }
15960
15961  function updateMutableSource(source, getSnapshot, subscribe) {
15962    {
15963      return undefined;
15964    }
15965  }
15966
15967  function mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
15968    var fiber = currentlyRenderingFiber$1;
15969    var hook = mountWorkInProgressHook();
15970    var nextSnapshot;
15971    var isHydrating = getIsHydrating();
15972
15973    if (isHydrating) {
15974      if (getServerSnapshot === undefined) {
15975        throw new Error('Missing getServerSnapshot, which is required for ' + 'server-rendered content. Will revert to client rendering.');
15976      }
15977
15978      nextSnapshot = getServerSnapshot();
15979
15980      {
15981        if (!didWarnUncachedGetSnapshot) {
15982          if (nextSnapshot !== getServerSnapshot()) {
15983            error('The result of getServerSnapshot should be cached to avoid an infinite loop');
15984
15985            didWarnUncachedGetSnapshot = true;
15986          }
15987        }
15988      }
15989    } else {
15990      nextSnapshot = getSnapshot();
15991
15992      {
15993        if (!didWarnUncachedGetSnapshot) {
15994          var cachedSnapshot = getSnapshot();
15995
15996          if (!objectIs(nextSnapshot, cachedSnapshot)) {
15997            error('The result of getSnapshot should be cached to avoid an infinite loop');
15998
15999            didWarnUncachedGetSnapshot = true;
16000          }
16001        }
16002      } // Unless we're rendering a blocking lane, schedule a consistency check.
16003      // Right before committing, we will walk the tree and check if any of the
16004      // stores were mutated.
16005      //
16006      // We won't do this if we're hydrating server-rendered content, because if
16007      // the content is stale, it's already visible anyway. Instead we'll patch
16008      // it up in a passive effect.
16009
16010
16011      var root = getWorkInProgressRoot();
16012
16013      if (root === null) {
16014        throw new Error('Expected a work-in-progress root. This is a bug in React. Please file an issue.');
16015      }
16016
16017      if (!includesBlockingLane(root, renderLanes)) {
16018        pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot);
16019      }
16020    } // Read the current snapshot from the store on every render. This breaks the
16021    // normal rules of React, and only works because store updates are
16022    // always synchronous.
16023
16024
16025    hook.memoizedState = nextSnapshot;
16026    var inst = {
16027      value: nextSnapshot,
16028      getSnapshot: getSnapshot
16029    };
16030    hook.queue = inst; // Schedule an effect to subscribe to the store.
16031
16032    mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [subscribe]); // Schedule an effect to update the mutable instance fields. We will update
16033    // this whenever subscribe, getSnapshot, or value changes. Because there's no
16034    // clean-up function, and we track the deps correctly, we can call pushEffect
16035    // directly, without storing any additional state. For the same reason, we
16036    // don't need to set a static flag, either.
16037    // TODO: We can move this to the passive phase once we add a pre-commit
16038    // consistency check. See the next comment.
16039
16040    fiber.flags |= Passive;
16041    pushEffect(HasEffect | Passive$1, updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot), undefined, null);
16042    return nextSnapshot;
16043  }
16044
16045  function updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
16046    var fiber = currentlyRenderingFiber$1;
16047    var hook = updateWorkInProgressHook(); // Read the current snapshot from the store on every render. This breaks the
vendor: 13,532 bytes, lines 16048-16478
16048    // normal rules of React, and only works because store updates are
16049    // always synchronous.
16050
16051    var nextSnapshot = getSnapshot();
16052
16053    {
16054      if (!didWarnUncachedGetSnapshot) {
16055        var cachedSnapshot = getSnapshot();
16056
16057        if (!objectIs(nextSnapshot, cachedSnapshot)) {
16058          error('The result of getSnapshot should be cached to avoid an infinite loop');
16059
16060          didWarnUncachedGetSnapshot = true;
16061        }
16062      }
16063    }
16064
16065    var prevSnapshot = hook.memoizedState;
16066    var snapshotChanged = !objectIs(prevSnapshot, nextSnapshot);
16067
16068    if (snapshotChanged) {
16069      hook.memoizedState = nextSnapshot;
16070      markWorkInProgressReceivedUpdate();
16071    }
16072
16073    var inst = hook.queue;
16074    updateEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [subscribe]); // Whenever getSnapshot or subscribe changes, we need to check in the
16075    // commit phase if there was an interleaved mutation. In concurrent mode
16076    // this can happen all the time, but even in synchronous mode, an earlier
16077    // effect may have mutated the store.
16078
16079    if (inst.getSnapshot !== getSnapshot || snapshotChanged || // Check if the susbcribe function changed. We can save some memory by
16080    // checking whether we scheduled a subscription effect above.
16081    workInProgressHook !== null && workInProgressHook.memoizedState.tag & HasEffect) {
16082      fiber.flags |= Passive;
16083      pushEffect(HasEffect | Passive$1, updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot), undefined, null); // Unless we're rendering a blocking lane, schedule a consistency check.
16084      // Right before committing, we will walk the tree and check if any of the
16085      // stores were mutated.
16086
16087      var root = getWorkInProgressRoot();
16088
16089      if (root === null) {
16090        throw new Error('Expected a work-in-progress root. This is a bug in React. Please file an issue.');
16091      }
16092
16093      if (!includesBlockingLane(root, renderLanes)) {
16094        pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot);
16095      }
16096    }
16097
16098    return nextSnapshot;
16099  }
16100
16101  function pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {
16102    fiber.flags |= StoreConsistency;
16103    var check = {
16104      getSnapshot: getSnapshot,
16105      value: renderedSnapshot
16106    };
16107    var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;
16108
16109    if (componentUpdateQueue === null) {
16110      componentUpdateQueue = createFunctionComponentUpdateQueue();
16111      currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;
16112      componentUpdateQueue.stores = [check];
16113    } else {
16114      var stores = componentUpdateQueue.stores;
16115
16116      if (stores === null) {
16117        componentUpdateQueue.stores = [check];
16118      } else {
16119        stores.push(check);
16120      }
16121    }
16122  }
16123
16124  function updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {
16125    // These are updated in the passive phase
16126    inst.value = nextSnapshot;
16127    inst.getSnapshot = getSnapshot; // Something may have been mutated in between render and commit. This could
16128    // have been in an event that fired before the passive effects, or it could
16129    // have been in a layout effect. In that case, we would have used the old
16130    // snapsho and getSnapshot values to bail out. We need to check one more time.
16131
16132    if (checkIfSnapshotChanged(inst)) {
16133      // Force a re-render.
16134      forceStoreRerender(fiber);
16135    }
16136  }
16137
16138  function subscribeToStore(fiber, inst, subscribe) {
16139    var handleStoreChange = function () {
16140      // The store changed. Check if the snapshot changed since the last time we
16141      // read from the store.
16142      if (checkIfSnapshotChanged(inst)) {
16143        // Force a re-render.
16144        forceStoreRerender(fiber);
16145      }
16146    }; // Subscribe to the store and return a clean-up function.
16147
16148
16149    return subscribe(handleStoreChange);
16150  }
16151
16152  function checkIfSnapshotChanged(inst) {
16153    var latestGetSnapshot = inst.getSnapshot;
16154    var prevValue = inst.value;
16155
16156    try {
16157      var nextValue = latestGetSnapshot();
16158      return !objectIs(prevValue, nextValue);
16159    } catch (error) {
16160      return true;
16161    }
16162  }
16163
16164  function forceStoreRerender(fiber) {
16165    var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
16166
16167    if (root !== null) {
16168      scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
16169    }
16170  }
16171
16172  function mountState(initialState) {
16173    var hook = mountWorkInProgressHook();
16174
16175    if (typeof initialState === 'function') {
16176      // $FlowFixMe: Flow doesn't like mixed types
16177      initialState = initialState();
16178    }
16179
16180    hook.memoizedState = hook.baseState = initialState;
16181    var queue = {
16182      pending: null,
16183      interleaved: null,
16184      lanes: NoLanes,
16185      dispatch: null,
16186      lastRenderedReducer: basicStateReducer,
16187      lastRenderedState: initialState
16188    };
16189    hook.queue = queue;
16190    var dispatch = queue.dispatch = dispatchSetState.bind(null, currentlyRenderingFiber$1, queue);
16191    return [hook.memoizedState, dispatch];
16192  }
16193
16194  function updateState(initialState) {
16195    return updateReducer(basicStateReducer);
16196  }
16197
16198  function rerenderState(initialState) {
16199    return rerenderReducer(basicStateReducer);
16200  }
16201
16202  function pushEffect(tag, create, destroy, deps) {
16203    var effect = {
16204      tag: tag,
16205      create: create,
16206      destroy: destroy,
16207      deps: deps,
16208      // Circular
16209      next: null
16210    };
16211    var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;
16212
16213    if (componentUpdateQueue === null) {
16214      componentUpdateQueue = createFunctionComponentUpdateQueue();
16215      currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;
16216      componentUpdateQueue.lastEffect = effect.next = effect;
16217    } else {
16218      var lastEffect = componentUpdateQueue.lastEffect;
16219
16220      if (lastEffect === null) {
16221        componentUpdateQueue.lastEffect = effect.next = effect;
16222      } else {
16223        var firstEffect = lastEffect.next;
16224        lastEffect.next = effect;
16225        effect.next = firstEffect;
16226        componentUpdateQueue.lastEffect = effect;
16227      }
16228    }
16229
16230    return effect;
16231  }
16232
16233  function mountRef(initialValue) {
16234    var hook = mountWorkInProgressHook();
16235
16236    {
16237      var _ref2 = {
16238        current: initialValue
16239      };
16240      hook.memoizedState = _ref2;
16241      return _ref2;
16242    }
16243  }
16244
16245  function updateRef(initialValue) {
16246    var hook = updateWorkInProgressHook();
16247    return hook.memoizedState;
16248  }
16249
16250  function mountEffectImpl(fiberFlags, hookFlags, create, deps) {
16251    var hook = mountWorkInProgressHook();
16252    var nextDeps = deps === undefined ? null : deps;
16253    currentlyRenderingFiber$1.flags |= fiberFlags;
16254    hook.memoizedState = pushEffect(HasEffect | hookFlags, create, undefined, nextDeps);
16255  }
16256
16257  function updateEffectImpl(fiberFlags, hookFlags, create, deps) {
16258    var hook = updateWorkInProgressHook();
16259    var nextDeps = deps === undefined ? null : deps;
16260    var destroy = undefined;
16261
16262    if (currentHook !== null) {
16263      var prevEffect = currentHook.memoizedState;
16264      destroy = prevEffect.destroy;
16265
16266      if (nextDeps !== null) {
16267        var prevDeps = prevEffect.deps;
16268
16269        if (areHookInputsEqual(nextDeps, prevDeps)) {
16270          hook.memoizedState = pushEffect(hookFlags, create, destroy, nextDeps);
16271          return;
16272        }
16273      }
16274    }
16275
16276    currentlyRenderingFiber$1.flags |= fiberFlags;
16277    hook.memoizedState = pushEffect(HasEffect | hookFlags, create, destroy, nextDeps);
16278  }
16279
16280  function mountEffect(create, deps) {
16281    if ( (currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
16282      return mountEffectImpl(MountPassiveDev | Passive | PassiveStatic, Passive$1, create, deps);
16283    } else {
16284      return mountEffectImpl(Passive | PassiveStatic, Passive$1, create, deps);
16285    }
16286  }
16287
16288  function updateEffect(create, deps) {
16289    return updateEffectImpl(Passive, Passive$1, create, deps);
16290  }
16291
16292  function mountInsertionEffect(create, deps) {
16293    return mountEffectImpl(Update, Insertion, create, deps);
16294  }
16295
16296  function updateInsertionEffect(create, deps) {
16297    return updateEffectImpl(Update, Insertion, create, deps);
16298  }
16299
16300  function mountLayoutEffect(create, deps) {
16301    var fiberFlags = Update;
16302
16303    {
16304      fiberFlags |= LayoutStatic;
16305    }
16306
16307    if ( (currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
16308      fiberFlags |= MountLayoutDev;
16309    }
16310
16311    return mountEffectImpl(fiberFlags, Layout, create, deps);
16312  }
16313
16314  function updateLayoutEffect(create, deps) {
16315    return updateEffectImpl(Update, Layout, create, deps);
16316  }
16317
16318  function imperativeHandleEffect(create, ref) {
16319    if (typeof ref === 'function') {
16320      var refCallback = ref;
16321
16322      var _inst = create();
16323
16324      refCallback(_inst);
16325      return function () {
16326        refCallback(null);
16327      };
16328    } else if (ref !== null && ref !== undefined) {
16329      var refObject = ref;
16330
16331      {
16332        if (!refObject.hasOwnProperty('current')) {
16333          error('Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}');
16334        }
16335      }
16336
16337      var _inst2 = create();
16338
16339      refObject.current = _inst2;
16340      return function () {
16341        refObject.current = null;
16342      };
16343    }
16344  }
16345
16346  function mountImperativeHandle(ref, create, deps) {
16347    {
16348      if (typeof create !== 'function') {
16349        error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');
16350      }
16351    } // TODO: If deps are provided, should we skip comparing the ref itself?
16352
16353
16354    var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
16355    var fiberFlags = Update;
16356
16357    {
16358      fiberFlags |= LayoutStatic;
16359    }
16360
16361    if ( (currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
16362      fiberFlags |= MountLayoutDev;
16363    }
16364
16365    return mountEffectImpl(fiberFlags, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
16366  }
16367
16368  function updateImperativeHandle(ref, create, deps) {
16369    {
16370      if (typeof create !== 'function') {
16371        error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');
16372      }
16373    } // TODO: If deps are provided, should we skip comparing the ref itself?
16374
16375
16376    var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
16377    return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
16378  }
16379
16380  function mountDebugValue(value, formatterFn) {// This hook is normally a no-op.
16381    // The react-debug-hooks package injects its own implementation
16382    // so that e.g. DevTools can display custom hook values.
16383  }
16384
16385  var updateDebugValue = mountDebugValue;
16386
16387  function mountCallback(callback, deps) {
16388    var hook = mountWorkInProgressHook();
16389    var nextDeps = deps === undefined ? null : deps;
16390    hook.memoizedState = [callback, nextDeps];
16391    return callback;
16392  }
16393
16394  function updateCallback(callback, deps) {
16395    var hook = updateWorkInProgressHook();
16396    var nextDeps = deps === undefined ? null : deps;
16397    var prevState = hook.memoizedState;
16398
16399    if (prevState !== null) {
16400      if (nextDeps !== null) {
16401        var prevDeps = prevState[1];
16402
16403        if (areHookInputsEqual(nextDeps, prevDeps)) {
16404          return prevState[0];
16405        }
16406      }
16407    }
16408
16409    hook.memoizedState = [callback, nextDeps];
16410    return callback;
16411  }
16412
16413  function mountMemo(nextCreate, deps) {
16414    var hook = mountWorkInProgressHook();
16415    var nextDeps = deps === undefined ? null : deps;
16416    var nextValue = nextCreate();
16417    hook.memoizedState = [nextValue, nextDeps];
16418    return nextValue;
16419  }
16420
16421  function updateMemo(nextCreate, deps) {
16422    var hook = updateWorkInProgressHook();
16423    var nextDeps = deps === undefined ? null : deps;
16424    var prevState = hook.memoizedState;
16425
16426    if (prevState !== null) {
16427      // Assume these are defined. If they're not, areHookInputsEqual will warn.
16428      if (nextDeps !== null) {
16429        var prevDeps = prevState[1];
16430
16431        if (areHookInputsEqual(nextDeps, prevDeps)) {
16432          return prevState[0];
16433        }
16434      }
16435    }
16436
16437    var nextValue = nextCreate();
16438    hook.memoizedState = [nextValue, nextDeps];
16439    return nextValue;
16440  }
16441
16442  function mountDeferredValue(value) {
16443    var hook = mountWorkInProgressHook();
16444    hook.memoizedState = value;
16445    return value;
16446  }
16447
16448  function updateDeferredValue(value) {
16449    var hook = updateWorkInProgressHook();
16450    var resolvedCurrentHook = currentHook;
16451    var prevValue = resolvedCurrentHook.memoizedState;
16452    return updateDeferredValueImpl(hook, prevValue, value);
16453  }
16454
16455  function rerenderDeferredValue(value) {
16456    var hook = updateWorkInProgressHook();
16457
16458    if (currentHook === null) {
16459      // This is a rerender during a mount.
16460      hook.memoizedState = value;
16461      return value;
16462    } else {
16463      // This is a rerender during an update.
16464      var prevValue = currentHook.memoizedState;
16465      return updateDeferredValueImpl(hook, prevValue, value);
16466    }
16467  }
16468
16469  function updateDeferredValueImpl(hook, prevValue, value) {
16470    var shouldDeferValue = !includesOnlyNonUrgentLanes(renderLanes);
16471
16472    if (shouldDeferValue) {
16473      // This is an urgent update. If the value has changed, keep using the
16474      // previous value and spawn a deferred render to update it later.
16475      if (!objectIs(value, prevValue)) {
16476        // Schedule a deferred render
16477        var deferredLane = claimNextTransitionLane();
16478        currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, deferredLane);
16479        markSkippedUpdateLanes(deferredLane); // Set this to true to indicate that the rendered value is inconsistent
16480        // from the latest value. The name "baseState" doesn't really match how we
16481        // use it because we're reusing a state hook field instead of creating a
16482        // new one.
16483
16484        hook.baseState = true;
16485      } // Reuse the previous value
16486
16487
16488      return prevValue;
16489    } else {
16490      // This is not an urgent update, so we can use the latest value regardless
16491      // of what it is. No need to defer it.
16492      // However, if we're currently inside a spawned render, then we need to mark
16493      // this as an update to prevent the fiber from bailing out.
16494      //
16495      // `baseState` is true when the current value is different from the rendered
16496      // value. The name doesn't really match how we use it because we're reusing
16497      // a state hook field instead of creating a new one.
16498      if (hook.baseState) {
16499        // Flip this back to false.
16500        hook.baseState = false;
16501        markWorkInProgressReceivedUpdate();
16502      }
16503
16504      hook.memoizedState = value;
16505      return value;
16506    }
16507  }
16508
16509  function startTransition(setPending, callback, options) {
16510    var previousPriority = getCurrentUpdatePriority();
16511    setCurrentUpdatePriority(higherEventPriority(previousPriority, ContinuousEventPriority));
16512    setPending(true);
16513    var prevTransition = ReactCurrentBatchConfig$2.transition;
16514    ReactCurrentBatchConfig$2.transition = {};
16515    var currentTransition = ReactCurrentBatchConfig$2.transition;
16516
16517    {
16518      ReactCurrentBatchConfig$2.transition._updatedFibers = new Set();
16519    }
16520
16521    try {
16522      setPending(false);
16523      callback();
16524    } finally {
16525      setCurrentUpdatePriority(previousPriority);
16526      ReactCurrentBatchConfig$2.transition = prevTransition;
16527
16528      {
16529        if (prevTransition === null && currentTransition._updatedFibers) {
16530          var updatedFibersCount = currentTransition._updatedFibers.size;
16531
16532          if (updatedFibersCount > 10) {
16533            warn('Detected a large number of updates inside startTransition. ' + 'If this is due to a subscription please re-write it to use React provided hooks. ' + 'Otherwise concurrent mode guarantees are off the table.');
16534          }
16535
16536          currentTransition._updatedFibers.clear();
16537        }
16538      }
16539    }
16540  }
16541
16542  function mountTransition() {
16543    var _mountState = mountState(false),
16544        isPending = _mountState[0],
16545        setPending = _mountState[1]; // The `start` method never changes.
16546
16547
16548    var start = startTransition.bind(null, setPending);
16549    var hook = mountWorkInProgressHook();
16550    hook.memoizedState = start;
16551    return [isPending, start];
16552  }
16553
16554  function updateTransition() {
16555    var _updateState = updateState(),
16556        isPending = _updateState[0];
16557
16558    var hook = updateWorkInProgressHook();
16559    var start = hook.memoizedState;
16560    return [isPending, start];
16561  }
16562
16563  function rerenderTransition() {
16564    var _rerenderState = rerenderState(),
16565        isPending = _rerenderState[0];
16566
16567    var hook = updateWorkInProgressHook();
16568    var start = hook.memoizedState;
16569    return [isPending, start];
16570  }
16571
16572  var isUpdatingOpaqueValueInRenderPhase = false;
16573  function getIsUpdatingOpaqueValueInRenderPhaseInDEV() {
16574    {
16575      return isUpdatingOpaqueValueInRenderPhase;
16576    }
16577  }
16578
16579  function mountId() {
16580    var hook = mountWorkInProgressHook();
16581    var root = getWorkInProgressRoot(); // TODO: In Fizz, id generation is specific to each server config. Maybe we
16582    // should do this in Fiber, too? Deferring this decision for now because
16583    // there's no other place to store the prefix except for an internal field on
16584    // the public createRoot object, which the fiber tree does not currently have
16585    // a reference to.
16586
16587    var identifierPrefix = root.identifierPrefix;
16588    var id;
16589
16590    if (getIsHydrating()) {
16591      var treeId = getTreeId(); // Use a captial R prefix for server-generated ids.
16592
16593      id = ':' + identifierPrefix + 'R' + treeId; // Unless this is the first id at this level, append a number at the end
16594      // that represents the position of this useId hook among all the useId
16595      // hooks for this fiber.
16596
16597      var localId = localIdCounter++;
16598
16599      if (localId > 0) {
16600        id += 'H' + localId.toString(32);
16601      }
16602
16603      id += ':';
16604    } else {
16605      // Use a lowercase r prefix for client-generated ids.
16606      var globalClientId = globalClientIdCounter++;
16607      id = ':' + identifierPrefix + 'r' + globalClientId.toString(32) + ':';
16608    }
16609
16610    hook.memoizedState = id;
16611    return id;
16612  }
16613
16614  function updateId() {
16615    var hook = updateWorkInProgressHook();
16616    var id = hook.memoizedState;
16617    return id;
16618  }
16619
16620  function dispatchReducerAction(fiber, queue, action) {
16621    {
16622      if (typeof arguments[3] === 'function') {
16623        error("State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().');
16624      }
16625    }
16626
16627    var lane = requestUpdateLane(fiber);
16628    var update = {
16629      lane: lane,
16630      action: action,
16631      hasEagerState: false,
16632      eagerState: null,
16633      next: null
16634    };
16635
16636    if (isRenderPhaseUpdate(fiber)) {
16637      enqueueRenderPhaseUpdate(queue, update);
16638    } else {
16639      var root = enqueueConcurrentHookUpdate(fiber, queue, update, lane);
16640
16641      if (root !== null) {
16642        var eventTime = requestEventTime();
16643        scheduleUpdateOnFiber(root, fiber, lane, eventTime);
16644        entangleTransitionUpdate(root, queue, lane);
16645      }
16646    }
16647
16648    markUpdateInDevTools(fiber, lane);
16649  }
16650
16651  function dispatchSetState(fiber, queue, action) {
16652    {
16653      if (typeof arguments[3] === 'function') {
16654        error("State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().');
16655      }
16656    }
16657
16658    var lane = requestUpdateLane(fiber);
16659    var update = {
16660      lane: lane,
16661      action: action,
16662      hasEagerState: false,
16663      eagerState: null,
16664      next: null
16665    };
16666
16667    if (isRenderPhaseUpdate(fiber)) {
16668      enqueueRenderPhaseUpdate(queue, update);
16669    } else {
16670      var alternate = fiber.alternate;
16671
16672      if (fiber.lanes === NoLanes && (alternate === null || alternate.lanes === NoLanes)) {
16673        // The queue is currently empty, which means we can eagerly compute the
16674        // next state before entering the render phase. If the new state is the
16675        // same as the current state, we may be able to bail out entirely.
16676        var lastRenderedReducer = queue.lastRenderedReducer;
16677
16678        if (lastRenderedReducer !== null) {
16679          var prevDispatcher;
16680
16681          {
16682            prevDispatcher = ReactCurrentDispatcher$1.current;
16683            ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
16684          }
16685
16686          try {
16687            var currentState = queue.lastRenderedState;
16688            var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute
16689            // it, on the update object. If the reducer hasn't changed by the
16690            // time we enter the render phase, then the eager state can be used
16691            // without calling the reducer again.
16692
16693            update.hasEagerState = true;
16694            update.eagerState = eagerState;
16695
16696            if (objectIs(eagerState, currentState)) {
16697              // Fast path. We can bail out without scheduling React to re-render.
16698              // It's still possible that we'll need to rebase this update later,
16699              // if the component re-renders for a different reason and by that
16700              // time the reducer has changed.
16701              // TODO: Do we still need to entangle transitions in this case?
16702              enqueueConcurrentHookUpdateAndEagerlyBailout(fiber, queue, update, lane);
16703              return;
16704            }
16705          } catch (error) {// Suppress the error. It will throw again in the render phase.
16706          } finally {
16707            {
16708              ReactCurrentDispatcher$1.current = prevDispatcher;
16709            }
16710          }
16711        }
16712      }
16713
16714      var root = enqueueConcurrentHookUpdate(fiber, queue, update, lane);
16715
16716      if (root !== null) {
16717        var eventTime = requestEventTime();
16718        scheduleUpdateOnFiber(root, fiber, lane, eventTime);
16719        entangleTransitionUpdate(root, queue, lane);
16720      }
16721    }
16722
16723    markUpdateInDevTools(fiber, lane);
16724  }
16725
16726  function isRenderPhaseUpdate(fiber) {
16727    var alternate = fiber.alternate;
16728    return fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1;
16729  }
16730
16731  function enqueueRenderPhaseUpdate(queue, update) {
16732    // This is a render phase update. Stash it in a lazily-created map of
16733    // queue -> linked list of updates. After this render pass, we'll restart
16734    // and apply the stashed updates on top of the work-in-progress hook.
16735    didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate = true;
16736    var pending = queue.pending;
16737
16738    if (pending === null) {
16739      // This is the first update. Create a circular list.
16740      update.next = update;
16741    } else {
16742      update.next = pending.next;
16743      pending.next = update;
16744    }
16745
16746    queue.pending = update;
16747  } // TODO: Move to ReactFiberConcurrentUpdates?
16748
16749
16750  function entangleTransitionUpdate(root, queue, lane) {
16751    if (isTransitionLane(lane)) {
16752      var queueLanes = queue.lanes; // If any entangled lanes are no longer pending on the root, then they
16753      // must have finished. We can remove them from the shared queue, which
16754      // represents a superset of the actually pending lanes. In some cases we
16755      // may entangle more than we need to, but that's OK. In fact it's worse if
16756      // we *don't* entangle when we should.
16757
16758      queueLanes = intersectLanes(queueLanes, root.pendingLanes); // Entangle the new transition lane with the other transition lanes.
16759
16760      var newQueueLanes = mergeLanes(queueLanes, lane);
16761      queue.lanes = newQueueLanes; // Even if queue.lanes already include lane, we don't know for certain if
16762      // the lane finished since the last time we entangled it. So we need to
16763      // entangle it again, just to be sure.
16764
16765      markRootEntangled(root, newQueueLanes);
16766    }
16767  }
16768
16769  function markUpdateInDevTools(fiber, lane, action) {
16770
16771    {
16772      markStateUpdateScheduled(fiber, lane);
16773    }
16774  }
16775
vendor: 5,150 bytes, lines 16776-16909
16776  var ContextOnlyDispatcher = {
16777    readContext: readContext,
16778    useCallback: throwInvalidHookError,
16779    useContext: throwInvalidHookError,
16780    useEffect: throwInvalidHookError,
16781    useImperativeHandle: throwInvalidHookError,
16782    useInsertionEffect: throwInvalidHookError,
16783    useLayoutEffect: throwInvalidHookError,
16784    useMemo: throwInvalidHookError,
16785    useReducer: throwInvalidHookError,
16786    useRef: throwInvalidHookError,
16787    useState: throwInvalidHookError,
16788    useDebugValue: throwInvalidHookError,
16789    useDeferredValue: throwInvalidHookError,
16790    useTransition: throwInvalidHookError,
16791    useMutableSource: throwInvalidHookError,
16792    useSyncExternalStore: throwInvalidHookError,
16793    useId: throwInvalidHookError,
16794    unstable_isNewReconciler: enableNewReconciler
16795  };
16796
16797  var HooksDispatcherOnMountInDEV = null;
16798  var HooksDispatcherOnMountWithHookTypesInDEV = null;
16799  var HooksDispatcherOnUpdateInDEV = null;
16800  var HooksDispatcherOnRerenderInDEV = null;
16801  var InvalidNestedHooksDispatcherOnMountInDEV = null;
16802  var InvalidNestedHooksDispatcherOnUpdateInDEV = null;
16803  var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
16804
16805  {
16806    var warnInvalidContextAccess = function () {
16807      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().');
16808    };
16809
16810    var warnInvalidHookAccess = function () {
16811      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');
16812    };
16813
16814    HooksDispatcherOnMountInDEV = {
16815      readContext: function (context) {
16816        return readContext(context);
16817      },
16818      useCallback: function (callback, deps) {
16819        currentHookNameInDev = 'useCallback';
16820        mountHookTypesDev();
16821        checkDepsAreArrayDev(deps);
16822        return mountCallback(callback, deps);
16823      },
16824      useContext: function (context) {
16825        currentHookNameInDev = 'useContext';
16826        mountHookTypesDev();
16827        return readContext(context);
16828      },
16829      useEffect: function (create, deps) {
16830        currentHookNameInDev = 'useEffect';
16831        mountHookTypesDev();
16832        checkDepsAreArrayDev(deps);
16833        return mountEffect(create, deps);
16834      },
16835      useImperativeHandle: function (ref, create, deps) {
16836        currentHookNameInDev = 'useImperativeHandle';
16837        mountHookTypesDev();
16838        checkDepsAreArrayDev(deps);
16839        return mountImperativeHandle(ref, create, deps);
16840      },
16841      useInsertionEffect: function (create, deps) {
16842        currentHookNameInDev = 'useInsertionEffect';
16843        mountHookTypesDev();
16844        checkDepsAreArrayDev(deps);
16845        return mountInsertionEffect(create, deps);
16846      },
16847      useLayoutEffect: function (create, deps) {
16848        currentHookNameInDev = 'useLayoutEffect';
16849        mountHookTypesDev();
16850        checkDepsAreArrayDev(deps);
16851        return mountLayoutEffect(create, deps);
16852      },
16853      useMemo: function (create, deps) {
16854        currentHookNameInDev = 'useMemo';
16855        mountHookTypesDev();
16856        checkDepsAreArrayDev(deps);
16857        var prevDispatcher = ReactCurrentDispatcher$1.current;
16858        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16859
16860        try {
16861          return mountMemo(create, deps);
16862        } finally {
16863          ReactCurrentDispatcher$1.current = prevDispatcher;
16864        }
16865      },
16866      useReducer: function (reducer, initialArg, init) {
16867        currentHookNameInDev = 'useReducer';
16868        mountHookTypesDev();
16869        var prevDispatcher = ReactCurrentDispatcher$1.current;
16870        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16871
16872        try {
16873          return mountReducer(reducer, initialArg, init);
16874        } finally {
16875          ReactCurrentDispatcher$1.current = prevDispatcher;
16876        }
16877      },
16878      useRef: function (initialValue) {
16879        currentHookNameInDev = 'useRef';
16880        mountHookTypesDev();
16881        return mountRef(initialValue);
16882      },
16883      useState: function (initialState) {
16884        currentHookNameInDev = 'useState';
16885        mountHookTypesDev();
16886        var prevDispatcher = ReactCurrentDispatcher$1.current;
16887        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16888
16889        try {
16890          return mountState(initialState);
16891        } finally {
16892          ReactCurrentDispatcher$1.current = prevDispatcher;
16893        }
16894      },
16895      useDebugValue: function (value, formatterFn) {
16896        currentHookNameInDev = 'useDebugValue';
16897        mountHookTypesDev();
16898        return mountDebugValue();
16899      },
16900      useDeferredValue: function (value) {
16901        currentHookNameInDev = 'useDeferredValue';
16902        mountHookTypesDev();
16903        return mountDeferredValue(value);
16904      },
16905      useTransition: function () {
16906        currentHookNameInDev = 'useTransition';
16907        mountHookTypesDev();
16908        return mountTransition();
16909      },
vendor: 24,024 bytes, lines 16910-17589
16910      useMutableSource: function (source, getSnapshot, subscribe) {
16911        currentHookNameInDev = 'useMutableSource';
16912        mountHookTypesDev();
16913        return mountMutableSource();
16914      },
16915      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
16916        currentHookNameInDev = 'useSyncExternalStore';
16917        mountHookTypesDev();
16918        return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
16919      },
16920      useId: function () {
16921        currentHookNameInDev = 'useId';
16922        mountHookTypesDev();
16923        return mountId();
16924      },
16925      unstable_isNewReconciler: enableNewReconciler
16926    };
16927
16928    HooksDispatcherOnMountWithHookTypesInDEV = {
16929      readContext: function (context) {
16930        return readContext(context);
16931      },
16932      useCallback: function (callback, deps) {
16933        currentHookNameInDev = 'useCallback';
16934        updateHookTypesDev();
16935        return mountCallback(callback, deps);
16936      },
16937      useContext: function (context) {
16938        currentHookNameInDev = 'useContext';
16939        updateHookTypesDev();
16940        return readContext(context);
16941      },
16942      useEffect: function (create, deps) {
16943        currentHookNameInDev = 'useEffect';
16944        updateHookTypesDev();
16945        return mountEffect(create, deps);
16946      },
16947      useImperativeHandle: function (ref, create, deps) {
16948        currentHookNameInDev = 'useImperativeHandle';
16949        updateHookTypesDev();
16950        return mountImperativeHandle(ref, create, deps);
16951      },
16952      useInsertionEffect: function (create, deps) {
16953        currentHookNameInDev = 'useInsertionEffect';
16954        updateHookTypesDev();
16955        return mountInsertionEffect(create, deps);
16956      },
16957      useLayoutEffect: function (create, deps) {
16958        currentHookNameInDev = 'useLayoutEffect';
16959        updateHookTypesDev();
16960        return mountLayoutEffect(create, deps);
16961      },
16962      useMemo: function (create, deps) {
16963        currentHookNameInDev = 'useMemo';
16964        updateHookTypesDev();
16965        var prevDispatcher = ReactCurrentDispatcher$1.current;
16966        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16967
16968        try {
16969          return mountMemo(create, deps);
16970        } finally {
16971          ReactCurrentDispatcher$1.current = prevDispatcher;
16972        }
16973      },
16974      useReducer: function (reducer, initialArg, init) {
16975        currentHookNameInDev = 'useReducer';
16976        updateHookTypesDev();
16977        var prevDispatcher = ReactCurrentDispatcher$1.current;
16978        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16979
16980        try {
16981          return mountReducer(reducer, initialArg, init);
16982        } finally {
16983          ReactCurrentDispatcher$1.current = prevDispatcher;
16984        }
16985      },
16986      useRef: function (initialValue) {
16987        currentHookNameInDev = 'useRef';
16988        updateHookTypesDev();
16989        return mountRef(initialValue);
16990      },
16991      useState: function (initialState) {
16992        currentHookNameInDev = 'useState';
16993        updateHookTypesDev();
16994        var prevDispatcher = ReactCurrentDispatcher$1.current;
16995        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
16996
16997        try {
16998          return mountState(initialState);
16999        } finally {
17000          ReactCurrentDispatcher$1.current = prevDispatcher;
17001        }
17002      },
17003      useDebugValue: function (value, formatterFn) {
17004        currentHookNameInDev = 'useDebugValue';
17005        updateHookTypesDev();
17006        return mountDebugValue();
17007      },
17008      useDeferredValue: function (value) {
17009        currentHookNameInDev = 'useDeferredValue';
17010        updateHookTypesDev();
17011        return mountDeferredValue(value);
17012      },
17013      useTransition: function () {
17014        currentHookNameInDev = 'useTransition';
17015        updateHookTypesDev();
17016        return mountTransition();
17017      },
17018      useMutableSource: function (source, getSnapshot, subscribe) {
17019        currentHookNameInDev = 'useMutableSource';
17020        updateHookTypesDev();
17021        return mountMutableSource();
17022      },
17023      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17024        currentHookNameInDev = 'useSyncExternalStore';
17025        updateHookTypesDev();
17026        return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
17027      },
17028      useId: function () {
17029        currentHookNameInDev = 'useId';
17030        updateHookTypesDev();
17031        return mountId();
17032      },
17033      unstable_isNewReconciler: enableNewReconciler
17034    };
17035
17036    HooksDispatcherOnUpdateInDEV = {
17037      readContext: function (context) {
17038        return readContext(context);
17039      },
17040      useCallback: function (callback, deps) {
17041        currentHookNameInDev = 'useCallback';
17042        updateHookTypesDev();
17043        return updateCallback(callback, deps);
17044      },
17045      useContext: function (context) {
17046        currentHookNameInDev = 'useContext';
17047        updateHookTypesDev();
17048        return readContext(context);
17049      },
17050      useEffect: function (create, deps) {
17051        currentHookNameInDev = 'useEffect';
17052        updateHookTypesDev();
17053        return updateEffect(create, deps);
17054      },
17055      useImperativeHandle: function (ref, create, deps) {
17056        currentHookNameInDev = 'useImperativeHandle';
17057        updateHookTypesDev();
17058        return updateImperativeHandle(ref, create, deps);
17059      },
17060      useInsertionEffect: function (create, deps) {
17061        currentHookNameInDev = 'useInsertionEffect';
17062        updateHookTypesDev();
17063        return updateInsertionEffect(create, deps);
17064      },
17065      useLayoutEffect: function (create, deps) {
17066        currentHookNameInDev = 'useLayoutEffect';
17067        updateHookTypesDev();
17068        return updateLayoutEffect(create, deps);
17069      },
17070      useMemo: function (create, deps) {
17071        currentHookNameInDev = 'useMemo';
17072        updateHookTypesDev();
17073        var prevDispatcher = ReactCurrentDispatcher$1.current;
17074        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17075
17076        try {
17077          return updateMemo(create, deps);
17078        } finally {
17079          ReactCurrentDispatcher$1.current = prevDispatcher;
17080        }
17081      },
17082      useReducer: function (reducer, initialArg, init) {
17083        currentHookNameInDev = 'useReducer';
17084        updateHookTypesDev();
17085        var prevDispatcher = ReactCurrentDispatcher$1.current;
17086        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17087
17088        try {
17089          return updateReducer(reducer, initialArg, init);
17090        } finally {
17091          ReactCurrentDispatcher$1.current = prevDispatcher;
17092        }
17093      },
17094      useRef: function (initialValue) {
17095        currentHookNameInDev = 'useRef';
17096        updateHookTypesDev();
17097        return updateRef();
17098      },
17099      useState: function (initialState) {
17100        currentHookNameInDev = 'useState';
17101        updateHookTypesDev();
17102        var prevDispatcher = ReactCurrentDispatcher$1.current;
17103        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17104
17105        try {
17106          return updateState(initialState);
17107        } finally {
17108          ReactCurrentDispatcher$1.current = prevDispatcher;
17109        }
17110      },
17111      useDebugValue: function (value, formatterFn) {
17112        currentHookNameInDev = 'useDebugValue';
17113        updateHookTypesDev();
17114        return updateDebugValue();
17115      },
17116      useDeferredValue: function (value) {
17117        currentHookNameInDev = 'useDeferredValue';
17118        updateHookTypesDev();
17119        return updateDeferredValue(value);
17120      },
17121      useTransition: function () {
17122        currentHookNameInDev = 'useTransition';
17123        updateHookTypesDev();
17124        return updateTransition();
17125      },
17126      useMutableSource: function (source, getSnapshot, subscribe) {
17127        currentHookNameInDev = 'useMutableSource';
17128        updateHookTypesDev();
17129        return updateMutableSource();
17130      },
17131      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17132        currentHookNameInDev = 'useSyncExternalStore';
17133        updateHookTypesDev();
17134        return updateSyncExternalStore(subscribe, getSnapshot);
17135      },
17136      useId: function () {
17137        currentHookNameInDev = 'useId';
17138        updateHookTypesDev();
17139        return updateId();
17140      },
17141      unstable_isNewReconciler: enableNewReconciler
17142    };
17143
17144    HooksDispatcherOnRerenderInDEV = {
17145      readContext: function (context) {
17146        return readContext(context);
17147      },
17148      useCallback: function (callback, deps) {
17149        currentHookNameInDev = 'useCallback';
17150        updateHookTypesDev();
17151        return updateCallback(callback, deps);
17152      },
17153      useContext: function (context) {
17154        currentHookNameInDev = 'useContext';
17155        updateHookTypesDev();
17156        return readContext(context);
17157      },
17158      useEffect: function (create, deps) {
17159        currentHookNameInDev = 'useEffect';
17160        updateHookTypesDev();
17161        return updateEffect(create, deps);
17162      },
17163      useImperativeHandle: function (ref, create, deps) {
17164        currentHookNameInDev = 'useImperativeHandle';
17165        updateHookTypesDev();
17166        return updateImperativeHandle(ref, create, deps);
17167      },
17168      useInsertionEffect: function (create, deps) {
17169        currentHookNameInDev = 'useInsertionEffect';
17170        updateHookTypesDev();
17171        return updateInsertionEffect(create, deps);
17172      },
17173      useLayoutEffect: function (create, deps) {
17174        currentHookNameInDev = 'useLayoutEffect';
17175        updateHookTypesDev();
17176        return updateLayoutEffect(create, deps);
17177      },
17178      useMemo: function (create, deps) {
17179        currentHookNameInDev = 'useMemo';
17180        updateHookTypesDev();
17181        var prevDispatcher = ReactCurrentDispatcher$1.current;
17182        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
17183
17184        try {
17185          return updateMemo(create, deps);
17186        } finally {
17187          ReactCurrentDispatcher$1.current = prevDispatcher;
17188        }
17189      },
17190      useReducer: function (reducer, initialArg, init) {
17191        currentHookNameInDev = 'useReducer';
17192        updateHookTypesDev();
17193        var prevDispatcher = ReactCurrentDispatcher$1.current;
17194        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
17195
17196        try {
17197          return rerenderReducer(reducer, initialArg, init);
17198        } finally {
17199          ReactCurrentDispatcher$1.current = prevDispatcher;
17200        }
17201      },
17202      useRef: function (initialValue) {
17203        currentHookNameInDev = 'useRef';
17204        updateHookTypesDev();
17205        return updateRef();
17206      },
17207      useState: function (initialState) {
17208        currentHookNameInDev = 'useState';
17209        updateHookTypesDev();
17210        var prevDispatcher = ReactCurrentDispatcher$1.current;
17211        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
17212
17213        try {
17214          return rerenderState(initialState);
17215        } finally {
17216          ReactCurrentDispatcher$1.current = prevDispatcher;
17217        }
17218      },
17219      useDebugValue: function (value, formatterFn) {
17220        currentHookNameInDev = 'useDebugValue';
17221        updateHookTypesDev();
17222        return updateDebugValue();
17223      },
17224      useDeferredValue: function (value) {
17225        currentHookNameInDev = 'useDeferredValue';
17226        updateHookTypesDev();
17227        return rerenderDeferredValue(value);
17228      },
17229      useTransition: function () {
17230        currentHookNameInDev = 'useTransition';
17231        updateHookTypesDev();
17232        return rerenderTransition();
17233      },
17234      useMutableSource: function (source, getSnapshot, subscribe) {
17235        currentHookNameInDev = 'useMutableSource';
17236        updateHookTypesDev();
17237        return updateMutableSource();
17238      },
17239      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17240        currentHookNameInDev = 'useSyncExternalStore';
17241        updateHookTypesDev();
17242        return updateSyncExternalStore(subscribe, getSnapshot);
17243      },
17244      useId: function () {
17245        currentHookNameInDev = 'useId';
17246        updateHookTypesDev();
17247        return updateId();
17248      },
17249      unstable_isNewReconciler: enableNewReconciler
17250    };
17251
17252    InvalidNestedHooksDispatcherOnMountInDEV = {
17253      readContext: function (context) {
17254        warnInvalidContextAccess();
17255        return readContext(context);
17256      },
17257      useCallback: function (callback, deps) {
17258        currentHookNameInDev = 'useCallback';
17259        warnInvalidHookAccess();
17260        mountHookTypesDev();
17261        return mountCallback(callback, deps);
17262      },
17263      useContext: function (context) {
17264        currentHookNameInDev = 'useContext';
17265        warnInvalidHookAccess();
17266        mountHookTypesDev();
17267        return readContext(context);
17268      },
17269      useEffect: function (create, deps) {
17270        currentHookNameInDev = 'useEffect';
17271        warnInvalidHookAccess();
17272        mountHookTypesDev();
17273        return mountEffect(create, deps);
17274      },
17275      useImperativeHandle: function (ref, create, deps) {
17276        currentHookNameInDev = 'useImperativeHandle';
17277        warnInvalidHookAccess();
17278        mountHookTypesDev();
17279        return mountImperativeHandle(ref, create, deps);
17280      },
17281      useInsertionEffect: function (create, deps) {
17282        currentHookNameInDev = 'useInsertionEffect';
17283        warnInvalidHookAccess();
17284        mountHookTypesDev();
17285        return mountInsertionEffect(create, deps);
17286      },
17287      useLayoutEffect: function (create, deps) {
17288        currentHookNameInDev = 'useLayoutEffect';
17289        warnInvalidHookAccess();
17290        mountHookTypesDev();
17291        return mountLayoutEffect(create, deps);
17292      },
17293      useMemo: function (create, deps) {
17294        currentHookNameInDev = 'useMemo';
17295        warnInvalidHookAccess();
17296        mountHookTypesDev();
17297        var prevDispatcher = ReactCurrentDispatcher$1.current;
17298        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
17299
17300        try {
17301          return mountMemo(create, deps);
17302        } finally {
17303          ReactCurrentDispatcher$1.current = prevDispatcher;
17304        }
17305      },
17306      useReducer: function (reducer, initialArg, init) {
17307        currentHookNameInDev = 'useReducer';
17308        warnInvalidHookAccess();
17309        mountHookTypesDev();
17310        var prevDispatcher = ReactCurrentDispatcher$1.current;
17311        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
17312
17313        try {
17314          return mountReducer(reducer, initialArg, init);
17315        } finally {
17316          ReactCurrentDispatcher$1.current = prevDispatcher;
17317        }
17318      },
17319      useRef: function (initialValue) {
17320        currentHookNameInDev = 'useRef';
17321        warnInvalidHookAccess();
17322        mountHookTypesDev();
17323        return mountRef(initialValue);
17324      },
17325      useState: function (initialState) {
17326        currentHookNameInDev = 'useState';
17327        warnInvalidHookAccess();
17328        mountHookTypesDev();
17329        var prevDispatcher = ReactCurrentDispatcher$1.current;
17330        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
17331
17332        try {
17333          return mountState(initialState);
17334        } finally {
17335          ReactCurrentDispatcher$1.current = prevDispatcher;
17336        }
17337      },
17338      useDebugValue: function (value, formatterFn) {
17339        currentHookNameInDev = 'useDebugValue';
17340        warnInvalidHookAccess();
17341        mountHookTypesDev();
17342        return mountDebugValue();
17343      },
17344      useDeferredValue: function (value) {
17345        currentHookNameInDev = 'useDeferredValue';
17346        warnInvalidHookAccess();
17347        mountHookTypesDev();
17348        return mountDeferredValue(value);
17349      },
17350      useTransition: function () {
17351        currentHookNameInDev = 'useTransition';
17352        warnInvalidHookAccess();
17353        mountHookTypesDev();
17354        return mountTransition();
17355      },
17356      useMutableSource: function (source, getSnapshot, subscribe) {
17357        currentHookNameInDev = 'useMutableSource';
17358        warnInvalidHookAccess();
17359        mountHookTypesDev();
17360        return mountMutableSource();
17361      },
17362      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17363        currentHookNameInDev = 'useSyncExternalStore';
17364        warnInvalidHookAccess();
17365        mountHookTypesDev();
17366        return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
17367      },
17368      useId: function () {
17369        currentHookNameInDev = 'useId';
17370        warnInvalidHookAccess();
17371        mountHookTypesDev();
17372        return mountId();
17373      },
17374      unstable_isNewReconciler: enableNewReconciler
17375    };
17376
17377    InvalidNestedHooksDispatcherOnUpdateInDEV = {
17378      readContext: function (context) {
17379        warnInvalidContextAccess();
17380        return readContext(context);
17381      },
17382      useCallback: function (callback, deps) {
17383        currentHookNameInDev = 'useCallback';
17384        warnInvalidHookAccess();
17385        updateHookTypesDev();
17386        return updateCallback(callback, deps);
17387      },
17388      useContext: function (context) {
17389        currentHookNameInDev = 'useContext';
17390        warnInvalidHookAccess();
17391        updateHookTypesDev();
17392        return readContext(context);
17393      },
17394      useEffect: function (create, deps) {
17395        currentHookNameInDev = 'useEffect';
17396        warnInvalidHookAccess();
17397        updateHookTypesDev();
17398        return updateEffect(create, deps);
17399      },
17400      useImperativeHandle: function (ref, create, deps) {
17401        currentHookNameInDev = 'useImperativeHandle';
17402        warnInvalidHookAccess();
17403        updateHookTypesDev();
17404        return updateImperativeHandle(ref, create, deps);
17405      },
17406      useInsertionEffect: function (create, deps) {
17407        currentHookNameInDev = 'useInsertionEffect';
17408        warnInvalidHookAccess();
17409        updateHookTypesDev();
17410        return updateInsertionEffect(create, deps);
17411      },
17412      useLayoutEffect: function (create, deps) {
17413        currentHookNameInDev = 'useLayoutEffect';
17414        warnInvalidHookAccess();
17415        updateHookTypesDev();
17416        return updateLayoutEffect(create, deps);
17417      },
17418      useMemo: function (create, deps) {
17419        currentHookNameInDev = 'useMemo';
17420        warnInvalidHookAccess();
17421        updateHookTypesDev();
17422        var prevDispatcher = ReactCurrentDispatcher$1.current;
17423        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17424
17425        try {
17426          return updateMemo(create, deps);
17427        } finally {
17428          ReactCurrentDispatcher$1.current = prevDispatcher;
17429        }
17430      },
17431      useReducer: function (reducer, initialArg, init) {
17432        currentHookNameInDev = 'useReducer';
17433        warnInvalidHookAccess();
17434        updateHookTypesDev();
17435        var prevDispatcher = ReactCurrentDispatcher$1.current;
17436        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17437
17438        try {
17439          return updateReducer(reducer, initialArg, init);
17440        } finally {
17441          ReactCurrentDispatcher$1.current = prevDispatcher;
17442        }
17443      },
17444      useRef: function (initialValue) {
17445        currentHookNameInDev = 'useRef';
17446        warnInvalidHookAccess();
17447        updateHookTypesDev();
17448        return updateRef();
17449      },
17450      useState: function (initialState) {
17451        currentHookNameInDev = 'useState';
17452        warnInvalidHookAccess();
17453        updateHookTypesDev();
17454        var prevDispatcher = ReactCurrentDispatcher$1.current;
17455        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17456
17457        try {
17458          return updateState(initialState);
17459        } finally {
17460          ReactCurrentDispatcher$1.current = prevDispatcher;
17461        }
17462      },
17463      useDebugValue: function (value, formatterFn) {
17464        currentHookNameInDev = 'useDebugValue';
17465        warnInvalidHookAccess();
17466        updateHookTypesDev();
17467        return updateDebugValue();
17468      },
17469      useDeferredValue: function (value) {
17470        currentHookNameInDev = 'useDeferredValue';
17471        warnInvalidHookAccess();
17472        updateHookTypesDev();
17473        return updateDeferredValue(value);
17474      },
17475      useTransition: function () {
17476        currentHookNameInDev = 'useTransition';
17477        warnInvalidHookAccess();
17478        updateHookTypesDev();
17479        return updateTransition();
17480      },
17481      useMutableSource: function (source, getSnapshot, subscribe) {
17482        currentHookNameInDev = 'useMutableSource';
17483        warnInvalidHookAccess();
17484        updateHookTypesDev();
17485        return updateMutableSource();
17486      },
17487      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17488        currentHookNameInDev = 'useSyncExternalStore';
17489        warnInvalidHookAccess();
17490        updateHookTypesDev();
17491        return updateSyncExternalStore(subscribe, getSnapshot);
17492      },
17493      useId: function () {
17494        currentHookNameInDev = 'useId';
17495        warnInvalidHookAccess();
17496        updateHookTypesDev();
17497        return updateId();
17498      },
17499      unstable_isNewReconciler: enableNewReconciler
17500    };
17501
17502    InvalidNestedHooksDispatcherOnRerenderInDEV = {
17503      readContext: function (context) {
17504        warnInvalidContextAccess();
17505        return readContext(context);
17506      },
17507      useCallback: function (callback, deps) {
17508        currentHookNameInDev = 'useCallback';
17509        warnInvalidHookAccess();
17510        updateHookTypesDev();
17511        return updateCallback(callback, deps);
17512      },
17513      useContext: function (context) {
17514        currentHookNameInDev = 'useContext';
17515        warnInvalidHookAccess();
17516        updateHookTypesDev();
17517        return readContext(context);
17518      },
17519      useEffect: function (create, deps) {
17520        currentHookNameInDev = 'useEffect';
17521        warnInvalidHookAccess();
17522        updateHookTypesDev();
17523        return updateEffect(create, deps);
17524      },
17525      useImperativeHandle: function (ref, create, deps) {
17526        currentHookNameInDev = 'useImperativeHandle';
17527        warnInvalidHookAccess();
17528        updateHookTypesDev();
17529        return updateImperativeHandle(ref, create, deps);
17530      },
17531      useInsertionEffect: function (create, deps) {
17532        currentHookNameInDev = 'useInsertionEffect';
17533        warnInvalidHookAccess();
17534        updateHookTypesDev();
17535        return updateInsertionEffect(create, deps);
17536      },
17537      useLayoutEffect: function (create, deps) {
17538        currentHookNameInDev = 'useLayoutEffect';
17539        warnInvalidHookAccess();
17540        updateHookTypesDev();
17541        return updateLayoutEffect(create, deps);
17542      },
17543      useMemo: function (create, deps) {
17544        currentHookNameInDev = 'useMemo';
17545        warnInvalidHookAccess();
17546        updateHookTypesDev();
17547        var prevDispatcher = ReactCurrentDispatcher$1.current;
17548        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17549
17550        try {
17551          return updateMemo(create, deps);
17552        } finally {
17553          ReactCurrentDispatcher$1.current = prevDispatcher;
17554        }
17555      },
17556      useReducer: function (reducer, initialArg, init) {
17557        currentHookNameInDev = 'useReducer';
17558        warnInvalidHookAccess();
17559        updateHookTypesDev();
17560        var prevDispatcher = ReactCurrentDispatcher$1.current;
17561        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17562
17563        try {
17564          return rerenderReducer(reducer, initialArg, init);
17565        } finally {
17566          ReactCurrentDispatcher$1.current = prevDispatcher;
17567        }
17568      },
17569      useRef: function (initialValue) {
17570        currentHookNameInDev = 'useRef';
17571        warnInvalidHookAccess();
17572        updateHookTypesDev();
17573        return updateRef();
17574      },
17575      useState: function (initialState) {
17576        currentHookNameInDev = 'useState';
17577        warnInvalidHookAccess();
17578        updateHookTypesDev();
17579        var prevDispatcher = ReactCurrentDispatcher$1.current;
17580        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
17581
17582        try {
17583          return rerenderState(initialState);
17584        } finally {
17585          ReactCurrentDispatcher$1.current = prevDispatcher;
17586        }
17587      },
17588      useDebugValue: function (value, formatterFn) {
17589        currentHookNameInDev = 'useDebugValue';
17590        warnInvalidHookAccess();
17591        updateHookTypesDev();
17592        return updateDebugValue();
17593      },
17594      useDeferredValue: function (value) {
17595        currentHookNameInDev = 'useDeferredValue';
17596        warnInvalidHookAccess();
17597        updateHookTypesDev();
17598        return rerenderDeferredValue(value);
17599      },
17600      useTransition: function () {
17601        currentHookNameInDev = 'useTransition';
17602        warnInvalidHookAccess();
17603        updateHookTypesDev();
17604        return rerenderTransition();
17605      },
17606      useMutableSource: function (source, getSnapshot, subscribe) {
17607        currentHookNameInDev = 'useMutableSource';
17608        warnInvalidHookAccess();
17609        updateHookTypesDev();
17610        return updateMutableSource();
17611      },
17612      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
17613        currentHookNameInDev = 'useSyncExternalStore';
17614        warnInvalidHookAccess();
17615        updateHookTypesDev();
17616        return updateSyncExternalStore(subscribe, getSnapshot);
17617      },
17618      useId: function () {
17619        currentHookNameInDev = 'useId';
17620        warnInvalidHookAccess();
17621        updateHookTypesDev();
17622        return updateId();
17623      },
17624      unstable_isNewReconciler: enableNewReconciler
17625    };
17626  }
17627
17628  var now$1 = unstable_now;
17629  var commitTime = 0;
17630  var layoutEffectStartTime = -1;
17631  var profilerStartTime = -1;
17632  var passiveEffectStartTime = -1;
17633  /**
17634   * Tracks whether the current update was a nested/cascading update (scheduled from a layout effect).
17635   *
17636   * The overall sequence is:
17637   *   1. render
17638   *   2. commit (and call `onRender`, `onCommit`)
17639   *   3. check for nested updates
17640   *   4. flush passive effects (and call `onPostCommit`)
17641   *
17642   * Nested updates are identified in step 3 above,
17643   * but step 4 still applies to the work that was just committed.
17644   * We use two flags to track nested updates then:
17645   * one tracks whether the upcoming update is a nested update,
17646   * and the other tracks whether the current update was a nested update.
17647   * The first value gets synced to the second at the start of the render phase.
17648   */
17649
17650  var currentUpdateIsNested = false;
17651  var nestedUpdateScheduled = false;
17652
17653  function isCurrentUpdateNested() {
17654    return currentUpdateIsNested;
17655  }
17656
17657  function markNestedUpdateScheduled() {
17658    {
17659      nestedUpdateScheduled = true;
17660    }
17661  }
17662
17663  function resetNestedUpdateFlag() {
17664    {
17665      currentUpdateIsNested = false;
17666      nestedUpdateScheduled = false;
17667    }
17668  }
17669
17670  function syncNestedUpdateFlag() {
17671    {
17672      currentUpdateIsNested = nestedUpdateScheduled;
17673      nestedUpdateScheduled = false;
17674    }
17675  }
17676
17677  function getCommitTime() {
17678    return commitTime;
17679  }
17680
17681  function recordCommitTime() {
17682
17683    commitTime = now$1();
17684  }
17685
17686  function startProfilerTimer(fiber) {
17687
17688    profilerStartTime = now$1();
17689
17690    if (fiber.actualStartTime < 0) {
17691      fiber.actualStartTime = now$1();
17692    }
17693  }
17694
17695  function stopProfilerTimerIfRunning(fiber) {
17696
17697    profilerStartTime = -1;
17698  }
17699
17700  function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {
17701
17702    if (profilerStartTime >= 0) {
17703      var elapsedTime = now$1() - profilerStartTime;
17704      fiber.actualDuration += elapsedTime;
17705
17706      if (overrideBaseTime) {
17707        fiber.selfBaseDuration = elapsedTime;
17708      }
17709
17710      profilerStartTime = -1;
17711    }
17712  }
17713
17714  function recordLayoutEffectDuration(fiber) {
17715
17716    if (layoutEffectStartTime >= 0) {
17717      var elapsedTime = now$1() - layoutEffectStartTime;
17718      layoutEffectStartTime = -1; // Store duration on the next nearest Profiler ancestor
17719      // Or the root (for the DevTools Profiler to read)
17720
17721      var parentFiber = fiber.return;
17722
17723      while (parentFiber !== null) {
17724        switch (parentFiber.tag) {
17725          case HostRoot:
17726            var root = parentFiber.stateNode;
17727            root.effectDuration += elapsedTime;
17728            return;
17729
17730          case Profiler:
17731            var parentStateNode = parentFiber.stateNode;
17732            parentStateNode.effectDuration += elapsedTime;
17733            return;
17734        }
17735
17736        parentFiber = parentFiber.return;
17737      }
17738    }
17739  }
17740
17741  function recordPassiveEffectDuration(fiber) {
17742
17743    if (passiveEffectStartTime >= 0) {
17744      var elapsedTime = now$1() - passiveEffectStartTime;
17745      passiveEffectStartTime = -1; // Store duration on the next nearest Profiler ancestor
17746      // Or the root (for the DevTools Profiler to read)
17747
17748      var parentFiber = fiber.return;
17749
17750      while (parentFiber !== null) {
17751        switch (parentFiber.tag) {
17752          case HostRoot:
17753            var root = parentFiber.stateNode;
17754
17755            if (root !== null) {
17756              root.passiveEffectDuration += elapsedTime;
17757            }
17758
17759            return;
17760
17761          case Profiler:
17762            var parentStateNode = parentFiber.stateNode;
17763
17764            if (parentStateNode !== null) {
17765              // Detached fibers have their state node cleared out.
17766              // In this case, the return pointer is also cleared out,
17767              // so we won't be able to report the time spent in this Profiler's subtree.
17768              parentStateNode.passiveEffectDuration += elapsedTime;
17769            }
17770
17771            return;
17772        }
17773
17774        parentFiber = parentFiber.return;
17775      }
17776    }
17777  }
17778
17779  function startLayoutEffectTimer() {
17780
17781    layoutEffectStartTime = now$1();
17782  }
17783
17784  function startPassiveEffectTimer() {
17785
17786    passiveEffectStartTime = now$1();
17787  }
17788
17789  function transferActualDuration(fiber) {
17790    // Transfer time spent rendering these children so we don't lose it
17791    // after we rerender. This is used as a helper in special cases
17792    // where we should count the work of multiple passes.
17793    var child = fiber.child;
17794
17795    while (child) {
17796      fiber.actualDuration += child.actualDuration;
17797      child = child.sibling;
17798    }
17799  }
17800
17801  function resolveDefaultProps(Component, baseProps) {
17802    if (Component && Component.defaultProps) {
17803      // Resolve default props. Taken from ReactElement
17804      var props = assign({}, baseProps);
17805      var defaultProps = Component.defaultProps;
17806
17807      for (var propName in defaultProps) {
17808        if (props[propName] === undefined) {
17809          props[propName] = defaultProps[propName];
17810        }
17811      }
17812
17813      return props;
17814    }
17815
17816    return baseProps;
17817  }
17818
17819  var fakeInternalInstance = {};
17820  var didWarnAboutStateAssignmentForComponent;
17821  var didWarnAboutUninitializedState;
17822  var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;
17823  var didWarnAboutLegacyLifecyclesAndDerivedState;
17824  var didWarnAboutUndefinedDerivedState;
17825  var warnOnUndefinedDerivedState;
vendor: 4,111 bytes, lines 17826-17925
17826  var warnOnInvalidCallback;
17827  var didWarnAboutDirectlyAssigningPropsToState;
17828  var didWarnAboutContextTypeAndContextTypes;
17829  var didWarnAboutInvalidateContextType;
17830  var didWarnAboutLegacyContext$1;
17831
17832  {
17833    didWarnAboutStateAssignmentForComponent = new Set();
17834    didWarnAboutUninitializedState = new Set();
17835    didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
17836    didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
17837    didWarnAboutDirectlyAssigningPropsToState = new Set();
17838    didWarnAboutUndefinedDerivedState = new Set();
17839    didWarnAboutContextTypeAndContextTypes = new Set();
17840    didWarnAboutInvalidateContextType = new Set();
17841    didWarnAboutLegacyContext$1 = new Set();
17842    var didWarnOnInvalidCallback = new Set();
17843
17844    warnOnInvalidCallback = function (callback, callerName) {
17845      if (callback === null || typeof callback === 'function') {
17846        return;
17847      }
17848
17849      var key = callerName + '_' + callback;
17850
17851      if (!didWarnOnInvalidCallback.has(key)) {
17852        didWarnOnInvalidCallback.add(key);
17853
17854        error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
17855      }
17856    };
17857
17858    warnOnUndefinedDerivedState = function (type, partialState) {
17859      if (partialState === undefined) {
17860        var componentName = getComponentNameFromType(type) || 'Component';
17861
17862        if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
17863          didWarnAboutUndefinedDerivedState.add(componentName);
17864
17865          error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);
17866        }
17867      }
17868    }; // This is so gross but it's at least non-critical and can be removed if
17869    // it causes problems. This is meant to give a nicer error message for
17870    // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,
17871    // ...)) which otherwise throws a "_processChildContext is not a function"
17872    // exception.
17873
17874
17875    Object.defineProperty(fakeInternalInstance, '_processChildContext', {
17876      enumerable: false,
17877      value: function () {
17878        throw new Error('_processChildContext is not available in React 16+. This likely ' + 'means you have multiple copies of React and are attempting to nest ' + 'a React 15 tree inside a React 16 tree using ' + "unstable_renderSubtreeIntoContainer, which isn't supported. Try " + 'to make sure you have only one copy of React (and ideally, switch ' + 'to ReactDOM.createPortal).');
17879      }
17880    });
17881    Object.freeze(fakeInternalInstance);
17882  }
17883
17884  function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {
17885    var prevState = workInProgress.memoizedState;
17886    var partialState = getDerivedStateFromProps(nextProps, prevState);
17887
17888    {
17889      if ( workInProgress.mode & StrictLegacyMode) {
17890        setIsStrictModeForDevtools(true);
17891
17892        try {
17893          // Invoke the function an extra time to help detect side-effects.
17894          partialState = getDerivedStateFromProps(nextProps, prevState);
17895        } finally {
17896          setIsStrictModeForDevtools(false);
17897        }
17898      }
17899
17900      warnOnUndefinedDerivedState(ctor, partialState);
17901    } // Merge the partial state and the previous state.
17902
17903
17904    var memoizedState = partialState === null || partialState === undefined ? prevState : assign({}, prevState, partialState);
17905    workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the
17906    // base state.
17907
17908    if (workInProgress.lanes === NoLanes) {
17909      // Queue is always non-null for classes
17910      var updateQueue = workInProgress.updateQueue;
17911      updateQueue.baseState = memoizedState;
17912    }
17913  }
17914
17915  var classComponentUpdater = {
17916    isMounted: isMounted,
17917    enqueueSetState: function (inst, payload, callback) {
17918      var fiber = get(inst);
17919      var eventTime = requestEventTime();
17920      var lane = requestUpdateLane(fiber);
17921      var update = createUpdate(eventTime, lane);
17922      update.payload = payload;
17923
17924      if (callback !== undefined && callback !== null) {
17925        {
17926          warnOnInvalidCallback(callback, 'setState');
17927        }
17928
17929        update.callback = callback;
17930      }
17931
17932      var root = enqueueUpdate(fiber, update, lane);
17933
17934      if (root !== null) {
17935        scheduleUpdateOnFiber(root, fiber, lane, eventTime);
17936        entangleTransitions(root, fiber, lane);
17937      }
17938
17939      {
17940        markStateUpdateScheduled(fiber, lane);
17941      }
17942    },
17943    enqueueReplaceState: function (inst, payload, callback) {
17944      var fiber = get(inst);
17945      var eventTime = requestEventTime();
17946      var lane = requestUpdateLane(fiber);
17947      var update = createUpdate(eventTime, lane);
17948      update.tag = ReplaceState;
17949      update.payload = payload;
17950
17951      if (callback !== undefined && callback !== null) {
17952        {
17953          warnOnInvalidCallback(callback, 'replaceState');
17954        }
17955
17956        update.callback = callback;
17957      }
17958
17959      var root = enqueueUpdate(fiber, update, lane);
17960
17961      if (root !== null) {
17962        scheduleUpdateOnFiber(root, fiber, lane, eventTime);
17963        entangleTransitions(root, fiber, lane);
17964      }
17965
17966      {
17967        markStateUpdateScheduled(fiber, lane);
17968      }
17969    },
17970    enqueueForceUpdate: function (inst, callback) {
17971      var fiber = get(inst);
17972      var eventTime = requestEventTime();
17973      var lane = requestUpdateLane(fiber);
17974      var update = createUpdate(eventTime, lane);
17975      update.tag = ForceUpdate;
17976
17977      if (callback !== undefined && callback !== null) {
17978        {
vendor: 27,656 bytes, lines 17979-18574
17979          warnOnInvalidCallback(callback, 'forceUpdate');
17980        }
17981
17982        update.callback = callback;
17983      }
17984
17985      var root = enqueueUpdate(fiber, update, lane);
17986
17987      if (root !== null) {
17988        scheduleUpdateOnFiber(root, fiber, lane, eventTime);
17989        entangleTransitions(root, fiber, lane);
17990      }
17991
17992      {
17993        markForceUpdateScheduled(fiber, lane);
17994      }
17995    }
17996  };
17997
17998  function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {
17999    var instance = workInProgress.stateNode;
18000
18001    if (typeof instance.shouldComponentUpdate === 'function') {
18002      var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
18003
18004      {
18005        if ( workInProgress.mode & StrictLegacyMode) {
18006          setIsStrictModeForDevtools(true);
18007
18008          try {
18009            // Invoke the function an extra time to help detect side-effects.
18010            shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
18011          } finally {
18012            setIsStrictModeForDevtools(false);
18013          }
18014        }
18015
18016        if (shouldUpdate === undefined) {
18017          error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentNameFromType(ctor) || 'Component');
18018        }
18019      }
18020
18021      return shouldUpdate;
18022    }
18023
18024    if (ctor.prototype && ctor.prototype.isPureReactComponent) {
18025      return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);
18026    }
18027
18028    return true;
18029  }
18030
18031  function checkClassInstance(workInProgress, ctor, newProps) {
18032    var instance = workInProgress.stateNode;
18033
18034    {
18035      var name = getComponentNameFromType(ctor) || 'Component';
18036      var renderPresent = instance.render;
18037
18038      if (!renderPresent) {
18039        if (ctor.prototype && typeof ctor.prototype.render === 'function') {
18040          error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);
18041        } else {
18042          error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);
18043        }
18044      }
18045
18046      if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {
18047        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);
18048      }
18049
18050      if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {
18051        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);
18052      }
18053
18054      if (instance.propTypes) {
18055        error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);
18056      }
18057
18058      if (instance.contextType) {
18059        error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name);
18060      }
18061
18062      {
18063        if (ctor.childContextTypes && !didWarnAboutLegacyContext$1.has(ctor) && // Strict Mode has its own warning for legacy context, so we can skip
18064        // this one.
18065        (workInProgress.mode & StrictLegacyMode) === NoMode) {
18066          didWarnAboutLegacyContext$1.add(ctor);
18067
18068          error('%s uses the legacy childContextTypes API which is no longer ' + 'supported and will be removed in the next major release. Use ' + 'React.createContext() instead\n\n.' + 'Learn more about this warning here: https://reactjs.org/link/legacy-context', name);
18069        }
18070
18071        if (ctor.contextTypes && !didWarnAboutLegacyContext$1.has(ctor) && // Strict Mode has its own warning for legacy context, so we can skip
18072        // this one.
18073        (workInProgress.mode & StrictLegacyMode) === NoMode) {
18074          didWarnAboutLegacyContext$1.add(ctor);
18075
18076          error('%s uses the legacy contextTypes API which is no longer supported ' + 'and will be removed in the next major release. Use ' + 'React.createContext() with static contextType instead.\n\n' + 'Learn more about this warning here: https://reactjs.org/link/legacy-context', name);
18077        }
18078
18079        if (instance.contextTypes) {
18080          error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);
18081        }
18082
18083        if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
18084          didWarnAboutContextTypeAndContextTypes.add(ctor);
18085
18086          error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);
18087        }
18088      }
18089
18090      if (typeof instance.componentShouldUpdate === 'function') {
18091        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);
18092      }
18093
18094      if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {
18095        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');
18096      }
18097
18098      if (typeof instance.componentDidUnmount === 'function') {
18099        error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);
18100      }
18101
18102      if (typeof instance.componentDidReceiveProps === 'function') {
18103        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);
18104      }
18105
18106      if (typeof instance.componentWillRecieveProps === 'function') {
18107        error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);
18108      }
18109
18110      if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') {
18111        error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name);
18112      }
18113
18114      var hasMutatedProps = instance.props !== newProps;
18115
18116      if (instance.props !== undefined && hasMutatedProps) {
18117        error('%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name);
18118      }
18119
18120      if (instance.defaultProps) {
18121        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);
18122      }
18123
18124      if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
18125        didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
18126
18127        error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentNameFromType(ctor));
18128      }
18129
18130      if (typeof instance.getDerivedStateFromProps === 'function') {
18131        error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
18132      }
18133
18134      if (typeof instance.getDerivedStateFromError === 'function') {
18135        error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
18136      }
18137
18138      if (typeof ctor.getSnapshotBeforeUpdate === 'function') {
18139        error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name);
18140      }
18141
18142      var _state = instance.state;
18143
18144      if (_state && (typeof _state !== 'object' || isArray(_state))) {
18145        error('%s.state: must be set to an object or null', name);
18146      }
18147
18148      if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') {
18149        error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name);
18150      }
18151    }
18152  }
18153
18154  function adoptClassInstance(workInProgress, instance) {
18155    instance.updater = classComponentUpdater;
18156    workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates
18157
18158    set(instance, workInProgress);
18159
18160    {
18161      instance._reactInternalInstance = fakeInternalInstance;
18162    }
18163  }
18164
18165  function constructClassInstance(workInProgress, ctor, props) {
18166    var isLegacyContextConsumer = false;
18167    var unmaskedContext = emptyContextObject;
18168    var context = emptyContextObject;
18169    var contextType = ctor.contextType;
18170
18171    {
18172      if ('contextType' in ctor) {
18173        var isValid = // Allow null for conditional declaration
18174        contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>
18175
18176        if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {
18177          didWarnAboutInvalidateContextType.add(ctor);
18178          var addendum = '';
18179
18180          if (contextType === undefined) {
18181            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.';
18182          } else if (typeof contextType !== 'object') {
18183            addendum = ' However, it is set to a ' + typeof contextType + '.';
18184          } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {
18185            addendum = ' Did you accidentally pass the Context.Provider instead?';
18186          } else if (contextType._context !== undefined) {
18187            // <Context.Consumer>
18188            addendum = ' Did you accidentally pass the Context.Consumer instead?';
18189          } else {
18190            addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';
18191          }
18192
18193          error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentNameFromType(ctor) || 'Component', addendum);
18194        }
18195      }
18196    }
18197
18198    if (typeof contextType === 'object' && contextType !== null) {
18199      context = readContext(contextType);
18200    } else {
18201      unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
18202      var contextTypes = ctor.contextTypes;
18203      isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;
18204      context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;
18205    }
18206
18207    var instance = new ctor(props, context); // Instantiate twice to help detect side-effects.
18208
18209    {
18210      if ( workInProgress.mode & StrictLegacyMode) {
18211        setIsStrictModeForDevtools(true);
18212
18213        try {
18214          instance = new ctor(props, context); // eslint-disable-line no-new
18215        } finally {
18216          setIsStrictModeForDevtools(false);
18217        }
18218      }
18219    }
18220
18221    var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;
18222    adoptClassInstance(workInProgress, instance);
18223
18224    {
18225      if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {
18226        var componentName = getComponentNameFromType(ctor) || 'Component';
18227
18228        if (!didWarnAboutUninitializedState.has(componentName)) {
18229          didWarnAboutUninitializedState.add(componentName);
18230
18231          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);
18232        }
18233      } // If new component APIs are defined, "unsafe" lifecycles won't be called.
18234      // Warn about these lifecycles if they are present.
18235      // Don't warn about react-lifecycles-compat polyfilled methods though.
18236
18237
18238      if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {
18239        var foundWillMountName = null;
18240        var foundWillReceivePropsName = null;
18241        var foundWillUpdateName = null;
18242
18243        if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
18244          foundWillMountName = 'componentWillMount';
18245        } else if (typeof instance.UNSAFE_componentWillMount === 'function') {
18246          foundWillMountName = 'UNSAFE_componentWillMount';
18247        }
18248
18249        if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
18250          foundWillReceivePropsName = 'componentWillReceiveProps';
18251        } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
18252          foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
18253        }
18254
18255        if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
18256          foundWillUpdateName = 'componentWillUpdate';
18257        } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
18258          foundWillUpdateName = 'UNSAFE_componentWillUpdate';
18259        }
18260
18261        if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
18262          var _componentName = getComponentNameFromType(ctor) || 'Component';
18263
18264          var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';
18265
18266          if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
18267            didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
18268
18269            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 : '');
18270          }
18271        }
18272      }
18273    } // Cache unmasked context so we can avoid recreating masked context unless necessary.
18274    // ReactFiberContext usually updates this cache but can't for newly-created instances.
18275
18276
18277    if (isLegacyContextConsumer) {
18278      cacheContext(workInProgress, unmaskedContext, context);
18279    }
18280
18281    return instance;
18282  }
18283
18284  function callComponentWillMount(workInProgress, instance) {
18285    var oldState = instance.state;
18286
18287    if (typeof instance.componentWillMount === 'function') {
18288      instance.componentWillMount();
18289    }
18290
18291    if (typeof instance.UNSAFE_componentWillMount === 'function') {
18292      instance.UNSAFE_componentWillMount();
18293    }
18294
18295    if (oldState !== instance.state) {
18296      {
18297        error('%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentNameFromFiber(workInProgress) || 'Component');
18298      }
18299
18300      classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
18301    }
18302  }
18303
18304  function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {
18305    var oldState = instance.state;
18306
18307    if (typeof instance.componentWillReceiveProps === 'function') {
18308      instance.componentWillReceiveProps(newProps, nextContext);
18309    }
18310
18311    if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
18312      instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);
18313    }
18314
18315    if (instance.state !== oldState) {
18316      {
18317        var componentName = getComponentNameFromFiber(workInProgress) || 'Component';
18318
18319        if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {
18320          didWarnAboutStateAssignmentForComponent.add(componentName);
18321
18322          error('%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName);
18323        }
18324      }
18325
18326      classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
18327    }
18328  } // Invokes the mount life-cycles on a previously never rendered instance.
18329
18330
18331  function mountClassInstance(workInProgress, ctor, newProps, renderLanes) {
18332    {
18333      checkClassInstance(workInProgress, ctor, newProps);
18334    }
18335
18336    var instance = workInProgress.stateNode;
18337    instance.props = newProps;
18338    instance.state = workInProgress.memoizedState;
18339    instance.refs = {};
18340    initializeUpdateQueue(workInProgress);
18341    var contextType = ctor.contextType;
18342
18343    if (typeof contextType === 'object' && contextType !== null) {
18344      instance.context = readContext(contextType);
18345    } else {
18346      var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
18347      instance.context = getMaskedContext(workInProgress, unmaskedContext);
18348    }
18349
18350    {
18351      if (instance.state === newProps) {
18352        var componentName = getComponentNameFromType(ctor) || 'Component';
18353
18354        if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
18355          didWarnAboutDirectlyAssigningPropsToState.add(componentName);
18356
18357          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);
18358        }
18359      }
18360
18361      if (workInProgress.mode & StrictLegacyMode) {
18362        ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);
18363      }
18364
18365      {
18366        ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);
18367      }
18368    }
18369
18370    instance.state = workInProgress.memoizedState;
18371    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
18372
18373    if (typeof getDerivedStateFromProps === 'function') {
18374      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
18375      instance.state = workInProgress.memoizedState;
18376    } // In order to support react-lifecycles-compat polyfilled components,
18377    // Unsafe lifecycles should not be invoked for components using the new APIs.
18378
18379
18380    if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
18381      callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's
18382      // process them now.
18383
18384      processUpdateQueue(workInProgress, newProps, instance, renderLanes);
18385      instance.state = workInProgress.memoizedState;
18386    }
18387
18388    if (typeof instance.componentDidMount === 'function') {
18389      var fiberFlags = Update;
18390
18391      {
18392        fiberFlags |= LayoutStatic;
18393      }
18394
18395      if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
18396        fiberFlags |= MountLayoutDev;
18397      }
18398
18399      workInProgress.flags |= fiberFlags;
18400    }
18401  }
18402
18403  function resumeMountClassInstance(workInProgress, ctor, newProps, renderLanes) {
18404    var instance = workInProgress.stateNode;
18405    var oldProps = workInProgress.memoizedProps;
18406    instance.props = oldProps;
18407    var oldContext = instance.context;
18408    var contextType = ctor.contextType;
18409    var nextContext = emptyContextObject;
18410
18411    if (typeof contextType === 'object' && contextType !== null) {
18412      nextContext = readContext(contextType);
18413    } else {
18414      var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
18415      nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);
18416    }
18417
18418    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
18419    var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what
18420    // ever the previously attempted to render - not the "current". However,
18421    // during componentDidUpdate we pass the "current" props.
18422    // In order to support react-lifecycles-compat polyfilled components,
18423    // Unsafe lifecycles should not be invoked for components using the new APIs.
18424
18425    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
18426      if (oldProps !== newProps || oldContext !== nextContext) {
18427        callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
18428      }
18429    }
18430
18431    resetHasForceUpdateBeforeProcessing();
18432    var oldState = workInProgress.memoizedState;
18433    var newState = instance.state = oldState;
18434    processUpdateQueue(workInProgress, newProps, instance, renderLanes);
18435    newState = workInProgress.memoizedState;
18436
18437    if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
18438      // If an update was already in progress, we should schedule an Update
18439      // effect even though we're bailing out, so that cWU/cDU are called.
18440      if (typeof instance.componentDidMount === 'function') {
18441        var fiberFlags = Update;
18442
18443        {
18444          fiberFlags |= LayoutStatic;
18445        }
18446
18447        if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
18448          fiberFlags |= MountLayoutDev;
18449        }
18450
18451        workInProgress.flags |= fiberFlags;
18452      }
18453
18454      return false;
18455    }
18456
18457    if (typeof getDerivedStateFromProps === 'function') {
18458      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
18459      newState = workInProgress.memoizedState;
18460    }
18461
18462    var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
18463
18464    if (shouldUpdate) {
18465      // In order to support react-lifecycles-compat polyfilled components,
18466      // Unsafe lifecycles should not be invoked for components using the new APIs.
18467      if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
18468        if (typeof instance.componentWillMount === 'function') {
18469          instance.componentWillMount();
18470        }
18471
18472        if (typeof instance.UNSAFE_componentWillMount === 'function') {
18473          instance.UNSAFE_componentWillMount();
18474        }
18475      }
18476
18477      if (typeof instance.componentDidMount === 'function') {
18478        var _fiberFlags = Update;
18479
18480        {
18481          _fiberFlags |= LayoutStatic;
18482        }
18483
18484        if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
18485          _fiberFlags |= MountLayoutDev;
18486        }
18487
18488        workInProgress.flags |= _fiberFlags;
18489      }
18490    } else {
18491      // If an update was already in progress, we should schedule an Update
18492      // effect even though we're bailing out, so that cWU/cDU are called.
18493      if (typeof instance.componentDidMount === 'function') {
18494        var _fiberFlags2 = Update;
18495
18496        {
18497          _fiberFlags2 |= LayoutStatic;
18498        }
18499
18500        if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
18501          _fiberFlags2 |= MountLayoutDev;
18502        }
18503
18504        workInProgress.flags |= _fiberFlags2;
18505      } // If shouldComponentUpdate returned false, we should still update the
18506      // memoized state to indicate that this work can be reused.
18507
18508
18509      workInProgress.memoizedProps = newProps;
18510      workInProgress.memoizedState = newState;
18511    } // Update the existing instance's state, props, and context pointers even
18512    // if shouldComponentUpdate returns false.
18513
18514
18515    instance.props = newProps;
18516    instance.state = newState;
18517    instance.context = nextContext;
18518    return shouldUpdate;
18519  } // Invokes the update life-cycles and returns false if it shouldn't rerender.
18520
18521
18522  function updateClassInstance(current, workInProgress, ctor, newProps, renderLanes) {
18523    var instance = workInProgress.stateNode;
18524    cloneUpdateQueue(current, workInProgress);
18525    var unresolvedOldProps = workInProgress.memoizedProps;
18526    var oldProps = workInProgress.type === workInProgress.elementType ? unresolvedOldProps : resolveDefaultProps(workInProgress.type, unresolvedOldProps);
18527    instance.props = oldProps;
18528    var unresolvedNewProps = workInProgress.pendingProps;
18529    var oldContext = instance.context;
18530    var contextType = ctor.contextType;
18531    var nextContext = emptyContextObject;
18532
18533    if (typeof contextType === 'object' && contextType !== null) {
18534      nextContext = readContext(contextType);
18535    } else {
18536      var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
18537      nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);
18538    }
18539
18540    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
18541    var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what
18542    // ever the previously attempted to render - not the "current". However,
18543    // during componentDidUpdate we pass the "current" props.
18544    // In order to support react-lifecycles-compat polyfilled components,
18545    // Unsafe lifecycles should not be invoked for components using the new APIs.
18546
18547    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
18548      if (unresolvedOldProps !== unresolvedNewProps || oldContext !== nextContext) {
18549        callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
18550      }
18551    }
18552
18553    resetHasForceUpdateBeforeProcessing();
18554    var oldState = workInProgress.memoizedState;
18555    var newState = instance.state = oldState;
18556    processUpdateQueue(workInProgress, newProps, instance, renderLanes);
18557    newState = workInProgress.memoizedState;
18558
18559    if (unresolvedOldProps === unresolvedNewProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing() && !(enableLazyContextPropagation   )) {
18560      // If an update was already in progress, we should schedule an Update
18561      // effect even though we're bailing out, so that cWU/cDU are called.
18562      if (typeof instance.componentDidUpdate === 'function') {
18563        if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
18564          workInProgress.flags |= Update;
18565        }
18566      }
18567
18568      if (typeof instance.getSnapshotBeforeUpdate === 'function') {
18569        if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
18570          workInProgress.flags |= Snapshot;
18571        }
18572      }
18573
18574      return false;
18575    }
18576
18577    if (typeof getDerivedStateFromProps === 'function') {
18578      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
18579      newState = workInProgress.memoizedState;
18580    }
18581
18582    var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) || // TODO: In some cases, we'll end up checking if context has changed twice,
18583    // both before and after `shouldComponentUpdate` has been called. Not ideal,
18584    // but I'm loath to refactor this function. This only happens for memoized
18585    // components so it's not that common.
18586    enableLazyContextPropagation   ;
18587
18588    if (shouldUpdate) {
18589      // In order to support react-lifecycles-compat polyfilled components,
18590      // Unsafe lifecycles should not be invoked for components using the new APIs.
18591      if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {
18592        if (typeof instance.componentWillUpdate === 'function') {
18593          instance.componentWillUpdate(newProps, newState, nextContext);
18594        }
18595
18596        if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
18597          instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);
18598        }
18599      }
18600
18601      if (typeof instance.componentDidUpdate === 'function') {
18602        workInProgress.flags |= Update;
18603      }
18604
18605      if (typeof instance.getSnapshotBeforeUpdate === 'function') {
18606        workInProgress.flags |= Snapshot;
18607      }
18608    } else {
18609      // If an update was already in progress, we should schedule an Update
18610      // effect even though we're bailing out, so that cWU/cDU are called.
18611      if (typeof instance.componentDidUpdate === 'function') {
18612        if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
18613          workInProgress.flags |= Update;
18614        }
18615      }
18616
18617      if (typeof instance.getSnapshotBeforeUpdate === 'function') {
18618        if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
18619          workInProgress.flags |= Snapshot;
18620        }
18621      } // If shouldComponentUpdate returned false, we should still update the
18622      // memoized props/state to indicate that this work can be reused.
18623
18624
18625      workInProgress.memoizedProps = newProps;
18626      workInProgress.memoizedState = newState;
18627    } // Update the existing instance's state, props, and context pointers even
18628    // if shouldComponentUpdate returns false.
18629
18630
18631    instance.props = newProps;
18632    instance.state = newState;
18633    instance.context = nextContext;
18634    return shouldUpdate;
18635  }
18636
18637  function createCapturedValueAtFiber(value, source) {
18638    // If the value is an error, call this function immediately after it is thrown
18639    // so the stack is accurate.
18640    return {
18641      value: value,
18642      source: source,
18643      stack: getStackByFiberInDevAndProd(source),
18644      digest: null
18645    };
18646  }
18647  function createCapturedValue(value, digest, stack) {
18648    return {
18649      value: value,
18650      source: null,
18651      stack: stack != null ? stack : null,
18652      digest: digest != null ? digest : null
18653    };
18654  }
18655
18656  // This module is forked in different environments.
18657  // By default, return `true` to log errors to the console.
18658  // Forks can return `false` if this isn't desirable.
18659  function showErrorDialog(boundary, errorInfo) {
18660    return true;
18661  }
18662
18663  function logCapturedError(boundary, errorInfo) {
18664    try {
18665      var logError = showErrorDialog(boundary, errorInfo); // Allow injected showErrorDialog() to prevent default console.error logging.
18666      // This enables renderers like ReactNative to better manage redbox behavior.
18667
18668      if (logError === false) {
18669        return;
18670      }
18671
18672      var error = errorInfo.value;
18673
18674      if (true) {
18675        var source = errorInfo.source;
18676        var stack = errorInfo.stack;
18677        var componentStack = stack !== null ? stack : ''; // Browsers support silencing uncaught errors by calling
18678        // `preventDefault()` in window `error` handler.
18679        // We record this information as an expando on the error.
18680
18681        if (error != null && error._suppressLogging) {
18682          if (boundary.tag === ClassComponent) {
18683            // The error is recoverable and was silenced.
18684            // Ignore it and don't print the stack addendum.
18685            // This is handy for testing error boundaries without noise.
18686            return;
18687          } // The error is fatal. Since the silencing might have
18688          // been accidental, we'll surface it anyway.
18689          // However, the browser would have silenced the original error
18690          // so we'll print it first, and then print the stack addendum.
18691
18692
18693          console['error'](error); // Don't transform to our wrapper
18694          // For a more detailed description of this block, see:
18695          // https://github.com/facebook/react/pull/13384
18696        }
18697
18698        var componentName = source ? getComponentNameFromFiber(source) : null;
18699        var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : 'The above error occurred in one of your React components:';
18700        var errorBoundaryMessage;
18701
18702        if (boundary.tag === HostRoot) {
18703          errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\n' + 'Visit https://reactjs.org/link/error-boundaries to learn more about error boundaries.';
18704        } else {
18705          var errorBoundaryName = getComponentNameFromFiber(boundary) || 'Anonymous';
18706          errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + ".");
18707        }
18708
18709        var combinedMessage = componentNameMessage + "\n" + componentStack + "\n\n" + ("" + errorBoundaryMessage); // In development, we provide our own message with just the component stack.
18710        // We don't include the original error message and JS stack because the browser
18711        // has already printed it. Even if the application swallows the error, it is still
18712        // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.
18713
18714        console['error'](combinedMessage); // Don't transform to our wrapper
18715      } else {
18716        // In production, we print the error directly.
18717        // This will include the message, the JS stack, and anything the browser wants to show.
18718        // We pass the error object instead of custom message so that the browser displays the error natively.
18719        console['error'](error); // Don't transform to our wrapper
18720      }
18721    } catch (e) {
18722      // This method must not throw, or React internal state will get messed up.
18723      // If console.error is overridden, or logCapturedError() shows a dialog that throws,
18724      // we want to report this error outside of the normal stack as a last resort.
18725      // https://github.com/facebook/react/issues/13188
18726      setTimeout(function () {
18727        throw e;
18728      });
18729    }
18730  }
18731
18732  var PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map;
18733
18734  function createRootErrorUpdate(fiber, errorInfo, lane) {
18735    var update = createUpdate(NoTimestamp, lane); // Unmount the root by rendering null.
18736
18737    update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property
18738    // being called "element".
18739
18740    update.payload = {
18741      element: null
18742    };
18743    var error = errorInfo.value;
18744
18745    update.callback = function () {
18746      onUncaughtError(error);
18747      logCapturedError(fiber, errorInfo);
18748    };
18749
18750    return update;
18751  }
18752
18753  function createClassErrorUpdate(fiber, errorInfo, lane) {
18754    var update = createUpdate(NoTimestamp, lane);
18755    update.tag = CaptureUpdate;
18756    var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
18757
18758    if (typeof getDerivedStateFromError === 'function') {
18759      var error$1 = errorInfo.value;
18760
18761      update.payload = function () {
18762        return getDerivedStateFromError(error$1);
18763      };
18764
18765      update.callback = function () {
18766        {
18767          markFailedErrorBoundaryForHotReloading(fiber);
18768        }
18769
18770        logCapturedError(fiber, errorInfo);
18771      };
18772    }
18773
18774    var inst = fiber.stateNode;
18775
18776    if (inst !== null && typeof inst.componentDidCatch === 'function') {
18777      update.callback = function callback() {
18778        {
18779          markFailedErrorBoundaryForHotReloading(fiber);
18780        }
18781
18782        logCapturedError(fiber, errorInfo);
18783
18784        if (typeof getDerivedStateFromError !== 'function') {
18785          // To preserve the preexisting retry behavior of error boundaries,
18786          // we keep track of which ones already failed during this batch.
18787          // This gets reset before we yield back to the browser.
18788          // TODO: Warn in strict mode if getDerivedStateFromError is
18789          // not defined.
18790          markLegacyErrorBoundaryAsFailed(this);
18791        }
18792
18793        var error$1 = errorInfo.value;
18794        var stack = errorInfo.stack;
18795        this.componentDidCatch(error$1, {
18796          componentStack: stack !== null ? stack : ''
18797        });
18798
18799        {
18800          if (typeof getDerivedStateFromError !== 'function') {
18801            // If componentDidCatch is the only error boundary method defined,
18802            // then it needs to call setState to recover from errors.
18803            // If no state update is scheduled then the boundary will swallow the error.
18804            if (!includesSomeLane(fiber.lanes, SyncLane)) {
18805              error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentNameFromFiber(fiber) || 'Unknown');
18806            }
18807          }
18808        }
18809      };
18810    }
18811
18812    return update;
18813  }
18814
18815  function attachPingListener(root, wakeable, lanes) {
18816    // Attach a ping listener
18817    //
18818    // The data might resolve before we have a chance to commit the fallback. Or,
18819    // in the case of a refresh, we'll never commit a fallback. So we need to
18820    // attach a listener now. When it resolves ("pings"), we can decide whether to
18821    // try rendering the tree again.
18822    //
18823    // Only attach a listener if one does not already exist for the lanes
18824    // we're currently rendering (which acts like a "thread ID" here).
18825    //
18826    // We only need to do this in concurrent mode. Legacy Suspense always
18827    // commits fallbacks synchronously, so there are no pings.
18828    var pingCache = root.pingCache;
18829    var threadIDs;
18830
18831    if (pingCache === null) {
18832      pingCache = root.pingCache = new PossiblyWeakMap$1();
18833      threadIDs = new Set();
18834      pingCache.set(wakeable, threadIDs);
18835    } else {
18836      threadIDs = pingCache.get(wakeable);
18837
18838      if (threadIDs === undefined) {
18839        threadIDs = new Set();
18840        pingCache.set(wakeable, threadIDs);
18841      }
18842    }
18843
18844    if (!threadIDs.has(lanes)) {
18845      // Memoize using the thread ID to prevent redundant listeners.
18846      threadIDs.add(lanes);
18847      var ping = pingSuspendedRoot.bind(null, root, wakeable, lanes);
18848
18849      {
18850        if (isDevToolsPresent) {
18851          // If we have pending work still, restore the original updaters
18852          restorePendingUpdaters(root, lanes);
18853        }
18854      }
18855
18856      wakeable.then(ping, ping);
18857    }
18858  }
18859
18860  function attachRetryListener(suspenseBoundary, root, wakeable, lanes) {
18861    // Retry listener
18862    //
18863    // If the fallback does commit, we need to attach a different type of
18864    // listener. This one schedules an update on the Suspense boundary to turn
18865    // the fallback state off.
18866    //
18867    // Stash the wakeable on the boundary fiber so we can access it in the
18868    // commit phase.
18869    //
18870    // When the wakeable resolves, we'll attempt to render the boundary
18871    // again ("retry").
18872    var wakeables = suspenseBoundary.updateQueue;
18873
18874    if (wakeables === null) {
18875      var updateQueue = new Set();
18876      updateQueue.add(wakeable);
18877      suspenseBoundary.updateQueue = updateQueue;
18878    } else {
18879      wakeables.add(wakeable);
18880    }
18881  }
18882
18883  function resetSuspendedComponent(sourceFiber, rootRenderLanes) {
18884    // A legacy mode Suspense quirk, only relevant to hook components.
18885
18886
18887    var tag = sourceFiber.tag;
18888
18889    if ((sourceFiber.mode & ConcurrentMode) === NoMode && (tag === FunctionComponent || tag === ForwardRef || tag === SimpleMemoComponent)) {
18890      var currentSource = sourceFiber.alternate;
18891
18892      if (currentSource) {
18893        sourceFiber.updateQueue = currentSource.updateQueue;
18894        sourceFiber.memoizedState = currentSource.memoizedState;
18895        sourceFiber.lanes = currentSource.lanes;
18896      } else {
18897        sourceFiber.updateQueue = null;
18898        sourceFiber.memoizedState = null;
18899      }
18900    }
18901  }
18902
18903  function getNearestSuspenseBoundaryToCapture(returnFiber) {
18904    var node = returnFiber;
18905
18906    do {
18907      if (node.tag === SuspenseComponent && shouldCaptureSuspense(node)) {
18908        return node;
18909      } // This boundary already captured during this render. Continue to the next
18910      // boundary.
18911
18912
18913      node = node.return;
18914    } while (node !== null);
18915
18916    return null;
18917  }
18918
18919  function markSuspenseBoundaryShouldCapture(suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes) {
18920    // This marks a Suspense boundary so that when we're unwinding the stack,
18921    // it captures the suspended "exception" and does a second (fallback) pass.
18922    if ((suspenseBoundary.mode & ConcurrentMode) === NoMode) {
18923      // Legacy Mode Suspense
18924      //
18925      // If the boundary is in legacy mode, we should *not*
18926      // suspend the commit. Pretend as if the suspended component rendered
18927      // null and keep rendering. When the Suspense boundary completes,
18928      // we'll do a second pass to render the fallback.
18929      if (suspenseBoundary === returnFiber) {
18930        // Special case where we suspended while reconciling the children of
18931        // a Suspense boundary's inner Offscreen wrapper fiber. This happens
18932        // when a React.lazy component is a direct child of a
18933        // Suspense boundary.
18934        //
18935        // Suspense boundaries are implemented as multiple fibers, but they
18936        // are a single conceptual unit. The legacy mode behavior where we
18937        // pretend the suspended fiber committed as `null` won't work,
18938        // because in this case the "suspended" fiber is the inner
18939        // Offscreen wrapper.
18940        //
18941        // Because the contents of the boundary haven't started rendering
18942        // yet (i.e. nothing in the tree has partially rendered) we can
18943        // switch to the regular, concurrent mode behavior: mark the
18944        // boundary with ShouldCapture and enter the unwind phase.
18945        suspenseBoundary.flags |= ShouldCapture;
18946      } else {
18947        suspenseBoundary.flags |= DidCapture;
18948        sourceFiber.flags |= ForceUpdateForLegacySuspense; // We're going to commit this fiber even though it didn't complete.
18949        // But we shouldn't call any lifecycle methods or callbacks. Remove
18950        // all lifecycle effect tags.
18951
18952        sourceFiber.flags &= ~(LifecycleEffectMask | Incomplete);
18953
18954        if (sourceFiber.tag === ClassComponent) {
18955          var currentSourceFiber = sourceFiber.alternate;
18956
18957          if (currentSourceFiber === null) {
18958            // This is a new mount. Change the tag so it's not mistaken for a
18959            // completed class component. For example, we should not call
18960            // componentWillUnmount if it is deleted.
18961            sourceFiber.tag = IncompleteClassComponent;
18962          } else {
18963            // When we try rendering again, we should not reuse the current fiber,
18964            // since it's known to be in an inconsistent state. Use a force update to
18965            // prevent a bail out.
18966            var update = createUpdate(NoTimestamp, SyncLane);
18967            update.tag = ForceUpdate;
18968            enqueueUpdate(sourceFiber, update, SyncLane);
18969          }
18970        } // The source fiber did not complete. Mark it with Sync priority to
18971        // indicate that it still has pending work.
18972
18973
18974        sourceFiber.lanes = mergeLanes(sourceFiber.lanes, SyncLane);
18975      }
18976
18977      return suspenseBoundary;
18978    } // Confirmed that the boundary is in a concurrent mode tree. Continue
18979    // with the normal suspend path.
18980    //
18981    // After this we'll use a set of heuristics to determine whether this
18982    // render pass will run to completion or restart or "suspend" the commit.
18983    // The actual logic for this is spread out in different places.
18984    //
18985    // This first principle is that if we're going to suspend when we complete
18986    // a root, then we should also restart if we get an update or ping that
18987    // might unsuspend it, and vice versa. The only reason to suspend is
18988    // because you think you might want to restart before committing. However,
18989    // it doesn't make sense to restart only while in the period we're suspended.
18990    //
18991    // Restarting too aggressively is also not good because it starves out any
18992    // intermediate loading state. So we use heuristics to determine when.
18993    // Suspense Heuristics
18994    //
18995    // If nothing threw a Promise or all the same fallbacks are already showing,
18996    // then don't suspend/restart.
18997    //
18998    // If this is an initial render of a new tree of Suspense boundaries and
18999    // those trigger a fallback, then don't suspend/restart. We want to ensure
19000    // that we can show the initial loading state as quickly as possible.
19001    //
19002    // If we hit a "Delayed" case, such as when we'd switch from content back into
19003    // a fallback, then we should always suspend/restart. Transitions apply
19004    // to this case. If none is defined, JND is used instead.
19005    //
19006    // If we're already showing a fallback and it gets "retried", allowing us to show
19007    // another level, but there's still an inner boundary that would show a fallback,
19008    // then we suspend/restart for 500ms since the last time we showed a fallback
19009    // anywhere in the tree. This effectively throttles progressive loading into a
19010    // consistent train of commits. This also gives us an opportunity to restart to
19011    // get to the completed state slightly earlier.
19012    //
19013    // If there's ambiguity due to batching it's resolved in preference of:
19014    // 1) "delayed", 2) "initial render", 3) "retry".
19015    //
19016    // We want to ensure that a "busy" state doesn't get force committed. We want to
19017    // ensure that new initial loading states can commit as soon as possible.
19018
19019
19020    suspenseBoundary.flags |= ShouldCapture; // TODO: I think we can remove this, since we now use `DidCapture` in
19021    // the begin phase to prevent an early bailout.
19022
19023    suspenseBoundary.lanes = rootRenderLanes;
19024    return suspenseBoundary;
19025  }
19026
19027  function throwException(root, returnFiber, sourceFiber, value, rootRenderLanes) {
19028    // The source fiber did not complete.
19029    sourceFiber.flags |= Incomplete;
19030
19031    {
19032      if (isDevToolsPresent) {
19033        // If we have pending work still, restore the original updaters
19034        restorePendingUpdaters(root, rootRenderLanes);
19035      }
19036    }
19037
19038    if (value !== null && typeof value === 'object' && typeof value.then === 'function') {
19039      // This is a wakeable. The component suspended.
19040      var wakeable = value;
19041      resetSuspendedComponent(sourceFiber);
19042
19043      {
19044        if (getIsHydrating() && sourceFiber.mode & ConcurrentMode) {
19045          markDidThrowWhileHydratingDEV();
19046        }
19047      }
19048
19049
19050      var suspenseBoundary = getNearestSuspenseBoundaryToCapture(returnFiber);
19051
19052      if (suspenseBoundary !== null) {
19053        suspenseBoundary.flags &= ~ForceClientRender;
19054        markSuspenseBoundaryShouldCapture(suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes); // We only attach ping listeners in concurrent mode. Legacy Suspense always
19055        // commits fallbacks synchronously, so there are no pings.
19056
19057        if (suspenseBoundary.mode & ConcurrentMode) {
19058          attachPingListener(root, wakeable, rootRenderLanes);
19059        }
19060
19061        attachRetryListener(suspenseBoundary, root, wakeable);
19062        return;
19063      } else {
19064        // No boundary was found. Unless this is a sync update, this is OK.
19065        // We can suspend and wait for more data to arrive.
19066        if (!includesSyncLane(rootRenderLanes)) {
19067          // This is not a sync update. Suspend. Since we're not activating a
19068          // Suspense boundary, this will unwind all the way to the root without
19069          // performing a second pass to render a fallback. (This is arguably how
19070          // refresh transitions should work, too, since we're not going to commit
19071          // the fallbacks anyway.)
19072          //
19073          // This case also applies to initial hydration.
19074          attachPingListener(root, wakeable, rootRenderLanes);
19075          renderDidSuspendDelayIfPossible();
19076          return;
19077        } // This is a sync/discrete update. We treat this case like an error
19078        // because discrete renders are expected to produce a complete tree
19079        // synchronously to maintain consistency with external state.
19080
19081
19082        var uncaughtSuspenseError = 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.'); // If we're outside a transition, fall through to the regular error path.
19083        // The error will be caught by the nearest suspense boundary.
19084
19085        value = uncaughtSuspenseError;
19086      }
19087    } else {
19088      // This is a regular error, not a Suspense wakeable.
19089      if (getIsHydrating() && sourceFiber.mode & ConcurrentMode) {
19090        markDidThrowWhileHydratingDEV();
19091
19092        var _suspenseBoundary = getNearestSuspenseBoundaryToCapture(returnFiber); // If the error was thrown during hydration, we may be able to recover by
19093        // discarding the dehydrated content and switching to a client render.
19094        // Instead of surfacing the error, find the nearest Suspense boundary
19095        // and render it again without hydration.
19096
19097
19098        if (_suspenseBoundary !== null) {
19099          if ((_suspenseBoundary.flags & ShouldCapture) === NoFlags) {
19100            // Set a flag to indicate that we should try rendering the normal
19101            // children again, not the fallback.
19102            _suspenseBoundary.flags |= ForceClientRender;
19103          }
19104
19105          markSuspenseBoundaryShouldCapture(_suspenseBoundary, returnFiber, sourceFiber, root, rootRen
vendor: 4,174 bytes, lines 19105-19208
19105derLanes); // Even though the user may not be affected by this error, we should
19106          // still log it so it can be fixed.
19107
19108          queueHydrationError(createCapturedValueAtFiber(value, sourceFiber));
19109          return;
19110        }
19111      }
19112    }
19113
19114    value = createCapturedValueAtFiber(value, sourceFiber);
19115    renderDidError(value); // We didn't find a boundary that could handle this type of exception. Start
19116    // over and traverse parent path again, this time treating the exception
19117    // as an error.
19118
19119    var workInProgress = returnFiber;
19120
19121    do {
19122      switch (workInProgress.tag) {
19123        case HostRoot:
19124          {
19125            var _errorInfo = value;
19126            workInProgress.flags |= ShouldCapture;
19127            var lane = pickArbitraryLane(rootRenderLanes);
19128            workInProgress.lanes = mergeLanes(workInProgress.lanes, lane);
19129            var update = createRootErrorUpdate(workInProgress, _errorInfo, lane);
19130            enqueueCapturedUpdate(workInProgress, update);
19131            return;
19132          }
19133
19134        case ClassComponent:
19135          // Capture and retry
19136          var errorInfo = value;
19137          var ctor = workInProgress.type;
19138          var instance = workInProgress.stateNode;
19139
19140          if ((workInProgress.flags & DidCapture) === NoFlags && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {
19141            workInProgress.flags |= ShouldCapture;
19142
19143            var _lane = pickArbitraryLane(rootRenderLanes);
19144
19145            workInProgress.lanes = mergeLanes(workInProgress.lanes, _lane); // Schedule the error boundary to re-render using updated state
19146
19147            var _update = createClassErrorUpdate(workInProgress, errorInfo, _lane);
19148
19149            enqueueCapturedUpdate(workInProgress, _update);
19150            return;
19151          }
19152
19153          break;
19154      }
19155
19156      workInProgress = workInProgress.return;
19157    } while (workInProgress !== null);
19158  }
19159
19160  function getSuspendedCache() {
19161    {
19162      return null;
19163    } // This function is called when a Suspense boundary suspends. It returns the
19164  }
19165
19166  var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;
19167  var didReceiveUpdate = false;
19168  var didWarnAboutBadClass;
19169  var didWarnAboutModulePatternComponent;
19170  var didWarnAboutContextTypeOnFunctionComponent;
19171  var didWarnAboutGetDerivedStateOnFunctionComponent;
19172  var didWarnAboutFunctionRefs;
19173  var didWarnAboutReassigningProps;
19174  var didWarnAboutRevealOrder;
19175  var didWarnAboutTailOptions;
19176  var didWarnAboutDefaultPropsOnFunctionComponent;
19177
19178  {
19179    didWarnAboutBadClass = {};
19180    didWarnAboutModulePatternComponent = {};
19181    didWarnAboutContextTypeOnFunctionComponent = {};
19182    didWarnAboutGetDerivedStateOnFunctionComponent = {};
19183    didWarnAboutFunctionRefs = {};
19184    didWarnAboutReassigningProps = false;
19185    didWarnAboutRevealOrder = {};
19186    didWarnAboutTailOptions = {};
19187    didWarnAboutDefaultPropsOnFunctionComponent = {};
19188  }
19189
19190  function reconcileChildren(current, workInProgress, nextChildren, renderLanes) {
19191    if (current === null) {
19192      // If this is a fresh new component that hasn't been rendered yet, we
19193      // won't update its child set by applying minimal side-effects. Instead,
19194      // we will add them all to the child before it gets rendered. That means
19195      // we can optimize this reconciliation pass by not tracking side-effects.
19196      workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderLanes);
19197    } else {
19198      // If the current child is the same as the work in progress, it means that
19199      // we haven't yet started any work on these children. Therefore, we use
19200      // the clone algorithm to create a copy of all the current children.
19201      // If we had any progressed work already, that is invalid at this point so
19202      // let's throw it out.
19203      workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderLanes);
19204    }
19205  }
19206
19207  function forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderLanes) {
19208    // This function is fork of reconcileChildren. It's used in cases where we
19209    // want to reconcile without matching against the existing set. This has the
19210    // effect of all current children being unmounted; even if the type and key
19211    // are the same, the old child is unmounted and a new child is created.
19212    //
19213    // To do this, we're going to go through the reconcile algorithm twice. In
19214    // the first pass, we schedule a deletion for all the current children by
19215    // passing null.
19216    workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderLanes); // In the second pass, we mount the new children. The trick here is that we
19217    // pass null in place of where we usually pass the current child set. This has
19218    // the effect of remounting all children regardless of whether their
19219    // identities match.
19220
19221    workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderLanes);
19222  }
19223
19224  function updateForwardRef(current, workInProgress, Component, nextProps, renderLanes) {
19225    // TODO: current can be non-null here even if the component
19226    // hasn't yet mounted. This happens after the first render suspends.
19227    // We'll need to figure out if this is fine or can cause issues.
19228    {
19229      if (workInProgress.type !== workInProgress.elementType) {
19230        // Lazy component props can't be validated in createElement
19231        // because they're only guaranteed to be resolved here.
19232        var innerPropTypes = Component.propTypes;
19233
19234        if (innerPropTypes) {
19235          checkPropTypes(innerPropTypes, nextProps, // Resolved props
19236          'prop', getComponentNameFromType(Component));
19237        }
19238      }
19239    }
19240
19241    var render = Component.render;
19242    var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent
19243
19244    var nextChildren;
19245    var hasId;
19246    prepareToReadContext(workInProgress, renderLanes);
19247
19248    {
19249      markComponentRenderStarted(workInProgress);
19250    }
19251
19252    {
19253      ReactCurrentOwner$1.current = workInProgress;
19254      setIsRendering(true);
19255      nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderLanes);
19256      hasId = checkDidRenderIdHook();
19257
19258      if ( workInProgress.mode & StrictLegacyMode) {
19259        setIsStrictModeForDevtools(true);
19260
19261        try {
19262          nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderLanes);
19263          hasId = checkDidRenderIdHook();
19264        } finally {
19265          setIsStrictModeForDevtools(false);
19266        }
19267      }
19268
19269      setIsRendering(false);
19270    }
19271
19272    {
19273      markComponentRenderStopped();
19274    }
19275
19276    if (current !== null && !didReceiveUpdate) {
19277      bailoutHooks(current, workInProgress, renderLanes);
19278      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19279    }
19280
19281    if (getIsHydrating() && hasId) {
19282      pushMaterializedTreeId(workInProgress);
19283    } // React DevTools reads this flag.
19284
19285
19286    workInProgress.flags |= PerformedWork;
19287    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19288    return workInProgress.child;
19289  }
19290
19291  function updateMemoComponent(current, workInProgress, Component, nextProps, renderLanes) {
19292    if (current === null) {
19293      var type = Component.type;
19294
19295      if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either.
19296      Component.defaultProps === undefined) {
19297        var resolvedType = type;
19298
19299        {
19300          resolvedType = resolveFunctionForHotReloading(type);
19301        } // If this is a plain function component without default props,
19302        // and with only the default shallow comparison, we upgrade it
19303        // to a SimpleMemoComponent to allow fast path updates.
19304
19305
19306        workInProgress.tag = SimpleMemoComponent;
19307        workInProgress.type = resolvedType;
19308
19309        {
19310          validateFunctionComponentInDev(workInProgress, type);
19311        }
19312
19313        return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, renderLanes);
19314      }
19315
19316      {
19317        var innerPropTypes = type.propTypes;
19318
19319        if (innerPropTypes) {
19320          // Inner memo component props aren't currently validated in createElement.
19321          // We could move it there, but we'd still need this for lazy code path.
19322          checkPropTypes(innerPropTypes, nextProps, // Resolved props
19323          'prop', getComponentNameFromType(type));
19324        }
19325
19326        if ( Component.defaultProps !== undefined) {
19327          var componentName = getComponentNameFromType(type) || 'Unknown';
19328
19329          if (!didWarnAboutDefaultPropsOnFunctionComponent[componentName]) {
19330            error('%s: Support for defaultProps will be removed from memo components ' + 'in a future major release. Use JavaScript default parameters instead.', componentName);
19331
19332            didWarnAboutDefaultPropsOnFunctionComponent[componentName] = true;
19333          }
19334        }
19335      }
19336
19337      var child = createFiberFromTypeAndProps(Component.type, null, nextProps, workInProgress, workInProgress.mode, renderLanes);
19338      child.ref = workInProgress.ref;
vendor: 5,163 bytes, lines 19339-19450
19339      child.return = workInProgress;
19340      workInProgress.child = child;
19341      return child;
19342    }
19343
19344    {
19345      var _type = Component.type;
19346      var _innerPropTypes = _type.propTypes;
19347
19348      if (_innerPropTypes) {
19349        // Inner memo component props aren't currently validated in createElement.
19350        // We could move it there, but we'd still need this for lazy code path.
19351        checkPropTypes(_innerPropTypes, nextProps, // Resolved props
19352        'prop', getComponentNameFromType(_type));
19353      }
19354    }
19355
19356    var currentChild = current.child; // This is always exactly one child
19357
19358    var hasScheduledUpdateOrContext = checkScheduledUpdateOrContext(current, renderLanes);
19359
19360    if (!hasScheduledUpdateOrContext) {
19361      // This will be the props with resolved defaultProps,
19362      // unlike current.memoizedProps which will be the unresolved ones.
19363      var prevProps = currentChild.memoizedProps; // Default to shallow comparison
19364
19365      var compare = Component.compare;
19366      compare = compare !== null ? compare : shallowEqual;
19367
19368      if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) {
19369        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19370      }
19371    } // React DevTools reads this flag.
19372
19373
19374    workInProgress.flags |= PerformedWork;
19375    var newChild = createWorkInProgress(currentChild, nextProps);
19376    newChild.ref = workInProgress.ref;
19377    newChild.return = workInProgress;
19378    workInProgress.child = newChild;
19379    return newChild;
19380  }
19381
19382  function updateSimpleMemoComponent(current, workInProgress, Component, nextProps, renderLanes) {
19383    // TODO: current can be non-null here even if the component
19384    // hasn't yet mounted. This happens when the inner render suspends.
19385    // We'll need to figure out if this is fine or can cause issues.
19386    {
19387      if (workInProgress.type !== workInProgress.elementType) {
19388        // Lazy component props can't be validated in createElement
19389        // because they're only guaranteed to be resolved here.
19390        var outerMemoType = workInProgress.elementType;
19391
19392        if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {
19393          // We warn when you define propTypes on lazy()
19394          // so let's just skip over it to find memo() outer wrapper.
19395          // Inner props for memo are validated later.
19396          var lazyComponent = outerMemoType;
19397          var payload = lazyComponent._payload;
19398          var init = lazyComponent._init;
19399
19400          try {
19401            outerMemoType = init(payload);
19402          } catch (x) {
19403            outerMemoType = null;
19404          } // Inner propTypes will be validated in the function component path.
19405
19406
19407          var outerPropTypes = outerMemoType && outerMemoType.propTypes;
19408
19409          if (outerPropTypes) {
19410            checkPropTypes(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)
19411            'prop', getComponentNameFromType(outerMemoType));
19412          }
19413        }
19414      }
19415    }
19416
19417    if (current !== null) {
19418      var prevProps = current.memoizedProps;
19419
19420      if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload.
19421       workInProgress.type === current.type )) {
19422        didReceiveUpdate = false; // The props are shallowly equal. Reuse the previous props object, like we
19423        // would during a normal fiber bailout.
19424        //
19425        // We don't have strong guarantees that the props object is referentially
19426        // equal during updates where we can't bail out anyway — like if the props
19427        // are shallowly equal, but there's a local state or context update in the
19428        // same batch.
19429        //
19430        // However, as a principle, we should aim to make the behavior consistent
19431        // across different ways of memoizing a component. For example, React.memo
19432        // has a different internal Fiber layout if you pass a normal function
19433        // component (SimpleMemoComponent) versus if you pass a different type
19434        // like forwardRef (MemoComponent). But this is an implementation detail.
19435        // Wrapping a component in forwardRef (or React.lazy, etc) shouldn't
19436        // affect whether the props object is reused during a bailout.
19437
19438        workInProgress.pendingProps = nextProps = prevProps;
19439
19440        if (!checkScheduledUpdateOrContext(current, renderLanes)) {
19441          // The pending lanes were cleared at the beginning of beginWork. We're
19442          // about to bail out, but there might be other lanes that weren't
19443          // included in the current render. Usually, the priority level of the
19444          // remaining updates is accumulated during the evaluation of the
19445          // component (i.e. when processing the update queue). But since since
19446          // we're bailing out early *without* evaluating the component, we need
19447          // to account for it here, too. Reset to the value of the current fiber.
19448          // NOTE: This only applies to SimpleMemoComponent, not MemoComponent,
19449          // because a MemoComponent fiber does not have hooks or an update queue;
19450          // rather, it wraps around an inner component, which may or may not
19451          // contains hooks.
19452          // TODO: Move the reset at in beginWork out of the common path so that
19453          // this is no longer necessary.
19454          workInProgress.lanes = current.lanes;
19455          return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19456        } else if ((current.flags & ForceUpdateForLegacySuspense) !== NoFlags) {
19457          // This is a special case that only exists for legacy mode.
19458          // See https://github.com/facebook/react/pull/19216.
19459          didReceiveUpdate = true;
19460        }
19461      }
19462    }
19463
19464    return updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes);
19465  }
19466
19467  function updateOffscreenComponent(current, workInProgress, renderLanes) {
19468    var nextProps = workInProgress.pendingProps;
19469    var nextChildren = nextProps.children;
19470    var prevState = current !== null ? current.memoizedState : null;
19471
19472    if (nextProps.mode === 'hidden' || enableLegacyHidden ) {
19473      // Rendering a hidden tree.
19474      if ((workInProgress.mode & ConcurrentMode) === NoMode) {
19475        // In legacy sync mode, don't defer the subtree. Render it now.
19476        // TODO: Consider how Offscreen should work with transitions in the future
19477        var nextState = {
19478          baseLanes: NoLanes,
19479          cachePool: null,
19480          transitions: null
19481        };
19482        workInProgress.memoizedState = nextState;
19483
19484        pushRenderLanes(workInProgress, renderLanes);
19485      } else if (!includesSomeLane(renderLanes, OffscreenLane)) {
19486        var spawnedCachePool = null; // We're hidden, and we're not rendering at Offscreen. We will bail out
19487        // and resume this tree later.
19488
19489        var nextBaseLanes;
19490
19491        if (prevState !== null) {
19492          var prevBaseLanes = prevState.baseLanes;
19493          nextBaseLanes = mergeLanes(prevBaseLanes, renderLanes);
19494        } else {
19495          nextBaseLanes = renderLanes;
19496        } // Schedule this fiber to re-render at offscreen priority. Then bailout.
19497
19498
19499        workInProgress.lanes = workInProgress.childLanes = laneToLanes(OffscreenLane);
19500        var _nextState = {
19501          baseLanes: nextBaseLanes,
19502          cachePool: spawnedCachePool,
19503          transitions: null
19504        };
19505        workInProgress.memoizedState = _nextState;
19506        workInProgress.updateQueue = null;
19507        // to avoid a push/pop misalignment.
19508
19509
19510        pushRenderLanes(workInProgress, nextBaseLanes);
19511
19512        return null;
19513      } else {
19514        // This is the second render. The surrounding visible content has already
19515        // committed. Now we resume rendering the hidden tree.
19516        // Rendering at offscreen, so we can clear the base lanes.
19517        var _nextState2 = {
19518          baseLanes: NoLanes,
19519          cachePool: null,
19520          transitions: null
19521        };
19522        workInProgress.memoizedState = _nextState2; // Push the lanes that were skipped when we bailed out.
19523
19524        var subtreeRenderLanes = prevState !== null ? prevState.baseLanes : renderLanes;
19525
19526        pushRenderLanes(workInProgress, subtreeRenderLanes);
19527      }
19528    } else {
19529      // Rendering a visible tree.
19530      var _subtreeRenderLanes;
19531
19532      if (prevState !== null) {
19533        // We're going from hidden -> visible.
19534        _subtreeRenderLanes = mergeLanes(prevState.baseLanes, renderLanes);
19535
19536        workInProgress.memoizedState = null;
19537      } else {
19538        // We weren't previously hidden, and we still aren't, so there's nothing
19539        // special to do. Need to push to the stack regardless, though, to avoid
19540        // a push/pop misalignment.
19541        _subtreeRenderLanes = renderLanes;
19542      }
19543
19544      pushRenderLanes(workInProgress, _subtreeRenderLanes);
19545    }
19546
19547    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19548    return workInProgress.child;
19549  } // Note: These happen to have identical begin phases, for now. We shouldn't hold
19550
19551  function updateFragment(current, workInProgress, renderLanes) {
19552    var nextChildren = workInProgress.pendingProps;
19553    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19554    return workInProgress.child;
19555  }
19556
19557  function updateMode(current, workInProgress, renderLanes) {
19558    var nextChildren = workInProgress.pendingProps.children;
19559    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19560    return workInProgress.child;
19561  }
19562
19563  function updateProfiler(current, workInProgress, renderLanes) {
19564    {
19565      workInProgress.flags |= Update;
19566
19567      {
19568        // Reset effect durations for the next eventual effect phase.
19569        // These are reset during render to allow the DevTools commit hook a chance to read them,
19570        var stateNode = workInProgress.stateNode;
19571        stateNode.effectDuration = 0;
19572        stateNode.passiveEffectDuration = 0;
19573      }
19574    }
19575
19576    var nextProps = workInProgress.pendingProps;
19577    var nextChildren = nextProps.children;
19578    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19579    return workInProgress.child;
19580  }
19581
19582  function markRef(current, workInProgress) {
19583    var ref = workInProgress.ref;
19584
19585    if (current === null && ref !== null || current !== null && current.ref !== ref) {
19586      // Schedule a Ref effect
19587      workInProgress.flags |= Ref;
19588
19589      {
19590        workInProgress.flags |= RefStatic;
19591      }
19592    }
19593  }
19594
19595  function updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes) {
19596    {
19597      if (workInProgress.type !== workInProgress.elementType) {
19598        // Lazy component props can't be validated in createElement
19599        // because they're only guaranteed to be resolved here.
19600        var innerPropTypes = Component.propTypes;
19601
19602        if (innerPropTypes) {
19603          checkPropTypes(innerPropTypes, nextProps, // Resolved props
19604          'prop', getComponentNameFromType(Component));
19605        }
19606      }
19607    }
19608
19609    var context;
19610
19611    {
19612      var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);
19613      context = getMaskedContext(workInProgress, unmaskedContext);
19614    }
19615
19616    var nextChildren;
19617    var hasId;
19618    prepareToReadContext(workInProgress, renderLanes);
19619
19620    {
19621      markComponentRenderStarted(workInProgress);
19622    }
19623
19624    {
19625      ReactCurrentOwner$1.current = workInProgress;
19626      setIsRendering(true);
19627      nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderLanes);
19628      hasId = checkDidRenderIdHook();
19629
19630      if ( workInProgress.mode & StrictLegacyMode) {
19631        setIsStrictModeForDevtools(true);
19632
19633        try {
19634          nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderLanes);
19635          hasId = checkDidRenderIdHook();
19636        } finally {
19637          setIsStrictModeForDevtools(false);
19638        }
19639      }
19640
19641      setIsRendering(false);
19642    }
19643
19644    {
19645      markComponentRenderStopped();
19646    }
19647
19648    if (current !== null && !didReceiveUpdate) {
19649      bailoutHooks(current, workInProgress, renderLanes);
19650      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19651    }
19652
19653    if (getIsHydrating() && hasId) {
19654      pushMaterializedTreeId(workInProgress);
19655    } // React DevTools reads this flag.
19656
19657
19658    workInProgress.flags |= PerformedWork;
19659    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19660    return workInProgress.child;
19661  }
19662
19663  function updateClassComponent(current, workInProgress, Component, nextProps, renderLanes) {
19664    {
19665      // This is used by DevTools to force a boundary to error.
19666      switch (shouldError(workInProgress)) {
19667        case false:
19668          {
19669            var _instance = workInProgress.stateNode;
19670            var ctor = workInProgress.type; // TODO This way of resetting the error boundary state is a hack.
19671            // Is there a better way to do this?
19672
19673            var tempInstance = new ctor(workInProgress.memoizedProps, _instance.context);
19674            var state = tempInstance.state;
19675
19676            _instance.updater.enqueueSetState(_instance, state, null);
19677
19678            break;
19679          }
19680
19681        case true:
19682          {
19683            workInProgress.flags |= DidCapture;
19684            workInProgress.flags |= ShouldCapture; // eslint-disable-next-line react-internal/prod-error-codes
19685
19686            var error$1 = new Error('Simulated error coming from DevTools');
19687            var lane = pickArbitraryLane(renderLanes);
19688            workInProgress.lanes = mergeLanes(workInProgress.lanes, lane); // Schedule the error boundary to re-render using updated state
19689
19690            var update = createClassErrorUpdate(workInProgress, createCapturedValueAtFiber(error$1, workInProgress), lane);
19691            enqueueCapturedUpdate(workInProgress, update);
19692            break;
19693          }
19694      }
19695
19696      if (workInProgress.type !== workInProgress.elementType) {
19697        // Lazy component props can't be validated in createElement
19698        // because they're only guaranteed to be resolved here.
19699        var innerPropTypes = Component.propTypes;
19700
19701        if (innerPropTypes) {
19702          checkPropTypes(innerPropTypes, nextProps, // Resolved props
19703          'prop', getComponentNameFromType(Component));
19704        }
19705      }
19706    } // Push context providers early to prevent context stack mismatches.
19707    // During mounting we don't know the child context yet as the instance doesn't exist.
19708    // We will invalidate the child context in finishClassComponent() right after rendering.
19709
19710
19711    var hasContext;
19712
19713    if (isContextProvider(Component)) {
19714      hasContext = true;
19715      pushContextProvider(workInProgress);
19716    } else {
19717      hasContext = false;
vendor: 5,275 bytes, lines 19718-19869
19718    }
19719
19720    prepareToReadContext(workInProgress, renderLanes);
19721    var instance = workInProgress.stateNode;
19722    var shouldUpdate;
19723
19724    if (instance === null) {
19725      resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress); // In the initial pass we might need to construct the instance.
19726
19727      constructClassInstance(workInProgress, Component, nextProps);
19728      mountClassInstance(workInProgress, Component, nextProps, renderLanes);
19729      shouldUpdate = true;
19730    } else if (current === null) {
19731      // In a resume, we'll already have an instance we can reuse.
19732      shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderLanes);
19733    } else {
19734      shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderLanes);
19735    }
19736
19737    var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderLanes);
19738
19739    {
19740      var inst = workInProgress.stateNode;
19741
19742      if (shouldUpdate && inst.props !== nextProps) {
19743        if (!didWarnAboutReassigningProps) {
19744          error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentNameFromFiber(workInProgress) || 'a component');
19745        }
19746
19747        didWarnAboutReassigningProps = true;
19748      }
19749    }
19750
19751    return nextUnitOfWork;
19752  }
19753
19754  function finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderLanes) {
19755    // Refs should update even if shouldComponentUpdate returns false
19756    markRef(current, workInProgress);
19757    var didCaptureError = (workInProgress.flags & DidCapture) !== NoFlags;
19758
19759    if (!shouldUpdate && !didCaptureError) {
19760      // Context providers should defer to sCU for rendering
19761      if (hasContext) {
19762        invalidateContextProvider(workInProgress, Component, false);
19763      }
19764
19765      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19766    }
19767
19768    var instance = workInProgress.stateNode; // Rerender
19769
19770    ReactCurrentOwner$1.current = workInProgress;
19771    var nextChildren;
19772
19773    if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {
19774      // If we captured an error, but getDerivedStateFromError is not defined,
19775      // unmount all the children. componentDidCatch will schedule an update to
19776      // re-render a fallback. This is temporary until we migrate everyone to
19777      // the new API.
19778      // TODO: Warn in a future release.
19779      nextChildren = null;
19780
19781      {
19782        stopProfilerTimerIfRunning();
19783      }
19784    } else {
19785      {
19786        markComponentRenderStarted(workInProgress);
19787      }
19788
19789      {
19790        setIsRendering(true);
19791        nextChildren = instance.render();
19792
19793        if ( workInProgress.mode & StrictLegacyMode) {
19794          setIsStrictModeForDevtools(true);
19795
19796          try {
19797            instance.render();
19798          } finally {
19799            setIsStrictModeForDevtools(false);
19800          }
19801        }
19802
19803        setIsRendering(false);
19804      }
19805
19806      {
19807        markComponentRenderStopped();
19808      }
19809    } // React DevTools reads this flag.
19810
19811
19812    workInProgress.flags |= PerformedWork;
19813
19814    if (current !== null && didCaptureError) {
19815      // If we're recovering from an error, reconcile without reusing any of
19816      // the existing children. Conceptually, the normal children and the children
19817      // that are shown on error are two different sets, so we shouldn't reuse
19818      // normal children even if their identities match.
19819      forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderLanes);
19820    } else {
19821      reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19822    } // Memoize state using the values we just used to render.
19823    // TODO: Restructure so we never read values from the instance.
19824
19825
19826    workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it.
19827
19828    if (hasContext) {
19829      invalidateContextProvider(workInProgress, Component, true);
19830    }
19831
19832    return workInProgress.child;
19833  }
19834
19835  function pushHostRootContext(workInProgress) {
19836    var root = workInProgress.stateNode;
19837
19838    if (root.pendingContext) {
19839      pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);
19840    } else if (root.context) {
19841      // Should always be set
19842      pushTopLevelContextObject(workInProgress, root.context, false);
19843    }
19844
19845    pushHostContainer(workInProgress, root.containerInfo);
19846  }
19847
19848  function updateHostRoot(current, workInProgress, renderLanes) {
19849    pushHostRootContext(workInProgress);
19850
19851    if (current === null) {
19852      throw new Error('Should have a current fiber. This is a bug in React.');
19853    }
19854
19855    var nextProps = workInProgress.pendingProps;
19856    var prevState = workInProgress.memoizedState;
19857    var prevChildren = prevState.element;
19858    cloneUpdateQueue(current, workInProgress);
19859    processUpdateQueue(workInProgress, nextProps, null, renderLanes);
19860    var nextState = workInProgress.memoizedState;
19861    var root = workInProgress.stateNode;
19862    // being called "element".
19863
19864
19865    var nextChildren = nextState.element;
19866
19867    if ( prevState.isDehydrated) {
19868      // This is a hydration root whose shell has not yet hydrated. We should
19869      // attempt to hydrate.
19870      // Flip isDehydrated to false to indicate that when this render
19871      // finishes, the root will no longer be dehydrated.
19872      var overrideState = {
19873        element: nextChildren,
19874        isDehydrated: false,
19875        cache: nextState.cache,
19876        pendingSuspenseBoundaries: nextState.pendingSuspenseBoundaries,
19877        transitions: nextState.transitions
19878      };
19879      var updateQueue = workInProgress.updateQueue; // `baseState` can always be the last state because the root doesn't
19880      // have reducer functions so it doesn't need rebasing.
19881
19882      updateQueue.baseState = overrideState;
19883      workInProgress.memoizedState = overrideState;
19884
19885      if (workInProgress.flags & ForceClientRender) {
19886        // Something errored during a previous attempt to hydrate the shell, so we
19887        // forced a client render.
19888        var recoverableError = createCapturedValueAtFiber(new Error('There was an error while hydrating. Because the error happened outside ' + 'of a Suspense boundary, the entire root will switch to ' + 'client rendering.'), workInProgress);
19889        return mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes, recoverableError);
19890      } else if (nextChildren !== prevChildren) {
19891        var _recoverableError = createCapturedValueAtFiber(new Error('This root received an early update, before anything was able ' + 'hydrate. Switched the entire root to client rendering.'), workInProgress);
19892
19893        return mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes, _recoverableError);
19894      } else {
19895        // The outermost shell has not hydrated yet. Start hydrating.
19896        enterHydrationState(workInProgress);
19897
19898        var child = mountChildFibers(workInProgress, null, nextChildren, renderLanes);
19899        workInProgress.child = child;
19900        var node = child;
19901
19902        while (node) {
19903          // Mark each child as hydrating. This is a fast path to know whether this
19904          // tree is part of a hydrating tree. This is used to determine if a child
19905          // node has fully mounted yet, and for scheduling event replaying.
19906          // Conceptually this is similar to Placement in that a new subtree is
19907          // inserted into the React tree here. It just happens to not need DOM
19908          // mutations because it already exists.
19909          node.flags = node.flags & ~Placement | Hydrating;
19910          node = node.sibling;
19911        }
19912      }
19913    } else {
19914      // Root is not dehydrated. Either this is a client-only root, or it
19915      // already hydrated.
19916      resetHydrationState();
19917
19918      if (nextChildren === prevChildren) {
19919        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
19920      }
19921
19922      reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19923    }
19924
19925    return workInProgress.child;
19926  }
19927
19928  function mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes, recoverableError) {
19929    // Revert to client rendering.
19930    resetHydrationState();
19931    queueHydrationError(recoverableError);
19932    workInProgress.flags |= ForceClientRender;
19933    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19934    return workInProgress.child;
19935  }
19936
19937  function updateHostComponent(current, workInProgress, renderLanes) {
19938    pushHostContext(workInProgress);
19939
19940    if (current === null) {
19941      tryToClaimNextHydratableInstance(workInProgress);
19942    }
19943
19944    var type = workInProgress.type;
19945    var nextProps = workInProgress.pendingProps;
19946    var prevProps = current !== null ? current.memoizedProps : null;
19947    var nextChildren = nextProps.children;
19948    var isDirectTextChild = shouldSetTextContent(type, nextProps);
19949
19950    if (isDirectTextChild) {
19951      // We special case a direct text child of a host node. This is a common
19952      // case. We won't handle it as a reified child. We will instead handle
19953      // this in the host environment that also has access to this prop. That
19954      // avoids allocating another HostText fiber and traversing it.
19955      nextChildren = null;
19956    } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {
19957      // If we're switching from a direct text child to a normal child, or to
19958      // empty, we need to schedule the text content to be reset.
19959      workInProgress.flags |= ContentReset;
19960    }
19961
19962    markRef(current, workInProgress);
19963    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
19964    return workInProgress.child;
19965  }
19966
19967  function updateHostText(current, workInProgress) {
19968    if (current === null) {
vendor: 13,087 bytes, lines 19969-20305
19969      tryToClaimNextHydratableInstance(workInProgress);
19970    } // Nothing to do here. This is terminal. We'll do the completion step
19971    // immediately after.
19972
19973
19974    return null;
19975  }
19976
19977  function mountLazyComponent(_current, workInProgress, elementType, renderLanes) {
19978    resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress);
19979    var props = workInProgress.pendingProps;
19980    var lazyComponent = elementType;
19981    var payload = lazyComponent._payload;
19982    var init = lazyComponent._init;
19983    var Component = init(payload); // Store the unwrapped component in the type.
19984
19985    workInProgress.type = Component;
19986    var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);
19987    var resolvedProps = resolveDefaultProps(Component, props);
19988    var child;
19989
19990    switch (resolvedTag) {
19991      case FunctionComponent:
19992        {
19993          {
19994            validateFunctionComponentInDev(workInProgress, Component);
19995            workInProgress.type = Component = resolveFunctionForHotReloading(Component);
19996          }
19997
19998          child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderLanes);
19999          return child;
20000        }
20001
20002      case ClassComponent:
20003        {
20004          {
20005            workInProgress.type = Component = resolveClassForHotReloading(Component);
20006          }
20007
20008          child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderLanes);
20009          return child;
20010        }
20011
20012      case ForwardRef:
20013        {
20014          {
20015            workInProgress.type = Component = resolveForwardRefForHotReloading(Component);
20016          }
20017
20018          child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderLanes);
20019          return child;
20020        }
20021
20022      case MemoComponent:
20023        {
20024          {
20025            if (workInProgress.type !== workInProgress.elementType) {
20026              var outerPropTypes = Component.propTypes;
20027
20028              if (outerPropTypes) {
20029                checkPropTypes(outerPropTypes, resolvedProps, // Resolved for outer only
20030                'prop', getComponentNameFromType(Component));
20031              }
20032            }
20033          }
20034
20035          child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too
20036          renderLanes);
20037          return child;
20038        }
20039    }
20040
20041    var hint = '';
20042
20043    {
20044      if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {
20045        hint = ' Did you wrap a component in React.lazy() more than once?';
20046      }
20047    } // This message intentionally doesn't mention ForwardRef or MemoComponent
20048    // because the fact that it's a separate type of work is an
20049    // implementation detail.
20050
20051
20052    throw new Error("Element type is invalid. Received a promise that resolves to: " + Component + ". " + ("Lazy element type must resolve to a class or function." + hint));
20053  }
20054
20055  function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderLanes) {
20056    resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress); // Promote the fiber to a class and try rendering again.
20057
20058    workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent`
20059    // Push context providers early to prevent context stack mismatches.
20060    // During mounting we don't know the child context yet as the instance doesn't exist.
20061    // We will invalidate the child context in finishClassComponent() right after rendering.
20062
20063    var hasContext;
20064
20065    if (isContextProvider(Component)) {
20066      hasContext = true;
20067      pushContextProvider(workInProgress);
20068    } else {
20069      hasContext = false;
20070    }
20071
20072    prepareToReadContext(workInProgress, renderLanes);
20073    constructClassInstance(workInProgress, Component, nextProps);
20074    mountClassInstance(workInProgress, Component, nextProps, renderLanes);
20075    return finishClassComponent(null, workInProgress, Component, true, hasContext, renderLanes);
20076  }
20077
20078  function mountIndeterminateComponent(_current, workInProgress, Component, renderLanes) {
20079    resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress);
20080    var props = workInProgress.pendingProps;
20081    var context;
20082
20083    {
20084      var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);
20085      context = getMaskedContext(workInProgress, unmaskedContext);
20086    }
20087
20088    prepareToReadContext(workInProgress, renderLanes);
20089    var value;
20090    var hasId;
20091
20092    {
20093      markComponentRenderStarted(workInProgress);
20094    }
20095
20096    {
20097      if (Component.prototype && typeof Component.prototype.render === 'function') {
20098        var componentName = getComponentNameFromType(Component) || 'Unknown';
20099
20100        if (!didWarnAboutBadClass[componentName]) {
20101          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);
20102
20103          didWarnAboutBadClass[componentName] = true;
20104        }
20105      }
20106
20107      if (workInProgress.mode & StrictLegacyMode) {
20108        ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);
20109      }
20110
20111      setIsRendering(true);
20112      ReactCurrentOwner$1.current = workInProgress;
20113      value = renderWithHooks(null, workInProgress, Component, props, context, renderLanes);
20114      hasId = checkDidRenderIdHook();
20115      setIsRendering(false);
20116    }
20117
20118    {
20119      markComponentRenderStopped();
20120    } // React DevTools reads this flag.
20121
20122
20123    workInProgress.flags |= PerformedWork;
20124
20125    {
20126      // Support for module components is deprecated and is removed behind a flag.
20127      // Whether or not it would crash later, we want to show a good message in DEV first.
20128      if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
20129        var _componentName = getComponentNameFromType(Component) || 'Unknown';
20130
20131        if (!didWarnAboutModulePatternComponent[_componentName]) {
20132          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);
20133
20134          didWarnAboutModulePatternComponent[_componentName] = true;
20135        }
20136      }
20137    }
20138
20139    if ( // Run these checks in production only if the flag is off.
20140    // Eventually we'll delete this branch altogether.
20141     typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
20142      {
20143        var _componentName2 = getComponentNameFromType(Component) || 'Unknown';
20144
20145        if (!didWarnAboutModulePatternComponent[_componentName2]) {
20146          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);
20147
20148          didWarnAboutModulePatternComponent[_componentName2] = true;
20149        }
20150      } // Proceed under the assumption that this is a class instance
20151
20152
20153      workInProgress.tag = ClassComponent; // Throw out any hooks that were used.
20154
20155      workInProgress.memoizedState = null;
20156      workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches.
20157      // During mounting we don't know the child context yet as the instance doesn't exist.
20158      // We will invalidate the child context in finishClassComponent() right after rendering.
20159
20160      var hasContext = false;
20161
20162      if (isContextProvider(Component)) {
20163        hasContext = true;
20164        pushContextProvider(workInProgress);
20165      } else {
20166        hasContext = false;
20167      }
20168
20169      workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;
20170      initializeUpdateQueue(workInProgress);
20171      adoptClassInstance(workInProgress, value);
20172      mountClassInstance(workInProgress, Component, props, renderLanes);
20173      return finishClassComponent(null, workInProgress, Component, true, hasContext, renderLanes);
20174    } else {
20175      // Proceed under the assumption that this is a function component
20176      workInProgress.tag = FunctionComponent;
20177
20178      {
20179
20180        if ( workInProgress.mode & StrictLegacyMode) {
20181          setIsStrictModeForDevtools(true);
20182
20183          try {
20184            value = renderWithHooks(null, workInProgress, Component, props, context, renderLanes);
20185            hasId = checkDidRenderIdHook();
20186          } finally {
20187            setIsStrictModeForDevtools(false);
20188          }
20189        }
20190      }
20191
20192      if (getIsHydrating() && hasId) {
20193        pushMaterializedTreeId(workInProgress);
20194      }
20195
20196      reconcileChildren(null, workInProgress, value, renderLanes);
20197
20198      {
20199        validateFunctionComponentInDev(workInProgress, Component);
20200      }
20201
20202      return workInProgress.child;
20203    }
20204  }
20205
20206  function validateFunctionComponentInDev(workInProgress, Component) {
20207    {
20208      if (Component) {
20209        if (Component.childContextTypes) {
20210          error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component');
20211        }
20212      }
20213
20214      if (workInProgress.ref !== null) {
20215        var info = '';
20216        var ownerName = getCurrentFiberOwnerNameInDevOrNull();
20217
20218        if (ownerName) {
20219          info += '\n\nCheck the render method of `' + ownerName + '`.';
20220        }
20221
20222        var warningKey = ownerName || '';
20223        var debugSource = workInProgress._debugSource;
20224
20225        if (debugSource) {
20226          warningKey = debugSource.fileName + ':' + debugSource.lineNumber;
20227        }
20228
20229        if (!didWarnAboutFunctionRefs[warningKey]) {
20230          didWarnAboutFunctionRefs[warningKey] = true;
20231
20232          error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info);
20233        }
20234      }
20235
20236      if ( Component.defaultProps !== undefined) {
20237        var componentName = getComponentNameFromType(Component) || 'Unknown';
20238
20239        if (!didWarnAboutDefaultPropsOnFunctionComponent[componentName]) {
20240          error('%s: Support for defaultProps will be removed from function components ' + 'in a future major release. Use JavaScript default parameters instead.', componentName);
20241
20242          didWarnAboutDefaultPropsOnFunctionComponent[componentName] = true;
20243        }
20244      }
20245
20246      if (typeof Component.getDerivedStateFromProps === 'function') {
20247        var _componentName3 = getComponentNameFromType(Component) || 'Unknown';
20248
20249        if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3]) {
20250          error('%s: Function components do not support getDerivedStateFromProps.', _componentName3);
20251
20252          didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3] = true;
20253        }
20254      }
20255
20256      if (typeof Component.contextType === 'object' && Component.contextType !== null) {
20257        var _componentName4 = getComponentNameFromType(Component) || 'Unknown';
20258
20259        if (!didWarnAboutContextTypeOnFunctionComponent[_componentName4]) {
20260          error('%s: Function components do not support contextType.', _componentName4);
20261
20262          didWarnAboutContextTypeOnFunctionComponent[_componentName4] = true;
20263        }
20264      }
20265    }
20266  }
20267
20268  var SUSPENDED_MARKER = {
20269    dehydrated: null,
20270    treeContext: null,
20271    retryLane: NoLane
20272  };
20273
20274  function mountSuspenseOffscreenState(renderLanes) {
20275    return {
20276      baseLanes: renderLanes,
20277      cachePool: getSuspendedCache(),
20278      transitions: null
20279    };
20280  }
20281
20282  function updateSuspenseOffscreenState(prevOffscreenState, renderLanes) {
20283    var cachePool = null;
20284
20285    return {
20286      baseLanes: mergeLanes(prevOffscreenState.baseLanes, renderLanes),
20287      cachePool: cachePool,
20288      transitions: prevOffscreenState.transitions
20289    };
20290  } // TODO: Probably should inline this back
20291
20292
20293  function shouldRemainOnFallback(suspenseContext, current, workInProgress, renderLanes) {
20294    // If we're already showing a fallback, there are cases where we need to
20295    // remain on that fallback regardless of whether the content has resolved.
20296    // For example, SuspenseList coordinates when nested content appears.
20297    if (current !== null) {
20298      var suspenseState = current.memoizedState;
20299
20300      if (suspenseState === null) {
20301        // Currently showing content. Don't hide it, even if ForceSuspenseFallback
20302        // is true. More precise name might be "ForceRemainSuspenseFallback".
20303        // Note: This is a factoring smell. Can't remain on a fallback if there's
20304        // no fallback to remain on.
20305        return false;
20306      }
20307    } // Not currently showing content. Consult the Suspense context.
20308
20309
20310    return hasSuspenseContext(suspenseContext, ForceSuspenseFallback);
20311  }
20312
20313  function getRemainingWorkInPrimaryTree(current, renderLanes) {
20314    // TODO: Should not remove render lanes that were pinged during this render
20315    return removeLanes(current.childLanes, renderLanes);
20316  }
20317
20318  function updateSuspenseComponent(current, workInProgress, renderLanes) {
20319    var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend.
20320
20321    {
20322      if (shouldSuspend(workInProgress)) {
20323        workInProgress.flags |= DidCapture;
20324      }
20325    }
20326
20327    var suspenseContext = suspenseStackCursor.current;
20328    var showFallback = false;
20329    var didSuspend = (workInProgress.flags & DidCapture) !== NoFlags;
20330
20331    if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) {
20332      // Something in this boundary's subtree already suspended. Switch to
20333      // rendering the fallback children.
20334      showFallback = true;
20335      workInProgress.flags &= ~DidCapture;
20336    } else {
20337      // Attempting the main content
20338      if (current === null || current.memoizedState !== null) {
20339        // This is a new mount or this boundary is already showing a fallback state.
20340        // Mark this subtree context as having at least one invisible parent that could
20341        // handle the fallback state.
20342        // Avoided boundaries are not considered since they cannot handle preferred fallback states.
20343        {
20344          suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext);
20345        }
20346      }
20347    }
20348
20349    suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
20350    pushSuspenseContext(workInProgress, suspenseContext); // OK, the next part is confusing. We're about to reconcile the Suspense
20351    // boundary's children. This involves some custom reconciliation logic. Two
20352    // main reasons this is so complicated.
20353    //
20354    // First, Legacy Mode has different semantics for backwards compatibility. The
20355    // primary tree will commit in an inconsistent state, so when we do the
20356    // second pass to render the fallback, we do some exceedingly, uh, clever
20357    // hacks to make that not totally break. Like transferring effects and
20358    // deletions from hidden tree. In Concurrent Mode, it's much simpler,
20359    // because we bailout on the primary tree completely and leave it in its old
20360    // state, no effects. Same as what we do for Offscreen (except that
20361    // Offscreen doesn't have the first render pass).
20362    //
20363    // Second is hydration. During hydration, the Suspense fiber has a slightly
20364    // different layout, where the child points to a dehydrated fragment, which
20365    // contains the DOM rendered by the server.
20366    //
20367    // Third, even if you set all that aside, Suspense is like error boundaries in
20368    // that we first we try to render one tree, and if that fails, we render again
20369    // and switch to a different tree. Like a try/catch block. So we have to track
20370    // which branch we're currently rendering. Ideally we would model this using
20371    // a stack.
20372
20373    if (current === null) {
20374      // Initial mount
20375      // Special path for hydration
20376      // If we're currently hydrating, try to hydrate this boundary.
20377      tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component.
20378
20379      var suspenseState = workInProgress.memoizedState;
20380
20381      if (suspenseState !== null) {
20382        var dehydrated = suspenseState.dehydrated;
20383
20384        if (dehydrated !== null) {
20385          return mountDehydratedSuspenseComponent(workInProgress, dehydrated);
20386        }
20387      }
20388
20389      var nextPrimaryChildren = nextProps.children;
20390      var nextFallbackChildren = nextProps.fallback;
20391
20392      if (showFallback) {
20393        var fallbackFragment = mountSuspenseFallbackChildren(workInProgress, nextPrimaryChildren, nextFallbackChildren, renderLanes);
20394        var primaryChildFragment = workInProgress.child;
20395        primaryChildFragment.memoizedState = mountSuspenseOffscreenState(renderLanes);
20396        workInProgress.memoizedState = SUSPENDED_MARKER;
20397
20398        return fallbackFragment;
20399      } else {
20400        return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren);
20401      }
20402    } else {
20403      // This is an update.
20404      // Special path for hydration
20405      var prevState = current.memoizedState;
20406
20407      if (prevState !== null) {
20408        var _dehydrated = prevState.dehydrated;
20409
20410        if (_dehydrated !== null) {
20411          return updateDehydratedSuspenseComponent(current, workInProgress, didSuspend, nextProps, _dehydrated, prevState, renderLanes);
20412        }
20413      }
20414
20415      if (showFallback) {
20416        var _nextFallbackChildren = nextProps.fallback;
20417        var _nextPrimaryChildren = nextProps.children;
20418        var fallbackChildFragment = updateSuspenseFallbackChildren(current, workInProgress, _nextPrimaryChildren, _nextFallbackChildren, renderLanes);
20419        var _primaryChildFragment2 = workInProgress.child;
20420        var prevOffscreenState = current.child.memoizedState;
20421        _primaryChildFragment2.memoizedState = prevOffscreenState === null ? mountSuspenseOffscreenState(renderLanes) : updateSuspenseOffscreenState(prevOffscreenState, renderLanes);
20422
20423        _primaryChildFragment2.childLanes = getRemainingWorkInPrimaryTree(current, renderLanes);
20424        workInProgress.memoizedState = SUSPENDED_MARKER;
20425        return fallbackChildFragment;
20426      } else {
20427        var _nextPrimaryChildren2 = nextProps.children;
20428
20429        var _primaryChildFragment3 = updateSuspensePrimaryChildren(current, workInProgress, _nextPrimaryChildren2, renderLanes);
20430
20431        workInProgress.memoizedState = null;
20432        return _primaryChildFragment3;
20433      }
20434    }
20435  }
20436
20437  function mountSuspensePrimaryChildren(workInProgress, primaryChildren, renderLanes) {
20438    var mode = workInProgress.mode;
20439    var primaryChildProps = {
20440      mode: 'visible',
20441      children: primaryChildren
20442    };
20443    var primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, mode);
20444    primaryChildFragment.return = workInProgress;
20445    workInProgress.child = primaryChildFragment;
20446    return primaryChildFragment;
20447  }
20448
20449  function mountSuspenseFallbackChildren(workInProgress, primaryChildren, fallbackChildren, renderLanes) {
20450    var mode = workInProgress.mode;
20451    var progressedPrimaryFragment = workInProgress.child;
20452    var primaryChildProps = {
20453      mode: 'hidden',
20454      children: primaryChildren
20455    };
20456    var primaryChildFragment;
20457    var fallbackChildFragment;
20458
20459    if ((mode & ConcurrentMode) === NoMode && progressedPrimaryFragment !== null) {
20460      // In legacy mode, we commit the primary tree as if it successfully
20461      // completed, even though it's in an inconsistent state.
20462      primaryChildFragment = progressedPrimaryFragment;
20463      primaryChildFragment.childLanes = NoLanes;
20464      primaryChildFragment.pendingProps = primaryChildProps;
20465
20466      if ( workInProgress.mode & ProfileMode) {
20467        // Reset the durations from the first pass so they aren't included in the
20468        // final amounts. This seems counterintuitive, since we're intentionally
20469        // not measuring part of the render phase, but this makes it match what we
20470        // do in Concurrent Mode.
20471        primaryChildFragment.actualDuration = 0;
20472        primaryChildFragment.actualStartTime = -1;
20473        primaryChildFragment.selfBaseDuration = 0;
20474        primaryChildFragment.treeBaseDuration = 0;
20475      }
20476
20477      fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null);
20478    } else {
20479      primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, mode);
20480      fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null);
20481    }
20482
20483    primaryChildFragment.return = workInProgress;
20484    fallbackChildFragment.return = workInProgress;
20485    primaryChildFragment.sibling = fallbackChildFragment;
20486    workInProgress.child = primaryChildFragment;
20487    return fallbackChildFragment;
20488  }
20489
20490  function mountWorkInProgressOffscreenFiber(offscreenProps, mode, renderLanes) {
20491    // The props argument to `createFiberFromOffscreen` is `any` typed, so we use
20492    // this wrapper function to constrain it.
20493    return createFiberFromOffscreen(offscreenProps, mode, NoLanes, null);
20494  }
20495
20496  function updateWorkInProgressOffscreenFiber(current, offscreenProps) {
20497    // The props argument to `createWorkInProgress` is `any` typed, so we use this
20498    // wrapper function to constrain it.
20499    return createWorkInProgress(current, offscreenProps);
20500  }
20501
20502  function updateSuspensePrimaryChildren(current, workInProgress, primaryChildren, renderLanes) {
20503    var currentPrimaryChildFragment = current.child;
20504    var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
20505    var primaryChildFragment = updateWorkInProgressOffscreenFiber(currentPrimaryChildFragment, {
20506      mode: 'visible',
20507      children: primaryChildren
20508    });
20509
20510    if ((workInProgress.mode & ConcurrentMode) === NoMode) {
20511      primaryChildFragment.lanes = renderLanes;
20512    }
20513
20514    primaryChildFragment.return = workInProgress;
20515    primaryChildFragment.sibling = null;
20516
20517    if (currentFallbackChildFragment !== null) {
20518      // Delete the fallback child fragment
20519      var deletions = workInProgress.deletions;
20520
20521      if (deletions === null) {
20522        workInProgress.deletions = [currentFallbackChildFragment];
20523        workInProgress.flags |= ChildDeletion;
20524      } else {
20525        deletions.push(currentFallbackChildFragment);
20526      }
20527    }
20528
20529    workInProgress.child = primaryChildFragment;
20530    return primaryChildFragment;
20531  }
20532
20533  function updateSuspenseFallbackChildren(current, workInProgress, primaryChildren, fallbackChildren, renderLanes) {
20534    var mode = workInProgress.mode;
20535    var currentPrimaryChildFragment = current.child;
20536    var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
20537    var primaryChildProps = {
20538      mode: 'hidden',
20539      children: primaryChildren
20540    };
20541    var primaryChildFragment;
20542
20543    if ( // In legacy mode, we commit the primary tree as if it successfully
20544    // completed, even though it's in an inconsistent state.
20545    (mode & ConcurrentMode) === NoMode && // Make sure we're on the second pass, i.e. the primary child fragment was
20546    // already cloned. In legacy mode, the only case where this isn't true is
20547    // when DevTools forces us to display a fallback; we skip the first render
20548    // pass entirely and go straight to rendering the fallback. (In Concurrent
20549    // Mode, SuspenseList can also trigger this scenario, but this is a legacy-
20550    // only codepath.)
20551    workInProgress.child !== currentPrimaryChildFragment) {
20552      var progressedPrimaryFragment = workInProgress.child;
20553      primaryChildFragment = progressedPrimaryFragment;
20554      primaryChildFragment.childLanes = NoLanes;
20555      primaryChildFragment.pendingProps = primaryChildProps;
20556
20557      if ( workInProgress.mode & ProfileMode) {
20558        // Reset the durations from the first pass so they aren't included in the
20559        // final amounts. This seems counterintuitive, since we're intentionally
20560        // not measuring part of the render phase, but this makes it match what we
20561        // do in Concurrent Mode.
20562        primaryChildFragment.actualDuration = 0;
20563        primaryChildFragment.actualStartTime = -1;
20564        primaryChildFragment.selfBaseDuration = currentPrimaryChildFragment.selfBaseDuration;
20565        primaryChildFragment.treeBaseDuration = currentPrimaryChildFragment.treeBaseDuration;
20566      } // The fallback fiber was added as a deletion during the first pass.
20567      // However, since we're going to remain on the fallback, we no longer want
20568      // to delete it.
20569
20570
20571      workInProgress.deletions = null;
20572    } else {
20573      primaryChildFragment = updateWorkInProgressOffscreenFiber(currentPrimaryChildFragment, primaryChildProps); // Since we're reusing a current tree, we need to reuse the flags, too.
20574      // (We don't do this in legacy mode, because in legacy mode we don't re-use
20575      // the current tree; see previous branch.)
20576
20577      primaryChildFragment.subtreeFlags = currentPrimaryChildFragment.subtreeFlags & StaticMask;
20578    }
20579
20580    var fallbackChildFragment;
20581
20582    if (currentFallbackChildFragment !== null) {
20583      fallbackChildFragment = createWorkInProgress(currentFallbackChildFragment, fallbackChildren);
20584    } else {
20585      fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null); // Needs a placement effect because the parent (the Suspense boundary) already
20586      // mounted but this is a new fiber.
20587
20588      fallbackChildFragment.flags |= Placement;
20589    }
20590
20591    fallbackChildFragment.return = workInProgress;
20592    primaryChildFragment.return = workInProgress;
20593    primaryChildFragment.sibling = fallbackChildFragment;
20594    workInProgress.child = primaryChildFragment;
20595    return fallbackChildFragment;
20596  }
20597
20598  function retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, recoverableError) {
20599    // Falling back to client rendering. Because this has performance
20600    // implications, it's considered a recoverable error, even though the user
20601    // likely won't observe anything wrong with the UI.
20602    //
20603    // The error is passed in as an argument to enforce that every caller provide
20604    // a custom message, or explicitly opt out (currently the only path that opts
20605    // out is legacy mode; every concurrent path provides an error).
20606    if (recoverableError !== null) {
20607      queueHydrationError(recoverableError);
20608    } // This will add the old fiber to the deletion list
20609
20610
20611    reconcileChildFibers(workInProgress, current.child, null, renderLanes); // We're now not suspended nor dehydrated.
20612
20613    var nextProps = workInProgress.pendingProps;
20614    var primaryChildren = nextProps.children;
20615    var primaryChildFragment = mountSuspensePrimaryChildren(workInProgress, primaryChildren); // Needs a placement effect because the parent (the Suspense boundary) already
20616    // mounted but this is a new fiber.
20617
20618    primaryChildFragment.flags |= Placement;
20619    workInProgress.memoizedState = null;
20620    return primaryChildFragment;
20621  }
20622
20623  function mountSuspenseFallbackAfterRetryWithoutHydrating(current, workInProgress, primaryChildren, fallbackChildren, renderLanes) {
20624    var fiberMode = workInProgress.mode;
20625    var primaryChildProps = {
20626      mode: 'visible',
20627      children: primaryChildren
20628    };
20629    var primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, fiberMode);
20630    var fallbackChildFragment = createFiberFromFragment(fallbackChildren, fiberMode, renderLanes, null); // Needs a placement effect because the parent (the Suspense
20631    // boundary) already mounted but this is a new fiber.
20632
20633    fallbackChildFragment.flags |= Placement;
20634    primaryChildFragment.return = workInProgress;
20635    fallbackChildFragment.return = workInProgress;
20636    primaryChildFragment.sibling = fallbackChildFragment;
20637    workInProgress.child = primaryChildFragment;
20638
20639    if ((workInProgress.mode & ConcurrentMode) !== NoMode) {
20640      // We will have dropped the effect list which contains the
20641      // deletion. We need to reconcile to delete the current child.
20642      reconcileChildFibers(workInProgress, current.child, null, renderLanes);
20643    }
20644
20645    return fallbackChildFragment;
20646  }
20647
20648  function mountDehydratedSuspenseComponent(workInProgress, suspenseInstance, renderLanes) {
20649    // During the first pass, we'll bail out and not drill into the children.
20650    // Instead, we'll leave the content in place and try to hydrate it later.
20651    if ((workInProgress.mode & ConcurrentMode) === NoMode) {
20652      {
20653        error('Cannot hydrate Suspense in legacy mode. Switch from ' + 'ReactDOM.hydrate(element, container) to ' + 'ReactDOMClient.hydrateRoot(container, <App />)' + '.render(element) or remove the Suspense components from ' + 'the server rendered components.');
20654      }
20655
20656      workInProgress.lanes = laneToLanes(SyncLane);
20657    } else if (isSuspenseInstanceFallback(suspenseInstance)) {
20658      // This is a client-only boundary. Since we won't get any content from the server
20659      // for this, we need to schedule that at a higher priority based on when it would
20660      // have timed out. In theory we could render it in this pass but it would have the
20661      // wrong priority associated with it and will prevent hydration of parent path.
20662      // Instead, we'll leave work left on it to render it in a separate commit.
20663      // TODO This time should be the time at which the server rendered response that is
20664      // a parent to this boundary was displayed. However, since we currently don't have
20665      // a protocol to transfer that time, we'll just estimate it by using the current
20666      // time. This will mean that Suspense timeouts are slightly shifted to later than
20667      // they should be.
20668      // Schedule a normal pri update to render this content.
20669      workInProgress.lanes = laneToLanes(DefaultHydrationLane);
20670    } else {
20671      // We'll continue hydrating the rest at offscreen priority since we'll already
20672      // be showing the right content coming from the server, it is no rush.
20673      workInProgress.lanes = laneToLanes(OffscreenLane);
20674    }
20675
20676    return null;
20677  }
20678
20679  function updateDehydratedSuspenseComponent(current, workInProgress, didSuspend, nextProps, suspenseInstance, suspenseState, renderLanes) {
20680    if (!didSuspend) {
20681      // This is the first render pass. Attempt to hydrate.
20682      // We should never be hydrating at this point because it is the first pass,
20683      // but after we've already committed once.
20684      warnIfHydrating();
20685
20686      if ((workInProgress.mode & ConcurrentMode) === NoMode) {
20687        return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, // TODO: When we delete legacy mode, we should make this error argument
20688        // required — every concurrent mode path that causes hydration to
20689        // de-opt to client rendering should have an error message.
20690        null);
20691      }
20692
20693      if (isSuspenseInstanceFallback(suspenseInstance)) {
20694        // This boundary is in a permanent fallback state. In this case, we'll never
20695        // get an update and we'll never be able to hydrate the final content. Let's just try the
20696        // client side render instead.
20697        var digest, message, stack;
20698
20699        {
20700          var _getSuspenseInstanceF = getSuspenseInstanceFallbackErrorDetails(suspenseInstance);
20701
20702          digest = _getSuspenseInstanceF.digest;
20703          message = _getSuspenseInstanceF.message;
20704          stack = _getSuspenseInstanceF.stack;
20705        }
20706
20707        var error;
20708
20709        if (message) {
20710          // eslint-disable-next-line react-internal/prod-error-codes
20711          error = new Error(message);
20712        } else {
20713          error = new Error('The server could not finish this Suspense boundary, likely ' + 'due to an error during server rendering. Switched to ' + 'client rendering.');
20714        }
20715
20716        var capturedValue = createCapturedValue(error, digest, stack);
20717        return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, capturedValue);
20718      }
20719      // any context has changed, we need to treat is as if the input might have changed.
20720
20721
20722      var hasContextChanged = includesSomeLane(renderLanes, current.childLanes);
20723
20724      if (didReceiveUpdate || hasContextChanged) {
20725        // This boundary has changed since the first render. This means that we are now unable to
20726        // hydrate it. We might still be able to hydrate it using a higher priority lane.
20727        var root = getWorkInProgressRoot();
20728
20729        if (root !== null) {
20730          var attemptHydrationAtLane = getBumpedLaneForHydration(root, renderLanes);
20731
vendor: 17,046 bytes, lines 20732-21130
20732          if (attemptHydrationAtLane !== NoLane && attemptHydrationAtLane !== suspenseState.retryLane) {
20733            // Intentionally mutating since this render will get interrupted. This
20734            // is one of the very rare times where we mutate the current tree
20735            // during the render phase.
20736            suspenseState.retryLane = attemptHydrationAtLane; // TODO: Ideally this would inherit the event time of the current render
20737
20738            var eventTime = NoTimestamp;
20739            enqueueConcurrentRenderForLane(current, attemptHydrationAtLane);
20740            scheduleUpdateOnFiber(root, current, attemptHydrationAtLane, eventTime);
20741          }
20742        } // If we have scheduled higher pri work above, this will probably just abort the render
20743        // since we now have higher priority work, but in case it doesn't, we need to prepare to
20744        // render something, if we time out. Even if that requires us to delete everything and
20745        // skip hydration.
20746        // Delay having to do this as long as the suspense timeout allows us.
20747
20748
20749        renderDidSuspendDelayIfPossible();
20750
20751        var _capturedValue = createCapturedValue(new Error('This Suspense boundary received an update before it finished ' + 'hydrating. This caused the boundary to switch to client rendering. ' + 'The usual way to fix this is to wrap the original update ' + 'in startTransition.'));
20752
20753        return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, _capturedValue);
20754      } else if (isSuspenseInstancePending(suspenseInstance)) {
20755        // This component is still pending more data from the server, so we can't hydrate its
20756        // content. We treat it as if this component suspended itself. It might seem as if
20757        // we could just try to render it client-side instead. However, this will perform a
20758        // lot of unnecessary work and is unlikely to complete since it often will suspend
20759        // on missing data anyway. Additionally, the server might be able to render more
20760        // than we can on the client yet. In that case we'd end up with more fallback states
20761        // on the client than if we just leave it alone. If the server times out or errors
20762        // these should update this boundary to the permanent Fallback state instead.
20763        // Mark it as having captured (i.e. suspended).
20764        workInProgress.flags |= DidCapture; // Leave the child in place. I.e. the dehydrated fragment.
20765
20766        workInProgress.child = current.child; // Register a callback to retry this boundary once the server has sent the result.
20767
20768        var retry = retryDehydratedSuspenseBoundary.bind(null, current);
20769        registerSuspenseInstanceRetry(suspenseInstance, retry);
20770        return null;
20771      } else {
20772        // This is the first attempt.
20773        reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress, suspenseInstance, suspenseState.treeContext);
20774        var primaryChildren = nextProps.children;
20775        var primaryChildFragment = mountSuspensePrimaryChildren(workInProgress, primaryChildren); // Mark the children as hydrating. This is a fast path to know whether this
20776        // tree is part of a hydrating tree. This is used to determine if a child
20777        // node has fully mounted yet, and for scheduling event replaying.
20778        // Conceptually this is similar to Placement in that a new subtree is
20779        // inserted into the React tree here. It just happens to not need DOM
20780        // mutations because it already exists.
20781
20782        primaryChildFragment.flags |= Hydrating;
20783        return primaryChildFragment;
20784      }
20785    } else {
20786      // This is the second render pass. We already attempted to hydrated, but
20787      // something either suspended or errored.
20788      if (workInProgress.flags & ForceClientRender) {
20789        // Something errored during hydration. Try again without hydrating.
20790        workInProgress.flags &= ~ForceClientRender;
20791
20792        var _capturedValue2 = createCapturedValue(new Error('There was an error while hydrating this Suspense boundary. ' + 'Switched to client rendering.'));
20793
20794        return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, _capturedValue2);
20795      } else if (workInProgress.memoizedState !== null) {
20796        // Something suspended and we should still be in dehydrated mode.
20797        // Leave the existing child in place.
20798        workInProgress.child = current.child; // The dehydrated completion pass expects this flag to be there
20799        // but the normal suspense pass doesn't.
20800
20801        workInProgress.flags |= DidCapture;
20802        return null;
20803      } else {
20804        // Suspended but we should no longer be in dehydrated mode.
20805        // Therefore we now have to render the fallback.
20806        var nextPrimaryChildren = nextProps.children;
20807        var nextFallbackChildren = nextProps.fallback;
20808        var fallbackChildFragment = mountSuspenseFallbackAfterRetryWithoutHydrating(current, workInProgress, nextPrimaryChildren, nextFallbackChildren, renderLanes);
20809        var _primaryChildFragment4 = workInProgress.child;
20810        _primaryChildFragment4.memoizedState = mountSuspenseOffscreenState(renderLanes);
20811        workInProgress.memoizedState = SUSPENDED_MARKER;
20812        return fallbackChildFragment;
20813      }
20814    }
20815  }
20816
20817  function scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) {
20818    fiber.lanes = mergeLanes(fiber.lanes, renderLanes);
20819    var alternate = fiber.alternate;
20820
20821    if (alternate !== null) {
20822      alternate.lanes = mergeLanes(alternate.lanes, renderLanes);
20823    }
20824
20825    scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot);
20826  }
20827
20828  function propagateSuspenseContextChange(workInProgress, firstChild, renderLanes) {
20829    // Mark any Suspense boundaries with fallbacks as having work to do.
20830    // If they were previously forced into fallbacks, they may now be able
20831    // to unblock.
20832    var node = firstChild;
20833
20834    while (node !== null) {
20835      if (node.tag === SuspenseComponent) {
20836        var state = node.memoizedState;
20837
20838        if (state !== null) {
20839          scheduleSuspenseWorkOnFiber(node, renderLanes, workInProgress);
20840        }
20841      } else if (node.tag === SuspenseListComponent) {
20842        // If the tail is hidden there might not be an Suspense boundaries
20843        // to schedule work on. In this case we have to schedule it on the
20844        // list itself.
20845        // We don't have to traverse to the children of the list since
20846        // the list will propagate the change when it rerenders.
20847        scheduleSuspenseWorkOnFiber(node, renderLanes, workInProgress);
20848      } else if (node.child !== null) {
20849        node.child.return = node;
20850        node = node.child;
20851        continue;
20852      }
20853
20854      if (node === workInProgress) {
20855        return;
20856      }
20857
20858      while (node.sibling === null) {
20859        if (node.return === null || node.return === workInProgress) {
20860          return;
20861        }
20862
20863        node = node.return;
20864      }
20865
20866      node.sibling.return = node.return;
20867      node = node.sibling;
20868    }
20869  }
20870
20871  function findLastContentRow(firstChild) {
20872    // This is going to find the last row among these children that is already
20873    // showing content on the screen, as opposed to being in fallback state or
20874    // new. If a row has multiple Suspense boundaries, any of them being in the
20875    // fallback state, counts as the whole row being in a fallback state.
20876    // Note that the "rows" will be workInProgress, but any nested children
20877    // will still be current since we haven't rendered them yet. The mounted
20878    // order may not be the same as the new order. We use the new order.
20879    var row = firstChild;
20880    var lastContentRow = null;
20881
20882    while (row !== null) {
20883      var currentRow = row.alternate; // New rows can't be content rows.
20884
20885      if (currentRow !== null && findFirstSuspended(currentRow) === null) {
20886        lastContentRow = row;
20887      }
20888
20889      row = row.sibling;
20890    }
20891
20892    return lastContentRow;
20893  }
20894
20895  function validateRevealOrder(revealOrder) {
20896    {
20897      if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) {
20898        didWarnAboutRevealOrder[revealOrder] = true;
20899
20900        if (typeof revealOrder === 'string') {
20901          switch (revealOrder.toLowerCase()) {
20902            case 'together':
20903            case 'forwards':
20904            case 'backwards':
20905              {
20906                error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase());
20907
20908                break;
20909              }
20910
20911            case 'forward':
20912            case 'backward':
20913              {
20914                error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use "%ss" instead.', revealOrder, revealOrder.toLowerCase());
20915
20916                break;
20917              }
20918
20919            default:
20920              error('"%s" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder);
20921
20922              break;
20923          }
20924        } else {
20925          error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder);
20926        }
20927      }
20928    }
20929  }
20930
20931  function validateTailOptions(tailMode, revealOrder) {
20932    {
20933      if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) {
20934        if (tailMode !== 'collapsed' && tailMode !== 'hidden') {
20935          didWarnAboutTailOptions[tailMode] = true;
20936
20937          error('"%s" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean "collapsed" or "hidden"?', tailMode);
20938        } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') {
20939          didWarnAboutTailOptions[tailMode] = true;
20940
20941          error('<SuspenseList tail="%s" /> is only valid if revealOrder is ' + '"forwards" or "backwards". ' + 'Did you mean to specify revealOrder="forwards"?', tailMode);
20942        }
20943      }
20944    }
20945  }
20946
20947  function validateSuspenseListNestedChild(childSlot, index) {
20948    {
20949      var isAnArray = isArray(childSlot);
20950      var isIterable = !isAnArray && typeof getIteratorFn(childSlot) === 'function';
20951
20952      if (isAnArray || isIterable) {
20953        var type = isAnArray ? 'array' : 'iterable';
20954
20955        error('A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type);
20956
20957        return false;
20958      }
20959    }
20960
20961    return true;
20962  }
20963
20964  function validateSuspenseListChildren(children, revealOrder) {
20965    {
20966      if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) {
20967        if (isArray(children)) {
20968          for (var i = 0; i < children.length; i++) {
20969            if (!validateSuspenseListNestedChild(children[i], i)) {
20970              return;
20971            }
20972          }
20973        } else {
20974          var iteratorFn = getIteratorFn(children);
20975
20976          if (typeof iteratorFn === 'function') {
20977            var childrenIterator = iteratorFn.call(children);
20978
20979            if (childrenIterator) {
20980              var step = childrenIterator.next();
20981              var _i = 0;
20982
20983              for (; !step.done; step = childrenIterator.next()) {
20984                if (!validateSuspenseListNestedChild(step.value, _i)) {
20985                  return;
20986                }
20987
20988                _i++;
20989              }
20990            }
20991          } else {
20992            error('A single row was passed to a <SuspenseList revealOrder="%s" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder);
20993          }
20994        }
20995      }
20996    }
20997  }
20998
20999  function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode) {
21000    var renderState = workInProgress.memoizedState;
21001
21002    if (renderState === null) {
21003      workInProgress.memoizedState = {
21004        isBackwards: isBackwards,
21005        rendering: null,
21006        renderingStartTime: 0,
21007        last: lastContentRow,
21008        tail: tail,
21009        tailMode: tailMode
21010      };
21011    } else {
21012      // We can reuse the existing object from previous renders.
21013      renderState.isBackwards = isBackwards;
21014      renderState.rendering = null;
21015      renderState.renderingStartTime = 0;
21016      renderState.last = lastContentRow;
21017      renderState.tail = tail;
21018      renderState.tailMode = tailMode;
21019    }
21020  } // This can end up rendering this component multiple passes.
21021  // The first pass splits the children fibers into two sets. A head and tail.
21022  // We first render the head. If anything is in fallback state, we do another
21023  // pass through beginWork to rerender all children (including the tail) with
21024  // the force suspend context. If the first render didn't have anything in
21025  // in fallback state. Then we render each row in the tail one-by-one.
21026  // That happens in the completeWork phase without going back to beginWork.
21027
21028
21029  function updateSuspenseListComponent(current, workInProgress, renderLanes) {
21030    var nextProps = workInProgress.pendingProps;
21031    var revealOrder = nextProps.revealOrder;
21032    var tailMode = nextProps.tail;
21033    var newChildren = nextProps.children;
21034    validateRevealOrder(revealOrder);
21035    validateTailOptions(tailMode, revealOrder);
21036    validateSuspenseListChildren(newChildren, revealOrder);
21037    reconcileChildren(current, workInProgress, newChildren, renderLanes);
21038    var suspenseContext = suspenseStackCursor.current;
21039    var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback);
21040
21041    if (shouldForceFallback) {
21042      suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
21043      workInProgress.flags |= DidCapture;
21044    } else {
21045      var didSuspendBefore = current !== null && (current.flags & DidCapture) !== NoFlags;
21046
21047      if (didSuspendBefore) {
21048        // If we previously forced a fallback, we need to schedule work
21049        // on any nested boundaries to let them know to try to render
21050        // again. This is the same as context updating.
21051        propagateSuspenseContextChange(workInProgress, workInProgress.child, renderLanes);
21052      }
21053
21054      suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
21055    }
21056
21057    pushSuspenseContext(workInProgress, suspenseContext);
21058
21059    if ((workInProgress.mode & ConcurrentMode) === NoMode) {
21060      // In legacy mode, SuspenseList doesn't work so we just
21061      // use make it a noop by treating it as the default revealOrder.
21062      workInProgress.memoizedState = null;
21063    } else {
21064      switch (revealOrder) {
21065        case 'forwards':
21066          {
21067            var lastContentRow = findLastContentRow(workInProgress.child);
21068            var tail;
21069
21070            if (lastContentRow === null) {
21071              // The whole list is part of the tail.
21072              // TODO: We could fast path by just rendering the tail now.
21073              tail = workInProgress.child;
21074              workInProgress.child = null;
21075            } else {
21076              // Disconnect the tail rows after the content row.
21077              // We're going to render them separately later.
21078              tail = lastContentRow.sibling;
21079              lastContentRow.sibling = null;
21080            }
21081
21082            initSuspenseListRenderState(workInProgress, false, // isBackwards
21083            tail, lastContentRow, tailMode);
21084            break;
21085          }
21086
21087        case 'backwards':
21088          {
21089            // We're going to find the first row that has existing content.
21090            // At the same time we're going to reverse the list of everything
21091            // we pass in the meantime. That's going to be our tail in reverse
21092            // order.
21093            var _tail = null;
21094            var row = workInProgress.child;
21095            workInProgress.child = null;
21096
21097            while (row !== null) {
21098              var currentRow = row.alternate; // New rows can't be content rows.
21099
21100              if (currentRow !== null && findFirstSuspended(currentRow) === null) {
21101                // This is the beginning of the main content.
21102                workInProgress.child = row;
21103                break;
21104              }
21105
21106              var nextRow = row.sibling;
21107              row.sibling = _tail;
21108              _tail = row;
21109              row = nextRow;
21110            } // TODO: If workInProgress.child is null, we can continue on the tail immediately.
21111
21112
21113            initSuspenseListRenderState(workInProgress, true, // isBackwards
21114            _tail, null, // last
21115            tailMode);
21116            break;
21117          }
21118
21119        case 'together':
21120          {
21121            initSuspenseListRenderState(workInProgress, false, // isBackwards
21122            null, // tail
21123            null, // last
21124            undefined);
21125            break;
21126          }
21127
21128        default:
21129          {
21130            // The default reveal order is the same as not having
21131            // a boundary.
21132            workInProgress.memoizedState = null;
21133          }
21134      }
21135    }
21136
21137    return workInProgress.child;
21138  }
21139
21140  function updatePortalComponent(current, workInProgress, renderLanes) {
21141    pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
21142    var nextChildren = workInProgress.pendingProps;
21143
21144    if (current === null) {
21145      // Portals are special because we don't append the children during mount
21146      // but at commit. Therefore we need to track insertions which the normal
21147      // flow doesn't do during mount. This doesn't happen at the root because
21148      // the root always starts with a "current" with a null child.
21149      // TODO: Consider unifying this with how the root works.
21150      workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderLanes);
21151    } else {
21152      reconcileChildren(current, workInProgress, nextChildren, renderLanes);
21153    }
21154
21155    return workInProgress.child;
21156  }
21157
21158  var hasWarnedAboutUsingNoValuePropOnContextProvider = false;
vendor: 16,221 bytes, lines 21159-21583
21159
21160  function updateContextProvider(current, workInProgress, renderLanes) {
21161    var providerType = workInProgress.type;
21162    var context = providerType._context;
21163    var newProps = workInProgress.pendingProps;
21164    var oldProps = workInProgress.memoizedProps;
21165    var newValue = newProps.value;
21166
21167    {
21168      if (!('value' in newProps)) {
21169        if (!hasWarnedAboutUsingNoValuePropOnContextProvider) {
21170          hasWarnedAboutUsingNoValuePropOnContextProvider = true;
21171
21172          error('The `value` prop is required for the `<Context.Provider>`. Did you misspell it or forget to pass it?');
21173        }
21174      }
21175
21176      var providerPropTypes = workInProgress.type.propTypes;
21177
21178      if (providerPropTypes) {
21179        checkPropTypes(providerPropTypes, newProps, 'prop', 'Context.Provider');
21180      }
21181    }
21182
21183    pushProvider(workInProgress, context, newValue);
21184
21185    {
21186      if (oldProps !== null) {
21187        var oldValue = oldProps.value;
21188
21189        if (objectIs(oldValue, newValue)) {
21190          // No change. Bailout early if children are the same.
21191          if (oldProps.children === newProps.children && !hasContextChanged()) {
21192            return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
21193          }
21194        } else {
21195          // The context value changed. Search for matching consumers and schedule
21196          // them to update.
21197          propagateContextChange(workInProgress, context, renderLanes);
21198        }
21199      }
21200    }
21201
21202    var newChildren = newProps.children;
21203    reconcileChildren(current, workInProgress, newChildren, renderLanes);
21204    return workInProgress.child;
21205  }
21206
21207  var hasWarnedAboutUsingContextAsConsumer = false;
21208
21209  function updateContextConsumer(current, workInProgress, renderLanes) {
21210    var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In
21211    // DEV mode, we create a separate object for Context.Consumer that acts
21212    // like a proxy to Context. This proxy object adds unnecessary code in PROD
21213    // so we use the old behaviour (Context.Consumer references Context) to
21214    // reduce size and overhead. The separate object references context via
21215    // a property called "_context", which also gives us the ability to check
21216    // in DEV mode if this property exists or not and warn if it does not.
21217
21218    {
21219      if (context._context === undefined) {
21220        // This may be because it's a Context (rather than a Consumer).
21221        // Or it may be because it's older React where they're the same thing.
21222        // We only want to warn if we're sure it's a new React.
21223        if (context !== context.Consumer) {
21224          if (!hasWarnedAboutUsingContextAsConsumer) {
21225            hasWarnedAboutUsingContextAsConsumer = true;
21226
21227            error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
21228          }
21229        }
21230      } else {
21231        context = context._context;
21232      }
21233    }
21234
21235    var newProps = workInProgress.pendingProps;
21236    var render = newProps.children;
21237
21238    {
21239      if (typeof render !== 'function') {
21240        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.');
21241      }
21242    }
21243
21244    prepareToReadContext(workInProgress, renderLanes);
21245    var newValue = readContext(context);
21246
21247    {
21248      markComponentRenderStarted(workInProgress);
21249    }
21250
21251    var newChildren;
21252
21253    {
21254      ReactCurrentOwner$1.current = workInProgress;
21255      setIsRendering(true);
21256      newChildren = render(newValue);
21257      setIsRendering(false);
21258    }
21259
21260    {
21261      markComponentRenderStopped();
21262    } // React DevTools reads this flag.
21263
21264
21265    workInProgress.flags |= PerformedWork;
21266    reconcileChildren(current, workInProgress, newChildren, renderLanes);
21267    return workInProgress.child;
21268  }
21269
21270  function markWorkInProgressReceivedUpdate() {
21271    didReceiveUpdate = true;
21272  }
21273
21274  function resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress) {
21275    if ((workInProgress.mode & ConcurrentMode) === NoMode) {
21276      if (current !== null) {
21277        // A lazy component only mounts if it suspended inside a non-
21278        // concurrent tree, in an inconsistent state. We want to treat it like
21279        // a new mount, even though an empty version of it already committed.
21280        // Disconnect the alternate pointers.
21281        current.alternate = null;
21282        workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
21283
21284        workInProgress.flags |= Placement;
21285      }
21286    }
21287  }
21288
21289  function bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) {
21290    if (current !== null) {
21291      // Reuse previous dependencies
21292      workInProgress.dependencies = current.dependencies;
21293    }
21294
21295    {
21296      // Don't update "base" render times for bailouts.
21297      stopProfilerTimerIfRunning();
21298    }
21299
21300    markSkippedUpdateLanes(workInProgress.lanes); // Check if the children have any pending work.
21301
21302    if (!includesSomeLane(renderLanes, workInProgress.childLanes)) {
21303      // The children don't have any work either. We can skip them.
21304      // TODO: Once we add back resuming, we should check if the children are
21305      // a work-in-progress set. If so, we need to transfer their effects.
21306      {
21307        return null;
21308      }
21309    } // This fiber doesn't have work, but its subtree does. Clone the child
21310    // fibers and continue.
21311
21312
21313    cloneChildFibers(current, workInProgress);
21314    return workInProgress.child;
21315  }
21316
21317  function remountFiber(current, oldWorkInProgress, newWorkInProgress) {
21318    {
21319      var returnFiber = oldWorkInProgress.return;
21320
21321      if (returnFiber === null) {
21322        // eslint-disable-next-line react-internal/prod-error-codes
21323        throw new Error('Cannot swap the root fiber.');
21324      } // Disconnect from the old current.
21325      // It will get deleted.
21326
21327
21328      current.alternate = null;
21329      oldWorkInProgress.alternate = null; // Connect to the new tree.
21330
21331      newWorkInProgress.index = oldWorkInProgress.index;
21332      newWorkInProgress.sibling = oldWorkInProgress.sibling;
21333      newWorkInProgress.return = oldWorkInProgress.return;
21334      newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it.
21335
21336      if (oldWorkInProgress === returnFiber.child) {
21337        returnFiber.child = newWorkInProgress;
21338      } else {
21339        var prevSibling = returnFiber.child;
21340
21341        if (prevSibling === null) {
21342          // eslint-disable-next-line react-internal/prod-error-codes
21343          throw new Error('Expected parent to have a child.');
21344        }
21345
21346        while (prevSibling.sibling !== oldWorkInProgress) {
21347          prevSibling = prevSibling.sibling;
21348
21349          if (prevSibling === null) {
21350            // eslint-disable-next-line react-internal/prod-error-codes
21351            throw new Error('Expected to find the previous sibling.');
21352          }
21353        }
21354
21355        prevSibling.sibling = newWorkInProgress;
21356      } // Delete the old fiber and place the new one.
21357      // Since the old fiber is disconnected, we have to schedule it manually.
21358
21359
21360      var deletions = returnFiber.deletions;
21361
21362      if (deletions === null) {
21363        returnFiber.deletions = [current];
21364        returnFiber.flags |= ChildDeletion;
21365      } else {
21366        deletions.push(current);
21367      }
21368
21369      newWorkInProgress.flags |= Placement; // Restart work from the new fiber.
21370
21371      return newWorkInProgress;
21372    }
21373  }
21374
21375  function checkScheduledUpdateOrContext(current, renderLanes) {
21376    // Before performing an early bailout, we must check if there are pending
21377    // updates or context.
21378    var updateLanes = current.lanes;
21379
21380    if (includesSomeLane(updateLanes, renderLanes)) {
21381      return true;
21382    } // No pending update, but because context is propagated lazily, we need
21383
21384    return false;
21385  }
21386
21387  function attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress, renderLanes) {
21388    // This fiber does not have any pending work. Bailout without entering
21389    // the begin phase. There's still some bookkeeping we that needs to be done
21390    // in this optimized path, mostly pushing stuff onto the stack.
21391    switch (workInProgress.tag) {
21392      case HostRoot:
21393        pushHostRootContext(workInProgress);
21394        var root = workInProgress.stateNode;
21395
21396        resetHydrationState();
21397        break;
21398
21399      case HostComponent:
21400        pushHostContext(workInProgress);
21401        break;
21402
21403      case ClassComponent:
21404        {
21405          var Component = workInProgress.type;
21406
21407          if (isContextProvider(Component)) {
21408            pushContextProvider(workInProgress);
21409          }
21410
21411          break;
21412        }
21413
21414      case HostPortal:
21415        pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
21416        break;
21417
21418      case ContextProvider:
21419        {
21420          var newValue = workInProgress.memoizedProps.value;
21421          var context = workInProgress.type._context;
21422          pushProvider(workInProgress, context, newValue);
21423          break;
21424        }
21425
21426      case Profiler:
21427        {
21428          // Profiler should only call onRender when one of its descendants actually rendered.
21429          var hasChildWork = includesSomeLane(renderLanes, workInProgress.childLanes);
21430
21431          if (hasChildWork) {
21432            workInProgress.flags |= Update;
21433          }
21434
21435          {
21436            // Reset effect durations for the next eventual effect phase.
21437            // These are reset during render to allow the DevTools commit hook a chance to read them,
21438            var stateNode = workInProgress.stateNode;
21439            stateNode.effectDuration = 0;
21440            stateNode.passiveEffectDuration = 0;
21441          }
21442        }
21443
21444        break;
21445
21446      case SuspenseComponent:
21447        {
21448          var state = workInProgress.memoizedState;
21449
21450          if (state !== null) {
21451            if (state.dehydrated !== null) {
21452              pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // We know that this component will suspend again because if it has
21453              // been unsuspended it has committed as a resolved Suspense component.
21454              // If it needs to be retried, it should have work scheduled on it.
21455
21456              workInProgress.flags |= DidCapture; // We should never render the children of a dehydrated boundary until we
21457              // upgrade it. We return null instead of bailoutOnAlreadyFinishedWork.
21458
21459              return null;
21460            } // If this boundary is currently timed out, we need to decide
21461            // whether to retry the primary children, or to skip over it and
21462            // go straight to the fallback. Check the priority of the primary
21463            // child fragment.
21464
21465
21466            var primaryChildFragment = workInProgress.child;
21467            var primaryChildLanes = primaryChildFragment.childLanes;
21468
21469            if (includesSomeLane(renderLanes, primaryChildLanes)) {
21470              // The primary children have pending work. Use the normal path
21471              // to attempt to render the primary children again.
21472              return updateSuspenseComponent(current, workInProgress, renderLanes);
21473            } else {
21474              // The primary child fragment does not have pending work marked
21475              // on it
21476              pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient
21477              // priority. Bailout.
21478
21479              var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
21480
21481              if (child !== null) {
21482                // The fallback children have pending work. Skip over the
21483                // primary children and work on the fallback.
21484                return child.sibling;
21485              } else {
21486                // Note: We can return `null` here because we already checked
21487                // whether there were nested context consumers, via the call to
21488                // `bailoutOnAlreadyFinishedWork` above.
21489                return null;
21490              }
21491            }
21492          } else {
21493            pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current));
21494          }
21495
21496          break;
21497        }
21498
21499      case SuspenseListComponent:
21500        {
21501          var didSuspendBefore = (current.flags & DidCapture) !== NoFlags;
21502
21503          var _hasChildWork = includesSomeLane(renderLanes, workInProgress.childLanes);
21504
21505          if (didSuspendBefore) {
21506            if (_hasChildWork) {
21507              // If something was in fallback state last time, and we have all the
21508              // same children then we're still in progressive loading state.
21509              // Something might get unblocked by state updates or retries in the
21510              // tree which will affect the tail. So we need to use the normal
21511              // path to compute the correct tail.
21512              return updateSuspenseListComponent(current, workInProgress, renderLanes);
21513            } // If none of the children had any work, that means that none of
21514            // them got retried so they'll still be blocked in the same way
21515            // as before. We can fast bail out.
21516
21517
21518            workInProgress.flags |= DidCapture;
21519          } // If nothing suspended before and we're rendering the same children,
21520          // then the tail doesn't matter. Anything new that suspends will work
21521          // in the "together" mode, so we can continue from the state we had.
21522
21523
21524          var renderState = workInProgress.memoizedState;
21525
21526          if (renderState !== null) {
21527            // Reset to the "together" mode in case we've started a different
21528            // update in the past but didn't complete it.
21529            renderState.rendering = null;
21530            renderState.tail = null;
21531            renderState.lastEffect = null;
21532          }
21533
21534          pushSuspenseContext(workInProgress, suspenseStackCursor.current);
21535
21536          if (_hasChildWork) {
21537            break;
21538          } else {
21539            // If none of the children had any work, that means that none of
21540            // them got retried so they'll still be blocked in the same way
21541            // as before. We can fast bail out.
21542            return null;
21543          }
21544        }
21545
21546      case OffscreenComponent:
21547      case LegacyHiddenComponent:
21548        {
21549          // Need to check if the tree still needs to be deferred. This is
21550          // almost identical to the logic used in the normal update path,
21551          // so we'll just enter that. The only difference is we'll bail out
21552          // at the next level instead of this one, because the child props
21553          // have not changed. Which is fine.
21554          // TODO: Probably should refactor `beginWork` to split the bailout
21555          // path from the normal path. I'm tempted to do a labeled break here
21556          // but I won't :)
21557          workInProgress.lanes = NoLanes;
21558          return updateOffscreenComponent(current, workInProgress, renderLanes);
21559        }
21560    }
21561
21562    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
21563  }
21564
21565  function beginWork(current, workInProgress, renderLanes) {
21566    {
21567      if (workInProgress._debugNeedsRemount && current !== null) {
21568        // This will restart the begin phase with a new fiber.
21569        return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.lanes));
21570      }
21571    }
21572
21573    if (current !== null) {
21574      var oldProps = current.memoizedProps;
21575      var newProps = workInProgress.pendingProps;
21576
21577      if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload:
21578       workInProgress.type !== current.type )) {
21579        // If props or context changed, mark the fiber as having performed work.
21580        // This may be unset if the props are determined to be equal later (memo).
21581        didReceiveUpdate = true;
21582      } else {
21583        // Neither props nor legacy context changes. Check if there's a pen
21583ding
21584        // update or context change.
21585        var hasScheduledUpdateOrContext = checkScheduledUpdateOrContext(current, renderLanes);
21586
21587        if (!hasScheduledUpdateOrContext && // If this is the second pass of an error or suspense boundary, there
21588        // may not be work scheduled on `current`, so we check for this flag.
21589        (workInProgress.flags & DidCapture) === NoFlags) {
21590          // No pending updates or context. Bail out now.
21591          didReceiveUpdate = false;
21592          return attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress, renderLanes);
21593        }
21594
21595        if ((current.flags & ForceUpdateForLegacySuspense) !== NoFlags) {
21596          // This is a special case that only exists for legacy mode.
21597          // See https://github.com/facebook/react/pull/19216.
21598          didReceiveUpdate = true;
21599        } else {
21600          // An update was scheduled on this fiber, but there are no new props
21601          // nor legacy context. Set this to false. If an update queue or context
21602          // consumer produces a changed value, it will set this to true. Otherwise,
21603          // the component will assume the children have not changed and bail out.
21604          didReceiveUpdate = false;
21605        }
21606      }
21607    } else {
21608      didReceiveUpdate = false;
21609
21610      if (getIsHydrating() && isForkedChild(workInProgress)) {
21611        // Check if this child belongs to a list of muliple children in
21612        // its parent.
21613        //
21614        // In a true multi-threaded implementation, we would render children on
21615        // parallel threads. This would represent the beginning of a new render
21616        // thread for this subtree.
21617        //
21618        // We only use this for id generation during hydration, which is why the
21619        // logic is located in this special branch.
21620        var slotIndex = workInProgress.index;
21621        var numberOfForks = getForksAtLevel();
21622        pushTreeId(workInProgress, numberOfForks, slotIndex);
21623      }
21624    } // Before entering the begin phase, clear pending update priority.
21625    // TODO: This assumes that we're about to evaluate the component and process
21626    // the update queue. However, there's an exception: SimpleMemoComponent
21627    // sometimes bails out later in the begin phase. This indicates that we should
21628    // move this assignment out of the common path and into each branch.
21629
21630
21631    workInProgress.lanes = NoLanes;
21632
21633    switch (workInProgress.tag) {
21634      case IndeterminateComponent:
21635        {
21636          return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderLanes);
21637        }
21638
21639      case LazyComponent:
21640        {
21641          var elementType = workInProgress.elementType;
21642          return mountLazyComponent(current, workInProgress, elementType, renderLanes);
21643        }
21644
21645      case FunctionComponent:
21646        {
21647          var Component = workInProgress.type;
21648          var unresolvedProps = workInProgress.pendingProps;
21649          var resolvedProps = workInProgress.elementType === Component ? unresolvedProps : resolveDefaultProps(Component, unresolvedProps);
21650          return updateFunctionComponent(current, workInProgress, Component, resolvedProps, renderLanes);
21651        }
21652
21653      case ClassComponent:
21654        {
21655          var _Component = workInProgress.type;
21656          var _unresolvedProps = workInProgress.pendingProps;
21657
21658          var _resolvedProps = workInProgress.elementType === _Component ? _unresolvedProps : resolveDefaultProps(_Component, _unresolvedProps);
21659
21660          return updateClassComponent(current, workInProgress, _Component, _resolvedProps, renderLanes);
21661        }
21662
21663      case HostRoot:
21664        return updateHostRoot(current, workInProgress, renderLanes);
21665
21666      case HostComponent:
21667        return updateHostComponent(current, workInProgress, renderLanes);
21668
21669      case HostText:
21670        return updateHostText(current, workInProgress);
21671
21672      case SuspenseComponent:
21673        return updateSuspenseComponent(current, workInProgress, renderLanes);
21674
21675      case HostPortal:
21676        return updatePortalComponent(current, workInProgress, renderLanes);
21677
21678      case ForwardRef:
21679        {
21680          var type = workInProgress.type;
21681          var _unresolvedProps2 = workInProgress.pendingProps;
21682
21683          var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
21684
21685          return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderLanes);
21686        }
21687
21688      case Fragment:
21689        return updateFragment(current, workInProgress, renderLanes);
21690
21691      case Mode:
21692        return updateMode(current, workInProgress, renderLanes);
21693
21694      case Profiler:
21695        return updateProfiler(current, workInProgress, renderLanes);
21696
21697      case ContextProvider:
21698        return updateContextProvider(current, workInProgress, renderLanes);
21699
21700      case ContextConsumer:
21701        return updateContextConsumer(current, workInProgress, renderLanes);
21702
21703      case MemoComponent:
21704        {
21705          var _type2 = workInProgress.type;
21706          var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props.
21707
21708          var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);
21709
21710          {
21711            if (workInProgress.type !== workInProgress.elementType) {
21712              var outerPropTypes = _type2.propTypes;
21713
21714              if (outerPropTypes) {
21715                checkPropTypes(outerPropTypes, _resolvedProps3, // Resolved for outer only
21716                'prop', getComponentNameFromType(_type2));
21717              }
21718            }
21719          }
21720
21721          _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);
21722          return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, renderLanes);
21723        }
21724
21725      case SimpleMemoComponent:
21726        {
21727          return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes);
21728        }
21729
21730      case IncompleteClassComponent:
21731        {
21732          var _Component2 = workInProgress.type;
21733          var _unresolvedProps4 = workInProgress.pendingProps;
21734
21735          var _resolvedProps4 = workInProgress.elementType === _Component2 ? _unresolvedProps4 : resolveDefaultProps(_Component2, _unresolvedProps4);
21736
21737          return mountIncompleteClassComponent(current, workInProgress, _Component2, _resolvedProps4, renderLanes);
21738        }
21739
21740      case SuspenseListComponent:
21741        {
21742          return updateSuspenseListComponent(current, workInProgress, renderLanes);
21743        }
21744
21745      case ScopeComponent:
21746        {
21747
21748          break;
21749        }
21750
21751      case OffscreenComponent:
21752        {
21753          return updateOffscreenComponent(current, workInProgress, renderLanes);
21754        }
21755    }
21756
21757    throw new Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in " + 'React. Please file an issue.');
21758  }
21759
21760  function markUpdate(workInProgress) {
21761    // Tag the fiber with an update effect. This turns a Placement into
21762    // a PlacementAndUpdate.
21763    workInProgress.flags |= Update;
21764  }
21765
vendor: 4,236 bytes, lines 21766-21886
21766  function markRef$1(workInProgress) {
21767    workInProgress.flags |= Ref;
21768
21769    {
21770      workInProgress.flags |= RefStatic;
21771    }
21772  }
21773
21774  var appendAllChildren;
21775  var updateHostContainer;
21776  var updateHostComponent$1;
21777  var updateHostText$1;
21778
21779  {
21780    // Mutation mode
21781    appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
21782      // We only have the top Fiber that was created but we need recurse down its
21783      // children to find all the terminal nodes.
21784      var node = workInProgress.child;
21785
21786      while (node !== null) {
21787        if (node.tag === HostComponent || node.tag === HostText) {
21788          appendInitialChild(parent, node.stateNode);
21789        } else if (node.tag === HostPortal) ; else if (node.child !== null) {
21790          node.child.return = node;
21791          node = node.child;
21792          continue;
21793        }
21794
21795        if (node === workInProgress) {
21796          return;
21797        }
21798
21799        while (node.sibling === null) {
21800          if (node.return === null || node.return === workInProgress) {
21801            return;
21802          }
21803
21804          node = node.return;
21805        }
21806
21807        node.sibling.return = node.return;
21808        node = node.sibling;
21809      }
21810    };
21811
21812    updateHostContainer = function (current, workInProgress) {// Noop
21813    };
21814
21815    updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
21816      // If we have an alternate, that means this is an update and we need to
21817      // schedule a side-effect to do the updates.
21818      var oldProps = current.memoizedProps;
21819
21820      if (oldProps === newProps) {
21821        // In mutation mode, this is sufficient for a bailout because
21822        // we won't touch this node even if children changed.
21823        return;
21824      } // If we get updated because one of our children updated, we don't
21825      // have newProps so we'll have to reuse them.
21826      // TODO: Split the update API as separate for the props vs. children.
21827      // Even better would be if children weren't special cased at all tho.
21828
21829
21830      var instance = workInProgress.stateNode;
21831      var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host
21832      // component is hitting the resume path. Figure out why. Possibly
21833      // related to `hidden`.
21834
21835      var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component.
21836
21837      workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there
21838      // is a new ref we mark this as an update. All the work is done in commitWork.
21839
21840      if (updatePayload) {
21841        markUpdate(workInProgress);
21842      }
21843    };
21844
21845    updateHostText$1 = function (current, workInProgress, oldText, newText) {
21846      // If the text differs, mark it as an update. All the work in done in commitWork.
21847      if (oldText !== newText) {
21848        markUpdate(workInProgress);
21849      }
21850    };
21851  }
21852
21853  function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {
21854    if (getIsHydrating()) {
21855      // If we're hydrating, we should consume as many items as we can
21856      // so we don't leave any behind.
21857      return;
21858    }
21859
21860    switch (renderState.tailMode) {
21861      case 'hidden':
21862        {
21863          // Any insertions at the end of the tail list after this point
21864          // should be invisible. If there are already mounted boundaries
21865          // anything before them are not considered for collapsing.
21866          // Therefore we need to go through the whole tail to find if
21867          // there are any.
21868          var tailNode = renderState.tail;
21869          var lastTailNode = null;
21870
21871          while (tailNode !== null) {
21872            if (tailNode.alternate !== null) {
21873              lastTailNode = tailNode;
21874            }
21875
21876            tailNode = tailNode.sibling;
21877          } // Next we're simply going to delete all insertions after the
21878          // last rendered item.
21879
21880
21881          if (lastTailNode === null) {
21882            // All remaining items in the tail are insertions.
21883            renderState.tail = null;
21884          } else {
21885            // Detach the insertion after the last node that was already
21886            // inserted.
21887            lastTailNode.sibling = null;
21888          }
21889
21890          break;
21891        }
21892
21893      case 'collapsed':
21894        {
21895          // Any insertions at the end of the tail list after this point
21896          // should be invisible. If there are already mounted boundaries
21897          // anything before them are not considered for collapsing.
21898          // Therefore we need to go through the whole tail to find if
21899          // there are any.
21900          var _tailNode = renderState.tail;
21901          var _lastTailNode = null;
21902
21903          while (_tailNode !== null) {
21904            if (_tailNode.alternate !== null) {
21905              _lastTailNode = _tailNode;
21906            }
21907
21908            _tailNode = _tailNode.sibling;
21909          } // Next we're simply going to delete all insertions after the
21910          // last rendered item.
21911
21912
21913          if (_lastTailNode === null) {
21914            // All remaining items in the tail are insertions.
21915            if (!hasRenderedATailFallback && renderState.tail !== null) {
21916              // We suspended during the head. We want to show at least one
21917              // row at the tail. So we'll keep on and cut off the rest.
21918              renderState.tail.sibling = null;
21919            } else {
21920              renderState.tail = null;
21921            }
21922          } else {
21923            // Detach the insertion after the last node that was already
21924            // inserted.
21925            _lastTailNode.sibling = null;
21926          }
21927
21928          break;
21929        }
21930    }
21931  }
21932
21933  function bubbleProperties(completedWork) {
21934    var didBailout = completedWork.alternate !== null && completedWork.alternate.child === completedWork.child;
21935    var newChildLanes = NoLanes;
21936    var subtreeFlags = NoFlags;
21937
21938    if (!didBailout) {
21939      // Bubble up the earliest expiration time.
21940      if ( (completedWork.mode & ProfileMode) !== NoMode) {
21941        // In profiling mode, resetChildExpirationTime is also used to reset
21942        // profiler durations.
21943        var actualDuration = completedWork.actualDuration;
21944        var treeBaseDuration = completedWork.selfBaseDuration;
21945        var child = completedWork.child;
21946
21947        while (child !== null) {
21948          newChildLanes = mergeLanes(newChildLanes, mergeLanes(child.lanes, child.childLanes));
21949          subtreeFlags |= child.subtreeFlags;
21950          subtreeFlags |= child.flags; // When a fiber is cloned, its actualDuration is reset to 0. This value will
21951          // only be updated if work is done on the fiber (i.e. it doesn't bailout).
21952          // When work is done, it should bubble to the parent's actualDuration. If
21953          // the fiber has not been cloned though, (meaning no work was done), then
21954          // this value will reflect the amount of time spent working on a previous
21955          // render. In that case it should not bubble. We determine whether it was
21956          // cloned by comparing the child pointer.
21957
21958          actualDuration += child.actualDuration;
21959          treeBaseDuration += child.treeBaseDuration;
21960          child = child.sibling;
21961        }
21962
21963        completedWork.actualDuration = actualDuration;
21964        completedWork.treeBaseDuration = treeBaseDuration;
21965      } else {
21966        var _child = completedWork.child;
21967
21968        while (_child !== null) {
21969          newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child.lanes, _child.childLanes));
21970          subtreeFlags |= _child.subtreeFlags;
21971          subtreeFlags |= _child.flags; // Update the return pointer so the tree is consistent. This is a code
21972          // smell because it assumes the commit phase is never concurrent with
21973          // the render phase. Will address during refactor to alternate model.
21974
21975          _child.return = completedWork;
21976          _child = _child.sibling;
21977        }
21978      }
21979
21980      completedWork.subtreeFlags |= subtreeFlags;
21981    } else {
21982      // Bubble up the earliest expiration time.
21983      if ( (completedWork.mode & ProfileMode) !== NoMode) {
21984        // In profiling mode, resetChildExpirationTime is also used to reset
21985        // profiler durations.
21986        var _treeBaseDuration = completedWork.selfBaseDuration;
21987        var _child2 = completedWork.child;
21988
21989        while (_child2 !== null) {
21990          newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child2.lanes, _child2.childLanes)); // "Static" flags share the lifetime of the fiber/hook they belong to,
21991          // so we should bubble those up even during a bailout. All the other
21992          // flags have a lifetime only of a single render + commit, so we should
21993          // ignore them.
21994
21995          subtreeFlags |= _child2.subtreeFlags & StaticMask;
21996          subtreeFlags |= _child2.flags & StaticMask;
21997          _treeBaseDuration += _child2.treeBaseDuration;
21998          _child2 = _child2.sibling;
21999        }
22000
22001        completedWork.treeBaseDuration = _treeBaseDuration;
22002      } else {
22003        var _child3 = completedWork.child;
22004
22005        while (_child3 !== null) {
22006          newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child3.lanes, _child3.childLanes)); // "Static" flags share the lifetime of the fiber/hook they belong to,
22007          // so we should bubble those up even during a bailout. All the other
22008          // flags have a lifetime only of a single render + commit, so we should
22009          // ignore them.
22010
22011          subtreeFlags |= _child3.subtreeFlags & StaticMask;
22012          subtreeFlags |= _child3.flags & StaticMask; // Update the return pointer so the tree is consistent. This is a code
22013          // smell because it assumes the commit phase is never concurrent with
22014          // the render phase. Will address during refactor to alternate model.
22015
22016          _child3.return = completedWork;
22017          _child3 = _child3.sibling;
22018        }
22019      }
22020
22021      completedWork.subtreeFlags |= subtreeFlags;
22022    }
22023
22024    completedWork.childLanes = newChildLanes;
22025    return didBailout;
22026  }
22027
22028  function completeDehydratedSuspenseBoundary(current, workInProgress, nextState) {
22029    if (hasUnhydratedTailNodes() && (workInProgress.mode & ConcurrentMode) !== NoMode && (workInProgress.flags & DidCapture) === NoFlags) {
22030      warnIfUnhydratedTailNodes(workInProgress);
22031      resetHydrationState();
22032      workInProgress.flags |= ForceClientRender | Incomplete | ShouldCapture;
22033      return false;
22034    }
22035
22036    var wasHydrated = popHydrationState(workInProgress);
22037
22038    if (nextState !== null && nextState.dehydrated !== null) {
22039      // We might be inside a hydration state the first time we're picking up this
22040      // Suspense boundary, and also after we've reentered it for further hydration.
22041      if (current === null) {
22042        if (!wasHydrated) {
22043          throw new Error('A dehydrated suspense component was completed without a hydrated node. ' + 'This is probably a bug in React.');
22044        }
22045
22046        prepareToHydrateHostSuspenseInstance(workInProgress);
22047        bubbleProperties(workInProgress);
22048
22049        {
22050          if ((workInProgress.mode & ProfileMode) !== NoMode) {
22051            var isTimedOutSuspense = nextState !== null;
22052
22053            if (isTimedOutSuspense) {
22054              // Don't count time spent in a timed out Suspense subtree as part of the base duration.
22055              var primaryChildFragment = workInProgress.child;
22056
22057              if (primaryChildFragment !== null) {
22058                // $FlowFixMe Flow doesn't support type casting in combination with the -= operator
22059                workInProgress.treeBaseDuration -= primaryChildFragment.treeBaseDuration;
22060              }
22061            }
22062          }
22063        }
22064
22065        return false;
22066      } else {
22067        // We might have reentered this boundary to hydrate it. If so, we need to reset the hydration
22068        // state since we're now exiting out of it. popHydrationState doesn't do that for us.
22069        resetHydrationState();
22070
22071        if ((workInProgress.flags & DidCapture) === NoFlags) {
22072          // This boundary did not suspend so it's now hydrated and unsuspended.
22073          workInProgress.memoizedState = null;
22074        } // If nothing suspended, we need to schedule an effect to mark this boundary
22075        // as having hydrated so events know that they're free to be invoked.
22076        // It's also a signal to replay events and the suspense callback.
22077        // If something suspended, schedule an effect to attach retry listeners.
22078        // So we might as well always mark this.
22079
22080
22081        workInProgress.flags |= Update;
22082        bubbleProperties(workInProgress);
22083
22084        {
22085          if ((workInProgress.mode & ProfileMode) !== NoMode) {
22086            var _isTimedOutSuspense = nextState !== null;
22087
22088            if (_isTimedOutSuspense) {
22089              // Don't count time spent in a timed out Suspense subtree as part of the base duration.
22090              var _primaryChildFragment = workInProgress.child;
22091
22092              if (_primaryChildFragment !== null) {
22093                // $FlowFixMe Flow doesn't support type casting in combination with the -= operator
22094                workInProgress.treeBaseDuration -= _primaryChildFragment.treeBaseDuration;
22095              }
22096            }
22097          }
22098        }
22099
22100        return false;
22101      }
22102    } else {
22103      // Successfully completed this tree. If this was a forced client render,
22104      // there may have been recoverable errors during first hydration
22105      // attempt. If so, add them to a queue so we can log them in the
22106      // commit phase.
22107      upgradeHydrationErrorsToRecoverable(); // Fall through to normal Suspense path
22108
22109      return true;
22110    }
22111  }
22112
22113  function completeWork(current, workInProgress, renderLanes) {
22114    var newProps = workInProgress.pendingProps; // Note: This intentionally doesn't check if we're hydrating because comparing
22115    // to the current tree provider fiber is just as fast and less error-prone.
22116    // Ideally we would have a special version of the work loop only
22117    // for hydration.
22118
22119    popTreeContext(workInProgress);
22120
22121    switch (workInProgress.tag) {
22122      case IndeterminateComponent:
22123      case LazyComponent:
22124      case SimpleMemoComponent:
22125      case FunctionComponent:
22126      case ForwardRef:
22127      case Fragment:
22128      case Mode:
22129      case Profiler:
22130      case ContextConsumer:
22131      case MemoComponent:
22132        bubbleProperties(workInProgress);
22133        return null;
22134
22135      case ClassComponent:
22136        {
22137          var Component = workInProgress.type;
22138
22139          if (isContextProvider(Component)) {
22140            popContext(workInProgress);
22141          }
22142
22143          bubbleProperties(workInProgress);
22144          return null;
22145        }
22146
22147      case HostRoot:
22148        {
22149          var fiberRoot = workInProgress.stateNode;
22150          popHostContainer(workInProgress);
22151          popTopLevelContextObject(workInProgress);
22152          resetWorkInProgressVersions();
22153
vendor: 2,328 bytes, lines 22154-22206
22154          if (fiberRoot.pendingContext) {
22155            fiberRoot.context = fiberRoot.pendingContext;
22156            fiberRoot.pendingContext = null;
22157          }
22158
22159          if (current === null || current.child === null) {
22160            // If we hydrated, pop so that we can delete any remaining children
22161            // that weren't hydrated.
22162            var wasHydrated = popHydrationState(workInProgress);
22163
22164            if (wasHydrated) {
22165              // If we hydrated, then we'll need to schedule an update for
22166              // the commit side-effects on the root.
22167              markUpdate(workInProgress);
22168            } else {
22169              if (current !== null) {
22170                var prevState = current.memoizedState;
22171
22172                if ( // Check if this is a client root
22173                !prevState.isDehydrated || // Check if we reverted to client rendering (e.g. due to an error)
22174                (workInProgress.flags & ForceClientRender) !== NoFlags) {
22175                  // Schedule an effect to clear this container at the start of the
22176                  // next commit. This handles the case of React rendering into a
22177                  // container with previous children. It's also safe to do for
22178                  // updates too, because current.child would only be null if the
22179                  // previous render was null (so the container would already
22180                  // be empty).
22181                  workInProgress.flags |= Snapshot; // If this was a forced client render, there may have been
22182                  // recoverable errors during first hydration attempt. If so, add
22183                  // them to a queue so we can log them in the commit phase.
22184
22185                  upgradeHydrationErrorsToRecoverable();
22186                }
22187              }
22188            }
22189          }
22190
22191          updateHostContainer(current, workInProgress);
22192          bubbleProperties(workInProgress);
22193
22194          return null;
22195        }
22196
22197      case HostComponent:
22198        {
22199          popHostContext(workInProgress);
22200          var rootContainerInstance = getRootHostContainer();
22201          var type = workInProgress.type;
22202
22203          if (current !== null && workInProgress.stateNode != null) {
22204            updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);
22205
22206            if (current.ref !== workInProgress.ref) {
22207              markRef$1(workInProgress);
22208            }
22209          } else {
22210            if (!newProps) {
22211              if (workInProgress.stateNode === null) {
22212                throw new Error('We must have new props for new mounts. This error is likely ' + 'caused by a bug in React. Please file an issue.');
22213              } // This can happen when we abort work.
22214
22215
22216              bubbleProperties(workInProgress);
22217              return null;
22218            }
22219
22220            var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context
22221            // "stack" as the parent. Then append children as we go in beginWork
22222            // or completeWork depending on whether we want to add them top->down or
22223            // bottom->up. Top->down is faster in IE11.
22224
22225            var _wasHydrated = popHydrationState(workInProgress);
22226
22227            if (_wasHydrated) {
22228              // TODO: Move this and createInstance step into the beginPhase
22229              // to consolidate.
22230              if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {
22231                // If changes to the hydrated node need to be applied at the
22232                // commit-phase we mark this as such.
22233                markUpdate(workInProgress);
22234              }
22235            } else {
22236              var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);
22237              appendAllChildren(instance, workInProgress, false, false);
22238              workInProgress.stateNode = instance; // Certain renderers require commit-time effects for initial mount.
22239              // (eg DOM renderer supports auto-focus for certain elements).
22240              // Make sure such renderers get scheduled for later work.
22241
22242              if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) {
22243                markUpdate(workInProgress);
22244              }
22245            }
22246
22247            if (workInProgress.ref !== null) {
22248              // If there is a ref on a host node we need to schedule a callback
22249              markRef$1(workInProgress);
22250            }
22251          }
22252
22253          bubbleProperties(workInProgress);
22254          return null;
22255        }
22256
22257      case HostText:
22258        {
22259          var newText = newProps;
22260
22261          if (current && workInProgress.stateNode != null) {
22262            var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need
22263            // to schedule a side-effect to do the updates.
22264
22265            updateHostText$1(current, workInProgress, oldText, newText);
22266          } else {
22267            if (typeof newText !== 'string') {
22268              if (workInProgress.stateNode === null) {
22269                throw new Error('We must have new props for new mounts. This error is likely ' + 'caused by a bug in React. Please file an issue.');
22270              } // This can happen when we abort work.
22271
22272            }
22273
22274            var _rootContainerInstance = getRootHostContainer();
22275
22276            var _currentHostContext = getHostContext();
22277
22278            var _wasHydrated2 = popHydrationState(workInProgress);
22279
22280            if (_wasHydrated2) {
22281              if (prepareToHydrateHostTextInstance(workInProgress)) {
22282                markUpdate(workInProgress);
22283              }
22284            } else {
22285              workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);
22286            }
22287          }
22288
22289          bubbleProperties(workInProgress);
22290          return null;
22291        }
22292
22293      case SuspenseComponent:
22294        {
22295          popSuspenseContext(workInProgress);
22296          var nextState = workInProgress.memoizedState; // Special path for dehydrated boundaries. We may eventually move this
22297          // to its own fiber type so that we can add other kinds of hydration
22298          // boundaries that aren't associated with a Suspense tree. In anticipation
22299          // of such a refactor, all the hydration logic is contained in
22300          // this branch.
22301
22302          if (current === null || current.memoizedState !== null && current.memoizedState.dehydrated !== null) {
22303            var fallthroughToNormalSuspensePath = completeDehydratedSuspenseBoundary(current, workInProgress, nextState);
22304
22305            if (!fallthroughToNormalSuspensePath) {
22306              if (workInProgress.flags & ShouldCapture) {
22307                // Special case. There were remaining unhydrated nodes. We treat
22308                // this as a mismatch. Revert to client rendering.
22309                return workInProgress;
22310              } else {
22311                // Did not finish hydrating, either because this is the initial
22312                // render or because something suspended.
22313                return null;
22314              }
22315            } // Continue with the normal Suspense path.
22316
22317          }
22318
22319          if ((workInProgress.flags & DidCapture) !== NoFlags) {
22320            // Something suspended. Re-render with the fallback children.
22321            workInProgress.lanes = renderLanes; // Do not reset the effect list.
22322
22323            if ( (workInProgress.mode & ProfileMode) !== NoMode) {
22324              transferActualDuration(workInProgress);
22325            } // Don't bubble properties in this case.
22326
22327
22328            return workInProgress;
22329          }
22330
22331          var nextDidTimeout = nextState !== null;
22332          var prevDidTimeout = current !== null && current.memoizedState !== null;
22333          // a passive effect, which is when we process the transitions
22334
22335
22336          if (nextDidTimeout !== prevDidTimeout) {
22337            // an effect to toggle the subtree's visibility. When we switch from
22338            // fallback -> primary, the inner Offscreen fiber schedules this effect
22339            // as part of its normal complete phase. But when we switch from
22340            // primary -> fallback, the inner Offscreen fiber does not have a complete
22341            // phase. So we need to schedule its effect here.
22342            //
22343            // We also use this flag to connect/disconnect the effects, but the same
22344            // logic applies: when re-connecting, the Offscreen fiber's complete
22345            // phase will handle scheduling the effect. It's only when the fallback
22346            // is active that we have to do anything special.
22347
22348
22349            if (nextDidTimeout) {
22350              var _offscreenFiber2 = workInProgress.child;
22351              _offscreenFiber2.flags |= Visibility; // TODO: This will still suspend a synchronous tree if anything
22352              // in the concurrent tree already suspended during this render.
22353              // This is a known bug.
22354
22355              if ((workInProgress.mode & ConcurrentMode) !== NoMode) {
22356                // TODO: Move this back to throwException because this is too late
22357                // if this is a large tree which is common for initial loads. We
22358                // don't know if we should restart a render or not until we get
22359                // this marker, and this is too late.
22360                // If this render already had a ping or lower pri updates,
22361                // and this is the first time we know we're going to suspend we
22362                // should be able to immediately restart from within throwException.
22363                var hasInvisibleChildContext = current === null && (workInProgress.memoizedProps.unstable_avoidThisFallback !== true || !enableSuspenseAvoidThisFallback);
22364
22365                if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) {
22366                  // If this was in an invisible tree or a new render, then showing
22367                  // this boundary is ok.
22368                  renderDidSuspend();
22369                } else {
22370                  // Otherwise, we're going to have to hide content so we should
22371                  // suspend for longer if possible.
22372                  renderDidSuspendDelayIfPossible();
22373                }
22374              }
22375            }
22376          }
22377
22378          var wakeables = workInProgress.updateQueue;
22379
22380          if (wakeables !== null) {
22381            // Schedule an effect to attach a retry listener to the promise.
22382            // TODO: Move to passive phase
22383            workInProgress.flags |= Update;
22384          }
22385
22386          bubbleProperties(workInProgress);
22387
22388          {
22389            if ((workInProgress.mode & ProfileMode) !== NoMode) {
22390              if (nextDidTimeout) {
22391                // Don't count time spent in a timed out Suspense subtree as part of the base duration.
22392                var primaryChildFragment = workInProgress.child;
22393
22394                if (primaryChildFragment !== null) {
22395                  // $FlowFixMe Flow doesn't support type casting in combination with the -= operator
22396                  workInProgress.treeBaseDuration -= primaryChildFragment.treeBaseDuration;
22397                }
22398              }
22399            }
22400          }
22401
22402          return null;
22403        }
22404
22405      case HostPortal:
22406        popHostContainer(workInProgress);
22407        updateHostContainer(current, workInProgress);
22408
22409        if (current === null) {
22410          preparePortalMount(workInProgress.stateNode.containerInfo);
22411        }
22412
22413        bubbleProperties(workInProgress);
22414        return null;
22415
22416      case ContextProvider:
22417        // Pop provider fiber
22418        var context = workInProgress.type._context;
22419        popProvider(context, workInProgress);
22420        bubbleProperties(workInProgress);
22421        return null;
22422
22423      case IncompleteClassComponent:
22424        {
22425          // Same as class component case. I put it down here so that the tags are
22426          // sequential to ensure this switch is compiled to a jump table.
22427          var _Component = workInProgress.type;
22428
22429          if (isContextProvider(_Component)) {
22430            popContext(workInProgress);
22431          }
22432
22433          bubbleProperties(workInProgress);
22434          return null;
22435        }
22436
22437      case SuspenseListComponent:
22438        {
22439          popSuspenseContext(workInProgress);
22440          var renderState = workInProgress.memoizedState;
22441
22442          if (renderState === null) {
22443            // We're running in the default, "independent" mode.
22444            // We don't do anything in this mode.
22445            bubbleProperties(workInProgress);
22446            return null;
22447          }
22448
22449          var didSuspendAlready = (workInProgress.flags & DidCapture) !== NoFlags;
22450          var renderedTail = renderState.rendering;
22451
22452          if (renderedTail === null) {
22453            // We just rendered the head.
22454            if (!didSuspendAlready) {
22455              // This is the first pass. We need to figure out if anything is still
22456              // suspended in the rendered set.
22457              // If new content unsuspended, but there's still some content that
22458              // didn't. Then we need to do a second pass that forces everything
22459              // to keep showing their fallbacks.
22460              // We might be suspended if something in this render pass suspended, or
22461              // something in the previous committed pass suspended. Otherwise,
22462              // there's no chance so we can skip the expensive call to
22463              // findFirstSuspended.
22464              var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.flags & DidCapture) === NoFlags);
22465
22466              if (!cannotBeSuspended) {
22467                var row = workInProgress.child;
22468
22469                while (row !== null) {
22470                  var suspended = findFirstSuspended(row);
22471
22472                  if (suspended !== null) {
22473                    didSuspendAlready = true;
22474                    workInProgress.flags |= DidCapture;
22475                    cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as
22476                    // part of the second pass. In that case nothing will subscribe to
22477                    // its thenables. Instead, we'll transfer its thenables to the
22478                    // SuspenseList so that it can retry if they resolve.
22479                    // There might be multiple of these in the list but since we're
22480                    // going to wait for all of them anyway, it doesn't really matter
22481                    // which ones gets to ping. In theory we could get clever and keep
22482                    // track of how many dependencies remain but it gets tricky because
22483                    // in the meantime, we can add/remove/change items and dependencies.
22484                    // We might bail out of the loop before finding any but that
22485                    // doesn't matter since that means that the other boundaries that
22486                    // we did find already has their listeners attached.
22487
22488                    var newThenables = suspended.updateQueue;
22489
22490                    if (newThenables !== null) {
22491                      workInProgress.updateQueue = newThenables;
22492                      workInProgress.flags |= Update;
22493                    } // Rerender the whole list, but this time, we'll force fallbacks
22494                    // to stay in place.
22495                    // Reset the effect flags before doing the second pass since that's now invalid.
22496                    // Reset the child fibers to their original state.
22497
22498
22499                    workInProgress.subtreeFlags = NoFlags;
22500                    resetChildFibers(workInProgress, renderLanes); // Set up the Suspense Context to force suspense and immediately
22501                    // rerender the children.
22502
22503                    pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback)); // Don't bubble properties in this case.
22504
22505                    return workInProgress.child;
22506                  }
22507
22508                  row = row.sibling;
22509                }
22510              }
22511
22512              if (renderState.tail !== null && now() > getRenderTargetTime()) {
22513                // We have already passed our CPU deadline but we still have rows
22514                // left in the tail. We'll just give up further attempts to render
22515                // the main content and only render fallbacks.
22516                workInProgress.flags |= DidCapture;
22517                didSuspendAlready = true;
22518                cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this
22519                // to get it started back up to attempt the next item. While in terms
22520                // of priority this work has the same priority as this current render,
22521                // it's not part of the same transition once the transition has
22522                // committed. If it's sync, we still want to yield so that it can be
22523                // painted. Conceptually, this is really the same as pinging.
22524                // We can use any RetryLane even if it's the one currently rendering
22525                // since we're leaving it behind on this node.
22526
22527                workInProgress.lanes = SomeRetryLane;
22528              }
22529            } else {
22530              cutOffTailIfNeeded(renderState, false);
22531            } // Next we're going to render the tail.
22532
22533          } else {
22534            // Append the rendered row to the child list.
22535            if (!didSuspendAlready) {
22536              var _suspended = findFirstSuspended(renderedTail);
22537
22538              if (_suspended !== null) {
22539                workInProgress.flags |= DidCapture;
22540                didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't
22541                // get lost if this row ends up dropped during a second pass.
22542
22543                var _newThenables = _suspended.updateQueue;
22544
22545                if (_newThenables !== null) {
22546                  workInProgress.updateQueue = _newThenables;
22547                  workInProgress.flags |= Update;
22548                }
22549
22550                cutOffTailIfNeeded(renderState, true); // This might have been modified.
22551
22552                if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate && !getIsHydrating() // We don't cut it if we're hydrating.
22553                ) {
22554                    // We're done.
22555                    bubbleProperties(workInProgress);
22556                    return null;
22557                  }
22558              } else if ( // The time it took to render last row is greater than the remaining
22559              // time we have to render. So rendering one more row would likely
22560              // exceed it.
22561              now() * 2 - renderState.renderingStartTime > getRenderTargetTime() && renderLanes !== OffscreenLane) {
22562                // We have now passed our CPU deadline and we'll just give up further
22563                // attempts to render the main content and only render fallbacks.
22564                // The assumption is that this is usually faster.
22565                workInProgress.flags |= DidCapture;
22566                didSuspendAlready = true;
22567                cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this
22568                // to get it started back up to attempt the next item. While in terms
22569                // of priority this work has the same priority as this current render,
22570                // it's not part of the same transition once the transition has
22571                // committed. If it's sync, we still want to yield so that it can be
22572                // painted. Conceptually, this is really the same as pinging.
22573                // We can use any RetryLane even if it's the one currently rendering
22574                // since we're leaving it behind on this node.
22575
22576                workInProgress.lanes = SomeRetryLane;
22577              }
22578            }
22579
22580            if (renderState.isBackwards) {
22581              // The effect list of the backwards tail will have been added
22582              // to the end. This breaks the guarantee that life-cycles fire in
22583              // sibling order but that isn't a strong guarantee promised by React.
22584              // Especially since these might also just pop in during future commits.
22585              // Append to the beginning of the list.
22586              renderedTail.sibling = workInProgress.child;
22587              workInProgress.child = renderedTail;
22588            } else {
22589              var previousSibling = renderState.last;
22590
22591              if (previousSibling !== null) {
22592                previousSibling.sibling = renderedTail;
22593              } else {
22594                workInProgress.child = renderedTail;
22595              }
22596
22597              renderState.last = renderedTail;
22598            }
22599          }
22600
22601          if (renderState.tail !== null) {
22602            // We still have tail rows to render.
22603            // Pop a row.
22604            var next = renderState.tail;
22605            renderState.rendering = next;
22606            renderState.tail = next.sibling;
22607            renderState.renderingStartTime = now();
22608            next.sibling = null; // Restore the context.
22609            // TODO: We can probably just avoid popping it instead and only
22610            // setting it the first time we go from not suspended to suspended.
22611
22612            var suspenseContext = suspenseStackCursor.current;
22613
22614            if (didSuspendAlready) {
22615              suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
22616            } else {
22617              suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
22618            }
22619
22620            pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row.
22621            // Don't bubble properties in this case.
22622
22623            return next;
22624          }
22625
22626          bubbleProperties(workInProgress);
22627          return null;
22628        }
22629
22630      case ScopeComponent:
22631        {
22632
22633          break;
22634        }
22635
22636      case OffscreenComponent:
22637      case LegacyHiddenComponent:
22638        {
22639          popRenderLanes(workInProgress);
22640          var _nextState = workInProgress.memoizedState;
22641          var nextIsHidden = _nextState !== null;
22642
22643          if (current !== null) {
22644            var _prevState = current.memoizedState;
22645            var prevIsHidden = _prevState !== null;
22646
22647            if (prevIsHidden !== nextIsHidden && ( // LegacyHidden doesn't do any hiding — it only pre-renders.
22648            !enableLegacyHidden )) {
22649              workInProgress.flags |= Visibility;
22650            }
22651          }
22652
22653          if (!nextIsHidden || (workInProgress.mode & ConcurrentMode) === NoMode) {
22654            bubbleProperties(workInProgress);
22655          } else {
22656            // Don't bubble properties for hidden children unless we're rendering
22657            // at offscreen priority.
22658            if (includesSomeLane(subtreeRenderLanes, OffscreenLane)) {
22659              bubbleProperties(workInProgress);
22660
22661              {
22662                // Check if there was an insertion or update in the hidden subtree.
22663                // If so, we need to hide those nodes in the commit phase, so
22664                // schedule a visibility effect.
22665                if ( workInProgress.subtreeFlags & (Placement | Update)) {
22666                  workInProgress.flags |= Visibility;
22667                }
22668              }
22669            }
22670          }
22671          return null;
22672        }
22673
22674      case CacheComponent:
22675        {
22676
22677          return null;
22678        }
22679
22680      case TracingMarkerComponent:
22681        {
22682
22683          return null;
22684        }
22685    }
22686
22687    throw new Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in " + 'React. Please file an issue.');
22688  }
22689
22690  function unwindWork(current, workInProgress, renderLanes) {
22691    // Note: This intentionally doesn't check if we're hydrating because comparing
22692    // to the current tree provider fiber is just as fast and less error-prone.
22693    // Ideally we would have a special version of the work loop only
22694    // for hydration.
22695    popTreeContext(workInProgress);
22696
22697    switch (workInProgress.tag) {
22698      case ClassComponent:
22699        {
22700          var Component = workInProgress.type;
22701
22702          if (isContextProvider(Component)) {
22703            popContext(workInProgress);
22704          }
22705
22706          var flags = workInProgress.flags;
22707
22708          if (flags & ShouldCapture) {
22709            workInProgress.flags = flags & ~ShouldCapture | DidCapture;
22710
22711            if ( (workInProgress.mode & ProfileMode) !== NoMode) {
22712              transferActualDuration(workInProgress);
22713            }
22714
22715            return workInProgress;
22716          }
22717
22718          return null;
22719        }
22720
22721      case HostRoot:
22722        {
22723          var root = workInProgress.stateNode;
22724          popHostContainer(workInProgress);
22725          popTopLevelContextObject(workInProgress);
22726          resetWorkInProgressVersions();
22727          var _flags = workInProgress.flags;
22728
22729          if ((_flags & ShouldCapture) !== NoFlags && (_flags & DidCapture) === NoFlags) {
22730            // There was an error during render that wasn't captured by a suspense
22731            // boundary. Do a second pass on the root to unmount the children.
22732            workInProgress.flags = _flags & ~ShouldCapture | DidCapture;
22733            return workInProgress;
22734          } // We unwound to the root without completing it. Exit.
22735
22736
22737          return null;
22738        }
22739
22740      case HostComponent:
22741        {
22742          // TODO: popHydrationState
22743          popHostContext(workInProgress);
22744          return null;
22745        }
22746
22747      case SuspenseComponent:
22748        {
22749          popSuspenseContext(workInProgress);
22750          var suspenseState = workInProgress.memoizedState;
22751
22752          if (suspenseState !== null && suspenseState.dehydrated !== null) {
22753            if (workInProgress.alternate === null) {
22754              throw new Error('Threw in newly mounted dehydrated component. This is likely a bug in ' + 'React. Please file an issue.');
22755            }
22756
22757            resetHydrationState();
22758          }
22759
22760          var _flags2 = workInProgress.flags;
22761
22762          if (_flags2 & ShouldCapture) {
22763            workInProgress.flags = _flags2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary.
22764
22765            if ( (workInProgress.mode & ProfileMode) !== NoMode) {
22766              transferActualDuration(workInProgress);
22767            }
22768
22769            return workInProgress;
22770          }
22771
22772          return null;
22773        }
22774
22775      case SuspenseListComponent:
22776        {
22777          popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been
22778          // caught by a nested boundary. If not, it should bubble through.
22779
22780          return null;
22781        }
22782
22783      case HostPortal:
22784        popHostContainer(workInProgress);
22785        return null;
22786
22787      case ContextProvider:
22788        var context = workInProgress.type._context;
22789        popProvider(context, workInProgress);
22790        return null;
22791
22792      case OffscreenComponent:
22793      case LegacyHiddenComponent:
22794        popRenderLanes(workInProgress);
22795        return null;
22796
22797      case CacheComponent:
22798
22799        return null;
22800
22801      default:
22802        return null;
22803    }
22804  }
22805
22806  function unwindInterruptedWork(current, interruptedWork, renderLanes) {
22807    // Note: This intentionally doesn't check if we're hydrating because comparing
22808    // to the current tree provider fiber is just as fast and less error-prone.
22809    // Ideally we would have a special version of the work loop only
22810    // for hydration.
22811    popTreeContext(interruptedWork);
22812
22813    switch (interruptedWork.tag) {
22814      case ClassComponent:
22815        {
22816          var childContextTypes = interruptedWork.type.childContextTypes;
22817
22818          if (childContextTypes !== null && childContextTypes !== undefined) {
22819            popContext(interruptedWork);
22820          }
22821
22822          break;
22823        }
22824
22825      case HostRoot:
22826        {
22827          var root = interruptedWork.stateNode;
22828          popHostContainer(interruptedWork);
22829          popTopLevelContextObject(interruptedWork);
22830          resetWorkInProgressVersions();
22831          break;
22832        }
22833
22834      case HostComponent:
22835        {
22836          popHostContext(interruptedWork);
22837          break;
22838        }
22839
22840      case HostPortal:
22841        popHostContainer(interruptedWork);
22842        break;
22843
22844      case SuspenseComponent:
22845        popSuspenseContext(interruptedWork);
22846        break;
22847
22848      case SuspenseListComponent:
22849        popSuspenseContext(interruptedWork);
22850        break;
22851
22852      case ContextProvider:
22853        var context = interruptedWork.type._context;
22854        popProvider(context, interruptedWork);
22855        break;
22856
22857      case OffscreenComponent:
22858      case LegacyHiddenComponent:
22859        popRenderLanes(interruptedWork);
22860        break;
22861    }
22862  }
22863
22864  var didWarnAboutUndefinedSnapshotBeforeUpdate = null;
22865
22866  {
22867    didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();
22868  } // Used during the commit phase to track the state of the Offscreen component stack.
22869  // Allows us to avoid traversing the return path to find the nearest Offscreen ancestor.
22870  // Only used when enableSuspenseLayoutEffectSemantics is enabled.
22871
22872
22873  var offscreenSubtreeIsHidden = false;
22874  var offscreenSubtreeWasHidden = false;
22875  var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
22876  var nextEffect = null; // Used for Profiling builds to track updaters.
22877
22878  var inProgressLanes = null;
22879  var inProgressRoot = null;
22880  function reportUncaughtErrorInDEV(error) {
22881    // Wrapping each small part of the commit phase into a guarded
22882    // callback is a bit too slow (https://github.com/facebook/react/pull/21666).
22883    // But we rely on it to surface errors to DEV tools like overlays
22884    // (https://github.com/facebook/react/issues/21712).
22885    // As a compromise, rethrow only caught errors in a guard.
22886    {
22887      invokeGuardedCallback(null, function () {
22888        throw error;
22889      });
22890      clearCaughtError();
22891    }
22892  }
22893
22894  var callComponentWillUnmountWithTimer = function (current, instance) {
22895    instance.props = current.memoizedProps;
22896    instance.state = current.memoizedState;
22897
22898    if ( current.mode & ProfileMode) {
22899      try {
22900        startLayoutEffectTimer();
22901        instance.componentWillUnmount();
22902      } finally {
22903        recordLayoutEffectDuration(current);
22904      }
22905    } else {
22906      instance.componentWillUnmount();
22907    }
22908  }; // Capture errors so they don't interrupt mounting.
22909
22910
22911  function safelyCallCommitHookLayoutEffectListMount(current, nearestMountedAncestor) {
22912    try {
22913      commitHookEffectListMount(Layout, current);
22914    } catch (error) {
22915      captureCommitPhaseError(current, nearestMountedAncestor, error);
22916    }
22917  } // Capture errors so they don't interrupt unmounting.
22918
22919
22920  function safelyCallComponentWillUnmount(current, nearestMountedAncestor, instance) {
22921    try {
22922      callComponentWillUnmountWithTimer(current, instance);
22923    } catch (error) {
22924      captureCommitPhaseError(current, nearestMountedAncestor, error);
22925    }
22926  } // Capture errors so they don't interrupt mounting.
22927
22928
22929  function safelyCallComponentDidMount(current, nearestMountedAncestor, instance) {
22930    try {
22931      instance.componentDidMount();
22932    } catch (error) {
22933      captureCommitPhaseError(current, nearestMountedAncestor, error);
22934    }
22935  } // Capture errors so they don't interrupt mounting.
22936
22937
22938  function safelyAttachRef(current, nearestMountedAncestor) {
22939    try {
22940      commitAttachRef(current);
22941    } catch (error) {
22942      captureCommitPhaseError(current, nearestMountedAncestor, error);
22943    }
22944  }
22945
22946  function safelyDetachRef(current, nearestMountedAncestor) {
22947    var ref = current.ref;
22948
22949    if (ref !== null) {
22950      if (typeof ref === 'function') {
22951        var retVal;
22952
22953        try {
22954          if (enableProfilerTimer && enableProfilerCommitHooks && current.mode & ProfileMode) {
22955            try {
22956              startLayoutEffectTimer();
22957              retVal = ref(null);
22958            } finally {
22959              recordLayoutEffectDuration(current);
22960            }
22961          } else {
22962            retVal = ref(null);
22963          }
22964        } catch (error) {
22965          captureCommitPhaseError(current, nearestMountedAncestor, error);
22966        }
22967
22968        {
22969          if (typeof retVal === 'function') {
22970            error('Unexpected return value from a callback ref in %s. ' + 'A callback ref should not return a function.', getComponentNameFromFiber(current));
22971          }
22972        }
22973      } else {
22974        ref.current = null;
22975      }
22976    }
22977  }
22978
22979  function safelyCallDestroy(current, nearestMountedAncestor, destroy) {
22980    try {
22981      destroy();
22982    } catch (error) {
22983      captureCommitPhaseError(current, nearestMountedAncestor, error);
22984    }
22985  }
22986
22987  var focusedInstanceHandle = null;
22988  var shouldFireAfterActiveInstanceBlur = false;
22989  function commitBeforeMutationEffects(root, firstChild) {
22990    focusedInstanceHandle = prepareForCommit(root.containerInfo);
22991    nextEffect = firstChild;
22992    commitBeforeMutationEffects_begin(); // We no longer need to track the active instance fiber
22993
22994    var shouldFire = shouldFireAfterActiveInstanceBlur;
22995    shouldFireAfterActiveInstanceBlur = false;
22996    focusedInstanceHandle = null;
22997    return shouldFire;
22998  }
22999
23000  function commitBeforeMutationEffects_begin() {
23001    while (nextEffect !== null) {
23002      var fiber = nextEffect; // This phase is only used for beforeActiveInstanceBlur.
23003
23004      var child = fiber.child;
23005
23006      if ((fiber.subtreeFlags & BeforeMutationMask) !== NoFlags && child !== null) {
23007        child.return = fiber;
23008        nextEffect = child;
23009      } else {
23010        commitBeforeMutationEffects_complete();
23011      }
23012    }
23013  }
23014
23015  function commitBeforeMutationEffects_complete() {
23016    while (nextEffect !== null) {
23017      var fiber = nextEffect;
23018      setCurrentFiber(fiber);
23019
23020      try {
23021        commitBeforeMutationEffectsOnFiber(fiber);
23022      } catch (error) {
23023        captureCommitPhaseError(fiber, fiber.return, error);
23024      }
23025
23026      resetCurrentFiber();
23027      var sibling = fiber.sibling;
23028
23029      if (sibling !== null) {
23030        sibling.return = fiber.return;
23031        nextEffect = sibling;
23032        return;
23033      }
23034
23035      nextEffect = fiber.return;
23036    }
23037  }
23038
23039  function commitBeforeMutationEffectsOnFiber(finishedWork) {
23040    var current = finishedWork.alternate;
23041    var flags = finishedWork.flags;
23042
23043    if ((flags & Snapshot) !== NoFlags) {
23044      setCurrentFiber(finishedWork);
23045
23046      switch (finishedWork.tag) {
23047        case FunctionComponent:
23048        case ForwardRef:
23049        case SimpleMemoComponent:
23050          {
23051            break;
23052          }
23053
23054        case ClassComponent:
23055          {
23056            if (current !== null) {
23057              var prevProps = current.memoizedProps;
23058              var prevState = current.memoizedState;
23059              var instance = finishedWork.stateNode; // We could update instance props and state here,
23060              // but instead we rely on them being set during last render.
23061              // TODO: revisit this when we implement resuming.
23062
23063              {
23064                if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
23065                  if (instance.props !== finishedWork.memoizedProps) {
23066                    error('Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23067                  }
23068
23069                  if (instance.state !== finishedWork.memoizedState) {
23070                    error('Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23071                  }
23072                }
23073              }
23074
23075              var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);
23076
23077              {
23078                var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;
23079
23080                if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {
23081                  didWarnSet.add(finishedWork.type);
23082
23083                  error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentNameFromFiber(finishedWork));
23084                }
23085              }
23086
23087              instance.__reactInternalSnapshotBeforeUpdate = snapshot;
23088            }
23089
23090            break;
23091          }
23092
23093        case HostRoot:
23094          {
23095            {
23096              var root = finishedWork.stateNode;
23097              clearContainer(root.containerInfo);
23098            }
23099
23100            break;
23101          }
23102
23103        case HostComponent:
23104        case HostText:
23105        case HostPortal:
23106        case IncompleteClassComponent:
23107          // Nothing to do for these component types
23108          break;
23109
23110        default:
23111          {
23112            throw new Error('This unit of work tag should not have side-effects. This error is ' + 'likely caused by a bug in React. Please file an issue.');
23113          }
23114      }
23115
23116      resetCurrentFiber();
23117    }
23118  }
23119
23120  function commitHookEffectListUnmount(flags, finishedWork, nearestMountedAncestor) {
23121    var updateQueue = finishedWork.updateQueue;
23122    var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
23123
23124    if (lastEffect !== null) {
23125      var firstEffect = lastEffect.next;
23126      var effect = firstEffect;
23127
23128      do {
23129        if ((effect.tag & flags) === flags) {
23130          // Unmount
23131          var destroy = effect.destroy;
23132          effect.destroy = undefined;
23133
23134          if (destroy !== undefined) {
23135            {
23136              if ((flags & Passive$1) !== NoFlags$1) {
23137                markComponentPassiveEffectUnmountStarted(finishedWork);
23138              } else if ((flags & Layout) !== NoFlags$1) {
23139                markComponentLayoutEffectUnmountStarted(finishedWork);
23140              }
23141            }
23142
23143            {
23144              if ((flags & Insertion) !== NoFlags$1) {
23145                setIsRunningInsertionEffect(true);
23146              }
23147            }
23148
23149            safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy);
23150
23151            {
23152              if ((flags & Insertion) !== NoFlags$1) {
23153                setIsRunningInsertionEffect(false);
23154              }
23155            }
23156
23157            {
23158              if ((flags & Passive$1) !== NoFlags$1) {
23159                markComponentPassiveEffectUnmountStopped();
23160              } else if ((flags & Layout) !== NoFlags$1) {
23161                markComponentLayoutEffectUnmountStopped();
23162              }
23163            }
23164          }
23165        }
23166
23167        effect = effect.next;
23168      } while (effect !== firstEffect);
23169    }
23170  }
23171
23172  function commitHookEffectListMount(flags, finishedWork) {
23173    var updateQueue = finishedWork.updateQueue;
23174    var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
23175
23176    if (lastEffect !== null) {
23177      var firstEffect = lastEffect.next;
23178      var effect = firstEffect;
23179
23180      do {
23181        if ((effect.tag & flags) === flags) {
23182          {
23183            if ((flags & Passive$1) !== NoFlags$1) {
23184              markComponentPassiveEffectMountStarted(finishedWork);
23185            } else if ((flags & Layout) !== NoFlags$1) {
23186              markComponentLayoutEffectMountStarted(finishedWork);
23187            }
23188          } // Mount
23189
23190
23191          var create = effect.create;
23192
23193          {
23194            if ((flags & Insertion) !== NoFlags$1) {
23195              setIsRunningInsertionEffect(true);
23196            }
23197          }
23198
23199          effect.destroy = create();
23200
23201          {
23202            if ((flags & Insertion) !== NoFlags$1) {
23203              setIsRunningInsertionEffect(false);
23204            }
23205          }
23206
23207          {
23208            if ((flags & Passive$1) !== NoFlags$1) {
23209              markComponentPassiveEffectMountStopped();
23210            } else if ((flags & Layout) !== NoFlags$1) {
23211              markComponentLayoutEffectMountStopped();
23212            }
23213          }
23214
23215          {
23216            var destroy = effect.destroy;
23217
23218            if (destroy !== undefined && typeof destroy !== 'function') {
23219              var hookName = void 0;
23220
23221              if ((effect.tag & Layout) !== NoFlags) {
23222                hookName = 'useLayoutEffect';
23223              } else if ((effect.tag & Insertion) !== NoFlags) {
23224                hookName = 'useInsertionEffect';
23225              } else {
23226                hookName = 'useEffect';
23227              }
23228
23229              var addendum = void 0;
23230
23231              if (destroy === null) {
23232                addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';
23233              } else if (typeof destroy.then === 'function') {
23234                addendum = '\n\nIt looks like you wrote ' + hookName + '(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\n\n' + hookName + '(() =>
23234 {\n' + '  async function fetchData() {\n' + '    // You can await here\n' + '    const response = await MyAPI.getData(someId);\n' + '    // ...\n' + '  }\n' + '  fetchData();\n' + "}, [someId]); // Or [] if effect doesn't need props or state\n\n" + 'Learn more about data fetching with Hooks: https://reactjs.org/link/hooks-data-fetching';
23235              } else {
23236                addendum = ' You returned: ' + destroy;
23237              }
23238
23239              error('%s must not return anything besides a function, ' + 'which is used for clean-up.%s', hookName, addendum);
23240            }
23241          }
23242        }
23243
23244        effect = effect.next;
23245      } while (effect !== firstEffect);
23246    }
23247  }
23248
23249  function commitPassiveEffectDurations(finishedRoot, finishedWork) {
23250    {
23251      // Only Profilers with work in their subtree will have an Update effect scheduled.
23252      if ((finishedWork.flags & Update) !== NoFlags) {
23253        switch (finishedWork.tag) {
23254          case Profiler:
23255            {
23256              var passiveEffectDuration = finishedWork.stateNode.passiveEffectDuration;
23257              var _finishedWork$memoize = finishedWork.memoizedProps,
23258                  id = _finishedWork$memoize.id,
23259                  onPostCommit = _finishedWork$memoize.onPostCommit; // This value will still reflect the previous commit phase.
23260              // It does not get reset until the start of the next commit phase.
23261
23262              var commitTime = getCommitTime();
23263              var phase = finishedWork.alternate === null ? 'mount' : 'update';
23264
23265              {
23266                if (isCurrentUpdateNested()) {
23267                  phase = 'nested-update';
23268                }
23269              }
23270
23271              if (typeof onPostCommit === 'function') {
23272                onPostCommit(id, phase, passiveEffectDuration, commitTime);
23273              } // Bubble times to the next nearest ancestor Profiler.
23274              // After we process that Profiler, we'll bubble further up.
23275
23276
23277              var parentFiber = finishedWork.return;
23278
23279              outer: while (parentFiber !== null) {
23280                switch (parentFiber.tag) {
23281                  case HostRoot:
23282                    var root = parentFiber.stateNode;
23283                    root.passiveEffectDuration += passiveEffectDuration;
23284                    break outer;
23285
23286                  case Profiler:
23287                    var parentStateNode = parentFiber.stateNode;
23288                    parentStateNode.passiveEffectDuration += passiveEffectDuration;
23289                    break outer;
23290                }
23291
23292                parentFiber = parentFiber.return;
23293              }
23294
23295              break;
23296            }
23297        }
23298      }
23299    }
23300  }
23301
23302  function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork, committedLanes) {
23303    if ((finishedWork.flags & LayoutMask) !== NoFlags) {
23304      switch (finishedWork.tag) {
23305        case FunctionComponent:
23306        case ForwardRef:
23307        case SimpleMemoComponent:
23308          {
23309            if ( !offscreenSubtreeWasHidden) {
23310              // At this point layout effects have already been destroyed (during mutation phase).
23311              // This is done to prevent sibling component effects from interfering with each other,
23312              // e.g. a destroy function in one component should never override a ref set
23313              // by a create function in another component during the same commit.
23314              if ( finishedWork.mode & ProfileMode) {
23315                try {
23316                  startLayoutEffectTimer();
23317                  commitHookEffectListMount(Layout | HasEffect, finishedWork);
23318                } finally {
23319                  recordLayoutEffectDuration(finishedWork);
23320                }
23321              } else {
23322                commitHookEffectListMount(Layout | HasEffect, finishedWork);
23323              }
23324            }
23325
23326            break;
23327          }
23328
23329        case ClassComponent:
23330          {
23331            var instance = finishedWork.stateNode;
23332
23333            if (finishedWork.flags & Update) {
23334              if (!offscreenSubtreeWasHidden) {
23335                if (current === null) {
23336                  // We could update instance props and state here,
23337                  // but instead we rely on them being set during last render.
23338                  // TODO: revisit this when we implement resuming.
23339                  {
23340                    if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
23341                      if (instance.props !== finishedWork.memoizedProps) {
23342                        error('Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23343                      }
23344
23345                      if (instance.state !== finishedWork.memoizedState) {
23346                        error('Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23347                      }
23348                    }
23349                  }
23350
23351                  if ( finishedWork.mode & ProfileMode) {
23352                    try {
23353                      startLayoutEffectTimer();
23354                      instance.componentDidMount();
23355                    } finally {
23356                      recordLayoutEffectDuration(finishedWork);
23357                    }
23358                  } else {
23359                    instance.componentDidMount();
23360                  }
23361                } else {
23362                  var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps);
23363                  var prevState = current.memoizedState; // We could update instance props and state here,
23364                  // but instead we rely on them being set during last render.
23365                  // TODO: revisit this when we implement resuming.
23366
23367                  {
23368                    if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
23369                      if (instance.props !== finishedWork.memoizedProps) {
23370                        error('Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23371                      }
23372
23373                      if (instance.state !== finishedWork.memoizedState) {
23374                        error('Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23375                      }
23376                    }
23377                  }
23378
23379                  if ( finishedWork.mode & ProfileMode) {
23380                    try {
23381                      startLayoutEffectTimer();
23382                      instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
23383                    } finally {
23384                      recordLayoutEffectDuration(finishedWork);
23385                    }
23386                  } else {
23387                    instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
23388                  }
23389                }
23390              }
23391            } // TODO: I think this is now always non-null by the time it reaches the
23392            // commit phase. Consider removing the type check.
23393
23394
23395            var updateQueue = finishedWork.updateQueue;
23396
23397            if (updateQueue !== null) {
23398              {
23399                if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
23400                  if (instance.props !== finishedWork.memoizedProps) {
23401                    error('Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23402                  }
23403
23404                  if (instance.state !== finishedWork.memoizedState) {
23405                    error('Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
23406                  }
23407                }
23408              } // We could update instance props and state here,
23409              // but instead we rely on them being set during last render.
23410              // TODO: revisit this when we implement resuming.
23411
23412
23413              commitUpdateQueue(finishedWork, updateQueue, instance);
23414            }
23415
23416            break;
23417          }
23418
23419        case HostRoot:
23420          {
23421            // TODO: I think this is now always non-null by the time it reaches the
23422            // commit phase. Consider removing the type check.
23423            var _updateQueue = finishedWork.updateQueue;
23424
23425            if (_updateQueue !== null) {
23426              var _instance = null;
23427
23428              if (finishedWork.child !== null) {
23429                switch (finishedWork.child.tag) {
23430                  case HostComponent:
23431                    _instance = getPublicInstance(finishedWork.child.stateNode);
23432                    break;
23433
23434                  case ClassComponent:
23435                    _instance = finishedWork.child.stateNode;
23436                    break;
23437                }
23438              }
23439
23440              commitUpdateQueue(finishedWork, _updateQueue, _instance);
23441            }
23442
23443            break;
23444          }
23445
23446        case HostComponent:
23447          {
23448            var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted
23449            // (eg DOM renderer may schedule auto-focus for inputs and form controls).
23450            // These effects should only be committed when components are first mounted,
23451            // aka when there is no current/alternate.
23452
23453            if (current === null && finishedWork.flags & Update) {
23454              var type = finishedWork.type;
23455              var props = finishedWork.memoizedProps;
23456              commitMount(_instance2, type, props);
23457            }
23458
23459            break;
23460          }
23461
23462        case HostText:
23463          {
23464            // We have no life-cycles associated with text.
23465            break;
23466          }
23467
23468        case HostPortal:
23469          {
23470            // We have no life-cycles associated with portals.
23471            break;
23472          }
23473
23474        case Profiler:
23475          {
23476            {
23477              var _finishedWork$memoize2 = finishedWork.memoizedProps,
23478                  onCommit = _finishedWork$memoize2.onCommit,
23479                  onRender = _finishedWork$memoize2.onRender;
23480              var effectDuration = finishedWork.stateNode.effectDuration;
23481              var commitTime = getCommitTime();
23482              var phase = current === null ? 'mount' : 'update';
23483
23484              {
23485                if (isCurrentUpdateNested()) {
23486                  phase = 'nested-update';
23487                }
23488              }
23489
23490              if (typeof onRender === 'function') {
23491                onRender(finishedWork.memoizedProps.id, phase, finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, commitTime);
23492              }
23493
23494              {
23495                if (typeof onCommit === 'function') {
23496                  onCommit(finishedWork.memoizedProps.id, phase, effectDuration, commitTime);
23497                } // Schedule a passive effect for this Profiler to call onPostCommit hooks.
23498                // This effect should be scheduled even if there is no onPostCommit callback for this Profiler,
23499                // because the effect is also where times bubble to parent Profilers.
23500
23501
23502                enqueuePendingPassiveProfilerEffect(finishedWork); // Propagate layout effect durations to the next nearest Profiler ancestor.
23503                // Do not reset these values until the next render so DevTools has a chance to read them first.
23504
23505                var parentFiber = finishedWork.return;
23506
23507                outer: while (parentFiber !== null) {
23508                  switch (parentFiber.tag) {
23509                    case HostRoot:
23510                      var root = parentFiber.stateNode;
23511                      root.effectDuration += effectDuration;
23512                      break outer;
23513
23514                    case Profiler:
23515                      var parentStateNode = parentFiber.stateNode;
23516                      parentStateNode.effectDuration += effectDuration;
23517                      break outer;
23518                  }
23519
23520                  parentFiber = parentFiber.return;
23521                }
23522              }
23523            }
23524
23525            break;
23526          }
23527
23528        case SuspenseComponent:
23529          {
23530            commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);
23531            break;
23532          }
23533
23534        case SuspenseListComponent:
23535        case IncompleteClassComponent:
23536        case ScopeComponent:
23537        case OffscreenComponent:
23538        case LegacyHiddenComponent:
23539        case TracingMarkerComponent:
23540          {
23541            break;
23542          }
23543
23544        default:
23545          throw new Error('This unit of work tag should not have side-effects. This error is ' + 'likely caused by a bug in React. Please file an issue.');
23546      }
23547    }
23548
23549    if ( !offscreenSubtreeWasHidden) {
23550      {
23551        if (finishedWork.flags & Ref) {
23552          commitAttachRef(finishedWork);
23553        }
23554      }
23555    }
23556  }
23557
23558  function reappearLayoutEffectsOnFiber(node) {
23559    // Turn on layout effects in a tree that previously disappeared.
23560    // TODO (Offscreen) Check: flags & LayoutStatic
23561    switch (node.tag) {
23562      case FunctionComponent:
23563      case ForwardRef:
23564      case SimpleMemoComponent:
23565        {
23566          if ( node.mode & ProfileMode) {
23567            try {
23568              startLayoutEffectTimer();
23569              safelyCallCommitHookLayoutEffectListMount(node, node.return);
23570            } finally {
23571              recordLayoutEffectDuration(node);
23572            }
23573          } else {
23574            safelyCallCommitHookLayoutEffectListMount(node, node.return);
23575          }
23576
23577          break;
23578        }
23579
23580      case ClassComponent:
23581        {
23582          var instance = node.stateNode;
23583
23584          if (typeof instance.componentDidMount === 'function') {
23585            safelyCallComponentDidMount(node, node.return, instance);
23586          }
23587
23588          safelyAttachRef(node, node.return);
23589          break;
23590        }
23591
23592      case HostComponent:
23593        {
23594          safelyAttachRef(node, node.return);
23595          break;
23596        }
23597    }
23598  }
23599
23600  function hideOrUnhideAllChildren(finishedWork, isHidden) {
23601    // Only hide or unhide the top-most host nodes.
23602    var hostSubtreeRoot = null;
23603
23604    {
23605      // We only have the top Fiber that was inserted but we need to recurse down its
23606      // children to find all the terminal nodes.
23607      var node = finishedWork;
23608
23609      while (true) {
23610        if (node.tag === HostComponent) {
23611          if (hostSubtreeRoot === null) {
23612            hostSubtreeRoot = node;
23613
23614            try {
23615              var instance = node.stateNode;
23616
23617              if (isHidden) {
23618                hideInstance(instance);
23619              } else {
23620                unhideInstance(node.stateNode, node.memoizedProps);
23621              }
23622            } catch (error) {
23623              captureCommitPhaseError(finishedWork, finishedWork.return, error);
23624            }
23625          }
23626        } else if (node.tag === HostText) {
23627          if (hostSubtreeRoot === null) {
23628            try {
23629              var _instance3 = node.stateNode;
23630
23631              if (isHidden) {
23632                hideTextInstance(_instance3);
23633              } else {
23634                unhideTextInstance(_instance3, node.memoizedProps);
23635              }
23636            } catch (error) {
23637              captureCommitPhaseError(finishedWork, finishedWork.return, error);
23638            }
23639          }
23640        } else if ((node.tag === OffscreenComponent || node.tag === LegacyHiddenComponent) && node.memoizedState !== null && node !== finishedWork) ; else if (node.child !== null) {
23641          node.child.return = node;
23642          node = node.child;
23643          continue;
23644        }
23645
23646        if (node === finishedWork) {
23647          return;
23648        }
23649
23650        while (node.sibling === null) {
23651          if (node.return === null || node.return === finishedWork) {
23652            return;
23653          }
23654
23655          if (hostSubtreeRoot === node) {
23656            hostSubtreeRoot = null;
23657          }
23658
23659          node = node.return;
23660        }
23661
23662        if (hostSubtreeRoot === node) {
23663          hostSubtreeRoot = null;
23664        }
23665
23666        node.sibling.return = node.return;
23667        node = node.sibling;
23668      }
23669    }
23670  }
23671
23672  function commitAttachRef(finishedWork) {
23673    var ref = finishedWork.ref;
23674
23675    if (ref !== null) {
23676      var instance = finishedWork.stateNode;
23677      var instanceToUse;
23678
23679      switch (finishedWork.tag) {
23680        case HostComponent:
23681          instanceToUse = getPublicInstance(instance);
23682          break;
23683
23684        default:
23685          instanceToUse = instance;
23686      } // Moved outside to ensure DCE works with this flag
23687
23688      if (typeof ref === 'function') {
23689        var retVal;
23690
23691        if ( finishedWork.mode & ProfileMode) {
23692          try {
23693            startLayoutEffectTimer();
23694            retVal = ref(instanceToUse);
23695          } finally {
23696            recordLayoutEffectDuration(finishedWork);
23697          }
23698        } else {
23699          retVal = ref(instanceToUse);
23700        }
23701
23702        {
23703          if (typeof retVal === 'function') {
23704            error('Unexpected return value from a callback ref in %s. ' + 'A callback ref should not return a function.', getComponentNameFromFiber(finishedWork));
23705          }
23706        }
23707      } else {
23708        {
23709          if (!ref.hasOwnProperty('current')) {
23710            error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().', getComponentNameFromFiber(finishedWork));
23711          }
23712        }
23713
23714        ref.current = instanceToUse;
23715      }
23716    }
23717  }
23718
23719  function detachFiberMutation(fiber) {
23720    // Cut off the return pointer to disconnect it from the tree.
23721    // This enables us to detect and warn against state updates on an unmounted component.
23722    // It also prevents events from bubbling from within disconnected components.
23723    //
23724    // Ideally, we should also clear the child pointer of the parent alternate to let this
23725    // get GC:ed but we don't know which for sure which parent is the current
23726    // one so we'll settle for GC:ing the subtree of this child.
23727    // This child itself will be GC:ed when the parent updates the next time.
23728    //
23729    // Note that we can't clear child or sibling pointers yet.
23730    // They're needed for passive effects and for findDOMNode.
23731    // We defer those fields, and all other cleanup, to the passive phase (see detachFiberAfterEffects).
23732    //
23733    // Don't reset the alternate yet, either. We need that so we can detach the
23734    // alternate's fields in the passive phase. Clearing the return pointer is
23735    // sufficient for findDOMNode semantics.
23736    var alternate = fiber.alternate;
23737
23738    if (alternate !== null) {
23739      alternate.return = null;
23740    }
23741
23742    fiber.return = null;
23743  }
23744
23745  function detachFiberAfterEffects(fiber) {
23746    var alternate = fiber.alternate;
23747
23748    if (alternate !== null) {
23749      fiber.alternate = null;
23750      detachFiberAfterEffects(alternate);
23751    } // Note: Defensively using negation instead of < in case
23752    // `deletedTreeCleanUpLevel` is undefined.
23753
23754
23755    {
23756      // Clear cyclical Fiber fields. This level alone is designed to roughly
23757      // approximate the planned Fiber refactor. In that world, `setState` will be
vendor: 7,257 bytes, lines 23758-23973
23758      // bound to a special "instance" object instead of a Fiber. The Instance
23759      // object will not have any of these fields. It will only be connected to
23760      // the fiber tree via a single link at the root. So if this level alone is
23761      // sufficient to fix memory issues, that bodes well for our plans.
23762      fiber.child = null;
23763      fiber.deletions = null;
23764      fiber.sibling = null; // The `stateNode` is cyclical because on host nodes it points to the host
23765      // tree, which has its own pointers to children, parents, and siblings.
23766      // The other host nodes also point back to fibers, so we should detach that
23767      // one, too.
23768
23769      if (fiber.tag === HostComponent) {
23770        var hostInstance = fiber.stateNode;
23771
23772        if (hostInstance !== null) {
23773          detachDeletedInstance(hostInstance);
23774        }
23775      }
23776
23777      fiber.stateNode = null; // I'm intentionally not clearing the `return` field in this level. We
23778      // already disconnect the `return` pointer at the root of the deleted
23779      // subtree (in `detachFiberMutation`). Besides, `return` by itself is not
23780      // cyclical — it's only cyclical when combined with `child`, `sibling`, and
23781      // `alternate`. But we'll clear it in the next level anyway, just in case.
23782
23783      {
23784        fiber._debugOwner = null;
23785      }
23786
23787      {
23788        // Theoretically, nothing in here should be necessary, because we already
23789        // disconnected the fiber from the tree. So even if something leaks this
23790        // particular fiber, it won't leak anything else
23791        //
23792        // The purpose of this branch is to be super aggressive so we can measure
23793        // if there's any difference in memory impact. If there is, that could
23794        // indicate a React leak we don't know about.
23795        fiber.return = null;
23796        fiber.dependencies = null;
23797        fiber.memoizedProps = null;
23798        fiber.memoizedState = null;
23799        fiber.pendingProps = null;
23800        fiber.stateNode = null; // TODO: Move to `commitPassiveUnmountInsideDeletedTreeOnFiber` instead.
23801
23802        fiber.updateQueue = null;
23803      }
23804    }
23805  }
23806
23807  function getHostParentFiber(fiber) {
23808    var parent = fiber.return;
23809
23810    while (parent !== null) {
23811      if (isHostParent(parent)) {
23812        return parent;
23813      }
23814
23815      parent = parent.return;
23816    }
23817
23818    throw new Error('Expected to find a host parent. This error is likely caused by a bug ' + 'in React. Please file an issue.');
23819  }
23820
23821  function isHostParent(fiber) {
23822    return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
23823  }
23824
23825  function getHostSibling(fiber) {
23826    // We're going to search forward into the tree until we find a sibling host
23827    // node. Unfortunately, if multiple insertions are done in a row we have to
23828    // search past them. This leads to exponential search for the next sibling.
23829    // TODO: Find a more efficient way to do this.
23830    var node = fiber;
23831
23832    siblings: while (true) {
23833      // If we didn't find anything, let's try the next sibling.
23834      while (node.sibling === null) {
23835        if (node.return === null || isHostParent(node.return)) {
23836          // If we pop out of the root or hit the parent the fiber we are the
23837          // last sibling.
23838          return null;
23839        }
23840
23841        node = node.return;
23842      }
23843
23844      node.sibling.return = node.return;
23845      node = node.sibling;
23846
23847      while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) {
23848        // If it is not host node and, we might have a host node inside it.
23849        // Try to search down until we find one.
23850        if (node.flags & Placement) {
23851          // If we don't have a child, try the siblings instead.
23852          continue siblings;
23853        } // If we don't have a child, try the siblings instead.
23854        // We also skip portals because they are not part of this host tree.
23855
23856
23857        if (node.child === null || node.tag === HostPortal) {
23858          continue siblings;
23859        } else {
23860          node.child.return = node;
23861          node = node.child;
23862        }
23863      } // Check if this host node is stable or about to be placed.
23864
23865
23866      if (!(node.flags & Placement)) {
23867        // Found it!
23868        return node.stateNode;
23869      }
23870    }
23871  }
23872
23873  function commitPlacement(finishedWork) {
23874
23875
23876    var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together.
23877
23878    switch (parentFiber.tag) {
23879      case HostComponent:
23880        {
23881          var parent = parentFiber.stateNode;
23882
23883          if (parentFiber.flags & ContentReset) {
23884            // Reset the text content of the parent before doing any insertions
23885            resetTextContent(parent); // Clear ContentReset from the effect tag
23886
23887            parentFiber.flags &= ~ContentReset;
23888          }
23889
23890          var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its
23891          // children to find all the terminal nodes.
23892
23893          insertOrAppendPlacementNode(finishedWork, before, parent);
23894          break;
23895        }
23896
23897      case HostRoot:
23898      case HostPortal:
23899        {
23900          var _parent = parentFiber.stateNode.containerInfo;
23901
23902          var _before = getHostSibling(finishedWork);
23903
23904          insertOrAppendPlacementNodeIntoContainer(finishedWork, _before, _parent);
23905          break;
23906        }
23907      // eslint-disable-next-line-no-fallthrough
23908
23909      default:
23910        throw new Error('Invalid host parent fiber. This error is likely caused by a bug ' + 'in React. Please file an issue.');
23911    }
23912  }
23913
23914  function insertOrAppendPlacementNodeIntoContainer(node, before, parent) {
23915    var tag = node.tag;
23916    var isHost = tag === HostComponent || tag === HostText;
23917
23918    if (isHost) {
23919      var stateNode = node.stateNode;
23920
23921      if (before) {
23922        insertInContainerBefore(parent, stateNode, before);
23923      } else {
23924        appendChildToContainer(parent, stateNode);
23925      }
23926    } else if (tag === HostPortal) ; else {
23927      var child = node.child;
23928
23929      if (child !== null) {
23930        insertOrAppendPlacementNodeIntoContainer(child, before, parent);
23931        var sibling = child.sibling;
23932
23933        while (sibling !== null) {
23934          insertOrAppendPlacementNodeIntoContainer(sibling, before, parent);
23935          sibling = sibling.sibling;
23936        }
23937      }
23938    }
23939  }
23940
23941  function insertOrAppendPlacementNode(node, before, parent) {
23942    var tag = node.tag;
23943    var isHost = tag === HostComponent || tag === HostText;
23944
23945    if (isHost) {
23946      var stateNode = node.stateNode;
23947
23948      if (before) {
23949        insertBefore(parent, stateNode, before);
23950      } else {
23951        appendChild(parent, stateNode);
23952      }
23953    } else if (tag === HostPortal) ; else {
23954      var child = node.child;
23955
23956      if (child !== null) {
23957        insertOrAppendPlacementNode(child, before, parent);
23958        var sibling = child.sibling;
23959
23960        while (sibling !== null) {
23961          insertOrAppendPlacementNode(sibling, before, parent);
23962          sibling = sibling.sibling;
23963        }
23964      }
23965    }
23966  } // These are tracked on the stack as we recursively traverse a
23967  // deleted subtree.
23968  // TODO: Update these during the whole mutation phase, not just during
23969  // a deletion.
23970
23971
23972  var hostParent = null;
23973  var hostParentIsContainer = false;
23974
23975  function commitDeletionEffects(root, returnFiber, deletedFiber) {
23976    {
23977      // We only have the top Fiber that was deleted but we need to recurse down its
23978      // children to find all the terminal nodes.
23979      // Recursively delete all host nodes from the parent, detach refs, clean
23980      // up mounted layout effects, and call componentWillUnmount.
23981      // We only need to remove the topmost host child in each branch. But then we
23982      // still need to keep traversing to unmount effects, refs, and cWU. TODO: We
23983      // could split this into two separate traversals functions, where the second
23984      // one doesn't include any removeChild logic. This is maybe the same
23985      // function as "disappearLayoutEffects" (or whatever that turns into after
23986      // the layout phase is refactored to use recursion).
23987      // Before starting, find the nearest host parent on the stack so we know
23988      // which instance/container to remove the children from.
23989      // TODO: Instead of searching up the fiber return path on every deletion, we
23990      // can track the nearest host component on the JS stack as we traverse the
23991      // tree during the commit phase. This would make insertions faster, too.
23992      var parent = returnFiber;
23993
23994      findParent: while (parent !== null) {
23995        switch (parent.tag) {
23996          case HostComponent:
23997            {
23998              hostParent = parent.stateNode;
23999              hostParentIsContainer = false;
24000              break findParent;
24001            }
24002
24003          case HostRoot:
24004            {
24005              hostParent = parent.stateNode.containerInfo;
24006              hostParentIsContainer = true;
24007              break findParent;
24008            }
24009
24010          case HostPortal:
24011            {
24012              hostParent = parent.stateNode.containerInfo;
24013              hostParentIsContainer = true;
24014              break findParent;
24015            }
24016        }
24017
24018        parent = parent.return;
24019      }
24020
24021      if (hostParent === null) {
24022        throw new Error('Expected to find a host parent. This error is likely caused by ' + 'a bug in React. Please file an issue.');
24023      }
24024
24025      commitDeletionEffectsOnFiber(root, returnFiber, deletedFiber);
24026      hostParent = null;
24027      hostParentIsContainer = false;
24028    }
24029
24030    detachFiberMutation(deletedFiber);
24031  }
24032
24033  function recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, parent) {
24034    // TODO: Use a static flag to skip trees that don't have unmount effects
24035    var child = parent.child;
24036
24037    while (child !== null) {
24038      commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, child);
24039      child = child.sibling;
24040    }
24041  }
24042
24043  function commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, deletedFiber) {
24044    onCommitUnmount(deletedFiber); // The cases in this outer switch modify the stack before they traverse
24045    // into their subtree. There are simpler cases in the inner switch
24046    // that don't modify the stack.
24047
24048    switch (deletedFiber.tag) {
24049      case HostComponent:
24050        {
24051          if (!offscreenSubtreeWasHidden) {
24052            safelyDetachRef(deletedFiber, nearestMountedAncestor);
24053          } // Intentional fallthrough to next branch
24054
24055        }
24056      // eslint-disable-next-line-no-fallthrough
24057
24058      case HostText:
24059        {
24060          // We only need to remove the nearest host child. Set the host parent
24061          // to `null` on the stack to indicate that nested children don't
24062          // need to be removed.
24063          {
24064            var prevHostParent = hostParent;
24065            var prevHostParentIsContainer = hostParentIsContainer;
24066            hostParent = null;
24067            recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24068            hostParent = prevHostParent;
24069            hostParentIsContainer = prevHostParentIsContainer;
24070
24071            if (hostParent !== null) {
24072              // Now that all the child effects have unmounted, we can remove the
24073              // node from the tree.
24074              if (hostParentIsContainer) {
24075                removeChildFromContainer(hostParent, deletedFiber.stateNode);
24076              } else {
24077                removeChild(hostParent, deletedFiber.stateNode);
24078              }
24079            }
24080          }
24081
24082          return;
24083        }
24084
24085      case DehydratedFragment:
24086        {
24087          // Delete the dehydrated suspense boundary and all of its content.
24088
24089
24090          {
24091            if (hostParent !== null) {
24092              if (hostParentIsContainer) {
24093                clearSuspenseBoundaryFromContainer(hostParent, deletedFiber.stateNode);
24094              } else {
24095                clearSuspenseBoundary(hostParent, deletedFiber.stateNode);
24096              }
24097            }
24098          }
24099
24100          return;
24101        }
24102
24103      case HostPortal:
24104        {
24105          {
24106            // When we go into a portal, it becomes the parent to remove from.
24107            var _prevHostParent = hostParent;
24108            var _prevHostParentIsContainer = hostParentIsContainer;
24109            hostParent = deletedFiber.stateNode.containerInfo;
24110            hostParentIsContainer = true;
24111            recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24112            hostParent = _prevHostParent;
24113            hostParentIsContainer = _prevHostParentIsContainer;
24114          }
24115
24116          return;
24117        }
24118
24119      case FunctionComponent:
24120      case ForwardRef:
24121      case MemoComponent:
24122      case SimpleMemoComponent:
24123        {
24124          if (!offscreenSubtreeWasHidden) {
24125            var updateQueue = deletedFiber.updateQueue;
24126
24127            if (updateQueue !== null) {
24128              var lastEffect = updateQueue.lastEffect;
24129
24130              if (lastEffect !== null) {
24131                var firstEffect = lastEffect.next;
24132                var effect = firstEffect;
24133
24134                do {
24135                  var _effect = effect,
24136                      destroy = _effect.destroy,
24137                      tag = _effect.tag;
24138
24139                  if (destroy !== undefined) {
24140                    if ((tag & Insertion) !== NoFlags$1) {
24141                      safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
24142                    } else if ((tag & Layout) !== NoFlags$1) {
24143                      {
24144                        markComponentLayoutEffectUnmountStarted(deletedFiber);
24145                      }
24146
24147                      if ( deletedFiber.mode & ProfileMode) {
24148                        startLayoutEffectTimer();
24149                        safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
24150                        recordLayoutEffectDuration(deletedFiber);
24151                      } else {
24152                        safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
24153                      }
24154
24155                      {
24156                        markComponentLayoutEffectUnmountStopped();
24157                      }
24158                    }
24159                  }
24160
24161                  effect = effect.next;
24162                } while (effect !== firstEffect);
24163              }
24164            }
24165          }
24166
24167          recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24168          return;
24169        }
24170
24171      case ClassComponent:
24172        {
24173          if (!offscreenSubtreeWasHidden) {
24174            safelyDetachRef(deletedFiber, nearestMountedAncestor);
24175            var instance = deletedFiber.stateNode;
24176
24177            if (typeof instance.componentWillUnmount === 'function') {
24178              safelyCallComponentWillUnmount(deletedFiber, nearestMountedAncestor, instance);
24179            }
24180          }
24181
24182          recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24183          return;
24184        }
24185
24186      case ScopeComponent:
24187        {
24188
24189          recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24190          return;
24191        }
24192
24193      case OffscreenComponent:
24194        {
24195          if ( // TODO: Remove this dead flag
24196           deletedFiber.mode & ConcurrentMode) {
24197            // If this offscreen component is hidden, we already unmounted it. Before
24198            // deleting the children, track that it's already unmounted so that we
24199            // don't attempt to unmount the effects again.
24200            // TODO: If the tree is hidden, in most cases we should be able to skip
24201            // over the nested children entirely. An exception is we haven't yet found
24202            // the topmost host node to delete, which we already track on the stack.
24203            // But the other case is portals, which need to be detached no matter how
24204            // deeply they are nested. We should use a subtree flag to track whether a
24205            // subtree includes a nested portal.
24206            var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
24207            offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || deletedFiber.memoizedState !== null;
24208            recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24209            offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
24210          } else {
24211            recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24212          }
24213
24214          break;
24215        }
24216
24217      default:
24218        {
24219          recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
24220          return;
24221        }
24222    }
24223  }
24224
24225  function commitSuspenseCallback(finishedWork) {
24226    // TODO: Move this to passive phase
24227    var newState = finishedWork.memoizedState;
24228  }
24229
24230  function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {
24231
24232    var newState = finishedWork.memoizedState;
24233
24234    if (newState === null) {
24235      var current = finishedWork.alternate;
24236
24237      if (current !== null) {
24238        var prevState = current.memoizedState;
24239
24240        if (prevState !== null) {
24241          var suspenseInstance = prevState.dehydrated;
24242
24243          if (suspenseInstance !== null) {
24244            commitHydratedSuspenseInstance(suspenseInstance);
24245          }
24246        }
24247      }
24248    }
24249  }
24250
24251  function attachSuspenseRetryListeners(finishedWork) {
24252    // If this boundary just timed out, then it will have a set of wakeables.
24253    // For each wakeable, attach a listener so that when it resolves, React
24254    // attempts to re-render the boundary in the primary (pre-timeout) state.
24255    var wakeables = finishedWork.updateQueue;
24256
24257    if (wakeables !== null) {
24258      finishedWork.updateQueue = null;
24259      var retryCache = finishedWork.stateNode;
24260
24261      if (retryCache === null) {
24262        retryCache = finishedWork.stateNode = new PossiblyWeakSet();
24263      }
24264
24265      wakeables.forEach(function (wakeable) {
24266        // Memoize using the boundary fiber to prevent redundant listeners.
24267        var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable);
24268
24269        if (!retryCache.has(wakeable)) {
24270          retryCache.add(wakeable);
24271
24272          {
24273            if (isDevToolsPresent) {
24274              if (inProgressLanes !== null && inProgressRoot !== null) {
24275                // If we have pending work still, associate the original updaters with it.
24276                restorePendingUpdaters(inProgressRoot, inProgressLanes);
24277              } else {
24278                throw Error('Expected finished root and lanes to be set. This is a bug in React.');
24279              }
24280            }
24281          }
24282
24283          wakeable.then(retry, retry);
24284        }
24285      });
24286    }
24287  } // This function detects when a Suspense boundary goes from visible to hidden.
24288  function commitMutationEffects(root, finishedWork, committedLanes) {
24289    inProgressLanes = committedLanes;
24290    inProgressRoot = root;
24291    setCurrentFiber(finishedWork);
24292    commitMutationEffectsOnFiber(finishedWork, root);
24293    setCurrentFiber(finishedWork);
24294    inProgressLanes = null;
24295    inProgressRoot = null;
24296  }
24297
24298  function recursivelyTraverseMutationEffects(root, parentFiber, lanes) {
24299    // Deletions effects can be scheduled on any fiber type. They need to happen
24300    // before the children effects hae fired.
24301    var deletions = parentFiber.deletions;
24302
24303    if (deletions !== null) {
24304      for (var i = 0; i < deletions.length; i++) {
24305        var childToDelete = deletions[i];
24306
24307        try {
24308          commitDeletionEffects(root, parentFiber, childToDelete);
24309        } catch (error) {
24310          captureCommitPhaseError(childToDelete, parentFiber, error);
24311        }
24312      }
24313    }
24314
24315    var prevDebugFiber = getCurrentFiber();
24316
24317    if (parentFiber.subtreeFlags & MutationMask) {
24318      var child = parentFiber.child;
24319
24320      while (child !== null) {
24321        setCurrentFiber(child);
24322        commitMutationEffectsOnFiber(child, root);
24323        child = child.sibling;
24324      }
24325    }
24326
24327    setCurrentFiber(prevDebugFiber);
24328  }
24329
24330  function commitMutationEffectsOnFiber(finishedWork, root, lanes) {
24331    var current = finishedWork.alternate;
24332    var flags = finishedWork.flags; // The effect flag should be checked *after* we refine the type of fiber,
24333    // because the fiber tag is more specific. An exception is any flag related
24334    // to reconcilation, because those can be set on all fiber types.
24335
24336    switch (finishedWork.tag) {
24337      case FunctionComponent:
24338      case ForwardRef:
24339      case MemoComponent:
24340      case SimpleMemoComponent:
24341        {
24342          recursivelyTraverseMutationEffects(root, finishedWork);
24343          commitReconciliationEffects(finishedWork);
24344
24345          if (flags & Update) {
24346            try {
24347              commitHookEffectListUnmount(Insertion | HasEffect, finishedWork, finishedWork.return);
24348              commitHookEffectListMount(Insertion | HasEffect, finishedWork);
24349            } catch (error) {
24350              captureCommitPhaseError(finishedWork, finishedWork.return, error);
24351            } // Layout effects are destroyed during the mutation phase so that all
24352            // destroy functions for all fibers are called before any create functions.
24353            // This prevents sibling component effects from interfering with each other,
24354            // e.g. a destroy function in one component should never override a ref set
24355            // by a create function in another component during the same commit.
24356
24357
24358            if ( finishedWork.mode & ProfileMode) {
24359              try {
24360                startLayoutEffectTimer();
24361                commitHookEffectListUnmount(Layout | HasEffect, finishedWork, finishedWork.return);
24362              } catch (error) {
24363                captureCommitPhaseError(finishedWork, finishedWork.return, error);
24364              }
24365
24366              recordLayoutEffectDuration(finishedWork);
24367            } else {
24368              try {
24369                commitHookEffectListUnmount(Layout | HasEffect, finishedWork, finishedWork.return);
24370              } catch (error) {
24371                captureCommitPhaseError(finishedWork, finishedWork.return, error);
24372              }
24373            }
24374          }
24375
24376          return;
24377        }
24378
24379      case ClassComponent:
24380        {
24381          recursivelyTraverseMutationEffects(root, finishedWork);
24382          commitReconciliationEffects(finishedWork);
24383
24384          if (flags & Ref) {
24385            if (current !== null) {
24386              safelyDetachRef(current, current.return);
24387            }
24388          }
24389
24390          return;
24391        }
24392
24393      case HostComponent:
24394        {
24395          recursivelyTraverseMutationEffects(root, finishedWork);
24396          commitReconciliationEffects(finishedWork);
24397
24398          if (flags & Ref) {
24399            if (current !== null) {
24400              safelyDetachRef(current, current.return);
24401            }
24402          }
24403
24404          {
24405            // TODO: ContentReset gets cleared by the children during the commit
24406            // phase. This is a refactor hazard because it means we must read
24407            // flags the flags after `commitReconciliationEffects` has already run;
24408            // the order matters. We should refactor so that ContentReset does not
24409            // rely on mutating the flag during commit. Like by setting a flag
24410            // during the render phase instead.
24411            if (finishedWork.flags & ContentReset) {
24412              var instance = finishedWork.stateNode;
24413
24414              try {
24415                resetTextContent(instance);
24416              } catch (error) {
24417                captureCommitPhaseError(finishedWork, finishedWork.return, error);
24418              }
24419            }
24420
24421            if (flags & Update) {
24422              var _instance4 = finishedWork.stateNode;
24423
24424              if (_instance4 != null) {
24425                // Commit the work prepared earlier.
24426                var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps
24427                // as the newProps. The updatePayload will contain the real change in
24428                // this case.
24429
24430                var oldProps = current !== null ? current.memoizedProps : newProps;
24431                var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components.
24432
24433                var updatePayload = finishedWork.updateQueue;
24434                finishedWork.updateQueue = null;
24435
24436                if (updatePayload !== null) {
24437                  try {
24438                    commitUpdate(_instance4, updatePayload, type, oldProps, newProps, finishedWork);
24439                  } catch (error) {
24440                    captureCommitPhaseError(finishedWork, finishedWork.return, error);
24441                  }
24442                }
24443              }
24444            }
24445          }
24446
24447          return;
24448        }
24449
24450      case HostText:
24451        {
24452          recursivelyTraverseMutationEffects(root, finishedWork);
24453          commitReconciliationEffects(finishedWork);
24454
24455          if (flags & Update) {
24456            {
24457              if (finishedWork.stateNode === null) {
24458                throw new Error('This should have a text node initialized. This error is likely ' + 'caused by a bug in React. Please file an issue.');
24459              }
24460
24461              var textInstance = finishedWork.stateNode;
24462              var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps
24463              // as the newProps. The updatePayload will contain the real change in
24464              // this case.
24465
24466              var oldText = current !== null ? current.memoizedProps : newText;
24467
24468              try {
24469                commitTextUpdate(textInstance, oldText, newText);
24470              } catch (error) {
24471                captureCommitPhaseError(finishedWork, finishedWork.return, error);
24472              }
24473            }
24474          }
24475
24476          return;
24477        }
24478
24479      case HostRoot:
24480        {
24481          recursivelyTraverseMutationEffects(root, finishedWork);
24482          commitReconciliationEffects(finishedWork);
24483
24484          if (flags & Update) {
24485            {
24486              if (current !== null) {
24487                var prevRootState = current.memoizedState;
24488
24489                if (prevRootState.isDehydrated) {
24490                  try {
24491                    commitHydratedContainer(root.containerInfo);
24492                  } catch (error) {
24493                    captureCommitPhaseError(finishedWork, finishedWork.return, error);
24494                  }
24495                }
24496              }
24497            }
24498          }
24499
24500          return;
24501        }
24502
24503      case HostPortal:
24504        {
24505          recursivelyTraverseMutationEffects(root, finishedWork);
24506          commitReconciliationEffects(finishedWork);
24507
24508          return;
24509        }
24510
24511      case SuspenseComponent:
24512        {
24513          recursivelyTraverseMutationEffects(root, finishedWork);
24514          commitReconciliationEffects(finishedWork);
24515          var offscreenFiber = finishedWork.child;
24516
24517          if (offscreenFiber.flags & Visibility) {
24518            var offscreenInstance = offscreenFiber.stateNode;
24519            var newState = offscreenFiber.memoizedState;
24520            var isHidden = newState !== null; // Track the current state on the Offscreen instance so we can
24521            // read it during an event
24522
24523            offscreenInstance.isHidden = isHidden;
24524
24525            if (isHidden) {
24526              var wasHidden = offscreenFiber.alternate !== null && offscreenFiber.alternate.memoizedState !== null;
24527
24528              if (!wasHidden) {
24529                // TODO: Move to passive phase
24530                markCommitTimeOfFallback();
24531              }
24532            }
24533          }
24534
24535          if (flags & Update) {
24536            try {
24537              commitSuspenseCallback(finishedWork);
24538            } catch (error) {
24539              captureCommitPhaseError(finishedWork, finishedWork.return, error);
24540            }
24541
24542            attachSuspenseRetryListeners(finishedWork);
24543          }
24544
24545          return;
24546        }
24547
24548      case OffscreenComponent:
24549        {
24550          var _wasHidden = current !== null && current.memoizedState !== null;
24551
24552          if ( // TODO: Remove this dead flag
24553           finishedWork.mode & ConcurrentMode) {
24554            // Before committing the children, track on the stack whether this
24555            // offscreen subtree was already hidden, so that we don't unmount the
24556            // effects again.
24557            var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
24558            offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || _wasHidden;
24559            recursivelyTraverseMutationEffects(root, finishedWork);
24560            offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
24561          } else {
24562            recursivelyTraverseMutationEffects(root, finishedWork);
24563          }
24564
24565          commitReconciliationEffects(finishedWork);
24566
24567          if (flags & Visibility) {
24568            var _offscreenInstance = finishedWork.stateNode;
24569            var _newState = finishedWork.memoizedState;
24570
24571            var _isHidden = _newState !== null;
24572
24573            var offscreenBoundary = finishedWork; // Track the current state on the Offscreen instance so we can
24574            // read it during an event
24575
24576            _offscreenInstance.isHidden = _isHidden;
24577
24578            {
24579              if (_isHidden) {
24580                if (!_wasHidden) {
24581                  if ((offscreenBoundary.mode & ConcurrentMode) !== NoMode) {
24582                    nextEffect = offscreenBoundary;
24583                    var offscreenChild = offscreenBoundary.child;
24584
24585                    while (offscreenChild !== null) {
24586                      nextEffect = offscreenChild;
24587                      disappearLayoutEffects_begin(offscreenChild);
24588                      offscreenChild = offscreenChild.sibling;
24589                    }
24590                  }
24591                }
24592              }
24593            }
24594
24595            {
24596              // TODO: This needs to run whenever there's an insertion or update
24597              // inside a hidden Offscreen tree.
24598              hideOrUnhideAllChildren(offscreenBoundary, _isHidden);
24599            }
24600          }
24601
24602          return;
24603        }
24604
24605      case SuspenseListComponent:
24606        {
24607          recursivelyTraverseMutationEffects(root, finishedWork);
24608          commitReconciliationEffects(finishedWork);
24609
24610          if (flags & Update) {
24611            attachSuspenseRetryListeners(finishedWork);
24612          }
24613
24614          return;
24615        }
24616
24617      case ScopeComponent:
24618        {
24619
24620          return;
24621        }
24622
24623      default:
24624        {
24625          recursivelyTraverseMutationEffects(root, finishedWork);
24626          commitReconciliationEffects(finishedWork);
24627          return;
24628        }
24629    }
24630  }
24631
24632  function commitReconciliationEffects(finishedWork) {
24633    // Placement effects (insertions, reorders) can be scheduled on any fiber
24634    // type. They needs to happen after the children effects have fired, but
24635    // before the effects on this fiber have fired.
24636    var flags = finishedWork.flags;
24637
24638    if (flags & Placement) {
24639      try {
24640        commitPlacement(finishedWork);
24641      } catch (error) {
24642        captureCommitPhaseError(finishedWork, finishedWork.return, error);
24643      } // Clear the "placement" from effect tag so that we know that this is
24644      // inserted, before any life-cycles like componentDidMount gets called.
24645      // TODO: findDOMNode doesn't rely on this any more but isMounted does
24646      // and isMounted is deprecated anyway so we should be able to kill this.
24647
24648
24649      finishedWork.flags &= ~Placement;
24650    }
24651
24652    if (flags & Hydrating) {
24653      finishedWork.flags &= ~Hydrating;
24654    }
24655  }
24656
24657  function commitLayoutEffects(finishedWork, root, committedLanes) {
24658    inProgressLanes = committedLanes;
24659    inProgressRoot = root;
24660    nextEffect = finishedWork;
24661    commitLayoutEffects_begin(finishedWork, root, committedLanes);
24662    inProgressLanes = null;
24663    inProgressRoot = null;
24664  }
24665
24666  function commitLayoutEffects_begin(subtreeRoot, root, committedLanes) {
24667    // Suspense layout effects semantics don't change for legacy roots.
24668    var isModernRoot = (subtreeRoot.mode & ConcurrentMode) !== NoMode;
24669
24670    while (nextEffect !== null) {
24671      var fiber = nextEffect;
24672      var firstChild = fiber.child;
24673
24674      if ( fiber.tag === OffscreenComponent && isModernRoot) {
24675        // Keep track of the current Offscreen stack's state.
24676        var isHidden = fiber.memoizedState !== null;
24677        var newOffscreenSubtreeIsHidden = isHidden || offscreenSubtreeIsHidden;
24678
24679        if (newOffscreenSubtreeIsHidden) {
24680          // The Offscreen tree is hidden. Skip over its layout effects.
24681          commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes);
24682          continue;
24683        } else {
24684          // TODO (Offscreen) Also check: subtreeFlags & LayoutMask
24685          var current = fiber.alternate;
24686          var wasHidden = current !== null && current.memoizedState !== null;
24687          var newOffscreenSubtreeWasHidden = wasHidden || offscreenSubtreeWasHidden;
24688          var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden;
24689          var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; // Traverse the Offscreen subtree with the current Offscreen as the root.
24690
24691          offscreenSubtreeIsHidden = newOffscreenSubtreeIsHidden;
24692          offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden;
24693
24694          if (offscreenSubtreeWasHidden && !prevOffscreenSubtreeWasHidden) {
24695            // This is the root of a reappearing boundary. Turn its layout effects
24696            // back on.
24697            nextEffect = fiber;
24698            reappearLayoutEffects_begin(fiber);
24699          }
24700
24701          var child = firstChild;
24702
24703          while (child !== null) {
24704            nextEffect = child;
24705            commitLayoutEffects_begin(child, // New root; bubble back up to here and stop.
24706            root, committedLanes);
24707            child = child.sibling;
24708          } // Restore Offscreen state and resume in our-progress traversal.
24709
24710
24711          nextEffect = fiber;
24712          offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;
24713          offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
24714          commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes);
24715          continue;
24716        }
24717      }
24718
24719      if ((fiber.subtreeFlags & LayoutMask) !== NoFlags && firstChild !== null) {
24720        firstChild.return = fiber;
24721        nextEffect = firstChild;
24722      } else {
24723        commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes);
24724      }
24725    }
24726  }
24727
24728  function commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes) {
24729    while (nextEffect !== null) {
24730      var fiber = nextEffect;
24731
24732      if ((fiber.flags & LayoutMask) !== NoFlags) {
24733        var current = fiber.alternate;
24734        setCurrentFiber(fiber);
24735
24736        try {
24737          commitLayoutEffectOnFiber(root, current, fiber, committedLanes);
24738        } catch (error) {
24739          captureCommitPhaseError(fiber, fiber.return, error);
24740        }
24741
24742        resetCurrentFiber();
24743      }
24744
24745      if (fiber === subtreeRoot) {
24746        nextEffect = null;
24747        return;
24748      }
24749
24750      var sibling = fiber.sibling;
24751
24752      if (sibling !== null) {
24753        sibling.return = fiber.return;
24754        nextEffect = sibling;
24755        return;
24756      }
24757
24758      nextEffect = fiber.return;
24759    }
24760  }
24761
24762  function disappearLayoutEffects_begin(subtreeRoot) {
24763    while (nextEffect !== null) {
24764      var fiber = nextEffect;
24765      var firstChild = fiber.child; // TODO (Offscreen) Check: flags & (RefStatic | LayoutStatic)
24766
24767      switch (fiber.tag) {
24768        case FunctionComponent:
24769        case ForwardRef:
24770        case MemoComponent:
24771        case SimpleMemoComponent:
24772          {
24773            if ( fiber.mode & ProfileMode) {
24774              try {
24775                startLayoutEffectTimer();
24776                commitHookEffectListUnmount(Layout, fiber, fiber.return);
24777              } finally {
24778                recordLayoutEffectDuration(fiber);
24779              }
24780            } else {
24781              commitHookEffectListUnmount(Layout, fiber, fiber.return);
24782            }
24783
24784            break;
24785          }
24786
24787        case ClassComponent:
24788          {
24789            // TODO (Offscreen) Check: flags & RefStatic
24790            safelyDetachRef(fiber, fiber.return);
24791            var instance = fiber.stateNode;
24792
24793            if (typeof instance.componentWillUnmount === 'function') {
24794              safelyCallComponentWillUnmount(fiber, fiber.return, instance);
24795            }
24796
24797            break;
24798          }
24799
24800        case HostComponent:
24801          {
24802            safelyDetachRef(fiber, fiber.return);
24803            break;
24804          }
24805
24806        case OffscreenComponent:
24807          {
24808            // Check if this is a
24809            var isHidden = fiber.memoizedState !== null;
24810
24811            if (isHidden) {
24812              // Nested Offscreen tree is already hidden. Don't disappear
24813              // its effects.
24814              disappearLayoutEffects_complete(subtreeRoot);
24815              continue;
24816            }
24817
24818            break;
24819          }
24820      } // TODO (Offscreen) Check: subtreeFlags & LayoutStatic
24821
24822
24823      if (firstChild !== null) {
24824        firstChild.return = fiber;
24825        nextEffect = firstChild;
24826      } else {
24827        disappearLayoutEffects_complete(subtreeRoot);
24828      }
24829    }
24830  }
24831
24832  function disappearLayoutEffects_complete(subtreeRoot) {
24833    while (nextEffect !== null) {
24834      var fiber = nextEffect;
24835
24836      if (fiber === subtreeRoot) {
24837        nextEffect = null;
24838        return;
24839      }
24840
24841      var sibling = fiber.sibling;
24842
24843      if (sibling !== null) {
24844        sibling.return = fiber.return;
24845        nextEffect = sibling;
24846        return;
24847      }
24848
24849      nextEffect = fiber.return;
24850    }
24851  }
24852
24853  function reappearLayoutEffects_begin(subtreeRoot) {
24854    while (nextEffect !== null) {
24855      var fiber = nextEffect;
24856      var firstChild = fiber.child;
24857
24858      if (fiber.tag === OffscreenComponent) {
24859        var isHidden = fiber.memoizedState !== null;
24860
24861        if (isHidden) {
24862          // Nested Offscreen tree is still hidden. Don't re-appear its effects.
24863          reappearLayoutEffects_complete(subtreeRoot);
24864          continue;
24865        }
24866      } // TODO (Offscreen) Check: subtreeFlags & LayoutStatic
24867
24868
24869      if (firstChild !== null) {
24870        // This node may have been reused from a previous render, so we can't
24871        // assume its return pointer is correct.
24872        firstChild.return = fiber;
24873        nextEffect = firstChild;
24874      } else {
24875        reappearLayoutEffects_complete(subtreeRoot);
24876      }
24877    }
24878  }
24879
24880  function reappearLayoutEffects_complete(subtreeRoot) {
24881    while (nextEffect !== null) {
24882      var fiber = nextEffect; // TODO (Offscreen) Check: flags & LayoutStatic
24883
24884      setCurrentFiber(fiber);
24885
24886      try {
24887        reappearLayoutEffectsOnFiber(fiber);
24888      } catch (error) {
24889        captureCommitPhaseError(fiber, fiber.return, error);
24890      }
24891
24892      resetCurrentFiber();
24893
24894      if (fiber === subtreeRoot) {
24895        nextEffect = null;
24896        return;
24897      }
24898
24899      var sibling = fiber.sibling;
24900
24901      if (sibling !== null) {
24902        // This node may have been reused from a previous render, so we can't
24903        // assume its return pointer is correct.
24904        sibling.return = fiber.return;
24905        nextEffect = sibling;
24906        return;
24907      }
24908
24909      nextEffect = fiber.return;
24910    }
24911  }
24912
24913  function commitPassiveMountEffects(root, finishedWork, committedLanes, committedTransitions) {
24914    nextEffect = finishedWork;
24915    commitPassiveMountEffects_begin(finishedWork, root, committedLanes, committedTransitions);
24916  }
24917
24918  function commitPassiveMountEffects_begin(subtreeRoot, root, committedLanes, committedTransitions) {
24919    while (nextEffect !== null) {
24920      var fiber = nextEffect;
24921      var firstChild = fiber.child;
24922
24923      if ((fiber.subtreeFlags & PassiveMask) !== NoFlags && firstChild !== null) {
24924        firstChild.return = fiber;
24925        nextEffect = firstChild;
24926      } else {
24927        commitPassiveMountEffects_complete(subtreeRoot, root, committedLanes, committedTransitions);
24928      }
24929    }
24930  }
24931
24932  function commitPassiveMountEffects_complete(subtreeRoot, root, committedLanes, committedTransitions) {
24933    while (nextEffect !== null) {
24934      var fiber = nextEffect;
24935
24936      if ((fiber.flags & Passive) !== NoFlags) {
24937        setCurrentFiber(fiber);
24938
24939        try {
24940          commitPassiveMountOnFiber(root, fiber, committedLanes, committedTransitions);
24941        } catch (error) {
24942          captureCommitPhaseError(fiber, fiber.return, error);
24943        }
24944
24945        resetCurrentFiber();
24946      }
24947
24948      if (fiber === subtreeRoot) {
24949        nextEffect = null;
24950        return;
24951      }
24952
24953      var sibling = fiber.sibling;
24954
24955      if (sibling !== null) {
24956        sibling.return = fiber.return;
24957        nextEffect = sibling;
24958        return;
24959      }
24960
24961      nextEffect = fiber.return;
24962    }
24963  }
24964
24965  function commitPassiveMountOnFiber(finishedRoot, finishedWork, committedLanes, committedTransitions) {
24966    switch (finishedWork.tag) {
24967      case FunctionComponent:
24968      case ForwardRef:
24969      case SimpleMemoComponent:
24970        {
24971          if ( finishedWork.mode & ProfileMode) {
24972            startPassiveEffectTimer();
24973
24974            try {
24975              commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);
24976            } finally {
24977              recordPassiveEffectDuration(finishedWork);
24978            }
24979          } else {
24980            commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);
24981          }
24982
24983          break;
24984        }
24985    }
24986  }
24987
24988  function commitPassiveUnmountEffects(firstChild) {
24989    nextEffect = firstChild;
24990    commitPassiveUnmountEffects_begin();
24991  }
24992
24993  function commitPassiveUnmountEffects_begin() {
24994    while (nextEffect !== null) {
24995      var fiber = nextEffect;
24996      var child = fiber.child;
24997
24998      if ((nextEffect.flags & ChildDeletion) !== NoFlags) {
24999        var deletions = fiber.deletions;
25000
25001        if (deletions !== null) {
25002          for (var i = 0; i < deletions.length; i++) {
25003            var fiberToDelete = deletions[i];
25004            nextEffect = fiberToDelete;
25005            commitPassiveUnmountEffectsInsideOfDeletedTree_begin(fiberToDelete, fiber);
25006          }
25007
25008          {
25009            // A fiber was deleted from this parent fiber, but it's still part of
25010            // the previous (alternate) parent fiber's list of children. Because
25011            // children are a linked list, an earlier sibling that's still alive
25012            // will be connected to the deleted fiber via its `alternate`:
25013            //
25014            //   live fiber
25015            //   --alternate--> previous live fiber
25016            //   --sibling--> deleted fiber
25017            //
25018            // We can't disconnect `alternate` on nodes that haven't been deleted
25019            // yet, but we can disconnect the `sibling` and `child` pointers.
25020            var previousFiber = fiber.alternate;
25021
25022            if (previousFiber !== null) {
25023              var detachedChild = previousFiber.child;
25024
25025              if (detachedChild !== null) {
25026                previousFiber.child = null;
25027
25028                do {
25029                  var detachedSibling = detachedChild.sibling;
25030                  detachedChild.sibling = null;
25031                  detachedChild = detachedSibling;
25032                } while (detachedChild !== null);
25033              }
25034            }
25035          }
25036
25037          nextEffect = fiber;
25038        }
25039      }
25040
25041      if ((fiber.subtreeFlags & PassiveMask) !== NoFlags && child !== null) {
25042        child.return = fiber;
25043        nextEffect = child;
25044      } else {
25045        commitPassiveUnmountEffects_complete();
25046      }
25047    }
25048  }
25049
25050  function commitPassiveUnmountEffects_complete() {
25051    while (nextEffect !== null) {
25052      var fiber = nextEffect;
25053
25054      if ((fiber.flags & Passive) !== NoFlags) {
25055        setCurrentFiber(fiber);
25056        commitPassiveUnmountOnFiber(fiber);
25057        resetCurrentFiber();
25058      }
25059
25060      var sibling = fiber.sibling;
25061
25062      if (sibling !== null) {
25063        sibling.return = fiber.return;
25064        nextEffect = sibling;
25065        return;
25066      }
25067
25068      nextEffect = fiber.return;
25069    }
25070  }
25071
25072  function commitPassiveUnmountOnFiber(finishedWork) {
25073    switch (finishedWork.tag) {
25074      case FunctionComponent:
25075      case ForwardRef:
25076      case SimpleMemoComponent:
25077        {
25078          if ( finishedWork.mode & ProfileMode) {
25079            startPassiveEffectTimer();
25080            commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork, finishedWork.return);
25081            recordPassiveEffectDuration(finishedWork);
25082          } else {
25083            commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork, finishedWork.return);
25084          }
25085
25086          break;
25087        }
25088    }
25089  }
25090
25091  function commitPassiveUnmountEffectsInsideOfDeletedTree_begin(deletedSubtreeRoot, nearestMountedAncestor) {
25092    while (nextEffect !== null) {
25093      var fiber = nextEffect; // Deletion effects fire in parent -> child order
25094      // TODO: Check if fiber has a PassiveStatic flag
25095
25096      setCurrentFiber(fiber);
25097      commitPassiveUnmountInsideDeletedTreeOnFiber(fiber, nearestMountedAncestor);
25098      resetCurrentFiber();
25099      var child = fiber.child; // TODO: Only traverse subtree if it has a PassiveStatic flag. (But, if we
25100      // do this, still need to handle `deletedTreeCleanUpLevel` correctly.)
25101
25102      if (child !== null) {
25103        child.return = fiber;
25104        nextEffect = child;
25105      } else {
25106        commitPassiveUnmountEffectsInsideOfDeletedTree_complete(deletedSubtreeRoot);
25107      }
25108    }
25109  }
25110
25111  function commitPassiveUnmountEffectsInsideOfDeletedTree_complete(deletedSubtreeRoot) {
25112    while (nextEffect !== null) {
25113      var fiber = nextEffect;
25114      var sibling = fiber.sibling;
25115      var returnFiber = fiber.return;
25116
25117      {
25118        // Recursively traverse the entire deleted tree and clean up fiber fields.
25119        // This is more aggressive than ideal, and the long term goal is to only
25120        // have to detach the deleted tree at the root.
25121        detachFiberAfterEffects(fiber);
25122
25123        if (fiber === deletedSubtreeRoot) {
25124          nextEffect = null;
25125          return;
25126        }
25127      }
25128
25129      if (sibling !== null) {
25130        sibling.return = returnFiber;
25131        nextEffect = sibling;
25132        return;
25133      }
25134
25135      nextEffect = returnFiber;
25136    }
25137  }
25138
25139  function commitPassiveUnmountInsideDeletedTreeOnFiber(current, nearestMountedAncestor) {
25140    switch (current.tag) {
25141      case FunctionComponent:
25142      case ForwardRef:
25143      case SimpleMemoComponent:
25144        {
25145          if ( current.mode & ProfileMode) {
25146            startPassiveEffectTimer();
25147            commitHookEffectListUnmount(Passive$1, current, nearestMountedAncestor);
25148            recordPassiveEffectDuration(current);
25149          } else {
25150            commitHookEffectListUnmount(Passive$1, current, nearestMountedAncestor);
25151          }
25152
25153          break;
25154        }
25155    }
25156  } // TODO: Reuse reappearLayoutEffects traversal here?
25157
25158
25159  function invokeLayoutEffectMountInDEV(fiber) {
25160    {
25161      // We don't need to re-check StrictEffectsMode here.
vendor: 1,426 bytes, lines 25162-25216
25162      // This function is only called if that check has already passed.
25163      switch (fiber.tag) {
25164        case FunctionComponent:
25165        case ForwardRef:
25166        case SimpleMemoComponent:
25167          {
25168            try {
25169              commitHookEffectListMount(Layout | HasEffect, fiber);
25170            } catch (error) {
25171              captureCommitPhaseError(fiber, fiber.return, error);
25172            }
25173
25174            break;
25175          }
25176
25177        case ClassComponent:
25178          {
25179            var instance = fiber.stateNode;
25180
25181            try {
25182              instance.componentDidMount();
25183            } catch (error) {
25184              captureCommitPhaseError(fiber, fiber.return, error);
25185            }
25186
25187            break;
25188          }
25189      }
25190    }
25191  }
25192
25193  function invokePassiveEffectMountInDEV(fiber) {
25194    {
25195      // We don't need to re-check StrictEffectsMode here.
25196      // This function is only called if that check has already passed.
25197      switch (fiber.tag) {
25198        case FunctionComponent:
25199        case ForwardRef:
25200        case SimpleMemoComponent:
25201          {
25202            try {
25203              commitHookEffectListMount(Passive$1 | HasEffect, fiber);
25204            } catch (error) {
25205              captureCommitPhaseError(fiber, fiber.return, error);
25206            }
25207
25208            break;
25209          }
25210      }
25211    }
25212  }
25213
25214  function invokeLayoutEffectUnmountInDEV(fiber) {
25215    {
25216      // We don't need to re-check StrictEffectsMode here.
25217      // This function is only called if that check has already passed.
25218      switch (fiber.tag) {
25219        case FunctionComponent:
25220        case ForwardRef:
25221        case SimpleMemoComponent:
25222          {
25223            try {
25224              commitHookEffectListUnmount(Layout | HasEffect, fiber, fiber.return);
25225            } catch (error) {
25226              captureCommitPhaseError(fiber, fiber.return, error);
25227            }
25228
25229            break;
25230          }
25231
25232        case ClassComponent:
25233          {
25234            var instance = fiber.stateNode;
25235
25236            if (typeof instance.componentWillUnmount === 'function') {
25237              safelyCallComponentWillUnmount(fiber, fiber.return, instance);
25238            }
25239
25240            break;
25241          }
25242      }
25243    }
25244  }
25245
25246  function invokePassiveEffectUnmountInDEV(fiber) {
25247    {
25248      // We don't need to re-check StrictEffectsMode here.
25249      // This function is only called if that check has already passed.
25250      switch (fiber.tag) {
25251        case FunctionComponent:
25252        case ForwardRef:
25253        case SimpleMemoComponent:
25254          {
25255            try {
25256              commitHookEffectListUnmount(Passive$1 | HasEffect, fiber, fiber.return);
25257            } catch (error) {
25258              captureCommitPhaseError(fiber, fiber.return, error);
25259            }
25260          }
25261      }
25262    }
25263  }
25264
25265  var COMPONENT_TYPE = 0;
25266  var HAS_PSEUDO_CLASS_TYPE = 1;
25267  var ROLE_TYPE = 2;
25268  var TEST_NAME_TYPE = 3;
25269  var TEXT_TYPE = 4;
25270
25271  if (typeof Symbol === 'function' && Symbol.for) {
25272    var symbolFor = Symbol.for;
25273    COMPONENT_TYPE = symbolFor('selector.component');
25274    HAS_PSEUDO_CLASS_TYPE = symbolFor('selector.has_pseudo_class');
25275    ROLE_TYPE = symbolFor('selector.role');
25276    TEST_NAME_TYPE = symbolFor('selector.test_id');
25277    TEXT_TYPE = symbolFor('selector.text');
25278  }
25279  var commitHooks = [];
25280  function onCommitRoot$1() {
25281    {
25282      commitHooks.forEach(function (commitHook) {
25283        return commitHook();
25284      });
25285    }
25286  }
25287
25288  var ReactCurrentActQueue = ReactSharedInternals.ReactCurrentActQueue;
25289  function isLegacyActEnvironment(fiber) {
25290    {
25291      // Legacy mode. We preserve the behavior of React 17's act. It assumes an
25292      // act environment whenever `jest` is defined, but you can still turn off
25293      // spurious warnings by setting IS_REACT_ACT_ENVIRONMENT explicitly
25294      // to false.
25295      var isReactActEnvironmentGlobal = // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global
25296      typeof IS_REACT_ACT_ENVIRONMENT !== 'undefined' ? IS_REACT_ACT_ENVIRONMENT : undefined; // $FlowExpectedError - Flow doesn't know about jest
25297
25298      var jestIsDefined = typeof jest !== 'undefined';
25299      return  jestIsDefined && isReactActEnvironmentGlobal !== false;
25300    }
25301  }
25302  function isConcurrentActEnvironment() {
25303    {
25304      var isReactActEnvironmentGlobal = // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global
25305      typeof IS_REACT_ACT_ENVIRONMENT !== 'undefined' ? IS_REACT_ACT_ENVIRONMENT : undefined;
25306
25307      if (!isReactActEnvironmentGlobal && ReactCurrentActQueue.current !== null) {
25308        // TODO: Include link to relevant documentation page.
25309        error('The current testing environment is not configured to support ' + 'act(...)');
25310      }
25311
25312      return isReactActEnvironmentGlobal;
25313    }
25314  }
25315
25316  var ceil = Math.ceil;
25317  var ReactCurrentDispatcher$2 = ReactSharedInternals.ReactCurrentDispatcher,
25318      ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner,
25319      ReactCurrentBatchConfig$3 = ReactSharedInternals.ReactCurrentBatchConfig,
25320      ReactCurrentActQueue$1 = ReactSharedInternals.ReactCurrentActQueue;
25321  var NoContext =
25322  /*             */
25323  0;
25324  var BatchedContext =
25325  /*               */
25326  1;
25327  var RenderContext =
25328  /*                */
25329  2;
25330  var CommitContext =
25331  /*                */
25332  4;
25333  var RootInProgress = 0;
25334  var RootFatalErrored = 1;
25335  var RootErrored = 2;
25336  var RootSuspended = 3;
25337  var RootSuspendedWithDelay = 4;
25338  var RootCompleted = 5;
25339  var RootDidNotComplete = 6; // Describes where we are in the React execution stack
25340
25341  var executionContext = NoContext; // The root we're working on
25342
25343  var workInProgressRoot = null; // The fiber we're working on
25344
25345  var workInProgress = null; // The lanes we're rendering
25346
25347  var workInProgressRootRenderLanes = NoLanes; // Stack that allows components to change the render lanes for its subtree
25348  // This is a superset of the lanes we started working on at the root. The only
25349  // case where it's different from `workInProgressRootRenderLanes` is when we
25350  // enter a subtree that is hidden and needs to be unhidden: Suspense and
25351  // Offscreen component.
25352  //
25353  // Most things in the work loop should deal with workInProgressRootRenderLanes.
25354  // Most things in begin/complete phases should deal with subtreeRenderLanes.
25355
25356  var subtreeRenderLanes = NoLanes;
25357  var subtreeRenderLanesCursor = createCursor(NoLanes); // Whether to root completed, errored, suspended, etc.
25358
25359  var workInProgressRootExitStatus = RootInProgress; // A fatal error, if one is thrown
25360
25361  var workInProgressRootFatalError = null; // "Included" lanes refer to lanes that were worked on during this render. It's
25362  // slightly different than `renderLanes` because `renderLanes` can change as you
25363  // enter and exit an Offscreen tree. This value is the combination of all render
25364  // lanes for the entire render phase.
25365
25366  var workInProgressRootIncludedLanes = NoLanes; // The work left over by components that were visited during this render. Only
25367  // includes unprocessed updates, not work in bailed out children.
25368
25369  var workInProgressRootSkippedLanes = NoLanes; // Lanes that were updated (in an interleaved event) during this render.
25370
25371  var workInProgressRootInterleavedUpdatedLanes = NoLanes; // Lanes that were updated during the render phase (*not* an interleaved event).
25372
25373  var workInProgressRootPingedLanes = NoLanes; // Errors that are thrown during the render phase.
25374
25375  var workInProgressRootConcurrentErrors = null; // These are errors that we recovered from without surfacing them to the UI.
25376  // We will log them once the tree commits.
25377
25378  var workInProgressRootRecoverableErrors = null; // The most recent time we committed a fallback. This lets us ensure a train
25379  // model where we don't commit new loading states in too quick succession.
25380
25381  var globalMostRecentFallbackTime = 0;
25382  var FALLBACK_THROTTLE_MS = 500; // The absolute time for when we should start giving up on rendering
25383  // more and prefer CPU suspense heuristics instead.
25384
25385  var workInProgressRootRenderTargetTime = Infinity; // How long a render is supposed to take before we start following CPU
25386  // suspense heuristics and opt out of rendering more content.
25387
25388  var RENDER_TIMEOUT_MS = 500;
25389  var workInProgressTransitions = null;
25390
25391  function resetRenderTimer() {
25392    workInProgressRootRenderTargetTime = now() + RENDER_TIMEOUT_MS;
25393  }
25394
25395  function getRenderTargetTime() {
25396    return workInProgressRootRenderTargetTime;
25397  }
25398  var hasUncaughtError = false;
25399  var firstUncaughtError = null;
25400  var legacyErrorBoundariesThatAlreadyFailed = null; // Only used when enableProfilerNestedUpdateScheduledHook is true;
25401  var rootDoesHavePassiveEffects = false;
25402  var rootWithPendingPassiveEffects = null;
25403  var pendingPassiveEffectsLanes = NoLanes;
25404  var pendingPassiveProfilerEffects = [];
25405  var pendingPassiveTransitions = null; // Use these to prevent an infinite loop of nested updates
25406
25407  var NESTED_UPDATE_LIMIT = 50;
25408  var nestedUpdateCount = 0;
25409  var rootWithNestedUpdates = null;
25410  var isFlushingPassiveEffects = false;
25411  var didScheduleUpdateDuringPassiveEffects = false;
25412  var NESTED_PASSIVE_UPDATE_LIMIT = 50;
25413  var nestedPassiveUpdateCount = 0;
25414  var rootWithPassiveNestedUpdates = null; // If two updates are scheduled within the same event, we should treat their
25415  // event times as simultaneous, even if the actual clock time has advanced
25416  // between the first and second call.
25417
25418  var currentEventTime = NoTimestamp;
25419  var currentEventTransitionLane = NoLanes;
25420  var isRunningInsertionEffect = false;
25421  function getWorkInProgressRoot() {
25422    return workInProgressRoot;
25423  }
25424  function requestEventTime() {
25425    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
25426      // We're inside React, so it's fine to read the actual time.
25427      return now();
25428    } // We're not inside React, so we may be in the middle of a browser event.
25429
25430
25431    if (currentEventTime !== NoTimestamp) {
25432      // Use the same start time for all updates until we enter React again.
25433      return currentEventTime;
25434    } // This is the first update since React yielded. Compute a new start time.
25435
25436
25437    currentEventTime = now();
25438    return currentEventTime;
25439  }
25440  function requestUpdateLane(fiber) {
25441    // Special cases
25442    var mode = fiber.mode;
25443
25444    if ((mode & ConcurrentMode) === NoMode) {
25445      return SyncLane;
25446    } else if ( (executionContext & RenderContext) !== NoContext && workInProgressRootRenderLanes !== NoLanes) {
25447      // This is a render phase update. These are not officially supported. The
25448      // old behavior is to give this the same "thread" (lanes) as
25449      // whatever is currently rendering. So if you call `setState` on a component
25450      // that happens later in the same render, it will flush. Ideally, we want to
25451      // remove the special case and treat them as if they came from an
25452      // interleaved event. Regardless, this pattern is not officially supported.
25453      // This behavior is only a fallback. The flag only exists until we can roll
25454      // out the setState warning, since existing code might accidentally rely on
25455      // the current behavior.
25456      return pickArbitraryLane(workInProgressRootRenderLanes);
25457    }
25458
25459    var isTransition = requestCurrentTransition() !== NoTransition;
25460
25461    if (isTransition) {
25462      if ( ReactCurrentBatchConfig$3.transition !== null) {
25463        var transition = ReactCurrentBatchConfig$3.transition;
25464
25465        if (!transition._updatedFibers) {
25466          transition._updatedFibers = new Set();
25467        }
25468
25469        transition._updatedFibers.add(fiber);
25470      } // The algorithm for assigning an update to a lane should be stable for all
25471      // updates at the same priority within the same event. To do this, the
25472      // inputs to the algorithm must be the same.
25473      //
25474      // The trick we use is to cache the first of each of these inputs within an
25475      // event. Then reset the cached values once we can be sure the event is
25476      // over. Our heuristic for that is whenever we enter a concurrent work loop.
25477
25478
25479      if (currentEventTransitionLane === NoLane) {
25480        // All transitions within the same event are assigned the same lane.
25481        currentEventTransitionLane = claimNextTransitionLane();
25482      }
25483
25484      return currentEventTransitionLane;
25485    } // Updates originating inside certain React methods, like flushSync, have
25486    // their priority set by tracking it with a context variable.
25487    //
25488    // The opaque type returned by the host config is internally a lane, so we can
25489    // use that directly.
25490    // TODO: Move this type conversion to the event priority module.
25491
25492
25493    var updateLane = getCurrentUpdatePriority();
25494
25495    if (updateLane !== NoLane) {
25496      return updateLane;
25497    } // This update originated outside React. Ask the host environment for an
25498    // appropriate priority, based on the type of event.
25499    //
25500    // The opaque type returned by the host config is internally a lane, so we can
25501    // use that directly.
25502    // TODO: Move this type conversion to the event priority module.
25503
25504
25505    var eventLane = getCurrentEventPriority();
25506    return eventLane;
25507  }
25508
25509  function requestRetryLane(fiber) {
25510    // This is a fork of `requestUpdateLane` designed specifically for Suspense
25511    // "retries" — a special update that attempts to flip a Suspense boundary
25512    // from its placeholder state to its primary/resolved state.
25513    // Special cases
25514    var mode = fiber.mode;
25515
25516    if ((mode & ConcurrentMode) === NoMode) {
25517      return SyncLane;
25518    }
25519
25520    return claimNextRetryLane();
25521  }
25522
25523  function scheduleUpdateOnFiber(root, fiber, lane, eventTime) {
25524    checkForNestedUpdates();
25525
25526    {
25527      if (isRunningInsertionEffect) {
25528        error('useInsertionEffect must not schedule updates.');
25529      }
25530    }
25531
25532    {
25533      if (isFlushingPassiveEffects) {
25534        didScheduleUpdateDuringPassiveEffects = true;
25535      }
25536    } // Mark that the root has a pending update.
25537
25538
25539    markRootUpdated(root, lane, eventTime);
25540
25541    if ((executionContext & RenderContext) !== NoLanes && root === workInProgressRoot) {
25542      // This update was dispatched during the render phase. This is a mistake
25543      // if the update originates from user space (with the exception of local
25544      // hook updates, which are handled differently and don't reach this
25545      // function), but there are some internal React features that use this as
25546      // an implementation detail, like selective hydration.
25547      warnAboutRenderPhaseUpdatesInDEV(fiber); // Track lanes that were updated during the render phase
25548    } else {
25549      // This is a normal update, scheduled from outside the render phase. For
25550      // example, during an input event.
25551      {
25552        if (isDevToolsPresent) {
25553          addFiberToLanesMap(root, fiber, lane);
25554        }
25555      }
25556
25557      warnIfUpdatesNotWrappedWithActDEV(fiber);
25558
25559      if (root === workInProgressRoot) {
25560        // Received an update to a tree that's in the middle of rendering. Mark
25561        // that there was an interleaved update work on this root. Unless the
25562        // `deferRenderPhaseUpdateToNextBatch` flag is off and this is a render
25563        // phase update. In that case, we don't treat render phase updates as if
25564        // they were interleaved, for backwards compat reasons.
25565        if ( (executionContext & RenderContext) === NoContext) {
25566          workInProgressRootInterleavedUpdatedLanes = mergeLanes(workInProgressRootInterleavedUpdatedLanes, lane);
25567        }
25568
25569        if (workInProgressRootExitStatus === RootSuspendedWithDelay) {
25570          // The root already suspended with a delay, which means this render
25571          // definitely won't finish. Since we have a new update, let's mark it as
25572          // suspended now, right before marking the incoming update. This has the
25573          // effect of interrupting the current render and switching to the update.
25574          // TODO: Make sure this doesn't override pings that happen while we've
25575          // already started rendering.
25576          markRootSuspended$1(root, workInProgressRootRenderLanes);
25577        }
25578      }
25579
25580      ensureRootIsScheduled(root, eventTime);
25581
25582      if (lane === SyncLane && executionContext === NoContext && (fiber.mode & ConcurrentMode) === NoMode && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode.
25583      !( ReactCurrentActQueue$1.isBatchingLegacy)) {
25584        // Flush the synchronous work now, unless we're already working or inside
25585        // a batch. This is intentionally inside scheduleUpdateOnFiber instead of
25586        // scheduleCallbackForFiber to preserve the ability to schedule a callback
25587        // without immediately flushing it. We only do this for user-initiated
25588        // updates, to preserve historical behavior of legacy mode.
25589        resetRenderTimer();
25590        flushSyncCallbacksOnlyInLegacyMode();
25591      }
25592    }
25593  }
25594  function scheduleInitialHydrationOnRoot(root, lane, eventTime) {
25595    // This is a special fork of scheduleUpdateOnFiber that is only used to
25596    // schedule the initial hydration of a root that has just been created. Most
25597    // of the stuff in scheduleUpdateOnFiber can be skipped.
25598    //
25599    // The main reason for this separate path, though, is to distinguish the
25600    // initial children from subsequent updates. In fully client-rendered roots
25601    // (createRoot instead of hydrateRoot), all top-level renders are modeled as
25602    // updates, but hydration roots are special because the initial render must
25603    // match what was rendered on the server.
25604    var current = root.current;
25605    current.lanes = lane;
25606    markRootUpdated(root, lane, eventTime);
25607    ensureRootIsScheduled(root, eventTime);
25608  }
25609  function isUnsafeClassRenderPhaseUpdate(fiber) {
25610    // Check if this is a render phase update. Only called by class components,
25611    // which special (deprecated) behavior for UNSAFE_componentWillReceive props.
25612    return (// TODO: Remove outdated deferRenderPhaseUpdateToNextBatch experiment. We
25613      // decided not to enable it.
25614       (executionContext & RenderContext) !== NoContext
25615    );
25616  } // Use this function to schedule a task for a root. There's only one task per
25617  // root; if a task was already scheduled, we'll check to make sure the priority
25618  // of the existing task is the same as the priority of the next level that the
25619  // root has work on. This function is called on every update, and right before
25620  // exiting a task.
25621
25622  function ensureRootIsScheduled(root, currentTime) {
25623    var existingCallbackNode = root.callbackNode; // Check if any lanes are being starved by other work. If so, mark them as
25624    // expired so we know to work on those next.
25625
25626    markStarvedLanesAsExpired(root, currentTime); // Determine the next lanes to work on, and their priority.
25627
25628    var nextLanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes);
25629
25630    if (nextLanes === NoLanes) {
25631      // Special case: There's nothing to work on.
25632      if (existingCallbackNode !== null) {
25633        cancelCallback$1(existingCallbackNode);
25634      }
25635
25636      root.callbackNode = null;
25637      root.callbackPriority = NoLane;
25638      return;
25639    } // We use the highest priority lane to represent the priority of the callback.
25640
25641
25642    var newCallbackPriority = getHighestPriorityLane(nextLanes); // Check if there's an existing task. We may be able to reuse it.
25643
25644    var existingCallbackPriority = root.callbackPriority;
25645
25646    if (existingCallbackPriority === newCallbackPriority && // Special case related to `act`. If the currently sc
25646heduled task is a
25647    // Scheduler task, rather than an `act` task, cancel it and re-scheduled
25648    // on the `act` queue.
25649    !( ReactCurrentActQueue$1.current !== null && existingCallbackNode !== fakeActCallbackNode)) {
25650      {
25651        // If we're going to re-use an existing task, it needs to exist.
25652        // Assume that discrete update microtasks are non-cancellable and null.
25653        // TODO: Temporary until we confirm this warning is not fired.
25654        if (existingCallbackNode == null && existingCallbackPriority !== SyncLane) {
25655          error('Expected scheduled callback to exist. This error is likely caused by a bug in React. Please file an issue.');
25656        }
25657      } // The priority hasn't changed. We can reuse the existing task. Exit.
25658
25659
25660      return;
25661    }
25662
25663    if (existingCallbackNode != null) {
25664      // Cancel the existing callback. We'll schedule a new one below.
25665      cancelCallback$1(existingCallbackNode);
25666    } // Schedule a new callback.
25667
25668
25669    var newCallbackNode;
25670
25671    if (newCallbackPriority === SyncLane) {
25672      // Special case: Sync React callbacks are scheduled on a special
25673      // internal queue
25674      if (root.tag === LegacyRoot) {
25675        if ( ReactCurrentActQueue$1.isBatchingLegacy !== null) {
25676          ReactCurrentActQueue$1.didScheduleLegacyUpdate = true;
25677        }
25678
25679        scheduleLegacySyncCallback(performSyncWorkOnRoot.bind(null, root));
25680      } else {
25681        scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));
25682      }
25683
25684      {
25685        // Flush the queue in a microtask.
25686        if ( ReactCurrentActQueue$1.current !== null) {
25687          // Inside `act`, use our internal `act` queue so that these get flushed
25688          // at the end of the current scope even when using the sync ver
25688sion
25689          // of `act`.
25690          ReactCurrentActQueue$1.current.push(flushSyncCallbacks);
25691        } else {
25692          scheduleMicrotask(function () {
25693            // In Safari, appending an iframe forces microtasks to run.
25694            // https://github.com/facebook/react/issues/22459
25695            // We don't support running callbacks in the middle of render
25696            // or commit so we need to check against that.
25697            if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
25698              // Note that this would still prematurely flush the callbacks
25699              // if this happens outside render or commit phase (e.g. in an event).
25700              flushSyncCallbacks();
25701            }
25702          });
25703        }
25704      }
25705
25706      newCallbackNode = null;
25707    } else {
25708      var schedulerPriorityLevel;
25709
25710      switch (lanesToEventPriority(nextLanes)) {
25711        case DiscreteEventPriority:
25712          schedulerPriorityLevel = ImmediatePriority;
25713          break;
25714
25715        case ContinuousEventPriority:
25716          schedulerPriorityLevel = UserBlockingPriority;
25717          break;
25718
25719        case DefaultEventPriority:
25720          schedulerPriorityLevel = NormalPriority;
25721          break;
25722
25723        case IdleEventPriority:
25724          schedulerPriorityLevel = IdlePriority;
25725          break;
25726
25727        default:
25728          schedulerPriorityLevel = NormalPriority;
25729          break;
25730      }
25731
25732      newCallbackNode = scheduleCallback$1(schedulerPriorityLevel, performConcurrentWorkOnRoot.bind(null, root));
25733    }
25734
25735    root.callbackPriority = newCallbackPriority;
25736    root.callbackNode = newCallbackNode;
25737  } // This is the entry point for every concurrent task, i.e. anything that
25738  // goes through Scheduler.
25739
25740
25741  function performConcurrentWorkOnRoot(root, didTimeout) {
25742    {
25743      resetNestedUpdateFlag();
25744    } // Since we know we're in a React event, we can clear the current
25745    // event time. The next update will compute a new event time.
25746
25747
25748    currentEventTime = NoTimestamp;
25749    currentEventTransitionLane = NoLanes;
25750
25751    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
25752      throw new Error('Should not already be working.');
25753    } // Flush any pending passive effects before deciding which lanes to work on,
25754    // in case they schedule additional work.
25755
25756
25757    var originalCallbackNode = root.callbackNode;
25758    var didFlushPassiveEffects = flushPassiveEffects();
25759
25760    if (didFlushPassiveEffects) {
25761      // Something in the passive effect phase may have canceled the current task.
25762      // Check if the task node for this root was changed.
25763      if (root.callbackNode !== originalCallbackNode) {
25764        // The current task was canceled. Exit. We don't need to call
25765        // `ensureRootIsScheduled` because the check above implies either that
25766        // there's a new task, or that there's no remaining work on this root.
25767        return null;
25768      }
25769    } // Determine the next lanes to work on, using the fields stored
25770    // on the root.
25771
25772
25773    var lanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes);
25774
25775    if (lanes === NoLanes) {
25776      // Defensive coding. This is never expected to happen.
25777      return null;
25778    } // We disable time-slicing in some cases: if the work has been CPU-bound
25779    // for too long ("expired" work, to prevent starvation), or we're in
25780    // sync-updates-by-default mode.
25781    // TODO: We only check `didTimeout` defensively, to account for a Scheduler
25782    // bug we're still investigating. Once the bug in Scheduler is fixed,
25783    // we can remove this, since we track expiration ourselves.
25784
25785
25786    var shouldTimeSlice = !includesBlockingLane(root, lanes) && !includesExpiredLane(root, lanes) && ( !didTimeout);
25787    var exitStatus = shouldTimeSlice ? renderRootConcurrent(root, lanes) : renderRootSync(root, lanes);
25788
25789    if (exitStatus !== RootInProgress) {
25790      if (exitStatus === RootErrored) {
25791        // If something threw an error, try rendering one more time. We'll
25792        // render synchronously to block concurrent data mutations, and we'll
25793        // includes all pending updates are included. If it still fails after
25794        // the second attempt, we'll give up and commit the resulting tree.
25795        var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root);
25796
25797        if (errorRetryLanes !== NoLanes) {
25798          lanes = errorRetryLanes;
25799          exitStatus = recoverFromConcurrentError(root, errorRetryLanes);
25800        }
25801      }
25802
25803      if (exitStatus === RootFatalErrored) {
25804        var fatalError = workInProgressRootFatalError;
25805        prepareFreshStack(root, NoLanes);
25806        markRootSuspended$1(root, lanes);
25807        ensureRootIsScheduled(root, now());
25808        throw fatalError;
25809      }
25810
25811      if (exitStatus === RootDidNotComplete) {
25812        // The render unwound without completing the tree. This happens in special
25813        // cases where need to exit the current render without producing a
25814        // consistent tree or committing.
25815        //
25816        // This should only happen during a concurrent render, not a discrete or
25817        // synchronous update. We should have already checked for this when we
25818        // unwound the stack.
25819        markRootSuspended$1(root, lanes);
25820      } else {
25821        // The render completed.
25822        // Check if this render may have yielded to a concurrent event, and if so,
25823        // confirm that any newly rendered stores are consistent.
25824        // TODO: It's possible that even a concurrent render may never have yielded
25825        // to the main thread, if it was fast enough, or if it expired. We could
25826        // skip the consistency check in that case, too.
25827        var renderWasConcurrent = !includesBlockingLane(root, lanes);
25828        var finishedWork = root.current.alternate;
25829
25830        if (renderWasConcurrent && !isRenderConsistentWithExternalStores(finishedWork)) {
25831          // A store was mutated in an interleaved event. Render again,
25832          // synchronously, to block further mutations.
25833          exitStatus = renderRootSync(root, lanes); // We need to check again if something threw
25834
25835          if (exitStatus === RootErrored) {
25836            var _errorRetryLanes = getLanesToRetrySynchronouslyOnError(root);
25837
25838            if (_errorRetryLanes !== NoLanes) {
25839              lanes = _errorRetryLanes;
25840              exitStatus = recoverFromConcurrentError(root, _errorRetryLanes); // We assume the tree is now consistent because we didn't yield to any
25841              // concurrent events.
25842            }
25843          }
25844
25845          if (exitStatus === RootFatalErrored) {
25846            var _fatalError = workInProgressRootFatalError;
25847            prepareFreshStack(root, NoLanes);
25848            markRootSuspended$1(root, lanes);
25849            ensureRootIsScheduled(root, now());
25850            throw _fatalError;
25851          }
25852        } // We now have a consistent tree. The next step is either to commit it,
25853        // or, if something suspended, wait to commit it after a timeout.
25854
25855
25856        root.finishedWork = finishedWork;
25857        root.finishedLanes = lanes;
25858        finishConcurrentRender(root, exitStatus, lanes);
25859      }
25860    }
25861
25862    ensureRootIsScheduled(root, now());
25863
25864    if (root.callbackNode === originalCallbackNode) {
25865      // The task node scheduled for this root is the same one that's
25866      // currently executed. Need to return a continuation.
25867      return performConcurrentWorkOnRoot.bind(null, root);
25868    }
25869
25870    return null;
25871  }
25872
25873  function recoverFromConcurrentError(root, errorRetryLanes) {
25874    // If an error occurred during hydration, discard server response and fall
25875    // back to client side render.
25876    // Before rendering again, save the errors from the previous attempt.
25877    var errorsFromFirstAttempt = workInProgressRootConcurrentErrors;
25878
25879    if (isRootDehydrated(root)) {
25880      // The shell failed to hydrate. Set a flag to force a client rendering
25881      // during the next attempt. To do this, we call prepareFreshStack now
25882      // to create the root work-in-progress fiber. This is a bit weird in terms
25883      // of factoring, because it relies on renderRootSync not calling
25884      // prepareFreshStack again in the call below, which happens because the
25885      // root and lanes haven't changed.
25886      //
25887      // TODO: I think what we should do is set ForceClientRender inside
25888      // throwException, like we do for nested Suspense boundaries. The reason
25889      // it's here instead is so we can switch to the synchronous work loop, too.
25890      // Something to consider for a future refactor.
25891      var rootWorkInProgress = prepareFreshStack(root, errorRetryLanes);
25892      rootWorkInProgress.flags |= ForceClientRender;
25893
25894      {
25895        errorHydratingContainer(root.containerInfo);
25896      }
25897    }
25898
25899    var exitStatus = renderRootSync(root, errorRetryLanes);
25900
25901    if (exitStatus !== RootErrored) {
25902      // Successfully finished rendering on retry
25903      // The errors from the failed first attempt have been recovered. Add
25904      // them to the collection of recoverable errors. We'll log them in the
25905      // commit phase.
25906      var errorsFromSecondAttempt = workInProgressRootRecoverableErrors;
25907      workInProgressRootRecoverableErrors = errorsFromFirstAttempt; // The errors from the second attempt should be queued after the errors
25908      // from the first attempt, to preserve the causal sequence.
25909
25910      if (errorsFromSecondAttempt !== null) {
25911        queueRecoverableErrors(errorsFromSecondAttempt);
25912      }
25913    }
25914
25915    return exitStatus;
25916  }
25917
25918  function queueRecoverableErrors(errors) {
25919    if (workInProgressRootRecoverableErrors === null) {
25920      workInProgressRootRecoverableErrors = errors;
25921    } else {
25922      workInProgressRootRecoverableErrors.push.apply(workInProgressRootRecoverableErrors, errors);
25923    }
25924  }
25925
25926  function finishConcurrentRender(root, exitStatus, lanes) {
25927    switch (exitStatus) {
25928      case RootInProgress:
25929      case RootFatalErrored:
25930        {
25931          throw new Error('Root did not complete. This is a bug in React.');
25932        }
25933      // Flow knows about invariant, so it complains if I add a break
25934      // statement, but eslint doesn't know about invariant, so it complains
25935      // if I do. eslint-disable-next-line no-fallthrough
25936
25937      case RootErrored:
25938        {
25939          // We should have already attempted to retry this tree. If we reached
25940          // this point, it errored again. Commit it.
25941          commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
25942          break;
25943        }
25944
25945      case RootSuspended:
25946        {
25947          markRootSuspended$1(root, lanes); // We have an acceptable loading state. We need to figure out if we
25948          // should immediately commit it or wait a bit.
25949
25950          if (includesOnlyRetries(lanes) && // do not delay if we're inside an act() scope
25951          !shouldForceFlushFallbacksInDEV()) {
25952            // This render only included retries, no updates. Throttle committing
25953            // retries so that we don't show too many loading states too quickly.
25954            var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time.
25955
25956            if (msUntilTimeout > 10) {
25957              var nextLanes = getNextLanes(root, NoLanes);
25958
25959              if (nextLanes !== NoLanes) {
25960                // There's additional work on this root.
25961                break;
25962              }
25963
25964              var suspendedLanes = root.suspendedLanes;
25965
25966              if (!isSubsetOfLanes(suspendedLanes, lanes)) {
25967                // We should prefer to render the fallback of at the last
25968                // suspended level. Ping the last suspended level to try
25969                // rendering it again.
25970                // FIXME: What if the suspended lanes are Idle? Should not restart.
25971                var eventTime = requestEventTime();
25972                markRootPinged(root, suspendedLanes);
25973                break;
25974              } // The render is suspended, it hasn't timed out, and there's no
25975              // lower priority work to do. Instead of committing the fallback
25976              // immediately, wait for more data to arrive.
25977
25978
25979              root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root, workInProgressRootRecoverableErrors, workInProgressTransitions), msUntilTimeout);
25980              break;
25981            }
25982          } // The work expired. Commit immediately.
25983
25984
25985          commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
25986          break;
25987        }
25988
25989      case RootSuspendedWithDelay:
25990        {
25991          markRootSuspended$1(root, lanes);
25992
25993          if (includesOnlyTransitions(lanes)) {
25994            // This is a transition, so we should exit without committing a
25995            // placeholder and without scheduling a timeout. Delay indefinitely
25996            // until we receive more data.
25997            break;
25998          }
25999
26000          if (!shouldForceFlushFallbacksInDEV()) {
26001            // This is not a transition, but we did trigger an avoided state.
26002            // Schedule a placeholder to display after a short delay, using the Just
26003            // Noticeable Difference.
26004            // TODO: Is the JND optimization worth the added complexity? If this is
26005            // the only reason we track the event time, then probably not.
26006            // Consider removing.
26007            var mostRecentEventTime = getMostRecentEventTime(root, lanes);
26008            var eventTimeMs = mostRecentEventTime;
26009            var timeElapsedMs = now() - eventTimeMs;
26010
26011            var _msUntilTimeout = jnd(timeElapsedMs) - timeElapsedMs; // Don't bother with a very short suspense time.
26012
26013
26014            if (_msUntilTimeout > 10) {
26015              // Instead of committing the fallback immediately, wait for more data
26016              // to arrive.
26017              root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root, workInProgressRootRecoverableErrors, workInProgressTransitions), _msUntilTimeout);
26018              break;
26019            }
26020          } // Commit the placeholder.
26021
26022
26023          commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
26024          break;
26025        }
26026
26027      case RootCompleted:
26028        {
26029          // The work completed. Ready to commit.
26030          commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
26031          break;
26032        }
26033
26034      default:
26035        {
26036          throw new Error('Unknown root exit status.');
26037        }
26038    }
26039  }
26040
26041  function isRenderConsistentWithExternalStores(finishedWork) {
26042    // Search the rendered tree for external store reads, and check whether the
26043    // stores were mutated in a concurrent event. Intentionally using an iterative
26044    // loop instead of recursion so we can exit early.
26045    var node = finishedWork;
26046
26047    while (true) {
26048      if (node.flags & StoreConsistency) {
26049        var updateQueue = node.updateQueue;
26050
26051        if (updateQueue !== null) {
26052          var checks = updateQueue.stores;
26053
26054          if (checks !== null) {
26055            for (var i = 0; i < checks.length; i++) {
26056              var check = checks[i];
26057              var getSnapshot = check.getSnapshot;
26058              var renderedValue = check.value;
26059
26060              try {
26061                if (!objectIs(getSnapshot(), renderedValue)) {
26062                  // Found an inconsistent store.
26063                  return false;
26064                }
26065              } catch (error) {
26066                // If `getSnapshot` throws, return `false`. This will schedule
26067                // a re-render, and the error will be rethrown during render.
26068                return false;
26069              }
26070            }
26071          }
26072        }
26073      }
26074
26075      var child = node.child;
26076
26077      if (node.subtreeFlags & StoreConsistency && child !== null) {
26078        child.return = node;
26079        node = child;
26080        continue;
26081      }
26082
26083      if (node === finishedWork) {
26084        return true;
26085      }
26086
26087      while (node.sibling === null) {
26088        if (node.return === null || node.return === finishedWork) {
26089          return true;
26090        }
26091
26092        node = node.return;
26093      }
26094
26095      node.sibling.return = node.return;
26096      node = node.sibling;
26097    } // Flow doesn't know this is unreachable, but eslint does
26098    // eslint-disable-next-line no-unreachable
26099
26100
26101    return true;
26102  }
26103
26104  function markRootSuspended$1(root, suspendedLanes) {
26105    // When suspending, we should always exclude lanes that were pinged or (more
26106    // rarely, since we try to avoid it) updated during the render phase.
26107    // TODO: Lol maybe there's a better way to factor this besides this
26108    // obnoxiously named function :)
26109    suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes);
26110    suspendedLanes = removeLanes(suspendedLanes, workInProgressRootInterleavedUpdatedLanes);
26111    markRootSuspended(root, suspendedLanes);
26112  } // This is the entry point for synchronous tasks that don't go
26113  // through Scheduler
26114
26115
26116  function performSyncWorkOnRoot(root) {
26117    {
26118      syncNestedUpdateFlag();
26119    }
26120
26121    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
26122      throw new Error('Should not already be working.');
26123    }
26124
26125    flushPassiveEffects();
26126    var lanes = getNextLanes(root, NoLanes);
26127
26128    if (!includesSomeLane(lanes, SyncLane)) {
26129      // There's no remaining sync work left.
26130      ensureRootIsScheduled(root, now());
26131      return null;
26132    }
26133
26134    var exitStatus = renderRootSync(root, lanes);
26135
26136    if (root.tag !== LegacyRoot && exitStatus === RootErrored) {
26137      // If something threw an error, try rendering one more time. We'll render
26138      // synchronously to block concurrent data mutations, and we'll includes
26139      // all pending updates are included. If it still fails after the second
26140      // attempt, we'll give up and commit the resulting tree.
26141      var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root);
26142
26143      if (errorRetryLanes !== NoLanes) {
26144        lanes = errorRetryLanes;
26145        exitStatus = recoverFromConcurrentError(root, errorRetryLanes);
26146      }
26147    }
26148
26149    if (exitStatus === RootFatalErrored) {
26150      var fatalError = workInProgressRootFatalError;
26151      prepareFreshStack(root, NoLanes);
26152      markRootSuspended$1(root, lanes);
26153      ensureRootIsScheduled(root, now());
26154      throw fatalError;
26155    }
26156
26157    if (exitStatus === RootDidNotComplete) {
26158      throw new Error('Root did not complete. This is a bug in React.');
26159    } // We now have a consistent tree. Because this is a sync render, we
26160    // will commit it even if something suspended.
26161
26162
26163    var finishedWork = root.current.alternate;
26164    root.finishedWork = finishedWork;
26165    root.finishedLanes = lanes;
26166    commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions); // Before exiting, make sure there's a callback scheduled for the next
26167    // pending level.
26168
26169    ensureRootIsScheduled(root, now());
26170    return null;
26171  }
26172
26173  function flushRoot(root, lanes) {
26174    if (lanes !== NoLanes) {
26175      markRootEntangled(root, mergeLanes(lanes, SyncLane));
26176      ensureRootIsScheduled(root, now());
26177
26178      if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
26179        resetRenderTimer();
26180        flushSyncCallbacks();
26181      }
26182    }
26183  }
26184  function batchedUpdates$1(fn, a) {
26185    var prevExecutionContext = executionContext;
26186    executionContext |= BatchedContext;
26187
26188    try {
26189      return fn(a);
26190    } finally {
26191      executionContext = prevExecutionContext; // If there were legacy sync updates, flush them at the end of the outer
26192      // most batchedUpdates-like method.
26193
26194      if (executionContext === NoContext && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode.
26195      !( ReactCurrentActQueue$1.isBatchingLegacy)) {
26196        resetRenderTimer();
26197        flushSyncCallbacksOnlyInLegacyMode();
26198      }
26199    }
26200  }
26201  function discreteUpdates(fn, a, b, c, d) {
26202    var previousPriority = getCurrentUpdatePriority();
26203    var prevTransition = ReactCurrentBatchConfig$3.transition;
26204
26205    try {
26206      ReactCurrentBatchConfig$3.transition = null;
26207      setCurrentUpdatePriority(DiscreteEventPriority);
26208      return fn(a, b, c, d);
26209    } finally {
26210      setCurrentUpdatePriority(previousPriority);
26211      ReactCurrentBatchConfig$3.transition = prevTransition;
26212
26213      if (executionContext === NoContext) {
26214        resetRenderTimer();
26215      }
26216    }
26217  } // Overload the definition to the two valid signatures.
26218  // Warning, this opts-out of checking the function body.
26219
26220  // eslint-disable-next-line no-redeclare
26221  function flushSync(fn) {
26222    // In legacy mode, we flush pending passive effects at the beginning of the
26223    // next event, not at the end of the previous one.
26224    if (rootWithPendingPassiveEffects !== null && rootWithPendingPassiveEffects.tag === LegacyRoot && (executionContext & (RenderContext | CommitContext)) === NoContext) {
26225      flushPassiveEffects();
26226    }
26227
26228    var prevExecutionContext = executionContext;
26229    executionContext |= BatchedContext;
26230    var prevTransition = ReactCurrentBatchConfig$3.transition;
26231    var previousPriority = getCurrentUpdatePriority();
26232
26233    try {
26234      ReactCurrentBatchConfig$3.transition = null;
26235      setCurrentUpdatePriority(DiscreteEventPriority);
26236
26237      if (fn) {
26238        return fn();
26239      } else {
26240        return undefined;
26241      }
26242    } finally {
26243      setCurrentUpdatePriority(previousPriority);
26244      ReactCurrentBatchConfig$3.transition = prevTransition;
26245      executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch.
26246      // Note that this will happen even if batchedUpdates is higher up
26247      // the stack.
26248
26249      if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
26250        flushSyncCallbacks();
26251      }
26252    }
26253  }
26254  function isAlreadyRendering() {
26255    // Used by the renderer to print a warning if certain APIs are called from
26256    // the wrong context.
26257    return  (executionContext & (RenderContext | CommitContext)) !== NoContext;
26258  }
26259  function pushRenderLanes(fiber, lanes) {
26260    push(subtreeRenderLanesCursor, subtreeRenderLanes, fiber);
26261    subtreeRenderLanes = mergeLanes(subtreeRenderLanes, lanes);
26262    workInProgressRootIncludedLanes = mergeLanes(workInProgressRootIncludedLanes, lanes);
26263  }
26264  function popRenderLanes(fiber) {
26265    subtreeRenderLanes = subtreeRenderLanesCursor.current;
26266    pop(subtreeRenderLanesCursor, fiber);
26267  }
26268
26269  function prepareFreshStack(root, lanes) {
26270    root.finishedWork = null;
26271    root.finishedLanes = NoLanes;
26272    var timeoutHandle = root.timeoutHandle;
26273
26274    if (timeoutHandle !== noTimeout) {
26275      // The root previous suspended and scheduled a timeout to commit a fallback
26276      // state. Now that we have additional work, cancel the timeout.
26277      root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
26278
26279      cancelTimeout(timeoutHandle);
26280    }
26281
26282    if (workInProgress !== null) {
26283      var interruptedWork = workInProgress.return;
26284
26285      while (interruptedWork !== null) {
26286        var current = interruptedWork.alternate;
26287        unwindInterruptedWork(current, interruptedWork);
26288        interruptedWork = interruptedWork.return;
26289      }
26290    }
26291
26292    workInProgressRoot = root;
26293    var rootWorkInProgress = createWorkInProgress(root.current, null);
26294    workInProgress = rootWorkInProgress;
26295    workInProgressRootRenderLanes = subtreeRenderLanes = workInProgressRootIncludedLanes = lanes;
26296    workInProgressRootExitStatus = RootInProgress;
26297    workInProgressRootFatalError = null;
26298    workInProgressRootSkippedLanes = NoLanes;
26299    workInProgressRootInterleavedUpdatedLanes = NoLanes;
26300    workInProgressRootPingedLanes = NoLanes;
26301    workInProgressRootConcurrentErrors = null;
26302    workInProgressRootRecoverableErrors = null;
26303    finishQueueingConcurrentUpdates();
26304
26305    {
26306      ReactStrictModeWarnings.discardPendingWarnings();
26307    }
26308
26309    return rootWorkInProgress;
26310  }
26311
26312  function handleError(root, thrownValue) {
26313    do {
26314      var erroredWork = workInProgress;
26315
26316      try {
26317        // Reset module-level state that was set during the render phase.
26318        resetContextDependencies();
26319        resetHooksAfterThrow();
26320        resetCurrentFiber(); // TODO: I found and added this missing line while investigating a
26321        // separate issue. Write a regression test using string refs.
26322
26323        ReactCurrentOwner$2.current = null;
26324
26325        if (erroredWork === null || erroredWork.return === null) {
26326          // Expected to be working on a non-root fiber. This is a fatal error
26327          // because there's no ancestor that can handle it; the root is
26328          // supposed to capture all errors that weren't caught by an error
26329          // boundary.
26330          workInProgressRootExitStatus = RootFatalErrored;
26331          workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next
26332          // sibling, or the parent if there are no siblings. But since the root
26333          // has no siblings nor a parent, we set it to null. Usually this is
26334          // handled by `completeUnitOfWork` or `unwindWork`, but since we're
26335          // intentionally not calling those, we need set it here.
26336          // TODO: Consider calling `unwindWork` to pop the contexts.
26337
26338          workInProgress = null;
26339          return;
26340        }
26341
26342        if (enableProfilerTimer && erroredWork.mode & ProfileMode) {
26343          // Record the time spent rendering before an error was thrown. This
26344          // avoids inaccurate Profiler durations in the case of a
26345          // suspended render.
26346          stopProfilerTimerIfRunningAndRecordDelta(erroredWork, true);
26347        }
26348
26349        if (enableSchedulingProfiler) {
26350          markComponentRenderStopped();
26351
26352          if (thrownValue !== null && typeof thrownValue === 'object' && typeof thrownValue.then === 'function') {
26353            var wakeable = thrownValue;
26354            markComponentSuspended(erroredWork, wakeable, workInProgressRootRenderLanes);
26355          } else {
26356            markComponentErrored(erroredWork, thrownValue, workInProgressRootRenderLanes);
26357          }
26358        }
26359
26360        throwException(root, erroredWork.return, erroredWork, thrownValue, workInProgressRootRenderLanes);
26361        completeUnitOfWork(erroredWork);
26362      } catch (yetAnotherThrownValue) {
26363        // Something in the return path also threw.
26364        thrownValue = yetAnotherThrownValue;
26365
26366        if (workInProgress === erroredWork && erroredWork !== null) {
26367          // If this boundary has already errored, then we had trouble processing
26368          // the error. Bubble it to the next boundary.
26369          erroredWork = erroredWork.return;
26370          workInProgress = erroredWork;
26371        } else {
26372          erroredWork = workInProgress;
26373        }
26374
26375        continue;
26376      } // Return to the normal work loop.
26377
26378
26379      return;
26380    } while (true);
26381  }
26382
26383  function pushDispatcher() {
26384    var prevDispatcher = ReactCurrentDispatcher$2.current;
26385    ReactCurrentDispatcher$2.current = ContextOnlyDispatcher;
26386
26387    if (prevDispatcher === null) {
26388      // The React isomorphic package does not include a default dispatcher.
26389      // Instead the first renderer will lazily attach one, in order to give
26390      // nicer error messages.
26391      return ContextOnlyDispatcher;
26392    } else {
26393      return prevDispatcher;
26394    }
26395  }
26396
26397  function popDispatcher(prevDispatcher) {
26398    ReactCurrentDispatcher$2.current = prevDispatcher;
26399  }
26400
26401  function markCommitTimeOfFallback() {
26402    globalMostRecentFallbackTime = now();
26403  }
26404  function markSkippedUpdateLanes(lane) {
26405    workInProgressRootSkippedLanes = mergeLanes(lane, workInProgressRootSkippedLanes);
26406  }
26407  function renderDidSuspend() {
26408    if (workInProgressRootExitStatus === RootInProgress) {
26409      workInProgressRootExitStatus = RootSuspended;
26410    }
26411  }
26412  function renderDidSuspendDelayIfPossible() {
26413    if (workInProgressRootExitStatus === RootInProgress || workInProgressRootExitStatus === RootSuspended || workInProgressRootExitStatus === RootErrored) {
26414      workInProgressRootExitStatus = RootSuspendedWithDelay;
26415    } // Check if there are updates that we skipped tree that might have unblocked
26416    // this render.
26417
26418
26419    if (workInProgressRoot !== null && (includesNonIdleWork(workInProgressRootSkippedLanes) || includesNonIdleWork(workInProgressRootInterleavedUpdatedLanes))) {
26420      // Mark the current render as suspended so that we switch to working on
26421      // the updates that were skipped. Usually we only suspend at the end of
26422      // the render phase.
26423      // TODO: We should probably always mark the root as suspended immediately
26424      // (inside this function), since by suspending at the end of the render
26425      // phase introduces a potential mistake where we suspend lanes that were
26426      // pinged or updated while we were rendering.
26427      markRootSuspended$1(workInProgressRoot, workInProgressRootRenderLanes);
26428    }
26429  }
26430  function renderDidError(error) {
26431    if (workInProgressRootExitStatus !== RootSuspendedWithDelay) {
26432      workInProgressRootExitStatus = RootErrored;
26433    }
26434
26435    if (workInProgressRootConcurrentErrors === null) {
26436      workInProgressRootConcurrentErrors = [error];
26437    } else {
26438      workInProgressRootConcurrentErrors.push(error);
26439    }
26440  } // Called during render to determine if anything has suspended.
26441  // Returns false if we're not sure.
26442
26443  function renderHasNotSuspendedYet() {
26444    // If something errored or completed, we can't really be sure,
26445    // so those are false.
26446    return workInProgressRootExitStatus === RootInProgress;
26447  }
26448
26449  function renderRootSync(root, lanes) {
26450    var prevExecutionContext = executionContext;
26451    executionContext |= RenderContext;
26452    var prevDispatcher = pushDispatcher(); // If the root or lanes have changed, throw out the existing stack
26453    // and prepare a fresh one. Otherwise we'll continue where we left off.
26454
26455    if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) {
26456      {
26457        if (isDevToolsPresent) {
26458          var memoizedUpdaters = root.memoizedUpdaters;
26459
26460          if (memoizedUpdaters.size > 0) {
26461            restorePendingUpdaters(root, workInProgressRootRenderLanes);
26462            memoizedUpdaters.clear();
26463          } // At this point, move Fibers that scheduled the upcoming work from the Map to the Set.
26464          // If we bailout on this work, we'll move them back (like above).
26465          // It's important to move them now in case the work spawns more work at the same priority with different updaters.
26466          // That way we can keep the current update and future updates separate.
26467
26468
26469          movePendingFibersToMemoized(root, lanes);
26470        }
26471      }
26472
26473      workInProgressTransitions = getTransitionsForLanes();
26474      prepareFreshStack(root, lanes);
26475    }
26476
26477    {
26478      markRenderStarted(lanes);
26479    }
26480
26481    do {
26482      try {
26483        workLoopSync();
26484        break;
26485      } catch (thrownValue) {
26486        handleError(root, thrownValue);
26487      }
26488    } while (true);
26489
26490    resetContextDependencies();
26491    executionContext = prevExecutionContext;
26492    popDispatcher(prevDispatcher);
26493
26494    if (workInProgress !== null) {
26495      // This is a sync render, so we should have finished the whole tree.
26496      throw new Error('Cannot commit an incomplete root. This error is likely caused by a ' + 'bug in React. Please file an issue.');
26497    }
26498
26499    {
26500      markRenderStopped();
26501    } // Set this to null to indicate there's no in-progress render.
26502
26503
26504    workInProgressRoot = null;
26505    workInProgressRootRenderLanes = NoLanes;
26506    return workInProgressRootExitStatus;
26507  } // The work loop is an extremely hot path. Tell Closure not to inline it.
26508
26509  /** @noinline */
26510
26511
26512  function workLoopSync() {
26513    // Already timed out, so perform work without checking if we need to yield.
26514    while (workInProgress !== null) {
26515      performUnitOfWork(workInProgress);
26516    }
26517  }
26518
26519  function renderRootConcurrent(root, lanes) {
26520    var prevExecutionContext = executionContext;
26521    executionContext |= RenderContext;
26522    var prevDispatcher = pushDispatcher(); // If the root or lanes have changed, throw out the existing stack
26523    // and prepare a fresh one. Otherwise we'll continue where we left off.
26524
26525    if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) {
26526      {
26527        if (isDevToolsPresent) {
26528          var memoizedUpdaters = root.memoizedUpdaters;
26529
26530          if (memoizedUpdaters.size > 0) {
26531            restorePendingUpdaters(root, workInProgressRootRenderLanes);
26532            memoizedUpdaters.clear();
26533          } // At this point, move Fibers that scheduled the upcoming work from the Map to the Set.
26534          // If we bailout on this work, we'll move them back (like above).
26535          // It's important to move them now in case the work spawns more work at the same priority with different updaters.
26536          // That way we can keep the current update and future updates separate.
26537
26538
26539          movePendingFibersToMemoized(root, lanes);
26540        }
26541      }
26542
26543      workInProgressTransitions = getTransitionsForLanes();
26544      resetRenderTimer();
26545      prepareFreshStack(root, lanes);
26546    }
26547
26548    {
26549      markRenderStarted(lanes);
26550    }
26551
26552    do {
26553      try {
26554        workLoopConcurrent();
26555        break;
26556      } catch (thrownValue) {
26557        handleError(root, thrownValue);
26558      }
26559    } while (true);
26560
26561    resetContextDependencies();
26562    popDispatcher(prevDispatcher);
26563    executionContext = prevExecutionContext;
26564
26565
26566    if (workInProgress !== null) {
26567      // Still work remaining.
26568      {
26569        markRenderYielded();
26570      }
26571
26572      return RootInProgress;
26573    } else {
26574      // Completed the tree.
26575      {
26576        markRenderStopped();
26577      } // Set this to null to indicate there's no in-progress render.
26578
26579
26580      workInProgressRoot = null;
26581      workInProgressRootRenderLanes = NoLanes; // Return the final exit status.
26582
26583      return workInProgressRootExitStatus;
26584    }
26585  }
26586  /** @noinline */
26587
26588
26589  function workLoopConcurrent() {
26590    // Perform work until Scheduler asks us to yield
26591    while (workInProgress !== null && !shouldYield()) {
26592      performUnitOfWork(workInProgress);
26593    }
26594  }
26595
26596  function performUnitOfWork(unitOfWork) {
26597    // The current, flushed, state of this fiber is the alternate. Ideally
26598    // nothing should rely on this, but relying on it here means that we don't
26599    // need an additional field on the work in progress.
26600    var current = unitOfWork.alternate;
26601    setCurrentFiber(unitOfWork);
26602    var next;
26603
26604    if ( (unitOfWork.mode & ProfileMode) !== NoMode) {
26605      startProfilerTimer(unitOfWork);
26606      next = beginWork$1(current, unitOfWork, subtreeRenderLanes);
26607      stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);
26608    } else {
26609      next = beginWork$1(current, unitOfWork, subtreeRenderLanes);
26610    }
26611
26612    resetCurrentFiber();
26613    unitOfWork.memoizedProps = unitOfWork.pendingProps;
26614
26615    if (next === null) {
26616      // If this doesn't spawn new work, complete the current work.
26617      completeUnitOfWork(unitOfWork);
26618    } else {
26619      workInProgress = next;
26620    }
26621
26622    ReactCurrentOwner$2.current = null;
26623  }
26624
26625  function completeUnitOfWork(unitOfWork) {
26626    // Attempt to complete the current unit of work, then move to the next
26627    // sibling. If there are no more siblings, return to the parent fiber.
26628    var completedWork = unitOfWork;
26629
26630    do {
26631      // The current, flushed, state of this fiber is the alternate. Ideally
26632      // nothing should rely on this, but relying on it here means that we don't
26633      // need an additional field on the work in progress.
26634      var current = completedWork.alternate;
26635      var returnFiber = completedWork.return; // Check if the work completed or if something threw.
26636
26637      if ((completedWork.flags & Incomplete) === NoFlags) {
26638        setCurrentFiber(completedWork);
26639        var next = void 0;
26640
26641        if ( (completedWork.mode & ProfileMode) === NoMode) {
26642          next = completeWork(current, completedWork, subtreeRenderLanes);
26643        } else {
26644          startProfilerTimer(completedWork);
26645          next = completeWork(current, completedWork, subtreeRenderLanes); // Update render duration assuming we didn't error.
26646
26647          stopProfilerTimerIfRunningAndRecordDelta(completedWork, false);
26648        }
26649
26650        resetCurrentFiber();
26651
26652        if (next !== null) {
26653          // Completing this fiber spawned new work. Work on that next.
26654          workInProgress = next;
26655          return;
26656        }
26657      } else {
26658        // This fiber did not complete because something threw. Pop values off
26659        // the stack without entering the complete phase. If this is a boundary,
26660        // capture values if possible.
26661        var _next = unwindWork(current, completedWork); // Because this fiber did not complete, don't reset its lanes.
26662
26663
26664        if (_next !== null) {
26665          // If completing this work spawned new work, do that next. We'll come
26666          // back here again.
26667          // Since we're restarting, remove anything that is not a host effect
26668          // from the effect tag.
26669          _next.flags &= HostEffectMask;
26670          workInProgress = _next;
26671          return;
26672        }
26673
26674        if ( (completedWork.mode & ProfileMode) !== NoMode) {
26675          // Record the render duration for the fiber that errored.
26676          stopProfilerTimerIfRunningAndRecordDelta(completedWork, false); // Include the time spent working on failed children before continuing.
26677
26678          var actualDuration = completedWork.actualDuration;
26679          var child = completedWork.child;
26680
26681          while (child !== null) {
26682            actualDuration += child.actualDuration;
26683            child = child.sibling;
26684          }
26685
26686          completedWork.actualDuration = actualDuration;
26687        }
26688
26689        if (returnFiber !== null) {
26690          // Mark the parent fiber as incomplete and clear its subtree flags.
26691          returnFiber.flags |= Incomplete;
26692          returnFiber.subtreeFlags = NoFlags;
26693          returnFiber.deletions = null;
26694        } else {
26695          // We've unwound all the way to the root.
26696          workInProgressRootExitStatus = RootDidNotComplete;
26697          workInProgress = null;
26698          return;
26699        }
26700      }
26701
26702      var siblingFiber = completedWork.sibling;
26703
26704      if (siblingFiber !== null) {
26705        // If there is more work to do in this returnFiber, do that next.
26706        workInProgress = siblingFiber;
26707        return;
26708      } // Otherwise, return to the parent
26709
26710
26711      completedWork = returnFiber; // Update the next thing we're working on in case something throws.
26712
26713      workInProgress = completedWork;
26714    } while (completedWork !== null); // We've reached the root.
26715
26716
26717    if (workInProgressRootExitStatus === RootInProgress) {
26718      workInProgressRootExitStatus = RootCompleted;
26719    }
26720  }
26721
26722  function commitRoot(root, recoverableErrors, transitions) {
26723    // TODO: This no longer makes any sense. We already wrap the mutation and
26724    // layout phases. Should be able to remove.
26725    var previousUpdateLanePriority = getCurrentUpdatePriority();
26726    var prevTransition = ReactCurrentBatchConfig$3.transition;
26727
26728    try {
26729      ReactCurrentBatchConfig$3.transition = null;
26730      setCurrentUpdatePriority(DiscreteEventPriority);
26731      commitRootImpl(root, recoverableErrors, transitions, previousUpdateLanePriority);
26732    } finally {
26733      ReactCurrentBatchConfig$3.transition = prevTransition;
26734      setCurrentUpdatePriority(previousUpdateLanePriority);
26735    }
26736
26737    return null;
26738  }
26739
26740  function commitRootImpl(root, recoverableErrors, transitions, renderPriorityLevel) {
26741    do {
26742      // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which
26743      // means `flushPassiveEffects` will sometimes result in additional
26744      // passive effects. So we need to keep flushing in a loop until there are
26745      // no more pending effects.
26746      // TODO: Might be better if `flushPassiveEffects` did not automatically
26747      // flush synchronous work at the end, to avoid factoring hazards like this.
26748      flushPassiveEffects();
26749    } while (rootWithPendingPassiveEffects !== null);
26750
26751    flushRenderPhaseStrictModeWarningsInDEV();
26752
26753    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
26754      throw new Error('Should not already be working.');
26755    }
26756
26757    var finishedWork = root.finishedWork;
26758    var lanes = root.finishedLanes;
26759
26760    {
26761      markCommitStarted(lanes);
26762    }
26763
26764    if (finishedWork === null) {
26765
26766      {
26767        markCommitStopped();
26768      }
26769
26770      return null;
26771    } else {
26772      {
26773        if (lanes === NoLanes) {
26774          error('root.finishedLanes should not be empty during a commit. This is a ' + 'bug in React.');
26775        }
26776      }
26777    }
26778
26779    root.finishedWork = null;
26780    root.finishedLanes = NoLanes;
26781
26782    if (finishedWork === root.current) {
26783      throw new Error('Cannot commit the same tree as before. This error is likely caused by ' + 'a bug in React. Please file an issue.');
26784    } // commitRoot never returns a continuation; it always finishes synchronously.
26785    // So we can clear these now to allow a new callback to be scheduled.
26786
26787
26788    root.callbackNode = null;
26789    root.callbackPriority = NoLane; // Update the first and last pending times on this root. The new first
26790    // pending time is whatever is left on the root fiber.
26791
26792    var remainingLanes = mergeLanes(finishedWork.lanes, finishedWork.childLanes);
26793    markRootFinished(root, remainingLanes);
26794
26795    if (root === workInProgressRoot) {
26796      // We can reset these now that they are finished.
26797      workInProgressRoot = null;
26798      workInProgress = null;
26799      workInProgressRootRenderLanes = NoLanes;
26800    } // If there are pending passive effects, schedule a callback to process them.
26801    // Do this as early as possible, so it is queued before anything else that
26802    // might get scheduled in the commit phase. (See #16714.)
26803    // TODO: Delete all other places that schedule the passive effect callback
26804    // They're redundant.
26805
26806
26807    if ((finishedWork.subtreeFlags & PassiveMask) !== NoFlags || (finishedWork.flags & PassiveMask) !== NoFlags) {
26808      if (!rootDoesHavePassiveEffects) {
26809        rootDoesHavePassiveEffects = true;
26810        // to store it in pendingPassiveTransitions until they get processed
26811        // We need to pass this through as an argument to commitRoot
26812        // because workInProgressTransitions might have changed between
26813        // the previous render and commit if we throttle the commit
26814        // with setTimeout
26815
26816        pendingPassiveTransitions = transitions;
26817        scheduleCallback$1(NormalPriority, function () {
26818          flushPassiveEffects(); // This render triggered passive effects: release the root cache pool
26819          // *after* passive effects fire to avoid freeing a cache pool that may
26820          // be referenced by a node in the tree (HostRoot, Cache boundary etc)
26821
26822          return null;
26823        });
26824      }
26825    } // Check if there are any effects in the whole tree.
26826    // TODO: This is left over from the effect list implementation, where we had
26827    // to check for the existence of `firstEffect` to satisfy Flow. I think the
26828    // only other reason this optimization exists is because it affects profiling.
26829    // Reconsider whether this is necessary.
26830
26831
26832    var subtreeHasEffects = (finishedWork.subtreeFlags & (BeforeMutationMask | MutationMask | LayoutMask | PassiveMask)) !== NoFlags;
26833    var rootHasEffect = (finishedWork.flags & (BeforeMutationMask | MutationMask | LayoutMask | PassiveMask)) !== NoFlags;
26834
26835    if (subtreeHasEffects || rootHasEffect) {
26836      var prevTransition = ReactCurrentBatchConfig$3.transition;
26837      ReactCurrentBatchConfig$3.transition = null;
26838      var previousPriority = getCurrentUpdatePriority();
26839      setCurrentUpdatePriority(DiscreteEventPriority);
26840      var prevExecutionContext = executionContext;
26841      executionContext |= CommitContext; // Reset this to null before calling lifecycles
26842
26843      ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass
26844      // of the effect list for each phase: all mutation effects come before all
26845      // layout effects, and so on.
26846      // The first phase a "before mutation" phase. We use this phase to read the
26847      // state of the host tree right before we mutate it. This is where
26848      // getSnapshotBeforeUpdate is called.
26849
26850      var shouldFireAfterActiveInstanceBlur = commitBeforeMutationEffects(root, finishedWork);
26851
26852      {
26853        // Mark the current commit time to be shared by all Profilers in this
26854        // batch. This enables them to be grouped later.
26855        recordCommitTime();
26856      }
26857
26858
26859      commitMutationEffects(root, finishedWork, lanes);
26860
26861      resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after
26862      // the mutation phase, so that the previous tree is still current during
26863      // componentWillUnmount, but before the layout phase, so that the finished
26864      // work is current during componentDidMount/Update.
26865
26866      root.current = finishedWork; // The next phase is the layout phase, where we call effects that read
26867
26868      {
26869        markLayoutEffectsStarted(lanes);
26870      }
26871
26872      commitLayoutEffects(finishedWork, root, lanes);
26873
26874      {
26875        markLayoutEffectsStopped();
26876      }
26877      // opportunity to paint.
26878
26879
26880      requestPaint();
26881      executionContext = prevExecutionContext; // Reset the priority to the previous non-sync value.
26882
26883      setCurrentUpdatePriority(previousPriority);
26884      ReactCurrentBatchConfig$3.transition = prevTransition;
26885    } else {
26886      // No effects.
26887      root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were
26888      // no effects.
26889      // TODO: Maybe there's a better way to report this.
26890
26891      {
26892        recordCommitTime();
26893      }
26894    }
26895
26896    var rootDidHavePassiveEffects = rootDoesHavePassiveEffects;
26897
26898    if (rootDoesHavePassiveEffects) {
26899      // This commit has passive effects. Stash a reference to them. But don't
26900      // schedule a callback until after flushing layout work.
26901      rootDoesHavePassiveEffects = false;
26902      rootWithPendingPassiveEffects = root;
26903      pendingPassiveEffectsLanes = lanes;
26904    } else {
26905
26906      {
26907        nestedPassiveUpdateCount = 0;
26908        rootWithPassiveNestedUpdates = null;
26909      }
26910    } // Read this again, since an effect might have updated it
26911
26912
26913    remainingLanes = root.pendingLanes; // Check if there's remaining work on this root
26914    // TODO: This is part of the `componentDidCatch` implementation. Its purpose
26915    // is to detect whether something might have called setState inside
26916    // `componentDidCatch`. The mechanism is known to be flawed because `setState`
26917    // inside `componentDidCatch` is itself flawed — that's why we recommend
26918    // `getDerivedStateFromError` instead. However, it could be improved by
26919    // checking if remainingLanes includes Sync work, instead of whether there's
26920    // any work remaining at all (which would also include stuff like Suspense
26921    // retries or transitions). It's been like this for a while, though, so fixing
26922    // it probably isn't that urgent.
26923
26924    if (remainingLanes === NoLanes) {
26925      // If there's no remaining work, we can clear the set of already failed
26926      // error boundaries.
26927      legacyErrorBoundariesThatAlreadyFailed = null;
26928    }
26929
26930    {
26931      if (!rootDidHavePassiveEffects) {
26932        commitDoubleInvokeEffectsInDEV(root.current, false);
26933      }
26934    }
26935
26936    onCommitRoot(finishedWork.stateNode, renderPriorityLevel);
26937
26938    {
26939      if (isDevToolsPresent) {
26940        root.memoizedUpdaters.clear();
26941      }
26942    }
26943
26944    {
26945      onCommitRoot$1();
26946    } // Always call this before exiting `commitRoot`, to ensure that any
26947    // additional work on this root is scheduled.
26948
26949
26950    ensureRootIsScheduled(root, now());
26951
26952    if (recoverableErrors !== null) {
26953      // There were errors during this render, but recovered from them without
26954      // needing to surface it to the UI. We log them here.
26955      var onRecoverableError = root.onRecoverableError;
26956
26957      for (var i = 0; i < recoverableErrors.length; i++) {
26958        var recoverableError = recoverableErrors[i];
26959        var componentStack = recoverableError.stack;
26960        var digest = recoverableError.digest;
26961        onRecoverableError(recoverableError.value, {
26962          componentStack: componentStack,
26963          digest: digest
26964        });
26965      }
26966    }
26967
26968    if (hasUncaughtError) {
26969      hasUncaughtError = false;
26970      var error$1 = firstUncaughtError;
26971      firstUncaughtError = null;
26972      throw error$1;
26973    } // If the passive effects are the result of a discrete render, flush them
26974    // synchronously at the end of the current task so that the result is
26975    // immediately observable. Otherwise, we assume that they are not
26976    // order-dependent and do not need to be observed by external systems, so we
26977    // can wait until after paint.
26978    // TODO: We can optimize this by not scheduling the callback earlier. Since we
26979    // currently schedule the callback in multiple places, will wait until those
26980    // are consolidated.
26981
26982
26983    if (includesSomeLane(pendingPassiveEffectsLanes, SyncLane) && root.tag !== LegacyRoot) {
26984      flushPassiveEffects();
26985    } // Read this again, since a passive effect might have updated it
26986
26987
26988    remainingLanes = root.pendingLanes;
26989
26990    if (includesSomeLane(remainingLanes, SyncLane)) {
26991      {
26992        markNestedUpdateScheduled();
26993      } // Count the number of times the root synchronously re-renders without
26994      // finishing. If there are too many, it indicates an infinite update loop.
26995
26996
26997      if (root === rootWithNestedUpdates) {
26998        nestedUpdateCount++;
26999      } else {
27000        nestedUpdateCount = 0;
27001        rootWithNestedUpdates = root;
27002      }
27003    } else {
27004      nestedUpdateCount = 0;
27005    } // If layout work was scheduled, flush it now.
27006
27007
27008    flushSyncCallbacks();
27009
27010    {
27011      markCommitStopped();
27012    }
27013
27014    return null;
27015  }
27016
27017  function flushPassiveEffects() {
27018    // Returns whether passive effects were flushed.
27019    // TODO: Combine this check with the one in flushPassiveEFfectsImpl. We should
27020    // probably just combine the two functions. I believe they were only separate
27021    // in the first place because we used to wrap it with
27022    // `Scheduler.runWithPriority`, which accepts a function. But now we track the
27023    // priority within React itself, so we can mutate the variable directly.
27024    if (rootWithPendingPassiveEffects !== null) {
27025      var renderPriority = lanesToEventPriority(pendingPassiveEffectsLanes);
27026      var priority = lowerEventPriority(DefaultEventPriority, renderPriority);
27027      var prevTransition = ReactCurrentBatchConfig$3.transition;
27028      var previousPriority = getCurrentUpdatePriority();
27029
27030      try {
27031        ReactCurrentBatchConfig$3.transition = null;
27032        setCurrentUpdatePriority(priority);
27033        return flushPassiveEffectsImpl();
27034      } finally {
27035        setCurrentUpdatePriority(previousPriority);
27036        ReactCurrentBatchConfig$3.transition = prevTransition; // Once passive effects have run for the tree - giving components a
27037      }
27038    }
27039
27040    return false;
27041  }
27042  function enqueuePendingPassiveProfilerEffect(fiber) {
27043    {
27044      pendingPassiveProfilerEffects.push(fiber);
27045
27046      if (!rootDoesHavePassiveEffects) {
27047        rootDoesHavePassiveEffects = true;
27048        scheduleCallback$1(NormalPriority, function () {
27049          flushPassiveEffects();
27050          return null;
27051        });
27052      }
27053    }
27054  }
27055
27056  function flushPassiveEffectsImpl() {
27057    if (rootWithPendingPassiveEffects === null) {
27058      return false;
27059    } // Cache and clear the transitions flag
27060
27061
27062    var transitions = pendingPassiveTransitions;
27063    pendingPassiveTransitions = null;
27064    var root = rootWithPendingPassiveEffects;
27065    var lanes = pendingPassiveEffectsLanes;
27066    rootWithPendingPassiveEffects = null; // TODO: This is sometimes out of sync with rootWithPendingPassiveEffects.
27067    // Figure out why and fix it. It's not causing any known issues (probably
27068    // because it's only used for profiling), but it's a refactor hazard.
27069
27070    pendingPassiveEffectsLanes = NoLanes;
27071
27072    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
27073      throw new Error('Cannot flush passive effects while already rendering.');
27074    }
27075
27076    {
27077      isFlushingPassiveEffects = true;
27078      didScheduleUpdateDuringPassiveEffects = false;
27079    }
27080
27081    {
27082      markPassiveEffectsStarted(lanes);
27083    }
27084
27085    var prevExecutionContext = executionContext;
27086    executionContext |= CommitContext;
27087    commitPassiveUnmountEffects(root.current);
27088    commitPassiveMountEffects(root, root.current, lanes, transitions); // TODO: Move to commitPassiveMountEffects
27089
27090    {
27091      var profilerEffects = pendingPassiveProfilerEffects;
27092      pendingPassiveProfilerEffects = [];
27093
27094      for (var i = 0; i < profilerEffects.length; i++) {
27095        var _fiber = profilerEffects[i];
27096        commitPassiveEffectDurations(root, _fiber);
27097      }
27098    }
27099
27100    {
27101      markPassiveEffectsStopped();
27102    }
27103
27104    {
27105      commitDoubleInvokeEffectsInDEV(root.current, true);
27106    }
27107
27108    executionContext = prevExecutionContext;
27109    flushSyncCallbacks();
27110
27111    {
27112      // If additional passive effects were scheduled, increment a counter. If this
27113      // exceeds the limit, we'll fire a warning.
27114      if (didScheduleUpdateDuringPassiveEffects) {
27115        if (root === rootWithPassiveNestedUpdates) {
27116          nestedPassiveUpdateCount++;
27117        } else {
27118          nestedPassiveUpdateCount = 0;
27119          rootWithPassiveNestedUpdates = root;
27120        }
27121      } else {
27122        nestedPassiveUpdateCount = 0;
27123      }
27124
27125      isFlushingPassiveEffects = false;
27126      didScheduleUpdateDuringPassiveEffects = false;
27127    } // TODO: Move to commitPassiveMountEffects
27128
27129
27130    onPostCommitRoot(root);
27131
27132    {
27133      var stateNode = root.current.stateNode;
27134      stateNode.effectDuration = 0;
27135      stateNode.passiveEffectDuration = 0;
27136    }
27137
27138    return true;
27139  }
27140
27141  function isAlreadyFailedLegacyErrorBoundary(instance) {
27142    return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);
27143  }
27144  function markLegacyErrorBoundaryAsFailed(instance) {
27145    if (legacyErrorBoundariesThatAlreadyFailed === null) {
27146      legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);
27147    } else {
27148      legacyErrorBoundariesThatAlreadyFailed.add(instance);
27149    }
27150  }
27151
27152  function prepareToThrowUncaughtError(error) {
27153    if (!hasUncaughtError) {
27154      hasUncaughtError = true;
27155      firstUncaughtError = error;
27156    }
27157  }
27158
27159  var onUncaughtError = prepareToThrowUncaughtError;
27160
27161  function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {
27162    var errorInfo = createCapturedValueAtFiber(error, sourceFiber);
27163    var update = createRootErrorUpdate(rootFiber, errorInfo, SyncLane);
27164    var root = enqueueUpdate(rootFiber, update, SyncLane);
27165    var eventTime = requestEventTime();
27166
27167    if (root !== null) {
27168      markRootUpdated(root, SyncLane, eventTime);
27169      ensureRootIsScheduled(root, eventTime);
27170    }
27171  }
27172
27173  function captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error$1) {
27174    {
27175      reportUncaughtErrorInDEV(error$1);
27176      setIsRunningInsertionEffect(false);
27177    }
27178
27179    if (sourceFiber.tag === HostRoot) {
27180      // Error was thrown at the root. There is no parent, so the root
27181      // itself should capture it.
27182      captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error$1);
27183      return;
27184    }
27185
27186    var fiber = null;
27187
27188    {
27189      fiber = nearestMountedAncestor;
27190    }
27191
27192    while (fiber !== null) {
27193      if (fiber.tag === HostRoot) {
27194        captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error$1);
27195        return;
27196      } else if (fiber.tag === ClassComponent) {
27197        var ctor = fiber.type;
27198        var instance = fiber.stateNode;
27199
27200        if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {
27201          var errorInfo = createCapturedValueAtFiber(error$1, sourceFiber);
27202          var update = createClassErrorUpdate(fiber, errorInfo, SyncLane);
27203          var root = enqueueUpdate(fiber, update, SyncLane);
27204          var eventTime = requestEventTime();
27205
27206          if (root !== null) {
27207            markRootUpdated(root, SyncLane, eventTime);
27208            ensureRootIsScheduled(root, eventTime);
27209          }
27210
27211          return;
27212        }
27213      }
27214
27215      fiber = fiber.return;
27216    }
27217
27218    {
27219      // TODO: Until we re-land skipUnmountedBoundaries (see #20147), this warning
27220      // will fire for errors that are thrown by destroy functions inside deleted
27221      // trees. What it should instead do is propagate the error to the parent of
27222      // the deleted tree. In the meantime, do not add this warning to the
27223      // allowlist; this is only for our internal use.
27224      error('Internal React error: Attempted to capture a commit phase error ' + 'inside a detached tree. This indicates a bug in React. Likely ' + 'causes include deleting the same fiber more than once, committing an ' + 'already-finished tree, or an inconsistent return pointer.\n\n' + 'Error message:\n\n%s', error$1);
27225    }
27226  }
27227  function pingSuspendedRoot(root, wakeable, pingedLanes) {
27228    var pingCache = root.pingCache;
27229
27230    if (pingCache !== null) {
27231      // The wakeable resolved, so we no longer need to memoize, because it will
27232      // never be thrown again.
27233      pingCache.delete(wakeable);
27234    }
27235
27236    var eventTime = requestEventTime();
27237    markRootPinged(root, pingedLanes);
27238    warnIfSuspenseResolutionNotWrappedWithActDEV(root);
27239
27240    if (workInProgressRoot === root && isSubsetOfLanes(workInProgressRootRenderLanes, pingedLanes)) {
27241      // Received a ping at the same priority level at which we're currently
27242      // rendering. We might want to restart this render. This should mirror
27243      // the logic of whether or not a root suspends once it completes.
27244      // TODO: If we're rendering sync either due to Sync, Batched or expired,
27245      // we should probably never restart.
27246      // If we're suspended with delay, or if it's a retry, we'll always suspend
27247      // so we can always restart.
27248      if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && includesOnlyRetries(workInProgressRootRenderLanes) && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) {
27249        // Restart from the root.
27250        prepareFreshStack(root, NoLanes);
27251      } else {
27252        // Even though we can't restart right now, we might get an
27253        // opportunity later. So we mark this render as having a ping.
27254        workInProgressRootPingedLanes = mergeLanes(workInProgressRootPingedLanes, pingedLanes);
27255      }
27256    }
27257
27258    ensureRootIsScheduled(root, eventTime);
27259  }
27260
27261  function retryTimedOutBoundary(boundaryFiber, retryLane) {
27262    // The boundary fiber (a Suspense component or SuspenseList component)
27263    // previously was rendered in its fallback state. One of the promises that
27264    // suspended it has resolved, which means at least part of the tree was
27265    // likely unblocked. Try rendering again, at a new lanes.
27266    if (retryLane === NoLane) {
27267      // TODO: Assign this to `suspenseState.retryLane`? to avoid
27268      // unnecessary entanglement?
27269      retryLane = requestRetryLane(boundaryFiber);
27270    } // TODO: Special case idle priority?
27271
27272
27273    var eventTime = requestEventTime();
27274    var root = enqueueConcurrentRenderForLane(boundaryFiber, retryLane);
27275
27276    if (root !== null) {
27277      markRootUpdated(root, retryLane, eventTime);
27278      ensureRootIsScheduled(root, eventTime);
27279    }
27280  }
27281
27282  function retryDehydratedSuspenseBoundary(boundaryFiber) {
27283    var suspenseState = boundaryFiber.memoizedState;
27284    var retryLane = NoLane;
27285
27286    if (suspenseState !== null) {
27287      retryLane = suspenseState.retryLane;
27288    }
27289
27290    retryTimedOutBoundary(boundaryFiber, retryLane);
27291  }
27292  function resolveRetryWakeable(boundaryFiber, wakeable) {
27293    var retryLane = NoLane; // Default
27294
27295    var retryCache;
27296
27297    switch (boundaryFiber.tag) {
27298      case SuspenseComponent:
27299        retryCache = boundaryFiber.stateNode;
27300        var suspenseState = boundaryFiber.memoizedState;
27301
27302        if (suspenseState !== null) {
27303          retryLane = suspenseState.retryLane;
27304        }
27305
27306        break;
27307
27308      case SuspenseListComponent:
27309        retryCache = boundaryFiber.stateNode;
27310        break;
27311
27312      default:
27313        throw new Error('Pinged unknown suspense boundary type. ' + 'This is probably a bug in React.');
27314    }
27315
27316    if (retryCache !== null) {
27317      // The wakeable resolved, so we no longer need to memoize, because it will
27318      // never be thrown again.
27319      retryCache.delete(wakeable);
27320    }
27321
27322    retryTimedOutBoundary(boundaryFiber, retryLane);
27323  } // Computes the next Just Noticeable Difference (JND) boundary.
27324  // The theory is that a person can't tell the difference between small differences in time.
27325  // Therefore, if we wait a bit longer than necessary that won't translate to a noticeable
27326  // difference in the experience. However, waiting for longer might mean that we can avoid
27327  // showing an intermediate loading state. The longer we have already waited, the harder it
27328  // is to tell small differences in time. Therefore, the longer we've already waited,
27329  // the longer we can wait additionally. At some point we have to give up though.
27330  // We pick a train model where the next boundary commits at a consistent schedule.
27331  // These particular numbers are vague estimates. We expect to adjust them based on research.
27332
27333  function jnd(timeElapsed) {
27334    return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960;
27335  }
27336
27337  function checkForNestedUpdates() {
27338    if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
27339      nestedUpdateCount = 0;
27340      rootWithNestedUpdates = null;
27341      throw new Error('Maximum update depth exceeded. This can happen when a component ' + 'repeatedly calls setState inside componentWillUpdate or ' + 'componentDidUpdate. React limits the number of nested updates to ' + 'prevent infinite loops.');
27342    }
27343
27344    {
27345      if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) {
27346        nestedPassiveUpdateCount = 0;
27347        rootWithPassiveNestedUpdates = null;
27348
27349        error('Maximum update depth exceeded. This can happen when a component ' + "calls setState inside useEffect, but useEffect either doesn't " + 'have a dependency array, or one of the dependencies changes on ' + 'every render.');
27350      }
27351    }
27352  }
27353
27354  function flushRenderPhaseStrictModeWarningsInDEV() {
27355    {
27356      ReactStrictModeWarnings.flushLegacyContextWarning();
27357
27358      {
27359        ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
27360      }
27361    }
27362  }
27363
27364  function commitDoubleInvokeEffectsInDEV(fiber, hasPassiveEffects) {
27365    {
27366      // TODO (StrictEffects) Should we set a marker on the root if it contains strict effects
27367      // so we don't traverse unnecessarily? similar to subtreeFlags but just at the root level.
27368      // Maybe not a big deal since this is DEV only behavior.
27369      setCurrentFiber(fiber);
27370      invokeEffectsInDev(fiber, MountLayoutDev, invokeLayoutEffectUnmountInDEV);
27371
27372      if (hasPassiveEffects) {
27373        invokeEffectsInDev(fiber, MountPassiveDev, invokePassiveEffectUnmountInDEV);
27374      }
27375
27376      invokeEffectsInDev(fiber, MountLayoutDev, invokeLayoutEffectMountInDEV);
27377
27378      if (hasPassiveEffects) {
27379        invokeEffectsInDev(fiber, MountPassiveDev, invokePassiveEffectMountInDEV);
27380      }
27381
27382      resetCurrentFiber();
27383    }
27384  }
27385
27386  function invokeEffectsInDev(firstChild, fiberFlags, invokeEffectFn) {
27387    {
27388      // We don't need to re-check StrictEffectsMode here.
27389      // This function is only called if that check has already passed.
27390      var current = firstChild;
27391      var subtreeRoot = null;
27392
27393      while (current !== null) {
27394        var primarySubtreeFlag = current.subtreeFlags & fiberFlags;
27395
27396        if (current !== subtreeRoot && current.child !== null && primarySubtreeFlag !== NoFlags) {
27397          current = current.child;
27398        } else {
27399          if ((current.flags & fiberFlags) !== NoFlags) {
27400            invokeEffectFn(current);
27401          }
27402
27403          if (current.sibling !== null) {
27404            current = current.sibling;
27405          } else {
27406            current = subtreeRoot = current.return;
27407          }
27408        }
27409      }
27410    }
27411  }
27412
27413  var didWarnStateUpdateForNotYetMountedComponent = null;
27414  function warnAboutUpdateOnNotYetMountedFiberInDEV(fiber) {
27415    {
27416      if ((executionContext & RenderContext) !== NoContext) {
27417        // We let the other warning about render phase updates deal with this one.
27418        return;
27419      }
27420
27421      if (!(fiber.mode & ConcurrentMode)) {
27422        return;
27423      }
27424
27425      var tag = fiber.tag;
27426
27427      if (tag !== IndeterminateComponent && tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent) {
27428        // Only warn for user-defined components, not internal ones like Suspense.
27429        return;
27430      } // We show the whole stack but dedupe on the top component's name because
27431      // the problematic code almost always lies inside that component.
27432
27433
27434      var componentName = getComponentNameFromFiber(fiber) || 'ReactComponent';
27435
27436      if (didWarnStateUpdateForNotYetMountedComponent !== null) {
27437        if (didWarnStateUpdateForNotYetMountedComponent.has(componentName)) {
27438          return;
27439        }
27440
27441        didWarnStateUpdateForNotYetMountedComponent.add(componentName);
27442      } else {
27443        didWarnStateUpdateForNotYetMountedComponent = new Set([componentName]);
27444      }
27445
27446      var previousFiber = current;
27447
27448      try {
27449        setCurrentFiber(fiber);
27450
27451        error("Can't perform a React state update on a component that hasn't mounted yet. " + 'This indicates that you have a side-effect in your render function that ' + 'asynchronously later calls tries to update the component. Move this work to ' + 'useEffect instead.');
27452      } finally {
27453        if (previousFiber) {
27454          setCurrentFiber(fiber);
27455        } else {
27456          resetCurrentFiber();
27457        }
27458      }
27459    }
27460  }
27461  var beginWork$1;
27462
27463  {
27464    var dummyFiber = null;
27465
27466    beginWork$1 = function (current, unitOfWork, lanes) {
27467      // If a component throws an error, we replay it again in a synchronously
27468      // dispatched event, so that the debugger will treat it as an uncaught
27469      // error See ReactErrorUtils for more information.
27470      // Before entering the begin phase, copy the work-in-progress onto a dummy
27471      // fiber. If beginWork throws, we'll use this to reset the state.
27472      var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork);
27473
27474      try {
27475        return beginWork(current, unitOfWork, lanes);
27476      } catch (originalError) {
27477        if (didSuspendOrErrorWhileHydratingDEV() || originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') {
27478          // Don't replay promises.
27479          // Don't replay errors if we are hydrating and have already suspended or handled an error
27480          throw originalError;
27481        } // Keep this code in sync with handleError; any changes here must have
27482        // corresponding changes there.
27483
27484
27485        resetContextDependencies();
27486        resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the
27487        // same fiber again.
27488        // Unwind the failed stack frame
27489
27490        unwindInterruptedWork(current, unitOfWork); // Restore the original properties of the fiber.
27491
27492        assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy);
27493
27494        if ( unitOfWork.mode & ProfileMode) {
27495          // Reset the profiler timer.
27496          startProfilerTimer(unitOfWork);
27497        } // Run beginWork again.
27498
27499
27500        invokeGuardedCallback(null, beginWork, null, current, unitOfWork, lanes);
27501
27502        if (hasCaughtError()) {
27503          var replayError = clearCaughtError();
27504
27505          if (typeof replayError === 'object' && replayError !== null && replayError._suppressLogging && typeof originalError === 'object' && originalError !== null && !originalError._suppressLogging) {
27506            // If suppressed, let the flag carry over to the original error which is the one we'll rethrow.
27507            originalError._suppressLogging = true;
27508          }
27509        } // We always throw the original error in case the second render pass is not idempotent.
27510        // This can happen if a memoized function or CommonJS module doesn't throw after first invocation.
27511
27512
27513        throw originalError;
27514      }
27515    };
27516  }
27517
27518  var didWarnAboutUpdateInRender = false;
27519  var didWarnAboutUpdateInRenderForAnotherComponent;
27520
27521  {
27522    didWarnAboutUpdateInRenderForAnotherComponent = new Set();
27523  }
27524
27525  function warnAboutRenderPhaseUpdatesInDEV(fiber) {
27526    {
27527      if (isRendering && !getIsUpdatingOpaqueValueInRenderPhaseInDEV()) {
27528        switch (fiber.tag) {
27529          case FunctionComponent:
27530          case ForwardRef:
27531          case SimpleMemoComponent:
27532            {
27533              var renderingComponentName = workInProgress && getComponentNameFromFiber(workInProgress) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed.
27534
27535              var dedupeKey = renderingComponentName;
27536
27537              if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) {
27538                didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey);
27539                var setStateComponentName = getComponentNameFromFiber(fiber) || 'Unknown';
27540
27541                error('Cannot update a component (`%s`) while rendering a ' + 'different component (`%s`). To locate the bad setState() call inside `%s`, ' + 'follow the stack trace as described in https://reactjs.org/link/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName);
27542              }
27543
27544              break;
27545            }
27546
27547          case ClassComponent:
27548            {
27549              if (!didWarnAboutUpdateInRender) {
27550                error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.');
27551
27552                didWarnAboutUpdateInRender = true;
27553              }
27554
27555              break;
27556            }
27557        }
27558      }
27559    }
27560  }
27561
27562  function restorePendingUpdaters(root, lanes) {
27563    {
27564      if (isDevToolsPresent) {
27565        var memoizedUpdaters = root.memoizedUpdaters;
27566        memoizedUpdaters.forEach(function (schedulingFiber) {
27567          addFiberToLanesMap(root, schedulingFiber, lanes);
27568        }); // This function intentionally does not clear memoized updaters.
27569        // Those may still be relevant to the current commit
27570        // and a future one (e.g. Suspense).
27571      }
27572    }
27573  }
27574  var fakeActCallbackNode = {};
27575
27576  function scheduleCallback$1(priorityLevel, callback) {
27577    {
27578      // If we're currently inside an `act` scope, bypass Scheduler and push to
27579      // the `act` queue instead.
27580      var actQueue = ReactCurrentActQueue$1.current;
27581
27582      if (actQueue !== null) {
27583        actQueue.push(callback);
27584        return fakeActCallbackNode;
27585      } else {
27586        return scheduleCallback(priorityLevel, callback);
27587      }
27588    }
27589  }
27590
27591  function cancelCallback$1(callbackNode) {
27592    if ( callbackNode === fakeActCallbackNode) {
27593      return;
27594    } // In production, always call Scheduler. This function will be stripped out.
27595
27596
27597    return cancelCallback(callbackNode);
27598  }
27599
27600  function shouldForceFlushFallbacksInDEV() {
27601    // Never force flush in production. This function should get stripped out.
27602    return  ReactCurrentActQueue$1.current !== null;
27603  }
27604
27605  function warnIfUpdatesNotWrappedWithActDEV(fiber) {
27606    {
27607      if (fiber.mode & ConcurrentMode) {
27608        if (!isConcurrentActEnvironment()) {
27609          // Not in an act environment. No need to warn.
27610          return;
27611        }
27612      } else {
27613        // Legacy mode has additional cases where we suppress a warning.
27614        if (!isLegacyActEnvironment()) {
27615          // Not in an act environment. No need to warn.
27616          return;
27617        }
27618
27619        if (executionContext !== NoContext) {
27620          // Legacy mode doesn't warn if the update is batched, i.e.
27621          // batchedUpdates or flushSync.
27622          return;
27623        }
27624
27625        if (fiber.tag !== FunctionComponent && fiber.tag !== ForwardRef && fiber.tag !== SimpleMemoComponent) {
27626          // For backwards compatibility with pre-hooks code, legacy mode only
27627          // warns for updates that originate from a hook.
27628          return;
27629        }
27630      }
27631
27632      if (ReactCurrentActQueue$1.current === null) {
27633        var previousFiber = current;
27634
27635        try {
27636          setCurrentFiber(fiber);
27637
27638          error('An update to %s inside a test was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() =>
vendor: 31,152 bytes, lines 27638-28601
27638 {\n' + '  /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://reactjs.org/link/wrap-tests-with-act', getComponentNameFromFiber(fiber));
27639        } finally {
27640          if (previousFiber) {
27641            setCurrentFiber(fiber);
27642          } else {
27643            resetCurrentFiber();
27644          }
27645        }
27646      }
27647    }
27648  }
27649
27650  function warnIfSuspenseResolutionNotWrappedWithActDEV(root) {
27651    {
27652      if (root.tag !== LegacyRoot && isConcurrentActEnvironment() && ReactCurrentActQueue$1.current === null) {
27653        error('A suspended resource finished loading inside a test, but the event ' + 'was not wrapped in act(...).\n\n' + 'When testing, code that resolves suspended data should be wrapped ' + 'into act(...):\n\n' + 'act(() => {\n' + '  /* finish loading suspended data */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://reactjs.org/link/wrap-tests-with-act');
27654      }
27655    }
27656  }
27657
27658  function setIsRunningInsertionEffect(isRunning) {
27659    {
27660      isRunningInsertionEffect = isRunning;
27661    }
27662  }
27663
27664  /* eslint-disable react-internal/prod-error-codes */
27665  var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below.
27666
27667  var failedBoundaries = null;
27668  var setRefreshHandler = function (handler) {
27669    {
27670      resolveFamily = handler;
27671    }
27672  };
27673  function resolveFunctionForHotReloading(type) {
27674    {
27675      if (resolveFamily === null) {
27676        // Hot reloading is disabled.
27677        return type;
27678      }
27679
27680      var family = resolveFamily(type);
27681
27682      if (family === undefined) {
27683        return type;
27684      } // Use the latest known implementation.
27685
27686
27687      return family.current;
27688    }
27689  }
27690  function resolveClassForHotReloading(type) {
27691    // No implementation differences.
27692    return resolveFunctionForHotReloading(type);
27693  }
27694  function resolveForwardRefForHotReloading(type) {
27695    {
27696      if (resolveFamily === null) {
27697        // Hot reloading is disabled.
27698        return type;
27699      }
27700
27701      var family = resolveFamily(type);
27702
27703      if (family === undefined) {
27704        // Check if we're dealing with a real forwardRef. Don't want to crash early.
27705        if (type !== null && type !== undefined && typeof type.render === 'function') {
27706          // ForwardRef is special because its resolved .type is an object,
27707          // but it's possible that we only have its inner render function in the map.
27708          // If that inner render function is different, we'll build a new forwardRef type.
27709          var currentRender = resolveFunctionForHotReloading(type.render);
27710
27711          if (type.render !== currentRender) {
27712            var syntheticType = {
27713              $$typeof: REACT_FORWARD_REF_TYPE,
27714              render: currentRender
27715            };
27716
27717            if (type.displayName !== undefined) {
27718              syntheticType.displayName = type.displayName;
27719            }
27720
27721            return syntheticType;
27722          }
27723        }
27724
27725        return type;
27726      } // Use the latest known implementation.
27727
27728
27729      return family.current;
27730    }
27731  }
27732  function isCompatibleFamilyForHotReloading(fiber, element) {
27733    {
27734      if (resolveFamily === null) {
27735        // Hot reloading is disabled.
27736        return false;
27737      }
27738
27739      var prevType = fiber.elementType;
27740      var nextType = element.type; // If we got here, we know types aren't === equal.
27741
27742      var needsCompareFamilies = false;
27743      var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null;
27744
27745      switch (fiber.tag) {
27746        case ClassComponent:
27747          {
27748            if (typeof nextType === 'function') {
27749              needsCompareFamilies = true;
27750            }
27751
27752            break;
27753          }
27754
27755        case FunctionComponent:
27756          {
27757            if (typeof nextType === 'function') {
27758              needsCompareFamilies = true;
27759            } else if ($$typeofNextType === REACT_LAZY_TYPE) {
27760              // We don't know the inner type yet.
27761              // We're going to assume that the lazy inner type is stable,
27762              // and so it is sufficient to avoid reconciling it away.
27763              // We're not going to unwrap or actually use the new lazy type.
27764              needsCompareFamilies = true;
27765            }
27766
27767            break;
27768          }
27769
27770        case ForwardRef:
27771          {
27772            if ($$typeofNextType === REACT_FORWARD_REF_TYPE) {
27773              needsCompareFamilies = true;
27774            } else if ($$typeofNextType === REACT_LAZY_TYPE) {
27775              needsCompareFamilies = true;
27776            }
27777
27778            break;
27779          }
27780
27781        case MemoComponent:
27782        case SimpleMemoComponent:
27783          {
27784            if ($$typeofNextType === REACT_MEMO_TYPE) {
27785              // TODO: if it was but can no longer be simple,
27786              // we shouldn't set this.
27787              needsCompareFamilies = true;
27788            } else if ($$typeofNextType === REACT_LAZY_TYPE) {
27789              needsCompareFamilies = true;
27790            }
27791
27792            break;
27793          }
27794
27795        default:
27796          return false;
27797      } // Check if both types have a family and it's the same one.
27798
27799
27800      if (needsCompareFamilies) {
27801        // Note: memo() and forwardRef() we'll compare outer rather than inner type.
27802        // This means both of them need to be registered to preserve state.
27803        // If we unwrapped and compared the inner types for wrappers instead,
27804        // then we would risk falsely saying two separate memo(Foo)
27805        // calls are equivalent because they wrap the same Foo function.
27806        var prevFamily = resolveFamily(prevType);
27807
27808        if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) {
27809          return true;
27810        }
27811      }
27812
27813      return false;
27814    }
27815  }
27816  function markFailedErrorBoundaryForHotReloading(fiber) {
27817    {
27818      if (resolveFamily === null) {
27819        // Hot reloading is disabled.
27820        return;
27821      }
27822
27823      if (typeof WeakSet !== 'function') {
27824        return;
27825      }
27826
27827      if (failedBoundaries === null) {
27828        failedBoundaries = new WeakSet();
27829      }
27830
27831      failedBoundaries.add(fiber);
27832    }
27833  }
27834  var scheduleRefresh = function (root, update) {
27835    {
27836      if (resolveFamily === null) {
27837        // Hot reloading is disabled.
27838        return;
27839      }
27840
27841      var staleFamilies = update.staleFamilies,
27842          updatedFamilies = update.updatedFamilies;
27843      flushPassiveEffects();
27844      flushSync(function () {
27845        scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies);
27846      });
27847    }
27848  };
27849  var scheduleRoot = function (root, element) {
27850    {
27851      if (root.context !== emptyContextObject) {
27852        // Super edge case: root has a legacy _renderSubtree context
27853        // but we don't know the parentComponent so we can't pass it.
27854        // Just ignore. We'll delete this with _renderSubtree code path later.
27855        return;
27856      }
27857
27858      flushPassiveEffects();
27859      flushSync(function () {
27860        updateContainer(element, root, null, null);
27861      });
27862    }
27863  };
27864
27865  function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {
27866    {
27867      var alternate = fiber.alternate,
27868          child = fiber.child,
27869          sibling = fiber.sibling,
27870          tag = fiber.tag,
27871          type = fiber.type;
27872      var candidateType = null;
27873
27874      switch (tag) {
27875        case FunctionComponent:
27876        case SimpleMemoComponent:
27877        case ClassComponent:
27878          candidateType = type;
27879          break;
27880
27881        case ForwardRef:
27882          candidateType = type.render;
27883          break;
27884      }
27885
27886      if (resolveFamily === null) {
27887        throw new Error('Expected resolveFamily to be set during hot reload.');
27888      }
27889
27890      var needsRender = false;
27891      var needsRemount = false;
27892
27893      if (candidateType !== null) {
27894        var family = resolveFamily(candidateType);
27895
27896        if (family !== undefined) {
27897          if (staleFamilies.has(family)) {
27898            needsRemount = true;
27899          } else if (updatedFamilies.has(family)) {
27900            if (tag === ClassComponent) {
27901              needsRemount = true;
27902            } else {
27903              needsRender = true;
27904            }
27905          }
27906        }
27907      }
27908
27909      if (failedBoundaries !== null) {
27910        if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) {
27911          needsRemount = true;
27912        }
27913      }
27914
27915      if (needsRemount) {
27916        fiber._debugNeedsRemount = true;
27917      }
27918
27919      if (needsRemount || needsRender) {
27920        var _root = enqueueConcurrentRenderForLane(fiber, SyncLane);
27921
27922        if (_root !== null) {
27923          scheduleUpdateOnFiber(_root, fiber, SyncLane, NoTimestamp);
27924        }
27925      }
27926
27927      if (child !== null && !needsRemount) {
27928        scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);
27929      }
27930
27931      if (sibling !== null) {
27932        scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies);
27933      }
27934    }
27935  }
27936
27937  var findHostInstancesForRefresh = function (root, families) {
27938    {
27939      var hostInstances = new Set();
27940      var types = new Set(families.map(function (family) {
27941        return family.current;
27942      }));
27943      findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances);
27944      return hostInstances;
27945    }
27946  };
27947
27948  function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) {
27949    {
27950      var child = fiber.child,
27951          sibling = fiber.sibling,
27952          tag = fiber.tag,
27953          type = fiber.type;
27954      var candidateType = null;
27955
27956      switch (tag) {
27957        case FunctionComponent:
27958        case SimpleMemoComponent:
27959        case ClassComponent:
27960          candidateType = type;
27961          break;
27962
27963        case ForwardRef:
27964          candidateType = type.render;
27965          break;
27966      }
27967
27968      var didMatch = false;
27969
27970      if (candidateType !== null) {
27971        if (types.has(candidateType)) {
27972          didMatch = true;
27973        }
27974      }
27975
27976      if (didMatch) {
27977        // We have a match. This only drills down to the closest host components.
27978        // There's no need to search deeper because for the purpose of giving
27979        // visual feedback, "flashing" outermost parent rectangles is sufficient.
27980        findHostInstancesForFiberShallowly(fiber, hostInstances);
27981      } else {
27982        // If there's no match, maybe there will be one further down in the child tree.
27983        if (child !== null) {
27984          findHostInstancesForMatchingFibersRecursively(child, types, hostInstances);
27985        }
27986      }
27987
27988      if (sibling !== null) {
27989        findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances);
27990      }
27991    }
27992  }
27993
27994  function findHostInstancesForFiberShallowly(fiber, hostInstances) {
27995    {
27996      var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances);
27997
27998      if (foundHostInstances) {
27999        return;
28000      } // If we didn't find any host children, fallback to closest host parent.
28001
28002
28003      var node = fiber;
28004
28005      while (true) {
28006        switch (node.tag) {
28007          case HostComponent:
28008            hostInstances.add(node.stateNode);
28009            return;
28010
28011          case HostPortal:
28012            hostInstances.add(node.stateNode.containerInfo);
28013            return;
28014
28015          case HostRoot:
28016            hostInstances.add(node.stateNode.containerInfo);
28017            return;
28018        }
28019
28020        if (node.return === null) {
28021          throw new Error('Expected to reach root first.');
28022        }
28023
28024        node = node.return;
28025      }
28026    }
28027  }
28028
28029  function findChildHostInstancesForFiberShallowly(fiber, hostInstances) {
28030    {
28031      var node = fiber;
28032      var foundHostInstances = false;
28033
28034      while (true) {
28035        if (node.tag === HostComponent) {
28036          // We got a match.
28037          foundHostInstances = true;
28038          hostInstances.add(node.stateNode); // There may still be more, so keep searching.
28039        } else if (node.child !== null) {
28040          node.child.return = node;
28041          node = node.child;
28042          continue;
28043        }
28044
28045        if (node === fiber) {
28046          return foundHostInstances;
28047        }
28048
28049        while (node.sibling === null) {
28050          if (node.return === null || node.return === fiber) {
28051            return foundHostInstances;
28052          }
28053
28054          node = node.return;
28055        }
28056
28057        node.sibling.return = node.return;
28058        node = node.sibling;
28059      }
28060    }
28061
28062    return false;
28063  }
28064
28065  var hasBadMapPolyfill;
28066
28067  {
28068    hasBadMapPolyfill = false;
28069
28070    try {
28071      var nonExtensibleObject = Object.preventExtensions({});
28072      /* eslint-disable no-new */
28073
28074      new Map([[nonExtensibleObject, null]]);
28075      new Set([nonExtensibleObject]);
28076      /* eslint-enable no-new */
28077    } catch (e) {
28078      // TODO: Consider warning about bad polyfills
28079      hasBadMapPolyfill = true;
28080    }
28081  }
28082
28083  function FiberNode(tag, pendingProps, key, mode) {
28084    // Instance
28085    this.tag = tag;
28086    this.key = key;
28087    this.elementType = null;
28088    this.type = null;
28089    this.stateNode = null; // Fiber
28090
28091    this.return = null;
28092    this.child = null;
28093    this.sibling = null;
28094    this.index = 0;
28095    this.ref = null;
28096    this.pendingProps = pendingProps;
28097    this.memoizedProps = null;
28098    this.updateQueue = null;
28099    this.memoizedState = null;
28100    this.dependencies = null;
28101    this.mode = mode; // Effects
28102
28103    this.flags = NoFlags;
28104    this.subtreeFlags = NoFlags;
28105    this.deletions = null;
28106    this.lanes = NoLanes;
28107    this.childLanes = NoLanes;
28108    this.alternate = null;
28109
28110    {
28111      // Note: The following is done to avoid a v8 performance cliff.
28112      //
28113      // Initializing the fields below to smis and later updating them with
28114      // double values will cause Fibers to end up having separate shapes.
28115      // This behavior/bug has something to do with Object.preventExtension().
28116      // Fortunately this only impacts DEV builds.
28117      // Unfortunately it makes React unusably slow for some applications.
28118      // To work around this, initialize the fields below with doubles.
28119      //
28120      // Learn more about this here:
28121      // https://github.com/facebook/react/issues/14365
28122      // https://bugs.chromium.org/p/v8/issues/detail?id=8538
28123      this.actualDuration = Number.NaN;
28124      this.actualStartTime = Number.NaN;
28125      this.selfBaseDuration = Number.NaN;
28126      this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization.
28127      // This won't trigger the performance cliff mentioned above,
28128      // and it simplifies other profiler code (including DevTools).
28129
28130      this.actualDuration = 0;
28131      this.actualStartTime = -1;
28132      this.selfBaseDuration = 0;
28133      this.treeBaseDuration = 0;
28134    }
28135
28136    {
28137      // This isn't directly used but is handy for debugging internals:
28138      this._debugSource = null;
28139      this._debugOwner = null;
28140      this._debugNeedsRemount = false;
28141      this._debugHookTypes = null;
28142
28143      if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {
28144        Object.preventExtensions(this);
28145      }
28146    }
28147  } // This is a constructor function, rather than a POJO constructor, still
28148  // please ensure we do the following:
28149  // 1) Nobody should add any instance methods on this. Instance methods can be
28150  //    more difficult to predict when they get optimized and they are almost
28151  //    never inlined properly in static compilers.
28152  // 2) Nobody should rely on `instanceof Fiber` for type testing. We should
28153  //    always know when it is a fiber.
28154  // 3) We might want to experiment with using numeric keys since they are easier
28155  //    to optimize in a non-JIT environment.
28156  // 4) We can easily go from a constructor to a createFiber object literal if that
28157  //    is faster.
28158  // 5) It should be easy to port this to a C struct and keep a C implementation
28159  //    compatible.
28160
28161
28162  var createFiber = function (tag, pendingProps, key, mode) {
28163    // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors
28164    return new FiberNode(tag, pendingProps, key, mode);
28165  };
28166
28167  function shouldConstruct$1(Component) {
28168    var prototype = Component.prototype;
28169    return !!(prototype && prototype.isReactComponent);
28170  }
28171
28172  function isSimpleFunctionComponent(type) {
28173    return typeof type === 'function' && !shouldConstruct$1(type) && type.defaultProps === undefined;
28174  }
28175  function resolveLazyComponentTag(Component) {
28176    if (typeof Component === 'function') {
28177      return shouldConstruct$1(Component) ? ClassComponent : FunctionComponent;
28178    } else if (Component !== undefined && Component !== null) {
28179      var $$typeof = Component.$$typeof;
28180
28181      if ($$typeof === REACT_FORWARD_REF_TYPE) {
28182        return ForwardRef;
28183      }
28184
28185      if ($$typeof === REACT_MEMO_TYPE) {
28186        return MemoComponent;
28187      }
28188    }
28189
28190    return IndeterminateComponent;
28191  } // This is used to create an alternate fiber to do work on.
28192
28193  function createWorkInProgress(current, pendingProps) {
28194    var workInProgress = current.alternate;
28195
28196    if (workInProgress === null) {
28197      // We use a double buffering pooling technique because we know that we'll
28198      // only ever need at most two versions of a tree. We pool the "other" unused
28199      // node that we're free to reuse. This is lazily created to avoid allocating
28200      // extra objects for things that are never updated. It also allow us to
28201      // reclaim the extra memory if needed.
28202      workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);
28203      workInProgress.elementType = current.elementType;
28204      workInProgress.type = current.type;
28205      workInProgress.stateNode = current.stateNode;
28206
28207      {
28208        // DEV-only fields
28209        workInProgress._debugSource = current._debugSource;
28210        workInProgress._debugOwner = current._debugOwner;
28211        workInProgress._debugHookTypes = current._debugHookTypes;
28212      }
28213
28214      workInProgress.alternate = current;
28215      current.alternate = workInProgress;
28216    } else {
28217      workInProgress.pendingProps = pendingProps; // Needed because Blocks store data on type.
28218
28219      workInProgress.type = current.type; // We already have an alternate.
28220      // Reset the effect tag.
28221
28222      workInProgress.flags = NoFlags; // The effects are no longer valid.
28223
28224      workInProgress.subtreeFlags = NoFlags;
28225      workInProgress.deletions = null;
28226
28227      {
28228        // We intentionally reset, rather than copy, actualDuration & actualStartTime.
28229        // This prevents time from endlessly accumulating in new commits.
28230        // This has the downside of resetting values for different priority renders,
28231        // But works for yielding (the common case) and should support resuming.
28232        workInProgress.actualDuration = 0;
28233        workInProgress.actualStartTime = -1;
28234      }
28235    } // Reset all effects except static ones.
28236    // Static effects are not specific to a render.
28237
28238
28239    workInProgress.flags = current.flags & StaticMask;
28240    workInProgress.childLanes = current.childLanes;
28241    workInProgress.lanes = current.lanes;
28242    workInProgress.child = current.child;
28243    workInProgress.memoizedProps = current.memoizedProps;
28244    workInProgress.memoizedState = current.memoizedState;
28245    workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so
28246    // it cannot be shared with the current fiber.
28247
28248    var currentDependencies = current.dependencies;
28249    workInProgress.dependencies = currentDependencies === null ? null : {
28250      lanes: currentDependencies.lanes,
28251      firstContext: currentDependencies.firstContext
28252    }; // These will be overridden during the parent's reconciliation
28253
28254    workInProgress.sibling = current.sibling;
28255    workInProgress.index = current.index;
28256    workInProgress.ref = current.ref;
28257
28258    {
28259      workInProgress.selfBaseDuration = current.selfBaseDuration;
28260      workInProgress.treeBaseDuration = current.treeBaseDuration;
28261    }
28262
28263    {
28264      workInProgress._debugNeedsRemount = current._debugNeedsRemount;
28265
28266      switch (workInProgress.tag) {
28267        case IndeterminateComponent:
28268        case FunctionComponent:
28269        case SimpleMemoComponent:
28270          workInProgress.type = resolveFunctionForHotReloading(current.type);
28271          break;
28272
28273        case ClassComponent:
28274          workInProgress.type = resolveClassForHotReloading(current.type);
28275          break;
28276
28277        case ForwardRef:
28278          workInProgress.type = resolveForwardRefForHotReloading(current.type);
28279          break;
28280      }
28281    }
28282
28283    return workInProgress;
28284  } // Used to reuse a Fiber for a second pass.
28285
28286  function resetWorkInProgress(workInProgress, renderLanes) {
28287    // This resets the Fiber to what createFiber or createWorkInProgress would
28288    // have set the values to before during the first pass. Ideally this wouldn't
28289    // be necessary but unfortunately many code paths reads from the workInProgress
28290    // when they should be reading from current and writing to workInProgress.
28291    // We assume pendingProps, index, key, ref, return are still untouched to
28292    // avoid doing another reconciliation.
28293    // Reset the effect flags but keep any Placement tags, since that's something
28294    // that child fiber is setting, not the reconciliation.
28295    workInProgress.flags &= StaticMask | Placement; // The effects are no longer valid.
28296
28297    var current = workInProgress.alternate;
28298
28299    if (current === null) {
28300      // Reset to createFiber's initial values.
28301      workInProgress.childLanes = NoLanes;
28302      workInProgress.lanes = renderLanes;
28303      workInProgress.child = null;
28304      workInProgress.subtreeFlags = NoFlags;
28305      workInProgress.memoizedProps = null;
28306      workInProgress.memoizedState = null;
28307      workInProgress.updateQueue = null;
28308      workInProgress.dependencies = null;
28309      workInProgress.stateNode = null;
28310
28311      {
28312        // Note: We don't reset the actualTime counts. It's useful to accumulate
28313        // actual time across multiple render passes.
28314        workInProgress.selfBaseDuration = 0;
28315        workInProgress.treeBaseDuration = 0;
28316      }
28317    } else {
28318      // Reset to the cloned values that createWorkInProgress would've.
28319      workInProgress.childLanes = current.childLanes;
28320      workInProgress.lanes = current.lanes;
28321      workInProgress.child = current.child;
28322      workInProgress.subtreeFlags = NoFlags;
28323      workInProgress.deletions = null;
28324      workInProgress.memoizedProps = current.memoizedProps;
28325      workInProgress.memoizedState = current.memoizedState;
28326      workInProgress.updateQueue = current.updateQueue; // Needed because Blocks store data on type.
28327
28328      workInProgress.type = current.type; // Clone the dependencies object. This is mutated during the render phase, so
28329      // it cannot be shared with the current fiber.
28330
28331      var currentDependencies = current.dependencies;
28332      workInProgress.dependencies = currentDependencies === null ? null : {
28333        lanes: currentDependencies.lanes,
28334        firstContext: currentDependencies.firstContext
28335      };
28336
28337      {
28338        // Note: We don't reset the actualTime counts. It's useful to accumulate
28339        // actual time across multiple render passes.
28340        workInProgress.selfBaseDuration = current.selfBaseDuration;
28341        workInProgress.treeBaseDuration = current.treeBaseDuration;
28342      }
28343    }
28344
28345    return workInProgress;
28346  }
28347  function createHostRootFiber(tag, isStrictMode, concurrentUpdatesByDefaultOverride) {
28348    var mode;
28349
28350    if (tag === ConcurrentRoot) {
28351      mode = ConcurrentMode;
28352
28353      if (isStrictMode === true) {
28354        mode |= StrictLegacyMode;
28355
28356        {
28357          mode |= StrictEffectsMode;
28358        }
28359      }
28360    } else {
28361      mode = NoMode;
28362    }
28363
28364    if ( isDevToolsPresent) {
28365      // Always collect profile timings when DevTools are present.
28366      // This enables DevTools to start capturing timing at any point–
28367      // Without some nodes in the tree having empty base times.
28368      mode |= ProfileMode;
28369    }
28370
28371    return createFiber(HostRoot, null, null, mode);
28372  }
28373  function createFiberFromTypeAndProps(type, // React$ElementType
28374  key, pendingProps, owner, mode, lanes) {
28375    var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy.
28376
28377    var resolvedType = type;
28378
28379    if (typeof type === 'function') {
28380      if (shouldConstruct$1(type)) {
28381        fiberTag = ClassComponent;
28382
28383        {
28384          resolvedType = resolveClassForHotReloading(resolvedType);
28385        }
28386      } else {
28387        {
28388          resolvedType = resolveFunctionForHotReloading(resolvedType);
28389        }
28390      }
28391    } else if (typeof type === 'string') {
28392      fiberTag = HostComponent;
28393    } else {
28394      getTag: switch (type) {
28395        case REACT_FRAGMENT_TYPE:
28396          return createFiberFromFragment(pendingProps.children, mode, lanes, key);
28397
28398        case REACT_STRICT_MODE_TYPE:
28399          fiberTag = Mode;
28400          mode |= StrictLegacyMode;
28401
28402          if ( (mode & ConcurrentMode) !== NoMode) {
28403            // Strict effects should never run on legacy roots
28404            mode |= StrictEffectsMode;
28405          }
28406
28407          break;
28408
28409        case REACT_PROFILER_TYPE:
28410          return createFiberFromProfiler(pendingProps, mode, lanes, key);
28411
28412        case REACT_SUSPENSE_TYPE:
28413          return createFiberFromSuspense(pendingProps, mode, lanes, key);
28414
28415        case REACT_SUSPENSE_LIST_TYPE:
28416          return createFiberFromSuspenseList(pendingProps, mode, lanes, key);
28417
28418        case REACT_OFFSCREEN_TYPE:
28419          return createFiberFromOffscreen(pendingProps, mode, lanes, key);
28420
28421        case REACT_LEGACY_HIDDEN_TYPE:
28422
28423        // eslint-disable-next-line no-fallthrough
28424
28425        case REACT_SCOPE_TYPE:
28426
28427        // eslint-disable-next-line no-fallthrough
28428
28429        case REACT_CACHE_TYPE:
28430
28431        // eslint-disable-next-line no-fallthrough
28432
28433        case REACT_TRACING_MARKER_TYPE:
28434
28435        // eslint-disable-next-line no-fallthrough
28436
28437        case REACT_DEBUG_TRACING_MODE_TYPE:
28438
28439        // eslint-disable-next-line no-fallthrough
28440
28441        default:
28442          {
28443            if (typeof type === 'object' && type !== null) {
28444              switch (type.$$typeof) {
28445                case REACT_PROVIDER_TYPE:
28446                  fiberTag = ContextProvider;
28447                  break getTag;
28448
28449                case REACT_CONTEXT_TYPE:
28450                  // This is a consumer
28451                  fiberTag = ContextConsumer;
28452                  break getTag;
28453
28454                case REACT_FORWARD_REF_TYPE:
28455                  fiberTag = ForwardRef;
28456
28457                  {
28458                    resolvedType = resolveForwardRefForHotReloading(resolvedType);
28459                  }
28460
28461                  break getTag;
28462
28463                case REACT_MEMO_TYPE:
28464                  fiberTag = MemoComponent;
28465                  break getTag;
28466
28467                case REACT_LAZY_TYPE:
28468                  fiberTag = LazyComponent;
28469                  resolvedType = null;
28470                  break getTag;
28471              }
28472            }
28473
28474            var info = '';
28475
28476            {
28477              if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
28478                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.';
28479              }
28480
28481              var ownerName = owner ? getComponentNameFromFiber(owner) : null;
28482
28483              if (ownerName) {
28484                info += '\n\nCheck the render method of `' + ownerName + '`.';
28485              }
28486            }
28487
28488            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));
28489          }
28490      }
28491    }
28492
28493    var fiber = createFiber(fiberTag, pendingProps, key, mode);
28494    fiber.elementType = type;
28495    fiber.type = resolvedType;
28496    fiber.lanes = lanes;
28497
28498    {
28499      fiber._debugOwner = owner;
28500    }
28501
28502    return fiber;
28503  }
28504  function createFiberFromElement(element, mode, lanes) {
28505    var owner = null;
28506
28507    {
28508      owner = element._owner;
28509    }
28510
28511    var type = element.type;
28512    var key = element.key;
28513    var pendingProps = element.props;
28514    var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes);
28515
28516    {
28517      fiber._debugSource = element._source;
28518      fiber._debugOwner = element._owner;
28519    }
28520
28521    return fiber;
28522  }
28523  function createFiberFromFragment(elements, mode, lanes, key) {
28524    var fiber = createFiber(Fragment, elements, key, mode);
28525    fiber.lanes = lanes;
28526    return fiber;
28527  }
28528
28529  function createFiberFromProfiler(pendingProps, mode, lanes, key) {
28530    {
28531      if (typeof pendingProps.id !== 'string') {
28532        error('Profiler must specify an "id" of type `string` as a prop. Received the type `%s` instead.', typeof pendingProps.id);
28533      }
28534    }
28535
28536    var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode);
28537    fiber.elementType = REACT_PROFILER_TYPE;
28538    fiber.lanes = lanes;
28539
28540    {
28541      fiber.stateNode = {
28542        effectDuration: 0,
28543        passiveEffectDuration: 0
28544      };
28545    }
28546
28547    return fiber;
28548  }
28549
28550  function createFiberFromSuspense(pendingProps, mode, lanes, key) {
28551    var fiber = createFiber(SuspenseComponent, pendingProps, key, mode);
28552    fiber.elementType = REACT_SUSPENSE_TYPE;
28553    fiber.lanes = lanes;
28554    return fiber;
28555  }
28556  function createFiberFromSuspenseList(pendingProps, mode, lanes, key) {
28557    var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode);
28558    fiber.elementType = REACT_SUSPENSE_LIST_TYPE;
28559    fiber.lanes = lanes;
28560    return fiber;
28561  }
28562  function createFiberFromOffscreen(pendingProps, mode, lanes, key) {
28563    var fiber = createFiber(OffscreenComponent, pendingProps, key, mode);
28564    fiber.elementType = REACT_OFFSCREEN_TYPE;
28565    fiber.lanes = lanes;
28566    var primaryChildInstance = {
28567      isHidden: false
28568    };
28569    fiber.stateNode = primaryChildInstance;
28570    return fiber;
28571  }
28572  function createFiberFromText(content, mode, lanes) {
28573    var fiber = createFiber(HostText, content, null, mode);
28574    fiber.lanes = lanes;
28575    return fiber;
28576  }
28577  function createFiberFromHostInstanceForDeletion() {
28578    var fiber = createFiber(HostComponent, null, null, NoMode);
28579    fiber.elementType = 'DELETED';
28580    return fiber;
28581  }
28582  function createFiberFromDehydratedFragment(dehydratedNode) {
28583    var fiber = createFiber(DehydratedFragment, null, null, NoMode);
28584    fiber.stateNode = dehydratedNode;
28585    return fiber;
28586  }
28587  function createFiberFromPortal(portal, mode, lanes) {
28588    var pendingProps = portal.children !== null ? portal.children : [];
28589    var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);
28590    fiber.lanes = lanes;
28591    fiber.stateNode = {
28592      containerInfo: portal.containerInfo,
28593      pendingChildren: null,
28594      // Used by persistent updates
28595      implementation: portal.implementation
28596    };
28597    return fiber;
28598  } // Used for stashing WIP properties to replay failed work in DEV.
28599
28600  function assignFiberPropertiesInDEV(target, source) {
28601    if (target === null) {
28602      // This Fiber's initial properties will always be overwritten.
28603      // We only use a Fiber to ensure the same hidden class so DEV isn't slow.
28604      target = createFiber(IndeterminateComponent, null, null, NoMode);
28605    } // This is intentionally written as a list of all properties.
28606    // We tried to use Object.assign() instead but this is called in
28607    // the hottest path, and Object.assign() was too slow:
28608    // https://github.com/facebook/react/issues/12502
28609    // This code is DEV-only so size is not a concern.
28610
28611
28612    target.tag = source.tag;
28613    target.key = source.key;
28614    target.elementType = source.elementType;
28615    target.type = source.type;
28616    target.stateNode = source.stateNode;
28617    target.return = source.return;
28618    target.child = source.child;
28619    target.sibling = source.sibling;
28620    target.index = source.index;
28621    target.ref = source.ref;
28622    target.pendingProps = source.pendingProps;
28623    target.memoizedProps = source.memoizedProps;
28624    target.updateQueue = source.updateQueue;
28625    target.memoizedState = source.memoizedState;
28626    target.dependencies = source.dependencies;
28627    target.mode = source.mode;
28628    target.flags = source.flags;
28629    target.subtreeFlags = source.subtreeFlags;
28630    target.deletions = source.deletions;
28631    target.lanes = source.lanes;
28632    target.childLanes = source.childLanes;
28633    target.alternate = source.alternate;
28634
28635    {
28636      target.actualDuration = source.actualDuration;
28637      target.actualStartTime = source.actualStartTime;
28638      target.selfBaseDuration = source.selfBaseDuration;
28639      target.treeBaseDuration = source.treeBaseDuration;
28640    }
28641
28642    target._debugSource = source._debugSource;
28643    target._debugOwner = source._debugOwner;
28644    target._debugNeedsRemount = source._debugNeedsRemount;
28645    target._debugHookTypes = source._debugHookTypes;
28646    return target;
28647  }
28648
28649  function FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onRecoverableError) {
28650    this.tag = tag;
28651    this.containerInfo = containerInfo;
28652    this.pendingChildren = null;
28653    this.current = null;
28654    this.pingCache = null;
28655    this.finishedWork = null;
28656    this.timeoutHandle = noTimeout;
28657    this.context = null;
28658    this.pendingContext = null;
28659    this.callbackNode = null;
28660    this.callbackPriority = NoLane;
28661    this.eventTimes = createLaneMap(NoLanes);
28662    this.expirationTimes = createLaneMap(NoTimestamp);
28663    this.pendingLanes = NoLanes;
28664    this.suspendedLanes = NoLanes;
28665    this.pingedLanes = NoLanes;
28666    this.expiredLanes = NoLanes;
28667    this.mutableReadLanes = NoLanes;
28668    this.finishedLanes = NoLanes;
28669    this.entangledLanes = NoLanes;
28670    this.entanglements = createLaneMap(NoLanes);
28671    this.identifierPrefix = identifierPrefix;
28672    this.onRecoverableError = onRecoverableError;
28673
28674    {
28675      this.mutableSourceEagerHydrationData = null;
28676    }
28677
28678    {
28679      this.effectDuration = 0;
28680      this.passiveEffectDuration = 0;
28681    }
28682
28683    {
28684      this.memoizedUpdaters = new Set();
28685      var pendingUpdatersLaneMap = this.pendingUpdatersLaneMap = [];
28686
28687      for (var _i = 0; _i < TotalLanes; _i++) {
28688        pendingUpdatersLaneMap.push(new Set());
28689      }
28690    }
28691
28692    {
28693      switch (tag) {
28694        case ConcurrentRoot:
28695          this._debugRootType = hydrate ? 'hydrateRoot()' : 'createRoot()';
28696          break;
28697
28698        case LegacyRoot:
28699          this._debugRootType = hydrate ? 'hydrate()' : 'render()';
28700          break;
28701      }
28702    }
28703  }
28704
28705  function createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, // TODO: We have several of these arguments that are conceptually part of the
28706  // host config, but because they are passed in at runtime, we have to thread
28707  // them through the root constructor. Perhaps we should put them all into a
28708  // single type, like a DynamicHostConfig that is defined by the renderer.
28709  identifierPrefix, onRecoverableError, transitionCallbacks) {
28710    var root = new FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onRecoverableError);
28711    // stateNode is any.
28712
28713
28714    var uninitializedFiber = createHostRootFiber(tag, isStrictMode);
28715    root.current = uninitializedFiber;
28716    uninitializedFiber.stateNode = root;
28717
28718    {
28719      var _initialState = {
28720        element: initialChildren,
28721        isDehydrated: hydrate,
28722        cache: null,
28723        // not enabled yet
28724        transitions: null,
28725        pendingSuspenseBoundaries: null
28726      };
28727      uninitializedFiber.memoizedState = _initialState;
28728    }
28729
28730    initializeUpdateQueue(uninitializedFiber);
28731    return root;
28732  }
28733
28734  var ReactVersion = '18.3.1';
28735
vendor: 10,125 bytes, lines 28736-29035
28736  function createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation.
28737  implementation) {
28738    var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
28739
28740    {
28741      checkKeyStringCoercion(key);
28742    }
28743
28744    return {
28745      // This tag allow us to uniquely identify this as a React Portal
28746      $$typeof: REACT_PORTAL_TYPE,
28747      key: key == null ? null : '' + key,
28748      children: children,
28749      containerInfo: containerInfo,
28750      implementation: implementation
28751    };
28752  }
28753
28754  var didWarnAboutNestedUpdates;
28755  var didWarnAboutFindNodeInStrictMode;
28756
28757  {
28758    didWarnAboutNestedUpdates = false;
28759    didWarnAboutFindNodeInStrictMode = {};
28760  }
28761
28762  function getContextForSubtree(parentComponent) {
28763    if (!parentComponent) {
28764      return emptyContextObject;
28765    }
28766
28767    var fiber = get(parentComponent);
28768    var parentContext = findCurrentUnmaskedContext(fiber);
28769
28770    if (fiber.tag === ClassComponent) {
28771      var Component = fiber.type;
28772
28773      if (isContextProvider(Component)) {
28774        return processChildContext(fiber, Component, parentContext);
28775      }
28776    }
28777
28778    return parentContext;
28779  }
28780
28781  function findHostInstanceWithWarning(component, methodName) {
28782    {
28783      var fiber = get(component);
28784
28785      if (fiber === undefined) {
28786        if (typeof component.render === 'function') {
28787          throw new Error('Unable to find node on an unmounted component.');
28788        } else {
28789          var keys = Object.keys(component).join(',');
28790          throw new Error("Argument appears to not be a ReactComponent. Keys: " + keys);
28791        }
28792      }
28793
28794      var hostFiber = findCurrentHostFiber(fiber);
28795
28796      if (hostFiber === null) {
28797        return null;
28798      }
28799
28800      if (hostFiber.mode & StrictLegacyMode) {
28801        var componentName = getComponentNameFromFiber(fiber) || 'Component';
28802
28803        if (!didWarnAboutFindNodeInStrictMode[componentName]) {
28804          didWarnAboutFindNodeInStrictMode[componentName] = true;
28805          var previousFiber = current;
28806
28807          try {
28808            setCurrentFiber(hostFiber);
28809
28810            if (fiber.mode & StrictLegacyMode) {
28811              error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-find-node', methodName, methodName, componentName);
28812            } else {
28813              error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-find-node', methodName, methodName, componentName);
28814            }
28815          } finally {
28816            // Ideally this should reset to previous but this shouldn't be called in
28817            // render and there's another warning for that anyway.
28818            if (previousFiber) {
28819              setCurrentFiber(previousFiber);
28820            } else {
28821              resetCurrentFiber();
28822            }
28823          }
28824        }
28825      }
28826
28827      return hostFiber.stateNode;
28828    }
28829  }
28830
28831  function createContainer(containerInfo, tag, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) {
28832    var hydrate = false;
28833    var initialChildren = null;
28834    return createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
28835  }
28836  function createHydrationContainer(initialChildren, // TODO: Remove `callback` when we delete legacy mode.
28837  callback, containerInfo, tag, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) {
28838    var hydrate = true;
28839    var root = createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError); // TODO: Move this to FiberRoot constructor
28840
28841    root.context = getContextForSubtree(null); // Schedule the initial render. In a hydration root, this is different from
28842    // a regular update because the initial render must match was was rendered
28843    // on the server.
28844    // NOTE: This update intentionally doesn't have a payload. We're only using
28845    // the update to schedule work on the root fiber (and, for legacy roots, to
28846    // enqueue the callback if one is provided).
28847
28848    var current = root.current;
28849    var eventTime = requestEventTime();
28850    var lane = requestUpdateLane(current);
28851    var update = createUpdate(eventTime, lane);
28852    update.callback = callback !== undefined && callback !== null ? callback : null;
28853    enqueueUpdate(current, update, lane);
28854    scheduleInitialHydrationOnRoot(root, lane, eventTime);
28855    return root;
28856  }
28857  function updateContainer(element, container, parentComponent, callback) {
28858    {
28859      onScheduleRoot(container, element);
28860    }
28861
28862    var current$1 = container.current;
28863    var eventTime = requestEventTime();
28864    var lane = requestUpdateLane(current$1);
28865
28866    {
28867      markRenderScheduled(lane);
28868    }
28869
28870    var context = getContextForSubtree(parentComponent);
28871
28872    if (container.context === null) {
28873      container.context = context;
28874    } else {
28875      container.pendingContext = context;
28876    }
28877
28878    {
28879      if (isRendering && current !== null && !didWarnAboutNestedUpdates) {
28880        didWarnAboutNestedUpdates = true;
28881
28882        error('Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\n\n' + 'Check the render method of %s.', getComponentNameFromFiber(current) || 'Unknown');
28883      }
28884    }
28885
28886    var update = createUpdate(eventTime, lane); // Caution: React DevTools currently depends on this property
28887    // being called "element".
28888
28889    update.payload = {
28890      element: element
28891    };
28892    callback = callback === undefined ? null : callback;
28893
28894    if (callback !== null) {
28895      {
28896        if (typeof callback !== 'function') {
28897          error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback);
28898        }
28899      }
28900
28901      update.callback = callback;
28902    }
28903
28904    var root = enqueueUpdate(current$1, update, lane);
28905
28906    if (root !== null) {
28907      scheduleUpdateOnFiber(root, current$1, lane, eventTime);
28908      entangleTransitions(root, current$1, lane);
28909    }
28910
28911    return lane;
28912  }
28913  function getPublicRootInstance(container) {
28914    var containerFiber = container.current;
28915
28916    if (!containerFiber.child) {
28917      return null;
28918    }
28919
28920    switch (containerFiber.child.tag) {
28921      case HostComponent:
28922        return getPublicInstance(containerFiber.child.stateNode);
28923
28924      default:
28925        return containerFiber.child.stateNode;
28926    }
28927  }
28928  function attemptSynchronousHydration$1(fiber) {
28929    switch (fiber.tag) {
28930      case HostRoot:
28931        {
28932          var root = fiber.stateNode;
28933
28934          if (isRootDehydrated(root)) {
28935            // Flush the first scheduled "update".
28936            var lanes = getHighestPriorityPendingLanes(root);
28937            flushRoot(root, lanes);
28938          }
28939
28940          break;
28941        }
28942
28943      case SuspenseComponent:
28944        {
28945          flushSync(function () {
28946            var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
28947
28948            if (root !== null) {
28949              var eventTime = requestEventTime();
28950              scheduleUpdateOnFiber(root, fiber, SyncLane, eventTime);
28951            }
28952          }); // If we're still blocked after this, we need to increase
28953          // the priority of any promises resolving within this
28954          // boundary so that they next attempt also has higher pri.
28955
28956          var retryLane = SyncLane;
28957          markRetryLaneIfNotHydrated(fiber, retryLane);
28958          break;
28959        }
28960    }
28961  }
28962
28963  function markRetryLaneImpl(fiber, retryLane) {
28964    var suspenseState = fiber.memoizedState;
28965
28966    if (suspenseState !== null && suspenseState.dehydrated !== null) {
28967      suspenseState.retryLane = higherPriorityLane(suspenseState.retryLane, retryLane);
28968    }
28969  } // Increases the priority of thenables when they resolve within this boundary.
28970
28971
28972  function markRetryLaneIfNotHydrated(fiber, retryLane) {
28973    markRetryLaneImpl(fiber, retryLane);
28974    var alternate = fiber.alternate;
28975
28976    if (alternate) {
28977      markRetryLaneImpl(alternate, retryLane);
28978    }
28979  }
28980  function attemptContinuousHydration$1(fiber) {
28981    if (fiber.tag !== SuspenseComponent) {
28982      // We ignore HostRoots here because we can't increase
28983      // their priority and they should not suspend on I/O,
28984      // since you have to wrap anything that might suspend in
28985      // Suspense.
28986      return;
28987    }
28988
28989    var lane = SelectiveHydrationLane;
28990    var root = enqueueConcurrentRenderForLane(fiber, lane);
28991
28992    if (root !== null) {
28993      var eventTime = requestEventTime();
28994      scheduleUpdateOnFiber(root, fiber, lane, eventTime);
28995    }
28996
28997    markRetryLaneIfNotHydrated(fiber, lane);
28998  }
28999  function attemptHydrationAtCurrentPriority$1(fiber) {
29000    if (fiber.tag !== SuspenseComponent) {
29001      // We ignore HostRoots here because we can't increase
29002      // their priority other than synchronously flush it.
29003      return;
29004    }
29005
29006    var lane = requestUpdateLane(fiber);
29007    var root = enqueueConcurrentRenderForLane(fiber, lane);
29008
29009    if (root !== null) {
29010      var eventTime = requestEventTime();
29011      scheduleUpdateOnFiber(root, fiber, lane, eventTime);
29012    }
29013
29014    markRetryLaneIfNotHydrated(fiber, lane);
29015  }
29016  function findHostInstanceWithNoPortals(fiber) {
29017    var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
29018
29019    if (hostFiber === null) {
29020      return null;
29021    }
29022
29023    return hostFiber.stateNode;
29024  }
29025
29026  var shouldErrorImpl = function (fiber) {
29027    return null;
29028  };
29029
29030  function shouldError(fiber) {
29031    return shouldErrorImpl(fiber);
29032  }
29033
29034  var shouldSuspendImpl = function (fiber) {
29035    return false;
29036  };
29037
29038  function shouldSuspend(fiber) {
29039    return shouldSuspendImpl(fiber);
29040  }
29041  var overrideHookState = null;
29042  var overrideHookStateDeletePath = null;
29043  var overrideHookStateRenamePath = null;
29044  var overrideProps = null;
29045  var overridePropsDeletePath = null;
29046  var overridePropsRenamePath = null;
29047  var scheduleUpdate = null;
29048  var setErrorHandler = null;
29049  var setSuspenseHandler = null;
29050
29051  {
29052    var copyWithDeleteImpl = function (obj, path, index) {
29053      var key = path[index];
29054      var updated = isArray(obj) ? obj.slice() : assign({}, obj);
29055
29056      if (index + 1 === path.length) {
29057        if (isArray(updated)) {
29058          updated.splice(key, 1);
29059        } else {
29060          delete updated[key];
29061        }
29062
29063        return updated;
29064      } // $FlowFixMe number or string is fine here
29065
29066
29067      updated[key] = copyWithDeleteImpl(obj[key], path, index + 1);
29068      return updated;
29069    };
29070
29071    var copyWithDelete = function (obj, path) {
29072      return copyWithDeleteImpl(obj, path, 0);
29073    };
29074
29075    var copyWithRenameImpl = function (obj, oldPath, newPath, index) {
29076      var oldKey = oldPath[index];
29077      var updated = isArray(obj) ? obj.slice() : assign({}, obj);
29078
29079      if (index + 1 === oldPath.length) {
29080        var newKey = newPath[index]; // $FlowFixMe number or string is fine here
29081
29082        updated[newKey] = updated[oldKey];
29083
29084        if (isArray(updated)) {
29085          updated.splice(oldKey, 1);
29086        } else {
29087          delete updated[oldKey];
29088        }
29089      } else {
29090        // $FlowFixMe number or string is fine here
29091        updated[oldKey] = copyWithRenameImpl( // $FlowFixMe number or string is fine here
29092        obj[oldKey], oldPath, newPath, index + 1);
29093      }
29094
29095      return updated;
29096    };
29097
29098    var copyWithRename = function (obj, oldPath, newPath) {
29099      if (oldPath.length !== newPath.length) {
29100        warn('copyWithRename() expects paths of the same length');
29101
29102        return;
29103      } else {
29104        for (var i = 0; i < newPath.length - 1; i++) {
29105          if (oldPath[i] !== newPath[i]) {
29106            warn('copyWithRename() expects paths to be the same except for the deepest key');
29107
29108            return;
29109          }
29110        }
29111      }
29112
29113      return copyWithRenameImpl(obj, oldPath, newPath, 0);
29114    };
29115
29116    var copyWithSetImpl = function (obj, path, index, value) {
29117      if (index >= path.length) {
29118        return value;
29119      }
29120
29121      var key = path[index];
29122      var updated = isArray(obj) ? obj.slice() : assign({}, obj); // $FlowFixMe number or string is fine here
29123
29124      updated[key] = copyWithSetImpl(obj[key], path, index + 1, value);
29125      return updated;
29126    };
29127
29128    var copyWithSet = function (obj, path, value) {
29129      return copyWithSetImpl(obj, path, 0, value);
29130    };
29131
29132    var findHook = function (fiber, id) {
29133      // For now, the "id" of stateful hooks is just the stateful hook index.
29134      // This may change in the future with e.g. nested hooks.
29135      var currentHook = fiber.memoizedState;
29136
29137      while (currentHook !== null && id > 0) {
29138        currentHook = currentHook.next;
29139        id--;
29140      }
29141
29142      return currentHook;
29143    }; // Support DevTools editable values for useState and useReducer.
29144
29145
29146    overrideHookState = function (fiber, id, path, value) {
29147      var hook = findHook(fiber, id);
29148
29149      if (hook !== null) {
29150        var newState = copyWithSet(hook.memoizedState, path, value);
29151        hook.memoizedState = newState;
29152        hook.baseState = newState; // We aren't actually adding an update to the queue,
29153        // because there is no update we can add for useReducer hooks that won't trigger an error.
29154        // (There's no appropriate action type for DevTools overrides.)
29155        // As a result though, React will see the scheduled update as a noop and bailout.
29156        // Shallow cloning props works as a workaround for now to bypass the bailout check.
29157
29158        fiber.memoizedProps = assign({}, fiber.memoizedProps);
29159        var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29160
29161        if (root !== null) {
29162          scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29163        }
29164      }
29165    };
29166
29167    overrideHookStateDeletePath = function (fiber, id, path) {
29168      var hook = findHook(fiber, id);
29169
29170      if (hook !== null) {
29171        var newState = copyWithDelete(hook.memoizedState, path);
29172        hook.memoizedState = newState;
29173        hook.baseState = newState; // We aren't actually adding an update to the queue,
29174        // because there is no update we can add for useReducer hooks that won't trigger an error.
29175        // (There's no appropriate action type for DevTools overrides.)
29176        // As a result though, React will see the scheduled update as a noop and bailout.
29177        // Shallow cloning props works as a workaround for now to bypass the bailout check.
29178
29179        fiber.memoizedProps = assign({}, fiber.memoizedProps);
29180        var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29181
29182        if (root !== null) {
29183          scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29184        }
29185      }
29186    };
29187
29188    overrideHookStateRenamePath = function (fiber, id, oldPath, newPath) {
29189      var hook = findHook(fiber, id);
29190
29191      if (hook !== null) {
29192        var newState = copyWithRename(hook.memoizedState, oldPath, newPath);
29193        hook.memoizedState = newState;
29194        hook.baseState = newState; // We aren't actually adding an update to the queue,
29195        // because there is no update we can add for useReducer hooks that won't trigger an error.
29196        // (There's no appropriate action type for DevTools overrides.)
29197        // As a result though, React will see the scheduled update as a noop and bailout.
29198        // Shallow cloning props works as a workaround for now to bypass the bailout check.
29199
29200        fiber.memoizedProps = assign({}, fiber.memoizedProps);
29201        var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29202
29203        if (root !== null) {
29204          scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29205        }
29206      }
29207    };
29207 // Support DevTools props for function components, forwardRef, memo, host components, etc.
29208
29209
29210    overrideProps = function (fiber, path, value) {
29211      fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);
29212
29213      if (fiber.alternate) {
29214        fiber.alternate.pendingProps = fiber.pendingProps;
29215      }
29216
29217      var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29218
29219      if (root !== null) {
29220        scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29221      }
29222    };
29223
29224    overridePropsDeletePath = function (fiber, path) {
29225      fiber.pendingProps = copyWithDelete(fiber.memoizedProps, path);
29226
29227      if (fiber.alternate) {
29228        fiber.alternate.pendingProps = fiber.pendingProps;
29229      }
29230
29231      var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29232
29233      if (root !== null) {
29234        scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29235      }
29236    };
29237
29238    overridePropsRenamePath = function (fiber, oldPath, newPath) {
29239      fiber.pendingProps = copyWithRename(fiber.memoizedProps, oldPath, newPath);
29240
29241      if (fiber.alternate) {
29242        fiber.alternate.pendingProps = fiber.pendingProps;
29243      }
29244
29245      var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29246
29247      if (root !== null) {
29248        scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29249      }
29250    };
29251
29252    scheduleUpdate = function (fiber) {
29253      var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
29254
29255      if (root !== null) {
29256        scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
29257      }
29258    };
29259
29260    setErrorHandler = function (newShouldErrorImpl) {
29261      shouldErrorImpl = newShouldErrorImpl;
29262    };
29263
29264    setSuspenseHandler = function (newShouldSuspendImpl) {
29265      shouldSuspendImpl = newShouldSuspendImpl;
29266    };
29267  }
29268
29269  function findHostInstanceByFiber(fiber) {
29270    var hostFiber = findCurrentHostFiber(fiber);
29271
29272    if (hostFiber === null) {
29273      return null;
29274    }
29275
29276    return hostFiber.stateNode;
29277  }
29278
29279  function emptyFindFiberByHostInstance(instance) {
29280    return null;
29281  }
29282
29283  function getCurrentFiberForDevTools() {
29284    return current;
29285  }
29286
29287  function injectIntoDevTools(devToolsConfig) {
29288    var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
29289    var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
29290    return injectInternals({
29291      bundleType: devToolsConfig.bundleType,
29292      version: devToolsConfig.version,
29293      rendererPackageName: devToolsConfig.rendererPackageName,
29294      rendererConfig: devToolsConfig.rendererConfig,
29295      overrideHookState: overrideHookState,
29296      overrideHookStateDeletePath: overrideHookStateDeletePath,
29297      overrideHookStateRenamePath: overrideHookStateRenamePath,
29298      overrideProps: overrideProps,
29299      overridePropsDeletePath: overridePropsDeletePath,
29300      overridePropsRenamePath: overridePropsRenamePath,
29301      setErrorHandler: setErrorHandler,
29302      setSuspenseHandler: setSuspenseHandler,
29303      scheduleUpdate: scheduleUpdate,
29304      currentDispatcherRef: ReactCurrentDispatcher,
29305      findHostInstanceByFiber: findHostInstanceByFiber,
29306      findFiberByHostInstance: findFiberByHostInstance || emptyFindFiberByHostInstance,
29307      // React Refresh
29308      findHostInstancesForRefresh:  findHostInstancesForRefresh ,
29309      scheduleRefresh:  scheduleRefresh ,
29310      scheduleRoot:  scheduleRoot ,
29311      setRefreshHandler:  setRefreshHandler ,
29312      // Enables DevTools to append owner stacks to error messages in DEV mode.
29313      getCurrentFiber:  getCurrentFiberForDevTools ,
29314      // Enables DevTools to detect reconciler version rather than renderer version
29315      // which may not match for third party renderers.
29316      reconcilerVersion: ReactVersion
29317    });
29318  }
29319
29320  /* global reportError */
29321
29322  var defaultOnRecoverableError = typeof reportError === 'function' ? // In modern browsers, reportError will dispatch an error event,
29323  // emulating an uncaught JavaScript error.
29324  reportError : function (error) {
29325    // In older browsers and test environments, fallback to console.error.
29326    // eslint-disable-next-line react-internal/no-production-logging
29327    console['error'](error);
29328  };
29329
29330  function ReactDOMRoot(internalRoot) {
29331    this._internalRoot = internalRoot;
29332  }
29333
29334  ReactDOMHydrationRoot.prototype.render = ReactDOMRoot.prototype.render = function (children) {
29335    var root = this._internalRoot;
29336
29337    if (root === null) {
29338      throw new Error('Cannot update an unmounted root.');
29339    }
29340
29341    {
29342      if (typeof arguments[1] === 'function') {
29343        error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');
29344      } else if (isValidContainer(arguments[1])) {
29345        error('You passed a container to the second argument of root.render(...). ' + "You don't need to pass it again since you already passed it to create the root.");
29346      } else if (typeof arguments[1] !== 'undefined') {
29347        error('You passed a second argument to root.render(...) but it only accepts ' + 'one argument.');
29348      }
29349
29350      var container = root.containerInfo;
29351
29352      if (container.nodeType !== COMMENT_NODE) {
29353        var hostInstance = findHostInstanceWithNoPortals(root.current);
29354
29355        if (hostInstance) {
29356          if (hostInstance.parentNode !== container) {
29357            error('render(...): It looks like the React-rendered content of the ' + 'root container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + "root.unmount() to empty a root's container.");
29358          }
29359        }
29360      }
29361    }
29362
29363    updateContainer(children, root, null, null);
29364  };
29365
29366  ReactDOMHydrationRoot.prototype.unmount = ReactDOMRoot.prototype.unmount = function () {
29367    {
29368      if (typeof arguments[0] === 'function') {
29369        error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');
29370      }
29371    }
29372
29373    var root = this._internalRoot;
29374
29375    if (root !== null) {
29376      this._internalRoot = null;
29377      var container = root.containerInfo;
29378
29379      {
29380        if (isAlreadyRendering()) {
29381          error('Attempted to synchronously unmount a root while React was already ' + 'rendering. React cannot finish unmounting the root until the ' + 'current render has completed, which may lead to a race condition.');
29382        }
29383      }
29384
29385      flushSync(function () {
29386        updateContainer(null, root, null, null);
29387      });
29388      unmarkContainerAsRoot(container);
29389    }
29390  };
29391
29392  function createRoot(container, options) {
29393    if (!isValidContainer(container)) {
29394      throw new Error('createRoot(...): Target container is not a DOM element.');
29395    }
29396
29397    warnIfReactDOMContainerInDEV(container);
29398    var isStrictMode = false;
29399    var concurrentUpdatesByDefaultOverride = false;
29400    var identifierPrefix = '';
29401    var onRecoverableError = defaultOnRecoverableError;
29402    var transitionCallbacks = null;
29403
29404    if (options !== null && options !== undefined) {
29405      {
29406        if (options.hydrate) {
29407          warn('hydrate through createRoot is deprecated. Use ReactDOMClient.hydrateRoot(container, <App />) instead.');
29408        } else {
29409          if (typeof options === 'object' && options !== null && options.$$typeof === REACT_ELEMENT_TYPE) {
29410            error('You passed a JSX element to createRoot. You probably meant to ' + 'call root.render instead. ' + 'Example usage:\n\n' + '  let root = createRoot(domContainer);\n' + '  root.render(<App />);');
29411          }
29412        }
29413      }
29414
29415      if (options.unstable_strictMode === true) {
29416        isStrictMode = true;
29417      }
29418
29419      if (options.identifierPrefix !== undefined) {
29420        identifierPrefix = options.identifierPrefix;
29421      }
29422
29423      if (options.onRecoverableError !== undefined) {
29424        onRecoverableError = options.onRecoverableError;
29425      }
29426
29427      if (options.transitionCallbacks !== undefined) {
29428        transitionCallbacks = options.transitionCallbacks;
29429      }
29430    }
29431
29432    var root = createContainer(container, ConcurrentRoot, null, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
29433    markContainerAsRoot(root.current, container);
29434    var rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
29435    listenToAllSupportedEvents(rootContainerElement);
29436    return new ReactDOMRoot(root);
29437  }
29438
29439  function ReactDOMHydrationRoot(internalRoot) {
29440    this._internalRoot = internalRoot;
29441  }
29442
29443  function scheduleHydration(target) {
29444    if (target) {
29445      queueExplicitHydrationTarget(target);
29446    }
29447  }
29448
29449  ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = scheduleHydration;
29450  function hydrateRoot(container, initialChildren, options) {
29451    if (!isValidContainer(container)) {
29452      throw new Error('hydrateRoot(...): Target container is not a DOM element.');
29453    }
29454
29455    warnIfReactDOMContainerInDEV(container);
29456
29457    {
29458      if (initialChildren === undefined) {
29459        error('Must provide initial children as second argument to hydrateRoot. ' + 'Example usage: hydrateRoot(domContainer, <App />)');
29460      }
29461    } // For now we reuse the whole bag of options since they contain
29462    // the hydration callbacks.
29463
29464
29465    var hydrationCallbacks = options != null ? options : null; // TODO: Delete this option
29466
29467    var mutableSources = options != null && options.hydratedSources || null;
29468    var isStrictMode = false;
29469    var concurrentUpdatesByDefaultOverride = false;
29470    var identifierPrefix = '';
29471    var onRecoverableError = defaultOnRecoverableError;
29472
29473    if (options !== null && options !== undefined) {
29474      if (options.unstable_strictMode === true) {
29475        isStrictMode = true;
29476      }
29477
29478      if (options.identifierPrefix !== undefined) {
29479        identifierPrefix = options.identifierPrefix;
29480      }
29481
29482      if (options.onRecoverableError !== undefined) {
29483        onRecoverableError = options.onRecoverableError;
29484      }
29485    }
29486
29487    var root = createHydrationContainer(initialChildren, null, container, ConcurrentRoot, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
29488    markContainerAsRoot(root.current, container); // This can't be a comment node since hydration doesn't work on comment nodes anyway.
29489
29490    listenToAllSupportedEvents(container);
29491
29492    if (mutableSources) {
29493      for (var i = 0; i < mutableSources.length; i++) {
29494        var mutableSource = mutableSources[i];
29495        registerMutableSourceForHydration(root, mutableSource);
29496      }
29497    }
29498
29499    return new ReactDOMHydrationRoot(root);
29500  }
29501  function isValidContainer(node) {
29502    return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || !disableCommentsAsDOMContainers  ));
29503  } // TODO: Remove this function which also includes comment nodes.
29504  // We only use it in places that are currently more relaxed.
29505
29506  function isValidContainerLegacy(node) {
29507    return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable '));
29508  }
29509
29510  function warnIfReactDOMContainerInDEV(container) {
29511    {
29512      if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {
29513        error('createRoot(): Creating roots directly with document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try using a container element created ' + 'for your app.');
29514      }
29515
29516      if (isContainerMarkedAsRoot(container)) {
29517        if (container._reactRootContainer) {
29518          error('You are calling ReactDOMClient.createRoot() on a container that was previously ' + 'passed to ReactDOM.render(). This is not supported.');
29519        } else {
29520          error('You are calling ReactDOMClient.createRoot() on a container that ' + 'has already been passed to createRoot() before. Instead, call ' + 'root.render() on the existing root instead if you want to update it.');
29521        }
29522      }
29523    }
29524  }
29525
29526  var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;
29527  var topLevelUpdateWarnings;
29528
29529  {
29530    topLevelUpdateWarnings = function (container) {
29531      if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
29532        var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer.current);
29533
29534        if (hostInstance) {
29535          if (hostInstance.parentNode !== container) {
29536            error('render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.');
29537          }
29538        }
29539      }
29540
29541      var isRootRenderedBySomeReact = !!container._reactRootContainer;
29542      var rootEl = getReactRootElementInContainer(container);
29543      var hasNonRootReactChild = !!(rootEl && getInstanceFromNode(rootEl));
29544
29545      if (hasNonRootReactChild && !isRootRenderedBySomeReact) {
29546        error('render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.');
29547      }
29548
29549      if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {
29550        error('render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.');
29551      }
29552    };
29553  }
29554
29555  function getReactRootElementInContainer(container) {
29556    if (!container) {
29557      return null;
29558    }
29559
29560    if (container.nodeType === DOCUMENT_NODE) {
29561      return container.documentElement;
29562    } else {
29563      return container.firstChild;
29564    }
29565  }
29566
29567  function noopOnRecoverableError() {// This isn't reachable because onRecoverableError isn't called in the
29568    // legacy API.
29569  }
29570
29571  function legacyCreateRootFromDOMContainer(container, initialChildren, parentComponent, callback, isHydrationContainer) {
29572    if (isHydrationContainer) {
29573      if (typeof callback === 'function') {
29574        var originalCallback = callback;
29575
29576        callback = function () {
29577          var instance = getPublicRootInstance(root);
29578          originalCallback.call(instance);
29579        };
29580      }
29581
29582      var root = createHydrationContainer(initialChildren, callback, container, LegacyRoot, null, // hydrationCallbacks
29583      false, // isStrictMode
29584      false, // concurrentUpdatesByDefaultOverride,
29585      '', // identifierPrefix
29586      noopOnRecoverableError);
29587      container._reactRootContainer = root;
29588      markContainerAsRoot(root.current, container);
29589      var rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
29590      listenToAllSupportedEvents(rootContainerElement);
29591      flushSync();
29592      return root;
29593    } else {
29594      // First clear any existing content.
29595      var rootSibling;
29596
29597      while (rootSibling = container.lastChild) {
29598        container.removeChild(rootSibling);
29599      }
29600
29601      if (typeof callback === 'function') {
29602        var _originalCallback = callback;
29603
29604        callback = function () {
29605          var instance = getPublicRootInstance(_root);
29606
29607          _originalCallback.call(instance);
29608        };
29609      }
29610
29611      var _root = createContainer(container, LegacyRoot, null, // hydrationCallbacks
29612      false, // isStrictMode
29613      false, // concurrentUpdatesByDefaultOverride,
29614      '', // identifierPrefix
29615      noopOnRecoverableError);
29616
29617      container._reactRootContainer = _root;
29618      markContainerAsRoot(_root.current, container);
29619
29620      var _rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
29621
29622      listenToAllSupportedEvents(_rootContainerElement); // Initial mount should not be batched.
29623
29624      flushSync(function () {
29625        updateContainer(initialChildren, _root, parentComponent, callback);
29626      });
29627      return _root;
29628    }
29629  }
29630
vendor: 9,227 bytes, lines 29631-29846
29631  function warnOnInvalidCallback$1(callback, callerName) {
29632    {
29633      if (callback !== null && typeof callback !== 'function') {
29634        error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
29635      }
29636    }
29637  }
29638
29639  function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
29640    {
29641      topLevelUpdateWarnings(container);
29642      warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render');
29643    }
29644
29645    var maybeRoot = container._reactRootContainer;
29646    var root;
29647
29648    if (!maybeRoot) {
29649      // Initial mount
29650      root = legacyCreateRootFromDOMContainer(container, children, parentComponent, callback, forceHydrate);
29651    } else {
29652      root = maybeRoot;
29653
29654      if (typeof callback === 'function') {
29655        var originalCallback = callback;
29656
29657        callback = function () {
29658          var instance = getPublicRootInstance(root);
29659          originalCallback.call(instance);
29660        };
29661      } // Update
29662
29663
29664      updateContainer(children, root, parentComponent, callback);
29665    }
29666
29667    return getPublicRootInstance(root);
29668  }
29669
29670  var didWarnAboutFindDOMNode = false;
29671  function findDOMNode(componentOrElement) {
29672    {
29673      if (!didWarnAboutFindDOMNode) {
29674        didWarnAboutFindDOMNode = true;
29675
29676        error('findDOMNode is deprecated and will be removed in the next major ' + 'release. Instead, add a ref directly to the element you want ' + 'to reference. Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-find-node');
29677      }
29678
29679      var owner = ReactCurrentOwner$3.current;
29680
29681      if (owner !== null && owner.stateNode !== null) {
29682        var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
29683
29684        if (!warnedAboutRefsInRender) {
29685          error('%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentNameFromType(owner.type) || 'A component');
29686        }
29687
29688        owner.stateNode._warnedAboutRefsInRender = true;
29689      }
29690    }
29691
29692    if (componentOrElement == null) {
29693      return null;
29694    }
29695
29696    if (componentOrElement.nodeType === ELEMENT_NODE) {
29697      return componentOrElement;
29698    }
29699
29700    {
29701      return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');
29702    }
29703  }
29704  function hydrate(element, container, callback) {
29705    {
29706      error('ReactDOM.hydrate is no longer supported in React 18. Use hydrateRoot ' + 'instead. Until you switch to the new API, your app will behave as ' + "if it's running React 17. Learn " + 'more: https://reactjs.org/link/switch-to-createroot');
29707    }
29708
29709    if (!isValidContainerLegacy(container)) {
29710      throw new Error('Target container is not a DOM element.');
29711    }
29712
29713    {
29714      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
29715
29716      if (isModernRoot) {
29717        error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOMClient.createRoot(). This is not supported. ' + 'Did you mean to call hydrateRoot(container, element)?');
29718      }
29719    } // TODO: throw or warn if we couldn't hydrate?
29720
29721
29722    return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);
29723  }
29724  function render(element, container, callback) {
29725    {
29726      error('ReactDOM.render is no longer supported in React 18. Use createRoot ' + 'instead. Until you switch to the new API, your app will behave as ' + "if it's running React 17. Learn " + 'more: https://reactjs.org/link/switch-to-createroot');
29727    }
29728
29729    if (!isValidContainerLegacy(container)) {
29730      throw new Error('Target container is not a DOM element.');
29731    }
29732
29733    {
29734      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
29735
29736      if (isModernRoot) {
29737        error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOMClient.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?');
29738      }
29739    }
29740
29741    return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
29742  }
29743  function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
29744    {
29745      error('ReactDOM.unstable_renderSubtreeIntoContainer() is no longer supported ' + 'in React 18. Consider using a portal instead. Until you switch to ' + "the createRoot API, your app will behave as if it's running React " + '17. Learn more: https://reactjs.org/link/switch-to-createroot');
29746    }
29747
29748    if (!isValidContainerLegacy(containerNode)) {
29749      throw new Error('Target container is not a DOM element.');
29750    }
29751
29752    if (parentComponent == null || !has(parentComponent)) {
29753      throw new Error('parentComponent must be a valid React Component');
29754    }
29755
29756    return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);
29757  }
29758  var didWarnAboutUnmountComponentAtNode = false;
29759  function unmountComponentAtNode(container) {
29760    {
29761      if (!didWarnAboutUnmountComponentAtNode) {
29762        didWarnAboutUnmountComponentAtNode = true;
29763
29764        error('unmountComponentAtNode is deprecated and will be removed in the ' + 'next major release. Switch to the createRoot API. Learn ' + 'more: https://reactjs.org/link/switch-to-createroot');
29765      }
29766    }
29767
29768    if (!isValidContainerLegacy(container)) {
29769      throw new Error('unmountComponentAtNode(...): Target container is not a DOM element.');
29770    }
29771
29772    {
29773      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
29774
29775      if (isModernRoot) {
29776        error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOMClient.createRoot(). This is not supported. Did you mean to call root.unmount()?');
29777      }
29778    }
29779
29780    if (container._reactRootContainer) {
29781      {
29782        var rootEl = getReactRootElementInContainer(container);
29783        var renderedByDifferentReact = rootEl && !getInstanceFromNode(rootEl);
29784
29785        if (renderedByDifferentReact) {
29786          error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.');
29787        }
29788      } // Unmount should not be batched.
29789
29790
29791      flushSync(function () {
29792        legacyRenderSubtreeIntoContainer(null, null, container, false, function () {
29793          // $FlowFixMe This should probably use `delete container._reactRootContainer`
29794          container._reactRootContainer = null;
29795          unmarkContainerAsRoot(container);
29796        });
29797      }); // If you call unmountComponentAtNode twice in quick succession, you'll
29798      // get `true` twice. That's probably fine?
29799
29800      return true;
29801    } else {
29802      {
29803        var _rootEl = getReactRootElementInContainer(container);
29804
29805        var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode(_rootEl)); // Check if the container itself is a React root node.
29806
29807        var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainerLegacy(container.parentNode) && !!container.parentNode._reactRootContainer;
29808
29809        if (hasNonRootReactChild) {
29810          error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.');
29811        }
29812      }
29813
29814      return false;
29815    }
29816  }
29817
29818  setAttemptSynchronousHydration(attemptSynchronousHydration$1);
29819  setAttemptContinuousHydration(attemptContinuousHydration$1);
29820  setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1);
29821  setGetCurrentUpdatePriority(getCurrentUpdatePriority);
29822  setAttemptHydrationAtPriority(runWithPriority);
29823
29824  {
29825    if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype
29826    Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype
29827    Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {
29828      error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://reactjs.org/link/react-polyfills');
29829    }
29830  }
29831
29832  setRestoreImplementation(restoreControlledState$3);
29833  setBatchingImplementation(batchedUpdates$1, discreteUpdates, flushSync);
29834
29835  function createPortal$1(children, container) {
29836    var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
29837
29838    if (!isValidContainer(container)) {
29839      throw new Error('Target container is not a DOM element.');
29840    } // TODO: pass ReactDOM portal implementation as third argument
29841    // $FlowFixMe The Flow type is opaque but there's no way to actually create it.
29842
29843
29844    return createPortal(children, container, null, key);
29845  }
29846
29847  function renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
29848    return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback);
29849  }
29850
29851  var Internals = {
29852    usingClientEntryPoint: false,
29853    // Keep in sync with ReactTestUtils.js.
29854    // This is an array for better minification.
29855    Events: [getInstanceFromNode, getNodeFromInstance, getFiberCurrentPropsFromNode, enqueueStateRestore, restoreStateIfNeeded, batchedUpdates$1]
29856  };
29857
29858  function createRoot$1(container, options) {
29859    {
29860      if (!Internals.usingClientEntryPoint && !true) {
29861        error('You are importing createRoot from "react-dom" which is not supported. ' + 'You should instead import it from "react-dom/client".');
29862      }
29863    }
29864
29865    return createRoot(container, options);
29866  }
29867
29868  function hydrateRoot$1(container, initialChildren, options) {
29869    {
29870      if (!Internals.usingClientEntryPoint && !true) {
29871        error('You are importing hydrateRoot from "react-dom" which is not supported. ' + 'You should instead import it from "react-dom/client".');
29872      }
29873    }
29874
29875    return hydrateRoot(container, initialChildren, options);
29876  } // Overload the definition to the two valid signatures.
29877  // Warning, this opts-out of checking the function body.
29878
29879
29880  // eslint-disable-next-line no-redeclare
29881  function flushSync$1(fn) {
29882    {
29883      if (isAlreadyRendering()) {
29884        error('flushSync was called from inside a lifecycle method. React cannot ' + 'flush when React is already rendering. Consider moving this call to ' + 'a scheduler task or micro task.');
29885      }
29886    }
29887
29888    return flushSync(fn);
29889  }
29890  var foundDevTools = injectIntoDevTools({
29891    findFiberByHostInstance: getClosestInstanceFromNode,
29892    bundleType:  1 ,
29893    version: ReactVersion,
29894    rendererPackageName: 'react-dom'
29895  });
29896
29897  {
29898    if (!foundDevTools && canUseDOM && window.top === window.self) {
29899      // If we're in Chrome or Firefox, provide a download link if not installed.
29900      if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
29901        var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://.
29902
29903        if (/^(https?|file):$/.test(protocol)) {
29904          // eslint-disable-next-line react-internal/no-production-logging
29905          console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://reactjs.org/link/react-devtools' + (protocol === 'file:' ? '\nYou might need to use a local HTTP server (instead of file://): ' + 'https://reactjs.org/link/react-devtools-faq' : ''), 'font-weight:bold');
29906        }
29907      }
29908    }
29909  }
29910
29911  exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals;
29912  exports.createPortal = createPortal$1;
29913  exports.createRoot = createRoot$1;
29914  exports.findDOMNode = findDOMNode;
29915  exports.flushSync = flushSync$1;
29916  exports.hydrate = hydrate;
29917  exports.hydrateRoot = hydrateRoot$1;
29918  exports.render = render;
29919  exports.unmountComponentAtNode = unmountComponentAtNode;
29920  exports.unstable_batchedUpdates = batchedUpdates$1;
29921  exports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer;
29922  exports.version = ReactVersion;
29923
29924})));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.