/* eslint-disable */
var __defProp = Object.defineProperty;
var __typeError = (msg) => {
  throw TypeError(msg);
};
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
var __privateWrapper = (obj, member, setter, getter) => ({
  set _(value) {
    __privateSet(obj, member, value, setter);
  },
  get _() {
    return __privateGet(obj, member, getter);
  }
});

// dist/src/utils/Utils.js
var Utils_exports = {};
__export(Utils_exports, {
  ChannelError: () => ChannelError,
  InnertubeError: () => InnertubeError,
  MissingParamError: () => MissingParamError,
  OAuth2Error: () => OAuth2Error,
  ParsingError: () => ParsingError,
  Platform: () => Platform,
  PlayerError: () => PlayerError,
  SessionError: () => SessionError,
  base64ToU8: () => base64ToU8,
  concatMemos: () => concatMemos,
  debugFetch: () => debugFetch,
  deepCompare: () => deepCompare,
  escapeStringRegexp: () => escapeStringRegexp,
  generateRandomString: () => generateRandomString,
  generateSidAuth: () => generateSidAuth,
  getCookie: () => getCookie,
  getNsigProcessorFn: () => getNsigProcessorFn,
  getRandomUserAgent: () => getRandomUserAgent,
  getStringBetweenStrings: () => getStringBetweenStrings,
  hasKeys: () => hasKeys,
  isTextRun: () => isTextRun,
  streamToIterable: () => streamToIterable,
  throwIfMissing: () => throwIfMissing,
  timeToSeconds: () => timeToSeconds,
  u8ToBase64: () => u8ToBase64
});

// dist/src/parser/helpers.js
var helpers_exports = {};
__export(helpers_exports, {
  Maybe: () => Maybe,
  Memo: () => Memo,
  SuperParsedResult: () => SuperParsedResult,
  YTNode: () => YTNode,
  observe: () => observe
});

// dist/src/utils/Log.js
var Log_exports = {};
__export(Log_exports, {
  Level: () => Level,
  debug: () => debug,
  error: () => error,
  info: () => info,
  setLevel: () => setLevel,
  warn: () => warn,
  warnOnce: () => warnOnce
});
var YTJS_TAG = "YOUTUBEJS";
var Level = {
  NONE: 0,
  ERROR: 1,
  WARNING: 2,
  INFO: 3,
  DEBUG: 4
};
var log_map = {
  [Level.ERROR]: (...args) => console.error(...args),
  [Level.WARNING]: (...args) => console.warn(...args),
  [Level.INFO]: (...args) => console.info(...args),
  [Level.DEBUG]: (...args) => console.debug(...args)
};
var log_level = [Level.WARNING];
var one_time_warnings_issued = /* @__PURE__ */ new Set();
function doLog(level, tag, args) {
  if (!log_map[level] || !log_level.includes(level))
    return;
  const tags = [`[${YTJS_TAG}]`];
  if (tag)
    tags.push(`[${tag}]`);
  log_map[level](`${tags.join("")}:`, ...args || []);
}
__name(doLog, "doLog");
var warnOnce = /* @__PURE__ */ __name((id, ...args) => {
  if (one_time_warnings_issued.has(id))
    return;
  doLog(Level.WARNING, id, args);
  one_time_warnings_issued.add(id);
}, "warnOnce");
var warn = /* @__PURE__ */ __name((tag, ...args) => doLog(Level.WARNING, tag, args), "warn");
var error = /* @__PURE__ */ __name((tag, ...args) => doLog(Level.ERROR, tag, args), "error");
var info = /* @__PURE__ */ __name((tag, ...args) => doLog(Level.INFO, tag, args), "info");
var debug = /* @__PURE__ */ __name((tag, ...args) => doLog(Level.DEBUG, tag, args), "debug");
function setLevel(...args) {
  log_level = args;
}
__name(setLevel, "setLevel");

// dist/src/parser/helpers.js
var isObserved = Symbol("ObservedArray.isObserved");
var _YTNode = class _YTNode {
  constructor() {
    __publicField(this, "type");
    this.type = this.constructor.type;
  }
  /**
   * Check if the node is of the given type.
   * @param types - The type to check
   * @returns whether the node is of the given type
   */
  is(...types) {
    return types.some((type) => this.type === type.type);
  }
  /**
   * Cast to one of the given types.
   * @param types - The types to cast to
   * @returns The node cast to one of the given types
   * @throws {ParsingError} If the node is not of the given type
   */
  as(...types) {
    if (!this.is(...types)) {
      throw new ParsingError(`Cannot cast ${this.type} to one of ${types.map((t) => t.type).join(", ")}`);
    }
    return this;
  }
  /**
   * Check for a key without asserting the type.
   * @param key - The key to check
   * @returns Whether the node has the key
   */
  hasKey(key) {
    return Reflect.has(this, key);
  }
  /**
   * Assert that the node has the given key and return it.
   * @param key - The key to check
   * @returns The value of the key wrapped in a Maybe
   * @throws {ParsingError} If the node does not have the key
   */
  key(key) {
    if (!this.hasKey(key)) {
      throw new ParsingError(`Missing key ${key}`);
    }
    return new Maybe(this[key]);
  }
};
__name(_YTNode, "YTNode");
__publicField(_YTNode, "type", "YTNode");
var YTNode = _YTNode;
var MAYBE_TAG = "Maybe";
var _value, _Maybe_instances, checkPrimitive_fn, assertPrimitive_fn;
var _Maybe = class _Maybe {
  constructor(value) {
    __privateAdd(this, _Maybe_instances);
    __privateAdd(this, _value);
    __privateSet(this, _value, value);
  }
  get typeof() {
    return typeof __privateGet(this, _value);
  }
  string() {
    return __privateMethod(this, _Maybe_instances, assertPrimitive_fn).call(this, "string");
  }
  isString() {
    return __privateMethod(this, _Maybe_instances, checkPrimitive_fn).call(this, "string");
  }
  number() {
    return __privateMethod(this, _Maybe_instances, assertPrimitive_fn).call(this, "number");
  }
  isNumber() {
    return __privateMethod(this, _Maybe_instances, checkPrimitive_fn).call(this, "number");
  }
  bigint() {
    return __privateMethod(this, _Maybe_instances, assertPrimitive_fn).call(this, "bigint");
  }
  isBigint() {
    return __privateMethod(this, _Maybe_instances, checkPrimitive_fn).call(this, "bigint");
  }
  boolean() {
    return __privateMethod(this, _Maybe_instances, assertPrimitive_fn).call(this, "boolean");
  }
  isBoolean() {
    return __privateMethod(this, _Maybe_instances, checkPrimitive_fn).call(this, "boolean");
  }
  symbol() {
    return __privateMethod(this, _Maybe_instances, assertPrimitive_fn).call(this, "symbol");
  }
  isSymbol() {
    return __privateMethod(this, _Maybe_instances, checkPrimitive_fn).call(this, "symbol");
  }
  undefined() {
    return __privateMethod(this, _Maybe_instances, assertPrimitive_fn).call(this, "undefined");
  }
  isUndefined() {
    return __privateMethod(this, _Maybe_instances, checkPrimitive_fn).call(this, "undefined");
  }
  null() {
    if (__privateGet(this, _value) !== null)
      throw new TypeError(`Expected null, got ${typeof __privateGet(this, _value)}`);
    return __privateGet(this, _value);
  }
  isNull() {
    return __privateGet(this, _value) === null;
  }
  object() {
    return __privateMethod(this, _Maybe_instances, assertPrimitive_fn).call(this, "object");
  }
  isObject() {
    return __privateMethod(this, _Maybe_instances, checkPrimitive_fn).call(this, "object");
  }
  // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
  function() {
    return __privateMethod(this, _Maybe_instances, assertPrimitive_fn).call(this, "function");
  }
  isFunction() {
    return __privateMethod(this, _Maybe_instances, checkPrimitive_fn).call(this, "function");
  }
  /**
   * Get the value as an array.
   * @returns the value as any[].
   * @throws If the value is not an array.
   */
  array() {
    if (!Array.isArray(__privateGet(this, _value))) {
      throw new TypeError(`Expected array, got ${typeof __privateGet(this, _value)}`);
    }
    return __privateGet(this, _value);
  }
  /**
   * More typesafe variant of {@link Maybe#array}.
   * @returns a proxied array which returns all the values as {@link Maybe}.
   * @throws {TypeError} If the value is not an array
   */
  arrayOfMaybe() {
    const arrayProps = [];
    return new Proxy(this.array(), {
      get(target, prop) {
        if (Reflect.has(arrayProps, prop)) {
          return Reflect.get(target, prop);
        }
        return new _Maybe(Reflect.get(target, prop));
      }
    });
  }
  /**
   * Check whether the value is an array.
   * @returns whether the value is an array.
   */
  isArray() {
    return Array.isArray(__privateGet(this, _value));
  }
  /**
   * Get the value as a YTNode.
   * @returns the value as a YTNode.
   * @throws If the value is not a YTNode.
   */
  node() {
    if (!(__privateGet(this, _value) instanceof YTNode)) {
      throw new TypeError(`Expected YTNode, got ${__privateGet(this, _value).constructor.name}`);
    }
    return __privateGet(this, _value);
  }
  /**
   * Check if the value is a YTNode.
   * @returns Whether the value is a YTNode.
   */
  isNode() {
    return __privateGet(this, _value) instanceof YTNode;
  }
  /**
   * Get the value as a YTNode of the given type.
   * @param types - The type(s) to cast to.
   * @returns The node cast to the given type.
   * @throws If the node is not of the given type.
   */
  nodeOfType(...types) {
    return this.node().as(...types);
  }
  /**
   * Check if the value is a YTNode of the given type.
   * @param types - the type(s) to check.
   * @returns Whether the value is a YTNode of the given type.
   */
  isNodeOfType(...types) {
    return this.isNode() && this.node().is(...types);
  }
  /**
   * Get the value as an ObservedArray.
   * @returns the value of the Maybe as a ObservedArray.
   */
  observed() {
    if (!this.isObserved()) {
      throw new TypeError(`Expected ObservedArray, got ${typeof __privateGet(this, _value)}`);
    }
    return __privateGet(this, _value);
  }
  /**
   * Check if the value is an ObservedArray.
   */
  isObserved() {
    return __privateGet(this, _value)?.[isObserved];
  }
  /**
   * Get the value of the Maybe as a SuperParsedResult.
   * @returns the value as a SuperParsedResult.
   * @throws If the value is not a SuperParsedResult.
   */
  parsed() {
    if (!(__privateGet(this, _value) instanceof SuperParsedResult)) {
      throw new TypeError(`Expected SuperParsedResult, got ${typeof __privateGet(this, _value)}`);
    }
    return __privateGet(this, _value);
  }
  /**
   * Is the result a SuperParsedResult?
   */
  isParsed() {
    return __privateGet(this, _value) instanceof SuperParsedResult;
  }
  /**
   * @deprecated
   * This call is not meant to be used outside of debugging. Please use the specific type getter instead.
   */
  any() {
    warn(MAYBE_TAG, "This call is not meant to be used outside of debugging. Please use the specific type getter instead.");
    return __privateGet(this, _value);
  }
  /**
   * Get the node as an instance of the given class.
   * @param type - The type to check.
   * @returns the value as the given type.
   * @throws If the node is not of the given type.
   */
  instanceof(type) {
    if (!this.isInstanceof(type)) {
      throw new TypeError(`Expected instance of ${type.name}, got ${__privateGet(this, _value).constructor.name}`);
    }
    return __privateGet(this, _value);
  }
  /**
   * Check if the node is an instance of the given class.
   * @param type - The type to check.
   * @returns Whether the node is an instance of the given type.
   */
  isInstanceof(type) {
    return __privateGet(this, _value) instanceof type;
  }
};
_value = new WeakMap();
_Maybe_instances = new WeakSet();
checkPrimitive_fn = /* @__PURE__ */ __name(function(type) {
  return typeof __privateGet(this, _value) === type;
}, "#checkPrimitive");
assertPrimitive_fn = /* @__PURE__ */ __name(function(type) {
  if (!__privateMethod(this, _Maybe_instances, checkPrimitive_fn).call(this, type)) {
    throw new TypeError(`Expected ${type}, got ${this.typeof}`);
  }
  return __privateGet(this, _value);
}, "#assertPrimitive");
__name(_Maybe, "Maybe");
var Maybe = _Maybe;
var _result;
var _SuperParsedResult = class _SuperParsedResult {
  constructor(result) {
    __privateAdd(this, _result);
    __privateSet(this, _result, result);
  }
  get is_null() {
    return __privateGet(this, _result) === null;
  }
  get is_array() {
    return !this.is_null && Array.isArray(__privateGet(this, _result));
  }
  get is_node() {
    return !this.is_array;
  }
  array() {
    if (!this.is_array) {
      throw new TypeError("Expected an array, got a node");
    }
    return __privateGet(this, _result);
  }
  item() {
    if (!this.is_node) {
      throw new TypeError("Expected a node, got an array");
    }
    return __privateGet(this, _result);
  }
};
_result = new WeakMap();
__name(_SuperParsedResult, "SuperParsedResult");
var SuperParsedResult = _SuperParsedResult;
function observe(obj) {
  return new Proxy(obj, {
    get(target, prop) {
      if (prop == "get") {
        return (rule, del_item) => target.find((obj2, index) => {
          const match = deepCompare(rule, obj2);
          if (match && del_item) {
            target.splice(index, 1);
          }
          return match;
        });
      }
      if (prop == isObserved) {
        return true;
      }
      if (prop == "getAll") {
        return (rule, del_items) => target.filter((obj2, index) => {
          const match = deepCompare(rule, obj2);
          if (match && del_items) {
            target.splice(index, 1);
          }
          return match;
        });
      }
      if (prop == "matchCondition") {
        return (condition) => target.find((obj2) => {
          return condition(obj2);
        });
      }
      if (prop == "filterType") {
        return (...types) => {
          return observe(target.filter((node) => {
            return !!node.is(...types);
          }));
        };
      }
      if (prop == "firstOfType") {
        return (...types) => {
          return target.find((node) => {
            return !!node.is(...types);
          });
        };
      }
      if (prop == "first") {
        return () => target[0];
      }
      if (prop == "as") {
        return (...types) => {
          return observe(target.map((node) => {
            if (node.is(...types))
              return node;
            throw new ParsingError(`Expected node of any type ${types.map((type) => type.type).join(", ")}, got ${node.type}`);
          }));
        };
      }
      if (prop == "remove") {
        return (index) => target.splice(index, 1);
      }
      return Reflect.get(target, prop);
    }
  });
}
__name(observe, "observe");
var _Memo = class _Memo extends Map {
  getType(...types) {
    types = types.flat();
    return observe(types.flatMap((type) => this.get(type.type) || []));
  }
};
__name(_Memo, "Memo");
var Memo = _Memo;

// dist/src/parser/misc.js
var misc_exports = {};
__export(misc_exports, {
  AccessibilityContext: () => AccessibilityContext,
  AccessibilityData: () => AccessibilityData,
  Author: () => Author,
  ChildElement: () => ChildElement,
  CommandContext: () => CommandContext,
  EmojiRun: () => EmojiRun,
  Format: () => Format,
  RendererContext: () => RendererContext,
  SubscriptionButton: () => SubscriptionButton,
  Text: () => Text2,
  TextRun: () => TextRun,
  Thumbnail: () => Thumbnail,
  VideoDetails: () => VideoDetails
});

// dist/src/parser/classes/misc/AccessibilityContext.js
var _AccessibilityContext = class _AccessibilityContext {
  constructor(data) {
    __publicField(this, "label");
    this.label = data.label;
  }
};
__name(_AccessibilityContext, "AccessibilityContext");
var AccessibilityContext = _AccessibilityContext;

// dist/src/parser/classes/misc/AccessibilityData.js
var _AccessibilityData = class _AccessibilityData {
  constructor(data) {
    __publicField(this, "accessibility_identifier");
    __publicField(this, "identifier");
    __publicField(this, "label");
    if ("accessibilityIdentifier" in data) {
      this.accessibility_identifier = data.accessibilityIdentifier;
    }
    if ("identifier" in data) {
      this.identifier = {
        accessibility_id_type: data.identifier.accessibilityIdType
      };
    }
    if ("label" in data) {
      this.label = data.label;
    }
  }
};
__name(_AccessibilityData, "AccessibilityData");
var AccessibilityData = _AccessibilityData;

// dist/src/utils/Constants.js
var Constants_exports = {};
__export(Constants_exports, {
  CLIENTS: () => CLIENTS,
  CLIENT_NAME_IDS: () => CLIENT_NAME_IDS,
  INNERTUBE_HEADERS_BASE: () => INNERTUBE_HEADERS_BASE,
  OAUTH: () => OAUTH,
  STREAM_HEADERS: () => STREAM_HEADERS,
  SUPPORTED_CLIENTS: () => SUPPORTED_CLIENTS,
  URLS: () => URLS
});
var URLS = {
  YT_BASE: "https://www.youtube.com",
  YT_MUSIC_BASE: "https://music.youtube.com",
  YT_SUGGESTIONS: "https://suggestqueries-clients6.youtube.com",
  YT_UPLOAD: "https://upload.youtube.com/",
  API: {
    BASE: "https://youtubei.googleapis.com",
    PRODUCTION_1: "https://www.youtube.com/youtubei/",
    PRODUCTION_2: "https://youtubei.googleapis.com/youtubei/",
    STAGING: "https://green-youtubei.sandbox.googleapis.com/youtubei/",
    RELEASE: "https://release-youtubei.sandbox.googleapis.com/youtubei/",
    TEST: "https://test-youtubei.sandbox.googleapis.com/youtubei/",
    CAMI: "http://cami-youtubei.sandbox.googleapis.com/youtubei/",
    UYTFE: "https://uytfe.sandbox.google.com/youtubei/"
  },
  GOOGLE_SEARCH_BASE: "https://www.google.com/"
};
var OAUTH = {
  REGEX: {
    TV_SCRIPT: new RegExp('<script\\s+id="base-js"\\s+src="([^"]+)"[^>]*><\\/script>'),
    CLIENT_IDENTITY: new RegExp('clientId:"(?<client_id>[^"]+)",[^"]*?:"(?<client_secret>[^"]+)"')
  }
};
var CLIENTS = {
  IOS: {
    NAME: "iOS",
    VERSION: "20.11.6",
    USER_AGENT: "com.google.ios.youtube/20.11.6 (iPhone10,4; U; CPU iOS 16_7_7 like Mac OS X)",
    DEVICE_MODEL: "iPhone10,4",
    OS_NAME: "iOS",
    OS_VERSION: "16.7.7.20H330"
  },
  WEB: {
    NAME: "WEB",
    VERSION: "2.20260206.01.00",
    API_KEY: "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8",
    API_VERSION: "v1",
    STATIC_VISITOR_ID: "6zpwvWUNAco",
    SUGG_EXP_ID: "ytzpb5_e2,ytpo.bo.lqp.elu=1,ytpo.bo.lqp.ecsc=1,ytpo.bo.lqp.mcsc=3,ytpo.bo.lqp.mec=1,ytpo.bo.lqp.rw=0.8,ytpo.bo.lqp.fw=0.2,ytpo.bo.lqp.szp=1,ytpo.bo.lqp.mz=3,ytpo.bo.lqp.al=en_us,ytpo.bo.lqp.zrm=1,ytpo.bo.lqp.er=1,ytpo.bo.ro.erl=1,ytpo.bo.ro.mlus=3,ytpo.bo.ro.erls=3,ytpo.bo.qfo.mlus=3,ytzprp.ppp.e=1,ytzprp.ppp.st=772,ytzprp.ppp.p=5"
  },
  MWEB: {
    NAME: "MWEB",
    VERSION: "2.20260205.04.01",
    API_VERSION: "v1"
  },
  WEB_KIDS: {
    NAME: "WEB_KIDS",
    VERSION: "2.20260205.00.00"
  },
  YTMUSIC: {
    NAME: "WEB_REMIX",
    VERSION: "1.20250219.01.00"
  },
  ANDROID: {
    NAME: "ANDROID",
    VERSION: "21.03.36",
    SDK_VERSION: 36,
    USER_AGENT: "com.google.android.youtube/21.03.36(Linux; U; Android 16; en_US; SM-S908E Build/TP1A.220624.014) gzip"
  },
  ANDROID_VR: {
    NAME: "ANDROID_VR",
    VERSION: "1.65.10",
    SDK_VERSION: 32,
    DEVICE_MAKE: "Oculus",
    DEVICE_MODEL: "Quest 3",
    USER_AGENT: "com.google.android.apps.youtube.vr.oculus/1.65.10 (Linux; U; Android 12L; eureka-user Build/SQ3A.220605.009.A1) gzip"
  },
  YTSTUDIO_ANDROID: {
    NAME: "ANDROID_CREATOR",
    VERSION: "22.43.101"
  },
  YTMUSIC_ANDROID: {
    NAME: "ANDROID_MUSIC",
    VERSION: "5.34.51"
  },
  TV: {
    NAME: "TVHTML5",
    VERSION: "7.20260311.12.00",
    USER_AGENT: "Mozilla/5.0 (ChromiumStylePlatform) Cobalt/Version"
  },
  TV_SIMPLY: {
    NAME: "TVHTML5_SIMPLY",
    VERSION: "1.0"
  },
  TV_EMBEDDED: {
    NAME: "TVHTML5_SIMPLY_EMBEDDED_PLAYER",
    VERSION: "2.0"
  },
  WEB_EMBEDDED: {
    NAME: "WEB_EMBEDDED_PLAYER",
    VERSION: "1.20260206.01.00",
    API_KEY: "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8",
    API_VERSION: "v1",
    STATIC_VISITOR_ID: "6zpwvWUNAco"
  },
  WEB_CREATOR: {
    NAME: "WEB_CREATOR",
    VERSION: "1.20241203.01.00",
    API_KEY: "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8",
    API_VERSION: "v1",
    STATIC_VISITOR_ID: "6zpwvWUNAco"
  }
};
var CLIENT_NAME_IDS = {
  iOS: "5",
  WEB: "1",
  MWEB: "2",
  WEB_KIDS: "76",
  WEB_REMIX: "67",
  ANDROID: "3",
  ANDROID_CREATOR: "14",
  ANDROID_MUSIC: "21",
  ANDROID_VR: "28",
  TVHTML5: "7",
  TVHTML5_SIMPLY: "74",
  TVHTML5_SIMPLY_EMBEDDED_PLAYER: "85",
  WEB_EMBEDDED_PLAYER: "56",
  WEB_CREATOR: "62"
};
var STREAM_HEADERS = {
  "accept": "*/*",
  "origin": "https://www.youtube.com",
  "referer": "https://www.youtube.com",
  "DNT": "?1"
};
var INNERTUBE_HEADERS_BASE = {
  "accept": "*/*",
  "accept-encoding": "gzip, deflate",
  "content-type": "application/json"
};
var SUPPORTED_CLIENTS = ["IOS", "WEB", "MWEB", "YTKIDS", "YTMUSIC", "ANDROID", "ANDROID_VR", "YTSTUDIO_ANDROID", "YTMUSIC_ANDROID", "TV", "TV_SIMPLY", "TV_EMBEDDED", "WEB_EMBEDDED", "WEB_CREATOR"];

// dist/src/parser/parser.js
var parser_exports = {};
__export(parser_exports, {
  addRuntimeParser: () => addRuntimeParser,
  applyCommentsMutations: () => applyCommentsMutations,
  applyMutations: () => applyMutations,
  getDynamicParsers: () => getDynamicParsers,
  getParserByName: () => getParserByName,
  hasParser: () => hasParser,
  parse: () => parse,
  parseActions: () => parseActions,
  parseArray: () => parseArray,
  parseC: () => parseC,
  parseCommand: () => parseCommand,
  parseCommands: () => parseCommands,
  parseFormats: () => parseFormats,
  parseItem: () => parseItem,
  parseLC: () => parseLC,
  parseRR: () => parseRR,
  parseResponse: () => parseResponse,
  sanitizeClassName: () => sanitizeClassName,
  setParserErrorHandler: () => setParserErrorHandler,
  shouldIgnore: () => shouldIgnore
});

// dist/src/parser/nodes.js
var nodes_exports = {};
__export(nodes_exports, {
  AboutChannel: () => AboutChannel,
  AboutChannelView: () => AboutChannelView,
  AccountChannel: () => AccountChannel,
  AccountItem: () => AccountItem,
  AccountItemSection: () => AccountItemSection,
  AccountItemSectionHeader: () => AccountItemSectionHeader,
  AccountSectionList: () => AccountSectionList,
  ActiveAccountHeader: () => ActiveAccountHeader,
  AddBannerToLiveChatCommand: () => AddBannerToLiveChatCommand,
  AddChatItemAction: () => AddChatItemAction,
  AddLiveChatTickerItemAction: () => AddLiveChatTickerItemAction,
  AddToPlaylist: () => AddToPlaylist,
  AddToPlaylistCommand: () => AddToPlaylistCommand,
  AddToPlaylistEndpoint: () => AddToPlaylistEndpoint,
  AddToPlaylistServiceEndpoint: () => AddToPlaylistServiceEndpoint,
  Alert: () => Alert,
  AlertWithButton: () => AlertWithButton,
  AnchoredSection: () => AnchoredSection,
  AnimatedThumbnailOverlayView: () => AnimatedThumbnailOverlayView,
  AppendContinuationItemsAction: () => AppendContinuationItemsAction,
  AttributionView: () => AttributionView,
  AudioOnlyPlayability: () => AudioOnlyPlayability,
  AuthorCommentBadge: () => AuthorCommentBadge,
  AutomixPreviewVideo: () => AutomixPreviewVideo,
  AvatarStackView: () => AvatarStackView,
  AvatarView: () => AvatarView,
  BackgroundPromo: () => BackgroundPromo,
  BackstageImage: () => BackstageImage,
  BackstagePost: () => BackstagePost,
  BackstagePostThread: () => BackstagePostThread,
  BadgeView: () => BadgeView,
  BrowseEndpoint: () => BrowseEndpoint,
  BrowseFeedActions: () => BrowseFeedActions,
  BrowserMediaSession: () => BrowserMediaSession,
  BumperUserEduContentView: () => BumperUserEduContentView,
  Button: () => Button,
  ButtonCardView: () => ButtonCardView,
  ButtonView: () => ButtonView,
  C4TabbedHeader: () => C4TabbedHeader,
  CallToActionButton: () => CallToActionButton,
  Card: () => Card,
  CardCollection: () => CardCollection,
  CarouselHeader: () => CarouselHeader,
  CarouselItem: () => CarouselItem,
  CarouselItemView: () => CarouselItemView,
  CarouselLockup: () => CarouselLockup,
  CarouselTitleView: () => CarouselTitleView,
  ChangeEngagementPanelVisibilityAction: () => ChangeEngagementPanelVisibilityAction,
  Channel: () => Channel,
  ChannelAboutFullMetadata: () => ChannelAboutFullMetadata,
  ChannelAgeGate: () => ChannelAgeGate,
  ChannelExternalLinkView: () => ChannelExternalLinkView,
  ChannelFeaturedContent: () => ChannelFeaturedContent,
  ChannelHeaderLinks: () => ChannelHeaderLinks,
  ChannelHeaderLinksView: () => ChannelHeaderLinksView,
  ChannelMetadata: () => ChannelMetadata,
  ChannelMobileHeader: () => ChannelMobileHeader,
  ChannelOptions: () => ChannelOptions,
  ChannelOwnerEmptyState: () => ChannelOwnerEmptyState,
  ChannelSubMenu: () => ChannelSubMenu,
  ChannelSwitcherHeader: () => ChannelSwitcherHeader,
  ChannelSwitcherPage: () => ChannelSwitcherPage,
  ChannelTagline: () => ChannelTagline,
  ChannelThumbnailWithLink: () => ChannelThumbnailWithLink,
  ChannelVideoPlayer: () => ChannelVideoPlayer,
  Chapter: () => Chapter,
  ChildVideo: () => ChildVideo,
  ChipBarView: () => ChipBarView,
  ChipCloud: () => ChipCloud,
  ChipCloudChip: () => ChipCloudChip,
  ChipView: () => ChipView,
  ClientSideToggleMenuItem: () => ClientSideToggleMenuItem,
  ClipAdState: () => ClipAdState,
  ClipCreation: () => ClipCreation,
  ClipCreationScrubber: () => ClipCreationScrubber,
  ClipCreationTextInput: () => ClipCreationTextInput,
  ClipSection: () => ClipSection,
  CollaboratorInfoCardContent: () => CollaboratorInfoCardContent,
  CollageHeroImage: () => CollageHeroImage,
  CollectionThumbnailView: () => CollectionThumbnailView,
  CommandExecutorCommand: () => CommandExecutorCommand,
  CommentActionButtons: () => CommentActionButtons,
  CommentDialog: () => CommentDialog,
  CommentReplies: () => CommentReplies,
  CommentReplyDialog: () => CommentReplyDialog,
  CommentSimplebox: () => CommentSimplebox,
  CommentThread: () => CommentThread,
  CommentView: () => CommentView,
  CommentsEntryPointHeader: () => CommentsEntryPointHeader,
  CommentsEntryPointTeaser: () => CommentsEntryPointTeaser,
  CommentsHeader: () => CommentsHeader,
  CommentsSimplebox: () => CommentsSimplebox,
  CompactChannel: () => CompactChannel,
  CompactLink: () => CompactLink,
  CompactMix: () => CompactMix,
  CompactMovie: () => CompactMovie,
  CompactPlaylist: () => CompactPlaylist_default,
  CompactStation: () => CompactStation,
  CompactVideo: () => CompactVideo,
  CompositeVideoPrimaryInfo: () => CompositeVideoPrimaryInfo,
  ConfirmDialog: () => ConfirmDialog,
  ContentMetadataView: () => ContentMetadataView,
  ContentPreviewImageView: () => ContentPreviewImageView,
  ContinuationCommand: () => ContinuationCommand,
  ContinuationItem: () => ContinuationItem,
  ConversationBar: () => ConversationBar,
  CopyLink: () => CopyLink,
  CreateCommentEndpoint: () => CreateCommentEndpoint,
  CreatePlaylistDialog: () => CreatePlaylistDialog,
  CreatePlaylistDialogFormView: () => CreatePlaylistDialogFormView,
  CreatePlaylistServiceEndpoint: () => CreatePlaylistServiceEndpoint,
  CreatorHeart: () => CreatorHeart,
  CreatorHeartView: () => CreatorHeartView,
  DecoratedAvatarView: () => DecoratedAvatarView,
  DecoratedPlayerBar: () => DecoratedPlayerBar,
  DefaultPromoPanel: () => DefaultPromoPanel,
  DeletePlaylistEndpoint: () => DeletePlaylistEndpoint,
  DescriptionPreviewView: () => DescriptionPreviewView,
  DialogHeaderView: () => DialogHeaderView,
  DialogView: () => DialogView,
  DidYouMean: () => DidYouMean,
  DimChatItemAction: () => DimChatItemAction,
  DislikeButtonView: () => DislikeButtonView,
  DismissableDialog: () => DismissableDialog,
  DismissableDialogContentSection: () => DismissableDialogContentSection,
  DownloadButton: () => DownloadButton,
  Dropdown: () => Dropdown,
  DropdownItem: () => DropdownItem,
  DropdownView: () => DropdownView,
  DynamicTextView: () => DynamicTextView,
  Element: () => Element,
  EmergencyOnebox: () => EmergencyOnebox,
  EmojiPicker: () => EmojiPicker,
  EmojiPickerCategory: () => EmojiPickerCategory,
  EmojiPickerCategoryButton: () => EmojiPickerCategoryButton,
  EmojiPickerUpsellCategory: () => EmojiPickerUpsellCategory,
  EndScreenPlaylist: () => EndScreenPlaylist,
  EndScreenVideo: () => EndScreenVideo,
  Endscreen: () => Endscreen,
  EndscreenElement: () => EndscreenElement,
  EngagementPanelSectionList: () => EngagementPanelSectionList,
  EngagementPanelTitleHeader: () => EngagementPanelTitleHeader,
  EomSettingsDisclaimer: () => EomSettingsDisclaimer,
  ExpandableMetadata: () => ExpandableMetadata,
  ExpandableTab: () => ExpandableTab,
  ExpandableVideoDescriptionBody: () => ExpandableVideoDescriptionBody,
  ExpandedShelfContents: () => ExpandedShelfContents,
  Factoid: () => Factoid,
  FancyDismissibleDialog: () => FancyDismissibleDialog,
  FeedFilterChipBar: () => FeedFilterChipBar,
  FeedNudge: () => FeedNudge,
  FeedTabbedHeader: () => FeedTabbedHeader,
  FeedbackEndpoint: () => FeedbackEndpoint,
  FlexibleActionsView: () => FlexibleActionsView,
  Form: () => Form,
  FormFooterView: () => FormFooterView,
  FormPopup: () => FormPopup,
  GameCard: () => GameCard,
  GameDetails: () => GameDetails,
  GetAccountsListInnertubeEndpoint: () => GetAccountsListInnertubeEndpoint,
  GetKidsBlocklistPickerCommand: () => GetKidsBlocklistPickerCommand,
  GetMultiPageMenuAction: () => GetMultiPageMenuAction,
  Grid: () => Grid,
  GridChannel: () => GridChannel,
  GridHeader: () => GridHeader,
  GridMix: () => GridMix,
  GridMovie: () => GridMovie,
  GridPlaylist: () => GridPlaylist,
  GridShelfView: () => GridShelfView,
  GridShow: () => GridShow,
  GridVideo: () => GridVideo,
  GuideCollapsibleEntry: () => GuideCollapsibleEntry,
  GuideCollapsibleSectionEntry: () => GuideCollapsibleSectionEntry,
  GuideDownloadsEntry: () => GuideDownloadsEntry,
  GuideEntry: () => GuideEntry,
  GuideSection: () => GuideSection,
  GuideSubscriptionsSection: () => GuideSubscriptionsSection,
  HashtagHeader: () => HashtagHeader,
  HashtagTile: () => HashtagTile,
  HeatMarker: () => HeatMarker,
  Heatmap: () => Heatmap,
  HeroPlaylistThumbnail: () => HeroPlaylistThumbnail,
  HideEngagementPanelEndpoint: () => HideEngagementPanelEndpoint,
  HighlightsCarousel: () => HighlightsCarousel,
  HistorySuggestion: () => HistorySuggestion,
  HorizontalCardList: () => HorizontalCardList,
  HorizontalList: () => HorizontalList,
  HorizontalMovieList: () => HorizontalMovieList,
  HowThisWasMadeSectionView: () => HowThisWasMadeSectionView,
  HypePointsFactoid: () => HypePointsFactoid,
  IconLink: () => IconLink,
  ImageBannerView: () => ImageBannerView,
  IncludingResultsFor: () => IncludingResultsFor,
  InfoPanelContainer: () => InfoPanelContainer,
  InfoPanelContent: () => InfoPanelContent,
  InfoRow: () => InfoRow,
  InteractiveTabbedHeader: () => InteractiveTabbedHeader,
  ItemSection: () => ItemSection,
  ItemSectionHeader: () => ItemSectionHeader,
  ItemSectionTab: () => ItemSectionTab,
  ItemSectionTabbedHeader: () => ItemSectionTabbedHeader,
  KidsBlocklistPicker: () => KidsBlocklistPicker,
  KidsBlocklistPickerItem: () => KidsBlocklistPickerItem,
  KidsCategoriesHeader: () => KidsCategoriesHeader,
  KidsCategoryTab: () => KidsCategoryTab,
  KidsHomeScreen: () => KidsHomeScreen,
  LikeButton: () => LikeButton,
  LikeButtonView: () => LikeButtonView,
  LikeEndpoint: () => LikeEndpoint,
  ListItemView: () => ListItemView,
  ListView: () => ListView,
  LiveChat: () => LiveChat,
  LiveChatActionPanel: () => LiveChatActionPanel,
  LiveChatAuthorBadge: () => LiveChatAuthorBadge,
  LiveChatAutoModMessage: () => LiveChatAutoModMessage,
  LiveChatBanner: () => LiveChatBanner,
  LiveChatBannerChatSummary: () => LiveChatBannerChatSummary,
  LiveChatBannerHeader: () => LiveChatBannerHeader,
  LiveChatBannerPoll: () => LiveChatBannerPoll,
  LiveChatBannerRedirect: () => LiveChatBannerRedirect,
  LiveChatDialog: () => LiveChatDialog,
  LiveChatHeader: () => LiveChatHeader,
  LiveChatItemBumperView: () => LiveChatItemBumperView,
  LiveChatItemContextMenuEndpoint: () => LiveChatItemContextMenuEndpoint,
  LiveChatItemList: () => LiveChatItemList,
  LiveChatMembershipItem: () => LiveChatMembershipItem,
  LiveChatMessageInput: () => LiveChatMessageInput,
  LiveChatModeChangeMessage: () => LiveChatModeChangeMessage,
  LiveChatPaidMessage: () => LiveChatPaidMessage,
  LiveChatPaidSticker: () => LiveChatPaidSticker,
  LiveChatParticipant: () => LiveChatParticipant,
  LiveChatParticipantsList: () => LiveChatParticipantsList,
  LiveChatPlaceholderItem: () => LiveChatPlaceholderItem,
  LiveChatProductItem: () => LiveChatProductItem,
  LiveChatRestrictedParticipation: () => LiveChatRestrictedParticipation,
  LiveChatSponsorshipsGiftPurchaseAnnouncement: () => LiveChatSponsorshipsGiftPurchaseAnnouncement,
  LiveChatSponsorshipsGiftRedemptionAnnouncement: () => LiveChatSponsorshipsGiftRedemptionAnnouncement,
  LiveChatSponsorshipsHeader: () => LiveChatSponsorshipsHeader,
  LiveChatTextMessage: () => LiveChatTextMessage,
  LiveChatTickerPaidMessageItem: () => LiveChatTickerPaidMessageItem,
  LiveChatTickerPaidStickerItem: () => LiveChatTickerPaidStickerItem,
  LiveChatTickerSponsorItem: () => LiveChatTickerSponsorItem,
  LiveChatViewerEngagementMessage: () => LiveChatViewerEngagementMessage,
  LockupMetadataView: () => LockupMetadataView,
  LockupView: () => LockupView,
  MacroMarkersInfoItem: () => MacroMarkersInfoItem,
  MacroMarkersList: () => MacroMarkersList,
  MacroMarkersListEntity: () => MacroMarkersListEntity,
  MacroMarkersListItem: () => MacroMarkersListItem,
  MarkChatItemAsDeletedAction: () => MarkChatItemAsDeletedAction,
  MarkChatItemsByAuthorAsDeletedAction: () => MarkChatItemsByAuthorAsDeletedAction,
  Menu: () => Menu,
  MenuFlexibleItem: () => MenuFlexibleItem,
  MenuNavigationItem: () => MenuNavigationItem,
  MenuPopup: () => MenuPopup,
  MenuServiceItem: () => MenuServiceItem,
  MenuServiceItemDownload: () => MenuServiceItemDownload,
  MenuTitle: () => MenuTitle,
  MerchandiseItem: () => MerchandiseItem,
  MerchandiseShelf: () => MerchandiseShelf,
  Message: () => Message,
  MetadataBadge: () => MetadataBadge,
  MetadataRow: () => MetadataRow,
  MetadataRowContainer: () => MetadataRowContainer,
  MetadataRowHeader: () => MetadataRowHeader,
  MetadataScreen: () => MetadataScreen,
  MicroformatData: () => MicroformatData,
  Mix: () => Mix,
  MobileTopbar: () => MobileTopbar,
  ModalWithTitleAndButton: () => ModalWithTitleAndButton,
  ModifyChannelNotificationPreferenceEndpoint: () => ModifyChannelNotificationPreferenceEndpoint,
  Movie: () => Movie,
  MovingThumbnail: () => MovingThumbnail,
  MultiMarkersPlayerBar: () => MultiMarkersPlayerBar,
  MultiPageMenu: () => MultiPageMenu,
  MultiPageMenuNotificationSection: () => MultiPageMenuNotificationSection,
  MultiPageMenuSection: () => MultiPageMenuSection,
  MusicCardShelf: () => MusicCardShelf,
  MusicCardShelfHeaderBasic: () => MusicCardShelfHeaderBasic,
  MusicCarouselShelf: () => MusicCarouselShelf,
  MusicCarouselShelfBasicHeader: () => MusicCarouselShelfBasicHeader,
  MusicDescriptionShelf: () => MusicDescriptionShelf,
  MusicDetailHeader: () => MusicDetailHeader,
  MusicDownloadStateBadge: () => MusicDownloadStateBadge,
  MusicEditablePlaylistDetailHeader: () => MusicEditablePlaylistDetailHeader,
  MusicElementHeader: () => MusicElementHeader,
  MusicHeader: () => MusicHeader,
  MusicImmersiveHeader: () => MusicImmersiveHeader,
  MusicInlineBadge: () => MusicInlineBadge,
  MusicItemThumbnailOverlay: () => MusicItemThumbnailOverlay,
  MusicLargeCardItemCarousel: () => MusicLargeCardItemCarousel,
  MusicMenuItemDivider: () => MusicMenuItemDivider,
  MusicMultiRowListItem: () => MusicMultiRowListItem,
  MusicMultiSelectMenu: () => MusicMultiSelectMenu,
  MusicMultiSelectMenuItem: () => MusicMultiSelectMenuItem,
  MusicNavigationButton: () => MusicNavigationButton,
  MusicPlayButton: () => MusicPlayButton,
  MusicPlaylistEditHeader: () => MusicPlaylistEditHeader,
  MusicPlaylistShelf: () => MusicPlaylistShelf,
  MusicQueue: () => MusicQueue,
  MusicResponsiveHeader: () => MusicResponsiveHeader,
  MusicResponsiveListItem: () => MusicResponsiveListItem,
  MusicResponsiveListItemFixedColumn: () => MusicResponsiveListItemFixedColumn,
  MusicResponsiveListItemFlexColumn: () => MusicResponsiveListItemFlexColumn,
  MusicShelf: () => MusicShelf,
  MusicSideAlignedItem: () => MusicSideAlignedItem,
  MusicSortFilterButton: () => MusicSortFilterButton,
  MusicTastebuilderShelf: () => MusicTasteBuilderShelf,
  MusicTastebuilderShelfThumbnail: () => MusicTastebuilderShelfThumbnail,
  MusicThumbnail: () => MusicThumbnail,
  MusicTwoRowItem: () => MusicTwoRowItem,
  MusicVisualHeader: () => MusicVisualHeader,
  NavigationEndpoint: () => NavigationEndpoint,
  Notification: () => Notification,
  NotificationAction: () => NotificationAction,
  OpenOnePickAddVideoModalCommand: () => OpenOnePickAddVideoModalCommand,
  OpenPopupAction: () => OpenPopupAction,
  PageHeader: () => PageHeader,
  PageHeaderView: () => PageHeaderView,
  PageIntroduction: () => PageIntroduction,
  PanelFooterView: () => PanelFooterView,
  PdgCommentChip: () => PdgCommentChip,
  PdgReplyButtonView: () => PdgReplyButtonView,
  PerformCommentActionEndpoint: () => PerformCommentActionEndpoint,
  PivotBar: () => PivotBar,
  PivotBarItem: () => PivotBarItem,
  PivotButton: () => PivotButton,
  PlayerAnnotationsExpanded: () => PlayerAnnotationsExpanded,
  PlayerCaptchaView: () => PlayerCaptchaView,
  PlayerCaptionsTracklist: () => PlayerCaptionsTracklist,
  PlayerControlsOverlay: () => PlayerControlsOverlay,
  PlayerErrorMessage: () => PlayerErrorMessage,
  PlayerLegacyDesktopYpcOffer: () => PlayerLegacyDesktopYpcOffer,
  PlayerLegacyDesktopYpcTrailer: () => PlayerLegacyDesktopYpcTrailer,
  PlayerLiveStoryboardSpec: () => PlayerLiveStoryboardSpec,
  PlayerMicroformat: () => PlayerMicroformat,
  PlayerOverflow: () => PlayerOverflow,
  PlayerOverlay: () => PlayerOverlay,
  PlayerOverlayAutoplay: () => PlayerOverlayAutoplay,
  PlayerOverlayVideoDetails: () => PlayerOverlayVideoDetails,
  PlayerStoryboardSpec: () => PlayerStoryboardSpec,
  Playlist: () => Playlist,
  PlaylistAddToOption: () => PlaylistAddToOption,
  PlaylistCustomThumbnail: () => PlaylistCustomThumbnail,
  PlaylistEditEndpoint: () => PlaylistEditEndpoint,
  PlaylistHeader: () => PlaylistHeader,
  PlaylistInfoCardContent: () => PlaylistInfoCardContent,
  PlaylistMetadata: () => PlaylistMetadata,
  PlaylistPanel: () => PlaylistPanel,
  PlaylistPanelVideo: () => PlaylistPanelVideo,
  PlaylistPanelVideoWrapper: () => PlaylistPanelVideoWrapper,
  PlaylistSidebar: () => PlaylistSidebar,
  PlaylistSidebarPrimaryInfo: () => PlaylistSidebarPrimaryInfo,
  PlaylistSidebarSecondaryInfo: () => PlaylistSidebarSecondaryInfo,
  PlaylistThumbnailOverlay: () => PlaylistThumbnailOverlay,
  PlaylistVideo: () => PlaylistVideo,
  PlaylistVideoList: () => PlaylistVideoList,
  PlaylistVideoThumbnail: () => PlaylistVideoThumbnail,
  Poll: () => Poll,
  PollHeader: () => PollHeader,
  Post: () => Post,
  PostMultiImage: () => PostMultiImage,
  PrefetchWatchCommand: () => PrefetchWatchCommand,
  PremiereTrailerBadge: () => PremiereTrailerBadge,
  ProductList: () => ProductList,
  ProductListHeader: () => ProductListHeader,
  ProductListItem: () => ProductListItem,
  ProfileColumn: () => ProfileColumn,
  ProfileColumnStats: () => ProfileColumnStats,
  ProfileColumnStatsEntry: () => ProfileColumnStatsEntry,
  ProfileColumnUserInfo: () => ProfileColumnUserInfo,
  Quiz: () => Quiz,
  RecognitionShelf: () => RecognitionShelf,
  ReelItem: () => ReelItem,
  ReelPlayerHeader: () => ReelPlayerHeader,
  ReelPlayerOverlay: () => ReelPlayerOverlay,
  ReelShelf: () => ReelShelf,
  ReelWatchEndpoint: () => ReelWatchEndpoint,
  RelatedChipCloud: () => RelatedChipCloud,
  RemoveBannerForLiveChatCommand: () => RemoveBannerForLiveChatCommand,
  RemoveChatItemAction: () => RemoveChatItemAction,
  RemoveChatItemByAuthorAction: () => RemoveChatItemByAuthorAction,
  ReplaceChatItemAction: () => ReplaceChatItemAction,
  ReplaceLiveChatAction: () => ReplaceLiveChatAction,
  ReplayChatItemAction: () => ReplayChatItemAction,
  RichGrid: () => RichGrid,
  RichItem: () => RichItem,
  RichListHeader: () => RichListHeader,
  RichMetadata: () => RichMetadata,
  RichMetadataRow: () => RichMetadataRow,
  RichSection: () => RichSection,
  RichShelf: () => RichShelf,
  RunAttestationCommand: () => RunAttestationCommand,
  SearchBox: () => SearchBox,
  SearchEndpoint: () => SearchEndpoint,
  SearchFilter: () => SearchFilter2,
  SearchFilterGroup: () => SearchFilterGroup,
  SearchFilterOptionsDialog: () => SearchFilterOptionsDialog,
  SearchHeader: () => SearchHeader,
  SearchRefinementCard: () => SearchRefinementCard,
  SearchSubMenu: () => SearchSubMenu,
  SearchSuggestion: () => SearchSuggestion,
  SearchSuggestionsSection: () => SearchSuggestionsSection,
  SecondarySearchContainer: () => SecondarySearchContainer,
  SectionHeaderView: () => SectionHeaderView,
  SectionList: () => SectionList,
  SegmentedLikeDislikeButton: () => SegmentedLikeDislikeButton,
  SegmentedLikeDislikeButtonView: () => SegmentedLikeDislikeButtonView,
  SendFeedbackAction: () => SendFeedbackAction,
  SettingBoolean: () => SettingBoolean,
  SettingsCheckbox: () => SettingsCheckbox,
  SettingsOptions: () => SettingsOptions,
  SettingsSidebar: () => SettingsSidebar,
  SettingsSwitch: () => SettingsSwitch,
  ShareEndpoint: () => ShareEndpoint,
  ShareEntityEndpoint: () => ShareEntityEndpoint,
  ShareEntityServiceEndpoint: () => ShareEntityServiceEndpoint,
  SharePanelHeader: () => SharePanelHeader,
  SharePanelTitleV15: () => SharePanelTitleV15,
  ShareTarget: () => ShareTarget,
  SharedPost: () => SharedPost,
  Shelf: () => Shelf,
  ShortsLockupView: () => ShortsLockupView,
  ShowCustomThumbnail: () => ShowCustomThumbnail,
  ShowDialogCommand: () => ShowDialogCommand,
  ShowEngagementPanelEndpoint: () => ShowEngagementPanelEndpoint,
  ShowLiveChatActionPanelAction: () => ShowLiveChatActionPanelAction,
  ShowLiveChatDialogAction: () => ShowLiveChatDialogAction,
  ShowLiveChatTooltipCommand: () => ShowLiveChatTooltipCommand,
  ShowingResultsFor: () => ShowingResultsFor,
  SignalAction: () => SignalAction,
  SignalServiceEndpoint: () => SignalServiceEndpoint,
  SimpleCardContent: () => SimpleCardContent,
  SimpleCardTeaser: () => SimpleCardTeaser,
  SimpleMenuHeader: () => SimpleMenuHeader,
  SimpleTextSection: () => SimpleTextSection,
  SingleActionEmergencySupport: () => SingleActionEmergencySupport,
  SingleColumnBrowseResults: () => SingleColumnBrowseResults,
  SingleColumnMusicWatchNextResults: () => SingleColumnMusicWatchNextResults,
  SingleHeroImage: () => SingleHeroImage,
  SlimOwner: () => SlimOwner,
  SlimVideoMetadata: () => SlimVideoMetadata,
  SortFilterHeader: () => SortFilterHeader,
  SortFilterSubMenu: () => SortFilterSubMenu,
  SponsorCommentBadge: () => SponsorCommentBadge,
  StartAt: () => StartAt,
  StructuredDescriptionContent: () => StructuredDescriptionContent,
  StructuredDescriptionPlaylistLockup: () => StructuredDescriptionPlaylistLockup,
  SubFeedOption: () => SubFeedOption,
  SubFeedSelector: () => SubFeedSelector,
  SubscribeButton: () => SubscribeButton,
  SubscribeButtonView: () => SubscribeButtonView,
  SubscribeEndpoint: () => SubscribeEndpoint,
  SubscriptionNotificationToggleButton: () => SubscriptionNotificationToggleButton,
  Tab: () => Tab,
  Tabbed: () => Tabbed,
  TabbedSearchResults: () => TabbedSearchResults,
  TextCarouselItemView: () => TextCarouselItemView,
  TextFieldView: () => TextFieldView,
  TextHeader: () => TextHeader,
  ThirdPartyShareTargetSection: () => ThirdPartyShareTargetSection,
  ThumbnailBadgeView: () => ThumbnailBadgeView,
  ThumbnailBottomOverlayView: () => ThumbnailBottomOverlayView,
  ThumbnailHoverOverlayToggleActionsView: () => ThumbnailHoverOverlayToggleActionsView,
  ThumbnailHoverOverlayView: () => ThumbnailHoverOverlayView,
  ThumbnailLandscapePortrait: () => ThumbnailLandscapePortrait,
  ThumbnailOverlayBadgeView: () => ThumbnailOverlayBadgeView,
  ThumbnailOverlayBottomPanel: () => ThumbnailOverlayBottomPanel,
  ThumbnailOverlayEndorsement: () => ThumbnailOverlayEndorsement,
  ThumbnailOverlayHoverText: () => ThumbnailOverlayHoverText,
  ThumbnailOverlayInlineUnplayable: () => ThumbnailOverlayInlineUnplayable,
  ThumbnailOverlayLoadingPreview: () => ThumbnailOverlayLoadingPreview,
  ThumbnailOverlayNowPlaying: () => ThumbnailOverlayNowPlaying,
  ThumbnailOverlayPinking: () => ThumbnailOverlayPinking,
  ThumbnailOverlayPlaybackStatus: () => ThumbnailOverlayPlaybackStatus,
  ThumbnailOverlayProgressBarView: () => ThumbnailOverlayProgressBarView,
  ThumbnailOverlayResumePlayback: () => ThumbnailOverlayResumePlayback,
  ThumbnailOverlaySidePanel: () => ThumbnailOverlaySidePanel,
  ThumbnailOverlayTimeStatus: () => ThumbnailOverlayTimeStatus,
  ThumbnailOverlayToggleButton: () => ThumbnailOverlayToggleButton,
  ThumbnailView: () => ThumbnailView,
  TimedMarkerDecoration: () => TimedMarkerDecoration,
  TitleAndButtonListHeader: () => TitleAndButtonListHeader,
  ToggleButton: () => ToggleButton,
  ToggleButtonView: () => ToggleButtonView,
  ToggleFormField: () => ToggleFormField,
  ToggleMenuServiceItem: () => ToggleMenuServiceItem,
  Tooltip: () => Tooltip,
  TopbarMenuButton: () => TopbarMenuButton,
  TopicChannelDetails: () => TopicChannelDetails,
  Transcript: () => Transcript,
  TranscriptFooter: () => TranscriptFooter,
  TranscriptSearchBox: () => TranscriptSearchBox,
  TranscriptSearchPanel: () => TranscriptSearchPanel,
  TranscriptSectionHeader: () => TranscriptSectionHeader,
  TranscriptSegment: () => TranscriptSegment,
  TranscriptSegmentList: () => TranscriptSegmentList,
  TwoColumnBrowseResults: () => TwoColumnBrowseResults,
  TwoColumnSearchResults: () => TwoColumnSearchResults,
  TwoColumnWatchNextResults: () => TwoColumnWatchNextResults,
  UnifiedSharePanel: () => UnifiedSharePanel,
  UniversalWatchCard: () => UniversalWatchCard,
  UnsubscribeEndpoint: () => UnsubscribeEndpoint,
  UpdateChannelSwitcherPageAction: () => UpdateChannelSwitcherPageAction,
  UpdateDateTextAction: () => UpdateDateTextAction,
  UpdateDescriptionAction: () => UpdateDescriptionAction,
  UpdateEngagementPanelAction: () => UpdateEngagementPanelAction,
  UpdateEngagementPanelContentCommand: () => UpdateEngagementPanelContentCommand,
  UpdateLiveChatPollAction: () => UpdateLiveChatPollAction,
  UpdateSubscribeButtonAction: () => UpdateSubscribeButtonAction,
  UpdateTitleAction: () => UpdateTitleAction,
  UpdateToggleButtonTextAction: () => UpdateToggleButtonTextAction,
  UpdateViewershipAction: () => UpdateViewershipAction,
  UploadTimeFactoid: () => UploadTimeFactoid,
  UpsellDialog: () => UpsellDialog,
  VerticalList: () => VerticalList,
  VerticalWatchCardList: () => VerticalWatchCardList,
  Video: () => Video,
  VideoAttributeView: () => VideoAttributeView,
  VideoAttributesSectionView: () => VideoAttributesSectionView,
  VideoCard: () => VideoCard,
  VideoDescriptionCourseSection: () => VideoDescriptionCourseSection,
  VideoDescriptionHeader: () => VideoDescriptionHeader,
  VideoDescriptionInfocardsSection: () => VideoDescriptionInfocardsSection,
  VideoDescriptionMusicSection: () => VideoDescriptionMusicSection,
  VideoDescriptionTranscriptSection: () => VideoDescriptionTranscriptSection,
  VideoInfoCardContent: () => VideoInfoCardContent,
  VideoMetadataCarouselView: () => VideoMetadataCarouselView,
  VideoOwner: () => VideoOwner,
  VideoPrimaryInfo: () => VideoPrimaryInfo,
  VideoSecondaryInfo: () => VideoSecondaryInfo,
  VideoSummaryContentView: () => VideoSummaryContentView,
  VideoSummaryParagraphView: () => VideoSummaryParagraphView,
  VideoViewCount: () => VideoViewCount,
  ViewCountFactoid: () => ViewCountFactoid,
  VoiceReplyContainerView: () => VoiceReplyContainerView,
  WatchCardCompactVideo: () => WatchCardCompactVideo,
  WatchCardHeroVideo: () => WatchCardHeroVideo,
  WatchCardRichHeader: () => WatchCardRichHeader,
  WatchCardSectionSequence: () => WatchCardSectionSequence,
  WatchEndpoint: () => WatchEndpoint,
  WatchNextEndScreen: () => WatchNextEndScreen,
  WatchNextEndpoint: () => WatchNextEndpoint,
  WatchNextTabbedResults: () => WatchNextTabbedResults,
  YpcTrailer: () => YpcTrailer
});

// dist/src/utils/Cache.js
var _cache;
var _UniversalCache = class _UniversalCache {
  constructor(persistent, persistent_directory) {
    __privateAdd(this, _cache);
    __privateSet(this, _cache, new Platform.shim.Cache(persistent, persistent_directory));
  }
  get cache_dir() {
    return __privateGet(this, _cache).cache_dir;
  }
  get(key) {
    return __privateGet(this, _cache).get(key);
  }
  set(key, value) {
    return __privateGet(this, _cache).set(key, value);
  }
  remove(key) {
    return __privateGet(this, _cache).remove(key);
  }
};
_cache = new WeakMap();
__name(_UniversalCache, "UniversalCache");
var UniversalCache = _UniversalCache;

// dist/src/utils/EventEmitterLike.js
var _legacy_listeners;
var _EventEmitterLike = class _EventEmitterLike extends EventTarget {
  constructor() {
    super();
    __privateAdd(this, _legacy_listeners, /* @__PURE__ */ new Map());
  }
  emit(type, ...args) {
    const event = new Platform.shim.CustomEvent(type, { detail: args });
    this.dispatchEvent(event);
  }
  on(type, listener) {
    const wrapper = /* @__PURE__ */ __name((ev) => {
      if (ev instanceof Platform.shim.CustomEvent) {
        listener(...ev.detail);
      } else {
        listener(ev);
      }
    }, "wrapper");
    __privateGet(this, _legacy_listeners).set(listener, wrapper);
    this.addEventListener(type, wrapper);
  }
  once(type, listener) {
    const wrapper = /* @__PURE__ */ __name((ev) => {
      if (ev instanceof Platform.shim.CustomEvent) {
        listener(...ev.detail);
      } else {
        listener(ev);
      }
      this.off(type, listener);
    }, "wrapper");
    __privateGet(this, _legacy_listeners).set(listener, wrapper);
    this.addEventListener(type, wrapper);
  }
  off(type, listener) {
    const wrapper = __privateGet(this, _legacy_listeners).get(listener);
    if (wrapper) {
      this.removeEventListener(type, wrapper);
      __privateGet(this, _legacy_listeners).delete(listener);
    }
  }
};
_legacy_listeners = new WeakMap();
__name(_EventEmitterLike, "EventEmitterLike");
var EventEmitterLike = _EventEmitterLike;

// dist/src/utils/FormatUtils.js
var FormatUtils_exports = {};
__export(FormatUtils_exports, {
  chooseFormat: () => chooseFormat,
  download: () => download,
  toDash: () => toDash
});

// dist/src/utils/DashUtils.js
var XML_CHARACTER_MAP = {
  "&": "&amp;",
  '"': "&quot;",
  "'": "&apos;",
  "<": "&lt;",
  ">": "&gt;"
};
function escapeXMLString(str) {
  return str.replace(/([&"<>'])/g, (_, item) => {
    return XML_CHARACTER_MAP[item];
  });
}
__name(escapeXMLString, "escapeXMLString");
function normalizeTag(tag) {
  return tag.charAt(0).toUpperCase() + tag.slice(1);
}
__name(normalizeTag, "normalizeTag");
function createElement(tagNameOrFunction, props, ...children) {
  const normalizedChildren = children.flat();
  if (typeof tagNameOrFunction === "function") {
    return tagNameOrFunction({ ...props, children: normalizedChildren });
  }
  return {
    type: normalizeTag(tagNameOrFunction),
    props: {
      ...props,
      children: normalizedChildren
    }
  };
}
__name(createElement, "createElement");
async function renderElementToString(element) {
  if (typeof element === "string")
    return escapeXMLString(element);
  let dom = `<${element.type}`;
  if (element.props) {
    for (const key of Object.keys(element.props)) {
      if (key !== "children" && element.props[key] !== void 0) {
        dom += ` ${key}="${escapeXMLString(`${element.props[key]}`)}"`;
      }
    }
  }
  if (element.props.children) {
    const children = await Promise.all((await Promise.all(element.props.children.flat())).flat().filter((child) => !!child).map((child) => renderElementToString(child)));
    if (children.length > 0) {
      dom += `>${children.join("")}</${element.type}>`;
      return dom;
    }
  }
  return `${dom}/>`;
}
__name(renderElementToString, "renderElementToString");
async function renderToString(root) {
  const dom = await renderElementToString(await root);
  return `<?xml version="1.0" encoding="utf-8"?>${dom}`;
}
__name(renderToString, "renderToString");
function Fragment(props) {
  return props.children;
}
__name(Fragment, "Fragment");

// dist/src/parser/classes/PlayerStoryboardSpec.js
var _PlayerStoryboardSpec = class _PlayerStoryboardSpec extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "boards");
    const parts = data.spec.split("|");
    const url = new URL(parts.shift());
    this.boards = parts.map((part, i) => {
      const [thumbnail_width, thumbnail_height, thumbnail_count, columns, rows, interval, name, sigh] = part.split("#");
      url.searchParams.set("sigh", sigh);
      const storyboard_count = Math.ceil(parseInt(thumbnail_count, 10) / (parseInt(columns, 10) * parseInt(rows, 10)));
      return {
        type: "vod",
        template_url: url.toString().replace("$L", i).replace("$N", name),
        thumbnail_width: parseInt(thumbnail_width, 10),
        thumbnail_height: parseInt(thumbnail_height, 10),
        thumbnail_count: parseInt(thumbnail_count, 10),
        interval: parseInt(interval, 10),
        columns: parseInt(columns, 10),
        rows: parseInt(rows, 10),
        storyboard_count
      };
    });
  }
};
__name(_PlayerStoryboardSpec, "PlayerStoryboardSpec");
__publicField(_PlayerStoryboardSpec, "type", "PlayerStoryboardSpec");
var PlayerStoryboardSpec = _PlayerStoryboardSpec;

// dist/package.json
var package_default = {
  name: "youtubei.js",
  version: "17.0.1",
  description: "A JavaScript client for YouTube's private API, known as InnerTube.",
  type: "module",
  types: "./dist/src/platform/lib.d.ts",
  typesVersions: {
    "*": {
      agnostic: [
        "./dist/src/platform/lib.d.ts"
      ],
      web: [
        "./dist/src/platform/lib.d.ts"
      ],
      "react-native": [
        "./dist/src/platform/lib.d.ts"
      ],
      "web.bundle": [
        "./dist/src/platform/lib.d.ts"
      ],
      "web.bundle.min": [
        "./dist/src/platform/lib.d.ts"
      ],
      "cf-worker": [
        "./dist/src/platform/lib.d.ts"
      ]
    }
  },
  exports: {
    ".": {
      deno: "./dist/src/platform/deno.js",
      node: {
        import: "./dist/src/platform/node.js",
        default: "./dist/src/platform/node.js"
      },
      types: "./dist/src/platform/lib.d.ts",
      browser: "./dist/src/platform/web.js",
      "react-native": "./dist/src/platform/react-native.js",
      default: "./dist/src/platform/web.js"
    },
    "./package.json": "./package.json",
    "./agnostic": {
      types: "./dist/src/platform/lib.d.ts",
      default: "./dist/src/platform/lib.js"
    },
    "./web": {
      types: "./dist/src/platform/lib.d.ts",
      default: "./dist/src/platform/web.js"
    },
    "./react-native": {
      types: "./dist/src/platform/lib.d.ts",
      default: "./dist/src/platform/react-native.js"
    },
    "./web.bundle": {
      types: "./dist/src/platform/lib.d.ts",
      default: "./bundle/browser.js"
    },
    "./cf-worker": {
      types: "./dist/src/platform/lib.d.ts",
      default: "./dist/src/platform/cf-worker.js"
    }
  },
  author: "LuanRT <luan.lrt4@gmail.com> (https://github.com/LuanRT)",
  funding: [
    "https://github.com/sponsors/LuanRT"
  ],
  contributors: [
    "Wykerd (https://github.com/wykerd/)",
    "MasterOfBob777 (https://github.com/MasterOfBob777)",
    "patrickkfkan (https://github.com/patrickkfkan)",
    "akkadaska (https://github.com/akkadaska)",
    "Absidue (https://github.com/absidue)"
  ],
  scripts: {
    test: "vitest run --reporter verbose",
    lint: "eslint ./src",
    "lint:fix": "eslint --fix ./src",
    "clean:source-maps": "rimraf ./bundle/browser.js.map ./bundle/cf-worker.js.map ./bundle/react-native.js.map",
    "clean:build-output": "rimraf ./dist ./bundle/browser.js ./bundle/cf-worker.js ./bundle/react-native.js ./deno",
    build: "npm run clean:build-output && npm run clean:source-maps && npm run build:parser-map && npm run build:esm && npm run bundle:browser && npm run bundle:cf-worker && npm run bundle:react-native",
    "build:esm": "tspc",
    "build:deno": `cpy ./src ./deno && cpy ./protos ./deno && esbuild ./src/utils/DashManifest.tsx --keep-names --format=esm --platform=neutral --target=es2020 --outfile=./deno/src/utils/DashManifest.js && cpy ./package.json ./deno && replace ".js';" ".ts';" ./deno -r && replace '.js";' '.ts";' ./deno -r && replace "'./DashManifest.ts';" "'./DashManifest.js';" ./deno -r && replace "'jintr';" "'jsr:@luanrt/jintr';" ./deno -r && replace "@bufbuild/protobuf/wire" "https://esm.sh/@bufbuild/protobuf@2.0.0/wire" ./deno -r`,
    "build:proto": "rimraf ./protos/generated && node ./dev-scripts/generate-proto.mjs",
    "build:parser-map": "node ./dev-scripts/gen-parser-map.mjs",
    "bundle:browser": 'esbuild ./dist/src/platform/web.js --banner:js="/* eslint-disable */" --bundle --sourcemap --target=chrome70 --keep-names --format=esm --define:global=globalThis --conditions=module --outfile=./bundle/browser.js --platform=browser',
    "bundle:react-native": "esbuild ./dist/src/platform/react-native.js --bundle --sourcemap --target=es2020 --keep-names --format=esm --platform=neutral --define:global=globalThis --conditions=module --outfile=./bundle/react-native.js",
    "bundle:cf-worker": 'esbuild ./dist/src/platform/cf-worker.js --banner:js="/* eslint-disable */" --bundle --sourcemap --target=es2020 --keep-names --format=esm --define:global=globalThis --conditions=module --outfile=./bundle/cf-worker.js --platform=node',
    "build:docs": "typedoc",
    prepare: "npm run build",
    watch: "tspc --watch"
  },
  repository: {
    type: "git",
    url: "git+https://github.com/LuanRT/YouTube.js.git"
  },
  files: [
    "dist/",
    "bundle/",
    "package.json",
    "README.md",
    "LICENSE"
  ],
  license: "MIT",
  dependencies: {
    "@bufbuild/protobuf": "^2.0.0",
    meriyah: "^6.1.4"
  },
  devDependencies: {
    "@eslint/js": "^9.37.0",
    "@types/estree": "^1.0.6",
    "@types/node": "^25.0.3",
    "@typescript-eslint/eslint-plugin": "^8.46.0",
    "@typescript-eslint/parser": "^8.46.0",
    "cpy-cli": "^6.0.0",
    esbuild: "^0.25.6",
    eslint: "^9.37.0",
    globals: "^17.0.0",
    replace: "^1.2.2",
    rimraf: "^6.0.1",
    "ts-patch": "^3.0.2",
    "ts-proto": "^2.2.0",
    typedoc: "^0.28.14",
    "typedoc-plugin-markdown": "^4.9.0",
    typescript: "^5.9.3",
    "typescript-eslint": "^8.46.0",
    vitest: "^3.2.4"
  },
  bugs: {
    url: "https://github.com/LuanRT/YouTube.js/issues"
  },
  homepage: "https://github.com/LuanRT/YouTube.js#readme",
  keywords: [
    "api",
    "youtube",
    "innertube",
    "livechat",
    "youtube-music",
    "ytdl",
    "youtube-studio",
    "downloader",
    "ytmusic"
  ]
};

// dist/src/utils/StreamingInfo.js
var TAG_ = "StreamingInfo";
function getFormatGroupings(formats, is_post_live_dvr) {
  const group_info = /* @__PURE__ */ new Map();
  const has_multiple_audio_tracks = formats.some((fmt) => !!fmt.audio_track);
  for (const format of formats) {
    if ((!format.index_range || !format.init_range) && !format.is_type_otf && !is_post_live_dvr) {
      continue;
    }
    const mime_type = format.mime_type.split(";")[0];
    const just_codec = getStringBetweenStrings(format.mime_type, 'codecs="', '"')?.split(".")[0];
    const color_info = format.color_info ? Object.values(format.color_info).join("-") : "";
    const audio_track_id = format.audio_track?.id || "";
    const drc = format.is_drc ? "drc" : "";
    const vb = format.is_vb ? "vb" : "";
    const group_id = `${mime_type}-${just_codec}-${color_info}-${audio_track_id}-${drc}-${vb}`;
    if (!group_info.has(group_id)) {
      group_info.set(group_id, []);
    }
    group_info.get(group_id)?.push(format);
  }
  return {
    groups: Array.from(group_info.values()),
    has_multiple_audio_tracks
  };
}
__name(getFormatGroupings, "getFormatGroupings");
function hoistCodecsIfPossible(formats, hoisted) {
  if (formats.length > 1 && new Set(formats.map((format) => getStringBetweenStrings(format.mime_type, 'codecs="', '"'))).size === 1) {
    hoisted.push("codecs");
    return getStringBetweenStrings(formats[0].mime_type, 'codecs="', '"');
  }
}
__name(hoistCodecsIfPossible, "hoistCodecsIfPossible");
function hoistNumberAttributeIfPossible(formats, property, hoisted) {
  if (formats.length > 1 && new Set(formats.map((format) => format.fps)).size === 1) {
    hoisted.push(property);
    return Number(formats[0][property]);
  }
}
__name(hoistNumberAttributeIfPossible, "hoistNumberAttributeIfPossible");
function hoistAudioChannelsIfPossible(formats, hoisted) {
  if (formats.length > 1 && new Set(formats.map((format) => format.audio_channels || 2)).size === 1) {
    hoisted.push("AudioChannelConfiguration");
    return formats[0].audio_channels;
  }
}
__name(hoistAudioChannelsIfPossible, "hoistAudioChannelsIfPossible");
async function getOTFSegmentTemplate(url, actions) {
  const response = await actions.session.http.fetch_function(`${url}&rn=0&sq=0`, {
    method: "GET",
    headers: STREAM_HEADERS,
    redirect: "follow"
  });
  const resolved_url = response.url.replace("&rn=0", "").replace("&sq=0", "");
  const response_text = await response.text();
  const segment_duration_strings = getStringBetweenStrings(response_text, "Segment-Durations-Ms:", "\r\n")?.split(",");
  if (!segment_duration_strings) {
    throw new InnertubeError("Failed to extract the segment durations from this OTF stream", { url });
  }
  const segment_durations = [];
  for (const segment_duration_string of segment_duration_strings) {
    const trimmed_segment_duration = segment_duration_string.trim();
    if (trimmed_segment_duration.length === 0) {
      continue;
    }
    let repeat_count;
    const repeat_count_string = getStringBetweenStrings(trimmed_segment_duration, "(r=", ")");
    if (repeat_count_string) {
      repeat_count = parseInt(repeat_count_string);
    }
    segment_durations.push({
      duration: parseInt(trimmed_segment_duration),
      repeat_count
    });
  }
  return {
    init_url: `${resolved_url}&sq=0`,
    media_url: `${resolved_url}&sq=$Number$`,
    timeline: segment_durations
  };
}
__name(getOTFSegmentTemplate, "getOTFSegmentTemplate");
async function getPostLiveDvrInfo(transformed_url, actions) {
  const response = await actions.session.http.fetch_function(`${transformed_url}&rn=0&sq=0`, {
    method: "HEAD",
    headers: STREAM_HEADERS,
    redirect: "follow"
  });
  const duration_ms = parseInt(response.headers.get("X-Head-Time-Millis") || "");
  const segment_count = parseInt(response.headers.get("X-Head-Seqnum") || "");
  if (isNaN(duration_ms) || isNaN(segment_count)) {
    throw new InnertubeError("Failed to extract the duration or segment count for this Post Live DVR video");
  }
  return {
    duration: duration_ms / 1e3,
    segment_count
  };
}
__name(getPostLiveDvrInfo, "getPostLiveDvrInfo");
async function getPostLiveDvrDuration(shared_post_live_dvr_info, format, url_transformer, actions, player, cpn) {
  if (!shared_post_live_dvr_info.item) {
    const url = new URL(await format.decipher(player));
    url.searchParams.set("cpn", cpn || "");
    const transformed_url = url_transformer(url).toString();
    shared_post_live_dvr_info.item = await getPostLiveDvrInfo(transformed_url, actions);
  }
  return shared_post_live_dvr_info.item.duration;
}
__name(getPostLiveDvrDuration, "getPostLiveDvrDuration");
async function getSegmentInfo(format, url_transformer, actions, player, cpn, shared_post_live_dvr_info, is_sabr) {
  let transformed_url = "";
  if (is_sabr) {
    const formatKey = `${format.itag || ""}:${format.xtags || ""}`;
    transformed_url = `sabr://${format.has_video ? "video" : "audio"}?key=${formatKey}`;
  } else {
    const url = new URL(await format.decipher(player));
    url.searchParams.set("cpn", cpn || "");
    transformed_url = url_transformer(url).toString();
  }
  if (format.is_type_otf) {
    if (!actions)
      throw new InnertubeError("Unable to get segment durations for this OTF stream without an Actions instance", { format });
    const info3 = {
      is_oft: true,
      is_post_live_dvr: false,
      getSegmentTemplate() {
        return getOTFSegmentTemplate(transformed_url, actions);
      }
    };
    return info3;
  }
  if (shared_post_live_dvr_info) {
    if (!actions) {
      throw new InnertubeError("Unable to get segment count for this Post Live DVR video without an Actions instance", { format });
    }
    const target_duration_dec = format.target_duration_dec;
    if (typeof target_duration_dec !== "number") {
      throw new InnertubeError("Format is missing target_duration_dec", { format });
    }
    const info3 = {
      is_oft: false,
      is_post_live_dvr: true,
      async getSegmentTemplate() {
        if (!shared_post_live_dvr_info.item) {
          shared_post_live_dvr_info.item = await getPostLiveDvrInfo(transformed_url, actions);
        }
        return {
          media_url: `${transformed_url}&sq=$Number$`,
          timeline: [
            {
              duration: target_duration_dec * 1e3,
              repeat_count: shared_post_live_dvr_info.item.segment_count
            }
          ]
        };
      }
    };
    return info3;
  }
  if (!format.index_range || !format.init_range)
    throw new InnertubeError("Index and init ranges not available", { format });
  const info2 = {
    is_oft: false,
    is_post_live_dvr: false,
    base_url: transformed_url,
    index_range: format.index_range,
    init_range: format.init_range
  };
  return info2;
}
__name(getSegmentInfo, "getSegmentInfo");
async function getAudioRepresentation(format, hoisted, url_transformer, actions, player, cpn, shared_post_live_dvr_info, is_sabr) {
  const uid_parts = [format.itag.toString()];
  if (format.audio_track) {
    uid_parts.push(format.audio_track.id);
  }
  if (format.is_drc) {
    uid_parts.push("drc");
  }
  if (format.is_vb) {
    uid_parts.push("vb");
  }
  const rep = {
    uid: uid_parts.join("-"),
    bitrate: format.bitrate,
    codecs: !hoisted.includes("codecs") ? getStringBetweenStrings(format.mime_type, 'codecs="', '"') : void 0,
    audio_sample_rate: !hoisted.includes("audio_sample_rate") ? format.audio_sample_rate : void 0,
    channels: !hoisted.includes("AudioChannelConfiguration") ? format.audio_channels || 2 : void 0,
    segment_info: await getSegmentInfo(format, url_transformer, actions, player, cpn, shared_post_live_dvr_info, is_sabr)
  };
  return rep;
}
__name(getAudioRepresentation, "getAudioRepresentation");
function getTrackRoles(format, has_drc_streams) {
  if (!format.audio_track && !has_drc_streams) {
    return;
  }
  const roles = [
    format.is_original ? "main" : "alternate"
  ];
  if (format.is_dubbed || format.is_auto_dubbed)
    roles.push("dub");
  if (format.is_descriptive)
    roles.push("description");
  if (format.is_drc || format.is_vb)
    roles.push("enhanced-audio-intelligibility");
  return roles;
}
__name(getTrackRoles, "getTrackRoles");
async function getAudioSet(formats, url_transformer, actions, player, cpn, shared_post_live_dvr_info, drc_labels, vb_labels, is_sabr) {
  const first_format = formats[0];
  const { audio_track } = first_format;
  const hoisted = [];
  const has_drc_streams = !!drc_labels;
  const has_vb_streams = !!vb_labels;
  let track_name;
  if (audio_track) {
    if (has_drc_streams && first_format.is_drc) {
      track_name = drc_labels.label_drc_multiple(audio_track.display_name);
    } else if (has_vb_streams && first_format.is_vb) {
      track_name = vb_labels.label_vb_multiple(audio_track.display_name);
    } else {
      track_name = audio_track.display_name;
    }
  } else if (has_drc_streams || has_vb_streams) {
    if (has_drc_streams && first_format.is_drc) {
      track_name = drc_labels.label_drc;
    } else if (has_vb_streams && first_format.is_vb) {
      track_name = vb_labels.label_vb;
    } else {
      track_name = (drc_labels || vb_labels)?.label_original;
    }
  }
  const set = {
    mime_type: first_format.mime_type.split(";")[0],
    language: first_format.language ?? void 0,
    codecs: hoistCodecsIfPossible(formats, hoisted),
    audio_sample_rate: hoistNumberAttributeIfPossible(formats, "audio_sample_rate", hoisted),
    track_name,
    track_roles: getTrackRoles(first_format, has_drc_streams),
    channels: hoistAudioChannelsIfPossible(formats, hoisted),
    drm_families: first_format.drm_families,
    drm_track_type: first_format.drm_track_type,
    representations: await Promise.all(formats.map((format) => getAudioRepresentation(format, hoisted, url_transformer, actions, player, cpn, shared_post_live_dvr_info, is_sabr)))
  };
  return set;
}
__name(getAudioSet, "getAudioSet");
var COLOR_PRIMARIES = {
  BT709: "1",
  BT2020: "9"
};
var COLOR_TRANSFER_CHARACTERISTICS = {
  BT709: "1",
  BT2020_10: "14",
  SMPTEST2084: "16",
  ARIB_STD_B67: "18"
};
var COLOR_MATRIX_COEFFICIENTS = {
  BT709: "1",
  BT2020_NCL: "14"
};
function getColorInfo(format) {
  const color_info = format.color_info;
  let primaries;
  let transfer_characteristics;
  let matrix_coefficients;
  if (color_info) {
    if (color_info.primaries) {
      primaries = COLOR_PRIMARIES[color_info.primaries];
    }
    if (color_info.transfer_characteristics) {
      transfer_characteristics = COLOR_TRANSFER_CHARACTERISTICS[color_info.transfer_characteristics];
    }
    if (color_info.matrix_coefficients) {
      matrix_coefficients = COLOR_MATRIX_COEFFICIENTS[color_info.matrix_coefficients];
      if (!matrix_coefficients) {
        const url = new URL(format.url);
        const anonymisedFormat = JSON.parse(JSON.stringify(format));
        anonymisedFormat.url = "REDACTED";
        anonymisedFormat.signature_cipher = "REDACTED";
        anonymisedFormat.cipher = "REDACTED";
        warn(TAG_, `Unknown matrix coefficients "${color_info.matrix_coefficients}". The DASH manifest is still usable without this.
Please report it at ${package_default.bugs.url} so we can add support for it.
InnerTube client: ${url.searchParams.get("c")}
format:`, anonymisedFormat);
      }
    }
  } else if (getStringBetweenStrings(format.mime_type, 'codecs="', '"')?.startsWith("avc1")) {
    transfer_characteristics = COLOR_TRANSFER_CHARACTERISTICS.BT709;
  }
  const info2 = {
    primaries,
    transfer_characteristics,
    matrix_coefficients
  };
  return info2;
}
__name(getColorInfo, "getColorInfo");
async function getVideoRepresentation(format, url_transformer, hoisted, player, actions, cpn, shared_post_live_dvr_info, is_sabr) {
  const rep = {
    uid: format.itag.toString(),
    bitrate: format.bitrate,
    width: format.width,
    height: format.height,
    codecs: !hoisted.includes("codecs") ? getStringBetweenStrings(format.mime_type, 'codecs="', '"') : void 0,
    fps: !hoisted.includes("fps") ? format.fps : void 0,
    segment_info: await getSegmentInfo(format, url_transformer, actions, player, cpn, shared_post_live_dvr_info, is_sabr)
  };
  return rep;
}
__name(getVideoRepresentation, "getVideoRepresentation");
async function getVideoSet(formats, url_transformer, player, actions, cpn, shared_post_live_dvr_info, is_sabr) {
  const first_format = formats[0];
  const color_info = getColorInfo(first_format);
  const hoisted = [];
  const set = {
    mime_type: first_format.mime_type.split(";")[0],
    color_info,
    codecs: hoistCodecsIfPossible(formats, hoisted),
    fps: hoistNumberAttributeIfPossible(formats, "fps", hoisted),
    drm_families: first_format.drm_families,
    drm_track_type: first_format.drm_track_type,
    representations: await Promise.all(formats.map((format) => getVideoRepresentation(format, url_transformer, hoisted, player, actions, cpn, shared_post_live_dvr_info, is_sabr)))
  };
  return set;
}
__name(getVideoSet, "getVideoSet");
function getStoryboardInfo(storyboards) {
  const mime_info = /* @__PURE__ */ new Map();
  const boards = storyboards.is(PlayerStoryboardSpec) ? storyboards.boards : [storyboards.board];
  for (const storyboard of boards) {
    const extension = new URL(storyboard.template_url).pathname.split(".").pop();
    const mime_type = `image/${extension === "jpg" ? "jpeg" : extension}`;
    if (!mime_info.has(mime_type)) {
      mime_info.set(mime_type, []);
    }
    mime_info.get(mime_type)?.push(storyboard);
  }
  return mime_info;
}
__name(getStoryboardInfo, "getStoryboardInfo");
async function getStoryboardMimeType(actions, board, transform_url, probable_mime_type, shared_response) {
  const url = board.template_url;
  const req_url = transform_url(new URL(url.replace("$M", "0")));
  const res_promise = shared_response.response ? shared_response.response : actions.session.http.fetch_function(req_url, {
    method: "HEAD",
    headers: STREAM_HEADERS
  });
  shared_response.response = res_promise;
  const res = await res_promise;
  return res.headers.get("Content-Type") || probable_mime_type;
}
__name(getStoryboardMimeType, "getStoryboardMimeType");
async function getStoryboardBitrate(actions, board, shared_response) {
  const url = board.template_url;
  const response_promises = [];
  const request_limit = Math.min(board.type === "vod" ? board.storyboard_count : 5, 10);
  for (let i = 0; i < request_limit; i++) {
    const req_url = new URL(url.replace("$M", i.toString()));
    const response_promise = i === 0 && shared_response.response ? shared_response.response : actions.session.http.fetch_function(req_url, {
      method: "HEAD",
      headers: STREAM_HEADERS
    });
    if (i === 0)
      shared_response.response = response_promise;
    response_promises.push(response_promise);
  }
  const responses = await Promise.all(response_promises);
  const content_lengths = [];
  for (const response of responses) {
    content_lengths.push(parseInt(response.headers.get("Content-Length") || "0"));
  }
  return Math.ceil(Math.max(...content_lengths) / (board.rows * board.columns) * 8);
}
__name(getStoryboardBitrate, "getStoryboardBitrate");
function getImageRepresentation(duration, actions, board, transform_url, shared_response) {
  const url = board.template_url;
  const template_url = new URL(url.replace("$M", "$Number$"));
  let template_duration;
  if (board.type === "vod") {
    template_duration = duration / board.storyboard_count;
  } else {
    template_duration = duration * board.columns * board.rows;
  }
  const rep = {
    uid: `thumbnails_${board.thumbnail_width}x${board.thumbnail_height}`,
    getBitrate() {
      return getStoryboardBitrate(actions, board, shared_response);
    },
    sheet_width: board.thumbnail_width * board.columns,
    sheet_height: board.thumbnail_height * board.rows,
    thumbnail_height: board.thumbnail_height,
    thumbnail_width: board.thumbnail_width,
    rows: board.rows,
    columns: board.columns,
    template_duration: Math.round(template_duration),
    template_url: transform_url(template_url).toString(),
    getURL(n) {
      return template_url.toString().replace("$Number$", n.toString());
    }
  };
  return rep;
}
__name(getImageRepresentation, "getImageRepresentation");
function getImageSets(duration, actions, storyboards, transform_url) {
  const mime_info = getStoryboardInfo(storyboards);
  const shared_response = {};
  return Array.from(mime_info.entries()).map(([type, boards]) => ({
    probable_mime_type: type,
    getMimeType() {
      return getStoryboardMimeType(actions, boards[0], transform_url, type, shared_response);
    },
    representations: boards.map((board) => getImageRepresentation(duration, actions, board, transform_url, shared_response))
  }));
}
__name(getImageSets, "getImageSets");
function getTextSets(caption_tracks, format, transform_url) {
  const mime_type = format === "vtt" ? "text/vtt" : "application/ttml+xml";
  return caption_tracks.map((caption_track) => {
    const url = new URL(caption_track.base_url);
    url.searchParams.set("fmt", format);
    const track_roles = ["caption"];
    if (url.searchParams.has("tlang")) {
      track_roles.push("dub");
    }
    return {
      mime_type,
      language: caption_track.language_code,
      track_name: caption_track.name.toString(),
      track_roles,
      representation: {
        uid: `text-${caption_track.vss_id}`,
        base_url: transform_url(url).toString()
      }
    };
  });
}
__name(getTextSets, "getTextSets");
async function getStreamingInfo(streaming_data, is_post_live_dvr = false, url_transformer = (url) => url, format_filter, cpn, player, actions, storyboards, caption_tracks, options) {
  if (!streaming_data)
    throw new InnertubeError("Streaming data not available");
  const formats = format_filter ? streaming_data.adaptive_formats.filter((fmt) => !format_filter(fmt)) : streaming_data.adaptive_formats;
  let getDuration;
  let shared_post_live_dvr_info;
  if (is_post_live_dvr) {
    shared_post_live_dvr_info = {};
    if (!actions) {
      throw new InnertubeError("Unable to get duration or segment count for this Post Live DVR video without an Actions instance");
    }
    getDuration = /* @__PURE__ */ __name(() => {
      if (!shared_post_live_dvr_info) {
        return Promise.resolve(0);
      }
      return getPostLiveDvrDuration(shared_post_live_dvr_info, formats[0], url_transformer, actions, player, cpn);
    }, "getDuration");
  } else {
    const duration = formats[0].approx_duration_ms / 1e3;
    getDuration = /* @__PURE__ */ __name(() => Promise.resolve(duration), "getDuration");
  }
  const { groups, has_multiple_audio_tracks } = getFormatGroupings(formats, is_post_live_dvr);
  const { video_groups, audio_groups } = groups.reduce((acc, formats2) => {
    if (formats2[0].has_audio) {
      if (has_multiple_audio_tracks && !formats2[0].audio_track)
        return acc;
      acc.audio_groups.push(formats2);
      return acc;
    }
    acc.video_groups.push(formats2);
    return acc;
  }, {
    video_groups: [],
    audio_groups: []
  });
  let drc_labels;
  let vb_labels;
  let hasDrc = false;
  let hasVb = false;
  for (const ag of audio_groups.flat()) {
    if (hasDrc === false && ag.is_drc) {
      hasDrc = true;
    }
    if (hasVb === false && ag.is_vb) {
      hasVb = true;
    }
  }
  if (hasDrc) {
    drc_labels = {
      label_original: options?.label_original || "Original",
      label_drc: options?.label_drc || "Stable Volume",
      label_drc_multiple: options?.label_drc_multiple || ((display_name) => `${display_name} (Stable Volume)`)
    };
  }
  if (hasVb) {
    vb_labels = {
      label_original: options?.label_original || "Original",
      label_vb: options?.label_vb || "Voice Boost",
      label_vb_multiple: options?.label_vb_multiple || ((display_name) => `${display_name} (Voice Boost)`)
    };
  }
  const audio_sets = await Promise.all(audio_groups.map((formats2) => getAudioSet(formats2, url_transformer, actions, player, cpn, shared_post_live_dvr_info, drc_labels, vb_labels, options?.is_sabr)));
  const video_sets = await Promise.all(video_groups.map((formats2) => getVideoSet(formats2, url_transformer, player, actions, cpn, shared_post_live_dvr_info, options?.is_sabr)));
  let image_sets = [];
  if (storyboards && actions) {
    let duration;
    if (storyboards.is(PlayerStoryboardSpec)) {
      duration = formats[0].approx_duration_ms / 1e3;
    } else {
      const target_duration_dec = formats[0].target_duration_dec;
      if (target_duration_dec === void 0)
        throw new InnertubeError("Format is missing target_duration_dec", { format: formats[0] });
      duration = target_duration_dec;
    }
    image_sets = getImageSets(duration, actions, storyboards, url_transformer);
  }
  let text_sets = [];
  if (caption_tracks && options?.captions_format) {
    if (options.captions_format !== "vtt" && options.captions_format !== "ttml") {
      throw new InnertubeError("Invalid captions format", options.captions_format);
    }
    text_sets = getTextSets(caption_tracks, options.captions_format, url_transformer);
  }
  const info2 = {
    getDuration,
    audio_sets,
    video_sets,
    image_sets,
    text_sets
  };
  return info2;
}
__name(getStreamingInfo, "getStreamingInfo");

// dist/src/utils/DashManifest.js
async function OTFPostLiveDvrSegmentInfo({ info: info2 }) {
  if (!info2.is_oft && !info2.is_post_live_dvr)
    return null;
  const template = await info2.getSegmentTemplate();
  return createElement(
    "segmentTemplate",
    { startNumber: template.init_url ? "1" : "0", timescale: "1000", initialization: template.init_url, media: template.media_url },
    createElement("segmentTimeline", null, template.timeline.map((segment_duration) => createElement("s", { d: segment_duration.duration, r: segment_duration.repeat_count })))
  );
}
__name(OTFPostLiveDvrSegmentInfo, "OTFPostLiveDvrSegmentInfo");
function SegmentInfo({ info: info2 }) {
  if (info2.is_oft || info2.is_post_live_dvr) {
    return createElement(OTFPostLiveDvrSegmentInfo, { info: info2 });
  }
  return createElement(
    Fragment,
    null,
    createElement("baseURL", null, info2.base_url),
    createElement(
      "segmentBase",
      { indexRange: `${info2.index_range.start}-${info2.index_range.end}` },
      createElement("initialization", { range: `${info2.init_range.start}-${info2.init_range.end}` })
    )
  );
}
__name(SegmentInfo, "SegmentInfo");
function getDrmSystemId(drm_family) {
  switch (drm_family) {
    case "WIDEVINE":
      return "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed";
    case "PLAYREADY":
      return "9a04f079-9840-4286-ab92-e65be0885f95";
    default:
      return null;
  }
}
__name(getDrmSystemId, "getDrmSystemId");
async function DashManifest({ streamingData, isPostLiveDvr, transformURL, rejectFormat, cpn, player, actions, storyboards, captionTracks, options }) {
  const { getDuration, audio_sets, video_sets, image_sets, text_sets } = await getStreamingInfo(streamingData, isPostLiveDvr, transformURL, rejectFormat, cpn, player, actions, storyboards, captionTracks, options);
  return createElement(
    "mPD",
    { xmlns: "urn:mpeg:dash:schema:mpd:2011", minBufferTime: "PT1.500S", profiles: "urn:mpeg:dash:profile:isoff-main:2011", type: "static", mediaPresentationDuration: `PT${await getDuration()}S`, "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation": "urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" },
    createElement(
      "period",
      null,
      audio_sets.map((set, index) => createElement(
        "adaptationSet",
        { id: index, mimeType: set.mime_type, startWithSAP: "1", subsegmentAlignment: "true", lang: set.language, codecs: set.codecs, audioSamplingRate: set.audio_sample_rate, contentType: "audio" },
        set.drm_families && set.drm_families.map((drm_family) => createElement("contentProtection", { schemeIdUri: `urn:uuid:${getDrmSystemId(drm_family)}` })),
        set.track_roles && set.track_roles.map((role) => createElement("role", { schemeIdUri: "urn:mpeg:dash:role:2011", value: role })),
        set.track_name && createElement("label", { id: index }, set.track_name),
        set.channels && createElement("audioChannelConfiguration", { schemeIdUri: "urn:mpeg:dash:23003:3:audio_channel_configuration:2011", value: set.channels }),
        set.representations.map((rep) => createElement(
          "representation",
          { id: rep.uid, bandwidth: rep.bitrate, codecs: rep.codecs, audioSamplingRate: rep.audio_sample_rate },
          rep.channels && createElement("audioChannelConfiguration", { schemeIdUri: "urn:mpeg:dash:23003:3:audio_channel_configuration:2011", value: rep.channels }),
          createElement(SegmentInfo, { info: rep.segment_info })
        ))
      )),
      video_sets.map((set, index) => createElement(
        "adaptationSet",
        { id: index + audio_sets.length, mimeType: set.mime_type, startWithSAP: "1", subsegmentAlignment: "true", codecs: set.codecs, maxPlayoutRate: "1", frameRate: set.fps, contentType: "video" },
        set.drm_families && set.drm_families.map((drm_family) => createElement("contentProtection", { schemeIdUri: `urn:uuid:${getDrmSystemId(drm_family)}` })),
        set.color_info.primaries && createElement("supplementalProperty", { schemeIdUri: "urn:mpeg:mpegB:cicp:ColourPrimaries", value: set.color_info.primaries }),
        set.color_info.transfer_characteristics && createElement("supplementalProperty", { schemeIdUri: "urn:mpeg:mpegB:cicp:TransferCharacteristics", value: set.color_info.transfer_characteristics }),
        set.color_info.matrix_coefficients && createElement("supplementalProperty", { schemeIdUri: "urn:mpeg:mpegB:cicp:MatrixCoefficients", value: set.color_info.matrix_coefficients }),
        set.representations.map((rep) => createElement(
          "representation",
          { id: rep.uid, bandwidth: rep.bitrate, width: rep.width, height: rep.height, codecs: rep.codecs, frameRate: rep.fps },
          createElement(SegmentInfo, { info: rep.segment_info })
        ))
      )),
      image_sets.map(async (set, index) => {
        return createElement("adaptationSet", { id: index + audio_sets.length + video_sets.length, mimeType: await set.getMimeType(), contentType: "image" }, set.representations.map(async (rep) => createElement(
          "representation",
          { id: `thumbnails_${rep.thumbnail_width}x${rep.thumbnail_height}`, bandwidth: await rep.getBitrate(), width: rep.sheet_width, height: rep.sheet_height },
          createElement("essentialProperty", { schemeIdUri: "http://dashif.org/thumbnail_tile", value: `${rep.columns}x${rep.rows}` }),
          createElement("segmentTemplate", { media: rep.template_url, duration: rep.template_duration, startNumber: "0" })
        )));
      }),
      text_sets.map((set, index) => {
        return createElement(
          "adaptationSet",
          { id: index + audio_sets.length + video_sets.length + image_sets.length, mimeType: set.mime_type, lang: set.language, contentType: "text" },
          set.track_roles.map((role) => createElement("role", { schemeIdUri: "urn:mpeg:dash:role:2011", value: role })),
          createElement("label", { id: index + audio_sets.length }, set.track_name),
          createElement(
            "representation",
            { id: set.representation.uid, bandwidth: "0" },
            createElement("baseURL", null, set.representation.base_url)
          )
        );
      })
    )
  );
}
__name(DashManifest, "DashManifest");
function toDash(streaming_data, is_post_live_dvr = false, url_transformer = (url) => url, format_filter, cpn, player, actions, storyboards, caption_tracks, options) {
  if (!streaming_data)
    throw new InnertubeError("Streaming data not available");
  return renderToString(createElement(DashManifest, { streamingData: streaming_data, isPostLiveDvr: is_post_live_dvr, transformURL: url_transformer, options, rejectFormat: format_filter, cpn, player, actions, storyboards, captionTracks: caption_tracks }));
}
__name(toDash, "toDash");

// dist/src/utils/FormatUtils.js
async function download(options, actions, playability_status, streaming_data, player, cpn) {
  if (playability_status?.status === "UNPLAYABLE")
    throw new InnertubeError("Video is unplayable", { error_type: "UNPLAYABLE" });
  if (playability_status?.status === "LOGIN_REQUIRED")
    throw new InnertubeError("Video is login required", { error_type: "LOGIN_REQUIRED" });
  if (!streaming_data)
    throw new InnertubeError("Streaming data not available.", { error_type: "NO_STREAMING_DATA" });
  const opts = {
    quality: "360p",
    type: "video+audio",
    format: "mp4",
    range: void 0,
    ...options
  };
  const format = chooseFormat(opts, streaming_data);
  const format_url = await format.decipher(player);
  if (opts.type === "video+audio" && !options.range) {
    const response = await actions.session.http.fetch_function(`${format_url}&cpn=${cpn}`, {
      method: "GET",
      headers: STREAM_HEADERS,
      redirect: "follow"
    });
    if (!response.ok)
      throw new InnertubeError("The server responded with a non 2xx status code", { error_type: "FETCH_FAILED", response });
    const body = response.body;
    if (!body)
      throw new InnertubeError("Could not get ReadableStream from fetch Response.", { error_type: "FETCH_FAILED", response });
    return body;
  }
  const chunk_size = 1048576 * 10;
  let chunk_start = options.range ? options.range.start : 0;
  let chunk_end = options.range ? options.range.end : chunk_size;
  let must_end = false;
  let cancel;
  return new Platform.shim.ReadableStream({
    start() {
    },
    pull: /* @__PURE__ */ __name(async (controller) => {
      if (must_end) {
        controller.close();
        return;
      }
      if (chunk_end >= (format.content_length ? format.content_length : 0) || options.range) {
        must_end = true;
      }
      return new Promise(async (resolve, reject) => {
        try {
          cancel = new AbortController();
          const response = await actions.session.http.fetch_function(`${format_url}&cpn=${cpn}&range=${chunk_start}-${chunk_end || ""}`, {
            method: "GET",
            headers: {
              ...STREAM_HEADERS
              // XXX: use YouTube's range parameter instead of a Range header.
              // Range: `bytes=${chunk_start}-${chunk_end}`
            },
            signal: cancel.signal
          });
          if (!response.ok)
            throw new InnertubeError("The server responded with a non 2xx status code", {
              error_type: "FETCH_FAILED",
              response
            });
          const body = response.body;
          if (!body)
            throw new InnertubeError("Could not get ReadableStream from fetch Response.", {
              error_type: "FETCH_FAILED",
              response
            });
          for await (const chunk of streamToIterable(body)) {
            controller.enqueue(chunk);
          }
          chunk_start = chunk_end + 1;
          chunk_end += chunk_size;
          resolve();
        } catch (e) {
          reject(e);
        }
      });
    }, "pull"),
    async cancel(reason) {
      cancel.abort(reason);
    }
  }, {
    highWaterMark: 1,
    // TODO: better value?
    size(chunk) {
      return chunk.byteLength;
    }
  });
}
__name(download, "download");
function chooseFormat(options, streaming_data) {
  if (!streaming_data)
    throw new InnertubeError("Streaming data not available");
  const formats = [
    ...streaming_data.formats || [],
    ...streaming_data.adaptive_formats || []
  ];
  if (options.itag) {
    const candidates2 = formats.filter((format) => format.itag === options.itag);
    if (!candidates2.length)
      throw new InnertubeError("No matching formats found", { options });
    return candidates2[0];
  }
  const requires_audio = options.type ? options.type.includes("audio") : true;
  const requires_video = options.type ? options.type.includes("video") : true;
  const language = options.language || "original";
  const quality = options.quality || "best";
  let best_width = -1;
  const is_best = ["best", "bestefficiency"].includes(quality);
  const use_most_efficient = quality !== "best";
  let candidates = formats.filter((format) => {
    if (requires_audio && !format.has_audio)
      return false;
    if (requires_video && !format.has_video)
      return false;
    if (options.codec && !format.mime_type.includes(options.codec))
      return false;
    if (options.format !== "any" && !format.mime_type.includes(options.format || "mp4"))
      return false;
    if (!is_best && format.quality_label !== quality)
      return false;
    if (format.width && best_width < format.width)
      best_width = format.width;
    return true;
  });
  if (!candidates.length)
    throw new InnertubeError("No matching formats found", { options });
  if (is_best && requires_video)
    candidates = candidates.filter((format) => format.width === best_width);
  if (requires_audio && !requires_video) {
    const audio_only = candidates.filter((format) => {
      if (language !== "original") {
        return !format.has_video && !format.has_text && format.language === language;
      }
      return !format.has_video && !format.has_text && format.is_original;
    });
    if (audio_only.length > 0) {
      candidates = audio_only;
    }
  }
  if (use_most_efficient) {
    candidates.sort((a, b) => a.bitrate - b.bitrate);
  } else {
    candidates.sort((a, b) => b.bitrate - a.bitrate);
  }
  return candidates[0];
}
__name(chooseFormat, "chooseFormat");

// dist/src/utils/HTTPClient.js
var _session, _cookie, _fetch, _HTTPClient_instances, processJsonPayload_fn, setupCommonHeaders_fn, adjustContext_fn;
var _HTTPClient = class _HTTPClient {
  constructor(session, cookie, fetch2) {
    __privateAdd(this, _HTTPClient_instances);
    __privateAdd(this, _session);
    __privateAdd(this, _cookie);
    __privateAdd(this, _fetch);
    __privateSet(this, _session, session);
    __privateSet(this, _cookie, cookie);
    __privateSet(this, _fetch, fetch2 || Platform.shim.fetch);
  }
  get fetch_function() {
    return __privateGet(this, _fetch);
  }
  async fetch(input, init) {
    const session = __privateGet(this, _session);
    const innertube_url = URLS.API.PRODUCTION_1 + session.api_version;
    const baseURL = init?.baseURL || innertube_url;
    const request_url = typeof input === "string" ? new URL(`${baseURL}${baseURL.endsWith("/") || input.startsWith("/") ? "" : "/"}${input}`) : input instanceof URL ? input : new URL(input.url, baseURL);
    const headers = init?.headers || (input instanceof Platform.shim.Request ? input.headers : new Platform.shim.Headers()) || new Platform.shim.Headers();
    const body = init?.body || (input instanceof Platform.shim.Request ? input.body : void 0);
    const request_headers = new Platform.shim.Headers(headers);
    __privateMethod(this, _HTTPClient_instances, setupCommonHeaders_fn).call(this, request_headers, session, request_url);
    request_url.searchParams.set("prettyPrint", "false");
    request_url.searchParams.set("alt", "json");
    const content_type = request_headers.get("Content-Type");
    let request_body = body;
    let is_web_kids = false;
    const is_innertube_req = baseURL === innertube_url || baseURL === URLS.YT_UPLOAD;
    if (content_type === "application/json" && is_innertube_req && typeof body === "string") {
      const { newBody, isWebKids: processedIsWebKids, clientVersion: processedClientVersion, clientNameId: processedClientNameId, adjustedClientName } = __privateMethod(this, _HTTPClient_instances, processJsonPayload_fn).call(this, body, session);
      request_body = newBody;
      is_web_kids = processedIsWebKids;
      if (processedClientVersion) {
        request_headers.set("X-Youtube-Client-Version", processedClientVersion);
      }
      if (processedClientNameId) {
        request_headers.set("X-Youtube-Client-Name", processedClientNameId);
      }
      if (adjustedClientName === CLIENTS.ANDROID.NAME || adjustedClientName === CLIENTS.YTMUSIC_ANDROID.NAME) {
        request_headers.set("User-Agent", CLIENTS.ANDROID.USER_AGENT);
        request_headers.set("X-GOOG-API-FORMAT-VERSION", "2");
      } else if (adjustedClientName === CLIENTS.IOS.NAME) {
        request_headers.set("User-Agent", CLIENTS.IOS.USER_AGENT);
      }
    } else if (content_type === "application/x-protobuf") {
      if (Platform.shim.server) {
        request_headers.set("User-Agent", CLIENTS.ANDROID.USER_AGENT);
        request_headers.set("X-GOOG-API-FORMAT-VERSION", "2");
        request_headers.delete("X-Youtube-Client-Version");
      }
    }
    if (session.logged_in && is_innertube_req && !is_web_kids) {
      const oauth = session.oauth;
      if (oauth.oauth2_tokens) {
        if (oauth.shouldRefreshToken()) {
          await oauth.refreshAccessToken();
        }
        request_headers.set("Authorization", `Bearer ${oauth.oauth2_tokens.access_token}`);
      }
      const cookie = __privateGet(this, _cookie);
      if (cookie) {
        const sapisid = getCookie(cookie, "SAPISID");
        if (sapisid) {
          request_headers.set("Authorization", await generateSidAuth(sapisid));
          request_headers.set("X-Goog-Authuser", session.account_index.toString());
          if (session.context.user.onBehalfOfUser)
            request_headers.set("X-Goog-PageId", session.context.user.onBehalfOfUser);
        }
        request_headers.set("Cookie", cookie);
      }
    }
    const request = new Platform.shim.Request(request_url, input instanceof Platform.shim.Request ? input : init);
    const response = await __privateGet(this, _fetch).call(this, request, {
      body: request_body,
      headers: request_headers,
      redirect: input instanceof Platform.shim.Request ? input.redirect : init?.redirect || "follow",
      ...Platform.shim.runtime !== "cf-worker" ? { credentials: "include" } : {}
    });
    if (response.ok) {
      return response;
    }
    throw new InnertubeError(`Request to ${response.url} failed with status code ${response.status}`, await response.text());
  }
};
_session = new WeakMap();
_cookie = new WeakMap();
_fetch = new WeakMap();
_HTTPClient_instances = new WeakSet();
processJsonPayload_fn = /* @__PURE__ */ __name(function(json_body, session) {
  const parsed_payload = JSON.parse(json_body);
  const adjusted_context = JSON.parse(JSON.stringify(session.context));
  __privateMethod(this, _HTTPClient_instances, adjustContext_fn).call(this, adjusted_context, parsed_payload.client);
  const new_payload = {
    ...parsed_payload,
    context: adjusted_context
  };
  const clientVersion = new_payload.context.client.clientVersion;
  const clientNameFromAdjustedContext = new_payload.context.client.clientName;
  const clientNameId = CLIENT_NAME_IDS[clientNameFromAdjustedContext];
  delete new_payload.client;
  const isWebKids = new_payload.context.client.clientName === CLIENTS.WEB_KIDS.NAME;
  return {
    newBody: JSON.stringify(new_payload),
    isWebKids,
    clientVersion,
    clientNameId,
    adjustedClientName: new_payload.context.client.clientName
  };
}, "#processJsonPayload");
setupCommonHeaders_fn = /* @__PURE__ */ __name(function(request_headers, session, request_url) {
  request_headers.set("Accept", "*/*");
  request_headers.set("Accept-Language", "*");
  request_headers.set("X-Goog-Visitor-Id", session.context.client.visitorData || "");
  request_headers.set("X-Youtube-Client-Version", session.context.client.clientVersion || "");
  const client_name_id = CLIENT_NAME_IDS[session.context.client.clientName];
  if (client_name_id) {
    request_headers.set("X-Youtube-Client-Name", client_name_id);
  }
  if (Platform.shim.server) {
    request_headers.set("User-Agent", session.user_agent || "");
    request_headers.set("Origin", request_url.origin);
  }
}, "#setupCommonHeaders");
adjustContext_fn = /* @__PURE__ */ __name(function(ctx, client) {
  if (!client)
    return;
  const clientName = client.toUpperCase();
  if (!SUPPORTED_CLIENTS.includes(clientName)) {
    throw new InnertubeError(`Invalid client: ${client}`, {
      available_innertube_clients: SUPPORTED_CLIENTS
    });
  }
  if (clientName !== "WEB") {
    delete ctx.client.configInfo;
  }
  if (clientName === "ANDROID" || clientName === "YTMUSIC_ANDROID" || clientName === "YTSTUDIO_ANDROID") {
    ctx.client.androidSdkVersion = CLIENTS.ANDROID.SDK_VERSION;
    ctx.client.userAgent = CLIENTS.ANDROID.USER_AGENT;
    ctx.client.osName = "Android";
    ctx.client.osVersion = "13";
    ctx.client.platform = "MOBILE";
  }
  switch (clientName) {
    case "MWEB":
      ctx.client.clientVersion = CLIENTS.MWEB.VERSION;
      ctx.client.clientName = CLIENTS.MWEB.NAME;
      ctx.client.clientFormFactor = "SMALL_FORM_FACTOR";
      ctx.client.platform = "MOBILE";
      break;
    case "IOS":
      ctx.client.deviceMake = "Apple";
      ctx.client.deviceModel = CLIENTS.IOS.DEVICE_MODEL;
      ctx.client.clientVersion = CLIENTS.IOS.VERSION;
      ctx.client.clientName = CLIENTS.IOS.NAME;
      ctx.client.platform = "MOBILE";
      ctx.client.osName = CLIENTS.IOS.OS_NAME;
      ctx.client.osVersion = CLIENTS.IOS.OS_VERSION;
      delete ctx.client.browserName;
      delete ctx.client.browserVersion;
      break;
    case "YTMUSIC":
      ctx.client.clientVersion = CLIENTS.YTMUSIC.VERSION;
      ctx.client.clientName = CLIENTS.YTMUSIC.NAME;
      break;
    case "ANDROID":
      ctx.client.clientVersion = CLIENTS.ANDROID.VERSION;
      ctx.client.clientFormFactor = "SMALL_FORM_FACTOR";
      ctx.client.clientName = CLIENTS.ANDROID.NAME;
      break;
    case "ANDROID_VR":
      ctx.client.androidSdkVersion = 32;
      ctx.client.osName = "Android";
      ctx.client.osVersion = "12L";
      ctx.client.platform = "MOBILE";
      ctx.client.userAgent = CLIENTS.ANDROID_VR.USER_AGENT;
      ctx.client.deviceMake = CLIENTS.ANDROID_VR.DEVICE_MAKE;
      ctx.client.deviceModel = CLIENTS.ANDROID_VR.DEVICE_MODEL;
      ctx.client.clientVersion = CLIENTS.ANDROID_VR.VERSION;
      ctx.client.clientFormFactor = "SMALL_FORM_FACTOR";
      ctx.client.clientName = CLIENTS.ANDROID_VR.NAME;
      break;
    case "YTMUSIC_ANDROID":
      ctx.client.clientVersion = CLIENTS.YTMUSIC_ANDROID.VERSION;
      ctx.client.clientFormFactor = "SMALL_FORM_FACTOR";
      ctx.client.clientName = CLIENTS.YTMUSIC_ANDROID.NAME;
      break;
    case "YTSTUDIO_ANDROID":
      ctx.client.clientVersion = CLIENTS.YTSTUDIO_ANDROID.VERSION;
      ctx.client.clientFormFactor = "SMALL_FORM_FACTOR";
      ctx.client.clientName = CLIENTS.YTSTUDIO_ANDROID.NAME;
      break;
    case "TV":
      ctx.client.clientVersion = CLIENTS.TV.VERSION;
      ctx.client.clientName = CLIENTS.TV.NAME;
      ctx.client.userAgent = CLIENTS.TV.USER_AGENT;
      break;
    case "TV_SIMPLY":
      ctx.client.clientVersion = CLIENTS.TV_SIMPLY.VERSION;
      ctx.client.clientName = CLIENTS.TV_SIMPLY.NAME;
      break;
    case "TV_EMBEDDED":
      ctx.client.clientName = CLIENTS.TV_EMBEDDED.NAME;
      ctx.client.clientVersion = CLIENTS.TV_EMBEDDED.VERSION;
      ctx.client.clientScreen = "EMBED";
      ctx.thirdParty = { embedUrl: URLS.YT_BASE };
      break;
    case "YTKIDS":
      ctx.client.clientVersion = CLIENTS.WEB_KIDS.VERSION;
      ctx.client.clientName = CLIENTS.WEB_KIDS.NAME;
      ctx.client.kidsAppInfo = {
        categorySettings: {
          enabledCategories: [
            "approved_for_you",
            "black_joy",
            "camp",
            "collections",
            "earth",
            "explore",
            "favorites",
            "gaming",
            "halloween",
            "hero",
            "learning",
            "move",
            "music",
            "reading",
            "shared_by_parents",
            "shows",
            "soccer",
            "sports",
            "spotlight",
            "winter"
          ]
        },
        contentSettings: {
          corpusPreference: "KIDS_CORPUS_PREFERENCE_YOUNGER",
          kidsNoSearchMode: "YT_KIDS_NO_SEARCH_MODE_OFF"
        }
      };
      break;
    case "WEB_EMBEDDED":
      ctx.client.clientName = CLIENTS.WEB_EMBEDDED.NAME;
      ctx.client.clientVersion = CLIENTS.WEB_EMBEDDED.VERSION;
      ctx.client.clientScreen = "EMBED";
      ctx.thirdParty = { embedUrl: URLS.GOOGLE_SEARCH_BASE };
      break;
    case "WEB_CREATOR":
      ctx.client.clientName = CLIENTS.WEB_CREATOR.NAME;
      ctx.client.clientVersion = CLIENTS.WEB_CREATOR.VERSION;
      break;
    default:
      break;
  }
}, "#adjustContext");
__name(_HTTPClient, "HTTPClient");
var HTTPClient = _HTTPClient;

// dist/src/utils/LZW.js
var LZW_exports = {};
__export(LZW_exports, {
  compress: () => compress,
  decompress: () => decompress
});
function compress(input) {
  const output = [];
  const dictionary = {};
  for (let i = 0; i < 256; i++) {
    dictionary[String.fromCharCode(i)] = i;
  }
  let current_string = "";
  let dictionary_size = 256;
  for (let i = 0; i < input.length; i++) {
    const current_char = input[i];
    const combined_string = current_string + current_char;
    if (dictionary.hasOwnProperty(combined_string)) {
      current_string = combined_string;
    } else {
      output.push(dictionary[current_string]);
      dictionary[combined_string] = dictionary_size++;
      current_string = current_char;
    }
  }
  if (current_string !== "") {
    output.push(dictionary[current_string]);
  }
  return output.map((code) => String.fromCharCode(code)).join("");
}
__name(compress, "compress");
function decompress(input) {
  const dictionary = {};
  const input_data = input.split("");
  const output = [input_data.shift()];
  const input_length = input_data.length >>> 0;
  let dictionary_code = 256;
  let current_char = output[0];
  let current_string = current_char;
  for (let i = 0; i < input_length; ++i) {
    const current_code = input_data[i].charCodeAt(0);
    const entry = current_code < 256 ? input_data[i] : dictionary[current_code] ? dictionary[current_code] : current_string + current_char;
    output.push(entry);
    current_char = entry.charAt(0);
    dictionary[dictionary_code++] = current_string + current_char;
    current_string = entry;
  }
  return output.join("");
}
__name(decompress, "decompress");

// dist/src/utils/BinarySerializer.js
var BinarySerializer_exports = {};
__export(BinarySerializer_exports, {
  MAGIC_HEADER: () => MAGIC_HEADER,
  VERSION: () => VERSION,
  deserialize: () => deserialize,
  serialize: () => serialize
});
var MAGIC_HEADER = 5849684;
var VERSION = 1;
function serialize(data) {
  const json_str = JSON.stringify(data);
  const compressed = compress(json_str);
  const compressed_bytes = new TextEncoder().encode(compressed);
  const buffer = new ArrayBuffer(12 + compressed_bytes.byteLength);
  const view = new DataView(buffer);
  view.setUint32(0, MAGIC_HEADER, true);
  view.setUint32(4, VERSION, true);
  view.setUint32(8, compressed_bytes.byteLength, true);
  new Uint8Array(buffer).set(compressed_bytes, 12);
  return buffer;
}
__name(serialize, "serialize");
function deserialize(buffer) {
  if (buffer.byteLength < 12)
    throw new Error("Invalid binary format: buffer too short");
  const view = new DataView(buffer.buffer, buffer.byteOffset);
  const magic = view.getUint32(0, true);
  if (magic !== MAGIC_HEADER) {
    throw new Error("Invalid binary format: magic header mismatch");
  }
  const version = view.getUint32(4, true);
  if (version !== VERSION) {
    throw new Error(`Unsupported binary format version: ${version}`);
  }
  const data_length = view.getUint32(8, true);
  const compressed_data = buffer.slice(12, 12 + data_length);
  const compressed = new TextDecoder().decode(compressed_data);
  const json_str = decompress(compressed);
  return JSON.parse(json_str);
}
__name(deserialize, "deserialize");

// dist/src/utils/ProtoUtils.js
var ProtoUtils_exports = {};
__export(ProtoUtils_exports, {
  decodeVisitorData: () => decodeVisitorData,
  encodeCommentActionParams: () => encodeCommentActionParams,
  encodeNextParams: () => encodeNextParams,
  encodeVisitorData: () => encodeVisitorData
});

// node_modules/@bufbuild/protobuf/dist/esm/wire/varint.js
function varint64read() {
  let lowBits = 0;
  let highBits = 0;
  for (let shift = 0; shift < 28; shift += 7) {
    let b = this.buf[this.pos++];
    lowBits |= (b & 127) << shift;
    if ((b & 128) == 0) {
      this.assertBounds();
      return [lowBits, highBits];
    }
  }
  let middleByte = this.buf[this.pos++];
  lowBits |= (middleByte & 15) << 28;
  highBits = (middleByte & 112) >> 4;
  if ((middleByte & 128) == 0) {
    this.assertBounds();
    return [lowBits, highBits];
  }
  for (let shift = 3; shift <= 31; shift += 7) {
    let b = this.buf[this.pos++];
    highBits |= (b & 127) << shift;
    if ((b & 128) == 0) {
      this.assertBounds();
      return [lowBits, highBits];
    }
  }
  throw new Error("invalid varint");
}
__name(varint64read, "varint64read");
function varint64write(lo, hi, bytes) {
  for (let i = 0; i < 28; i = i + 7) {
    const shift = lo >>> i;
    const hasNext = !(shift >>> 7 == 0 && hi == 0);
    const byte = (hasNext ? shift | 128 : shift) & 255;
    bytes.push(byte);
    if (!hasNext) {
      return;
    }
  }
  const splitBits = lo >>> 28 & 15 | (hi & 7) << 4;
  const hasMoreBits = !(hi >> 3 == 0);
  bytes.push((hasMoreBits ? splitBits | 128 : splitBits) & 255);
  if (!hasMoreBits) {
    return;
  }
  for (let i = 3; i < 31; i = i + 7) {
    const shift = hi >>> i;
    const hasNext = !(shift >>> 7 == 0);
    const byte = (hasNext ? shift | 128 : shift) & 255;
    bytes.push(byte);
    if (!hasNext) {
      return;
    }
  }
  bytes.push(hi >>> 31 & 1);
}
__name(varint64write, "varint64write");
var TWO_PWR_32_DBL = 4294967296;
function int64FromString(dec) {
  const minus = dec[0] === "-";
  if (minus) {
    dec = dec.slice(1);
  }
  const base = 1e6;
  let lowBits = 0;
  let highBits = 0;
  function add1e6digit(begin, end) {
    const digit1e6 = Number(dec.slice(begin, end));
    highBits *= base;
    lowBits = lowBits * base + digit1e6;
    if (lowBits >= TWO_PWR_32_DBL) {
      highBits = highBits + (lowBits / TWO_PWR_32_DBL | 0);
      lowBits = lowBits % TWO_PWR_32_DBL;
    }
  }
  __name(add1e6digit, "add1e6digit");
  add1e6digit(-24, -18);
  add1e6digit(-18, -12);
  add1e6digit(-12, -6);
  add1e6digit(-6);
  return minus ? negate(lowBits, highBits) : newBits(lowBits, highBits);
}
__name(int64FromString, "int64FromString");
function int64ToString(lo, hi) {
  let bits = newBits(lo, hi);
  const negative = bits.hi & 2147483648;
  if (negative) {
    bits = negate(bits.lo, bits.hi);
  }
  const result = uInt64ToString(bits.lo, bits.hi);
  return negative ? "-" + result : result;
}
__name(int64ToString, "int64ToString");
function uInt64ToString(lo, hi) {
  ({ lo, hi } = toUnsigned(lo, hi));
  if (hi <= 2097151) {
    return String(TWO_PWR_32_DBL * hi + lo);
  }
  const low = lo & 16777215;
  const mid = (lo >>> 24 | hi << 8) & 16777215;
  const high = hi >> 16 & 65535;
  let digitA = low + mid * 6777216 + high * 6710656;
  let digitB = mid + high * 8147497;
  let digitC = high * 2;
  const base = 1e7;
  if (digitA >= base) {
    digitB += Math.floor(digitA / base);
    digitA %= base;
  }
  if (digitB >= base) {
    digitC += Math.floor(digitB / base);
    digitB %= base;
  }
  return digitC.toString() + decimalFrom1e7WithLeadingZeros(digitB) + decimalFrom1e7WithLeadingZeros(digitA);
}
__name(uInt64ToString, "uInt64ToString");
function toUnsigned(lo, hi) {
  return { lo: lo >>> 0, hi: hi >>> 0 };
}
__name(toUnsigned, "toUnsigned");
function newBits(lo, hi) {
  return { lo: lo | 0, hi: hi | 0 };
}
__name(newBits, "newBits");
function negate(lowBits, highBits) {
  highBits = ~highBits;
  if (lowBits) {
    lowBits = ~lowBits + 1;
  } else {
    highBits += 1;
  }
  return newBits(lowBits, highBits);
}
__name(negate, "negate");
var decimalFrom1e7WithLeadingZeros = /* @__PURE__ */ __name((digit1e7) => {
  const partial = String(digit1e7);
  return "0000000".slice(partial.length) + partial;
}, "decimalFrom1e7WithLeadingZeros");
function varint32write(value, bytes) {
  if (value >= 0) {
    while (value > 127) {
      bytes.push(value & 127 | 128);
      value = value >>> 7;
    }
    bytes.push(value);
  } else {
    for (let i = 0; i < 9; i++) {
      bytes.push(value & 127 | 128);
      value = value >> 7;
    }
    bytes.push(1);
  }
}
__name(varint32write, "varint32write");
function varint32read() {
  let b = this.buf[this.pos++];
  let result = b & 127;
  if ((b & 128) == 0) {
    this.assertBounds();
    return result;
  }
  b = this.buf[this.pos++];
  result |= (b & 127) << 7;
  if ((b & 128) == 0) {
    this.assertBounds();
    return result;
  }
  b = this.buf[this.pos++];
  result |= (b & 127) << 14;
  if ((b & 128) == 0) {
    this.assertBounds();
    return result;
  }
  b = this.buf[this.pos++];
  result |= (b & 127) << 21;
  if ((b & 128) == 0) {
    this.assertBounds();
    return result;
  }
  b = this.buf[this.pos++];
  result |= (b & 15) << 28;
  for (let readBytes = 5; (b & 128) !== 0 && readBytes < 10; readBytes++)
    b = this.buf[this.pos++];
  if ((b & 128) != 0)
    throw new Error("invalid varint");
  this.assertBounds();
  return result >>> 0;
}
__name(varint32read, "varint32read");

// node_modules/@bufbuild/protobuf/dist/esm/proto-int64.js
var protoInt64 = /* @__PURE__ */ makeInt64Support();
function makeInt64Support() {
  const dv = new DataView(new ArrayBuffer(8));
  const ok = typeof BigInt === "function" && typeof dv.getBigInt64 === "function" && typeof dv.getBigUint64 === "function" && typeof dv.setBigInt64 === "function" && typeof dv.setBigUint64 === "function" && (!!globalThis.Deno || typeof process != "object" || typeof process.env != "object" || process.env.BUF_BIGINT_DISABLE !== "1");
  if (ok) {
    const MIN = BigInt("-9223372036854775808");
    const MAX = BigInt("9223372036854775807");
    const UMIN = BigInt("0");
    const UMAX = BigInt("18446744073709551615");
    return {
      zero: BigInt(0),
      supported: true,
      parse(value) {
        const bi = typeof value == "bigint" ? value : BigInt(value);
        if (bi > MAX || bi < MIN) {
          throw new Error(`invalid int64: ${value}`);
        }
        return bi;
      },
      uParse(value) {
        const bi = typeof value == "bigint" ? value : BigInt(value);
        if (bi > UMAX || bi < UMIN) {
          throw new Error(`invalid uint64: ${value}`);
        }
        return bi;
      },
      enc(value) {
        dv.setBigInt64(0, this.parse(value), true);
        return {
          lo: dv.getInt32(0, true),
          hi: dv.getInt32(4, true)
        };
      },
      uEnc(value) {
        dv.setBigInt64(0, this.uParse(value), true);
        return {
          lo: dv.getInt32(0, true),
          hi: dv.getInt32(4, true)
        };
      },
      dec(lo, hi) {
        dv.setInt32(0, lo, true);
        dv.setInt32(4, hi, true);
        return dv.getBigInt64(0, true);
      },
      uDec(lo, hi) {
        dv.setInt32(0, lo, true);
        dv.setInt32(4, hi, true);
        return dv.getBigUint64(0, true);
      }
    };
  }
  return {
    zero: "0",
    supported: false,
    parse(value) {
      if (typeof value != "string") {
        value = value.toString();
      }
      assertInt64String(value);
      return value;
    },
    uParse(value) {
      if (typeof value != "string") {
        value = value.toString();
      }
      assertUInt64String(value);
      return value;
    },
    enc(value) {
      if (typeof value != "string") {
        value = value.toString();
      }
      assertInt64String(value);
      return int64FromString(value);
    },
    uEnc(value) {
      if (typeof value != "string") {
        value = value.toString();
      }
      assertUInt64String(value);
      return int64FromString(value);
    },
    dec(lo, hi) {
      return int64ToString(lo, hi);
    },
    uDec(lo, hi) {
      return uInt64ToString(lo, hi);
    }
  };
}
__name(makeInt64Support, "makeInt64Support");
function assertInt64String(value) {
  if (!/^-?[0-9]+$/.test(value)) {
    throw new Error("invalid int64: " + value);
  }
}
__name(assertInt64String, "assertInt64String");
function assertUInt64String(value) {
  if (!/^[0-9]+$/.test(value)) {
    throw new Error("invalid uint64: " + value);
  }
}
__name(assertUInt64String, "assertUInt64String");

// node_modules/@bufbuild/protobuf/dist/esm/wire/text-encoding.js
var symbol = Symbol.for("@bufbuild/protobuf/text-encoding");
function getTextEncoding() {
  if (globalThis[symbol] == void 0) {
    const te = new globalThis.TextEncoder();
    const td = new globalThis.TextDecoder();
    globalThis[symbol] = {
      encodeUtf8(text) {
        return te.encode(text);
      },
      decodeUtf8(bytes) {
        return td.decode(bytes);
      },
      checkUtf8(text) {
        try {
          encodeURIComponent(text);
          return true;
        } catch (_) {
          return false;
        }
      }
    };
  }
  return globalThis[symbol];
}
__name(getTextEncoding, "getTextEncoding");

// node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.js
var WireType;
(function(WireType2) {
  WireType2[WireType2["Varint"] = 0] = "Varint";
  WireType2[WireType2["Bit64"] = 1] = "Bit64";
  WireType2[WireType2["LengthDelimited"] = 2] = "LengthDelimited";
  WireType2[WireType2["StartGroup"] = 3] = "StartGroup";
  WireType2[WireType2["EndGroup"] = 4] = "EndGroup";
  WireType2[WireType2["Bit32"] = 5] = "Bit32";
})(WireType || (WireType = {}));
var FLOAT32_MAX = 34028234663852886e22;
var FLOAT32_MIN = -34028234663852886e22;
var UINT32_MAX = 4294967295;
var INT32_MAX = 2147483647;
var INT32_MIN = -2147483648;
var _BinaryWriter = class _BinaryWriter {
  constructor(encodeUtf8 = getTextEncoding().encodeUtf8) {
    this.encodeUtf8 = encodeUtf8;
    this.stack = [];
    this.chunks = [];
    this.buf = [];
  }
  /**
   * Return all bytes written and reset this writer.
   */
  finish() {
    if (this.buf.length) {
      this.chunks.push(new Uint8Array(this.buf));
      this.buf = [];
    }
    let len = 0;
    for (let i = 0; i < this.chunks.length; i++)
      len += this.chunks[i].length;
    let bytes = new Uint8Array(len);
    let offset = 0;
    for (let i = 0; i < this.chunks.length; i++) {
      bytes.set(this.chunks[i], offset);
      offset += this.chunks[i].length;
    }
    this.chunks = [];
    return bytes;
  }
  /**
   * Start a new fork for length-delimited data like a message
   * or a packed repeated field.
   *
   * Must be joined later with `join()`.
   */
  fork() {
    this.stack.push({ chunks: this.chunks, buf: this.buf });
    this.chunks = [];
    this.buf = [];
    return this;
  }
  /**
   * Join the last fork. Write its length and bytes, then
   * return to the previous state.
   */
  join() {
    let chunk = this.finish();
    let prev = this.stack.pop();
    if (!prev)
      throw new Error("invalid state, fork stack empty");
    this.chunks = prev.chunks;
    this.buf = prev.buf;
    this.uint32(chunk.byteLength);
    return this.raw(chunk);
  }
  /**
   * Writes a tag (field number and wire type).
   *
   * Equivalent to `uint32( (fieldNo << 3 | type) >>> 0 )`.
   *
   * Generated code should compute the tag ahead of time and call `uint32()`.
   */
  tag(fieldNo, type) {
    return this.uint32((fieldNo << 3 | type) >>> 0);
  }
  /**
   * Write a chunk of raw bytes.
   */
  raw(chunk) {
    if (this.buf.length) {
      this.chunks.push(new Uint8Array(this.buf));
      this.buf = [];
    }
    this.chunks.push(chunk);
    return this;
  }
  /**
   * Write a `uint32` value, an unsigned 32 bit varint.
   */
  uint32(value) {
    assertUInt32(value);
    while (value > 127) {
      this.buf.push(value & 127 | 128);
      value = value >>> 7;
    }
    this.buf.push(value);
    return this;
  }
  /**
   * Write a `int32` value, a signed 32 bit varint.
   */
  int32(value) {
    assertInt32(value);
    varint32write(value, this.buf);
    return this;
  }
  /**
   * Write a `bool` value, a variant.
   */
  bool(value) {
    this.buf.push(value ? 1 : 0);
    return this;
  }
  /**
   * Write a `bytes` value, length-delimited arbitrary data.
   */
  bytes(value) {
    this.uint32(value.byteLength);
    return this.raw(value);
  }
  /**
   * Write a `string` value, length-delimited data converted to UTF-8 text.
   */
  string(value) {
    let chunk = this.encodeUtf8(value);
    this.uint32(chunk.byteLength);
    return this.raw(chunk);
  }
  /**
   * Write a `float` value, 32-bit floating point number.
   */
  float(value) {
    assertFloat32(value);
    let chunk = new Uint8Array(4);
    new DataView(chunk.buffer).setFloat32(0, value, true);
    return this.raw(chunk);
  }
  /**
   * Write a `double` value, a 64-bit floating point number.
   */
  double(value) {
    let chunk = new Uint8Array(8);
    new DataView(chunk.buffer).setFloat64(0, value, true);
    return this.raw(chunk);
  }
  /**
   * Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.
   */
  fixed32(value) {
    assertUInt32(value);
    let chunk = new Uint8Array(4);
    new DataView(chunk.buffer).setUint32(0, value, true);
    return this.raw(chunk);
  }
  /**
   * Write a `sfixed32` value, a signed, fixed-length 32-bit integer.
   */
  sfixed32(value) {
    assertInt32(value);
    let chunk = new Uint8Array(4);
    new DataView(chunk.buffer).setInt32(0, value, true);
    return this.raw(chunk);
  }
  /**
   * Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.
   */
  sint32(value) {
    assertInt32(value);
    value = (value << 1 ^ value >> 31) >>> 0;
    varint32write(value, this.buf);
    return this;
  }
  /**
   * Write a `fixed64` value, a signed, fixed-length 64-bit integer.
   */
  sfixed64(value) {
    let chunk = new Uint8Array(8), view = new DataView(chunk.buffer), tc = protoInt64.enc(value);
    view.setInt32(0, tc.lo, true);
    view.setInt32(4, tc.hi, true);
    return this.raw(chunk);
  }
  /**
   * Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.
   */
  fixed64(value) {
    let chunk = new Uint8Array(8), view = new DataView(chunk.buffer), tc = protoInt64.uEnc(value);
    view.setInt32(0, tc.lo, true);
    view.setInt32(4, tc.hi, true);
    return this.raw(chunk);
  }
  /**
   * Write a `int64` value, a signed 64-bit varint.
   */
  int64(value) {
    let tc = protoInt64.enc(value);
    varint64write(tc.lo, tc.hi, this.buf);
    return this;
  }
  /**
   * Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.
   */
  sint64(value) {
    const tc = protoInt64.enc(value), sign = tc.hi >> 31, lo = tc.lo << 1 ^ sign, hi = (tc.hi << 1 | tc.lo >>> 31) ^ sign;
    varint64write(lo, hi, this.buf);
    return this;
  }
  /**
   * Write a `uint64` value, an unsigned 64-bit varint.
   */
  uint64(value) {
    const tc = protoInt64.uEnc(value);
    varint64write(tc.lo, tc.hi, this.buf);
    return this;
  }
};
__name(_BinaryWriter, "BinaryWriter");
var BinaryWriter = _BinaryWriter;
var _BinaryReader = class _BinaryReader {
  constructor(buf, decodeUtf8 = getTextEncoding().decodeUtf8) {
    this.decodeUtf8 = decodeUtf8;
    this.varint64 = varint64read;
    this.uint32 = varint32read;
    this.buf = buf;
    this.len = buf.length;
    this.pos = 0;
    this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
  }
  /**
   * Reads a tag - field number and wire type.
   */
  tag() {
    let tag = this.uint32(), fieldNo = tag >>> 3, wireType = tag & 7;
    if (fieldNo <= 0 || wireType < 0 || wireType > 5)
      throw new Error("illegal tag: field no " + fieldNo + " wire type " + wireType);
    return [fieldNo, wireType];
  }
  /**
   * Skip one element and return the skipped data.
   *
   * When skipping StartGroup, provide the tags field number to check for
   * matching field number in the EndGroup tag.
   */
  skip(wireType, fieldNo) {
    let start = this.pos;
    switch (wireType) {
      case WireType.Varint:
        while (this.buf[this.pos++] & 128) {
        }
        break;
      // @ts-ignore TS7029: Fallthrough case in switch -- ignore instead of expect-error for compiler settings without noFallthroughCasesInSwitch: true
      case WireType.Bit64:
        this.pos += 4;
      case WireType.Bit32:
        this.pos += 4;
        break;
      case WireType.LengthDelimited:
        let len = this.uint32();
        this.pos += len;
        break;
      case WireType.StartGroup:
        for (; ; ) {
          const [fn, wt] = this.tag();
          if (wt === WireType.EndGroup) {
            if (fieldNo !== void 0 && fn !== fieldNo) {
              throw new Error("invalid end group tag");
            }
            break;
          }
          this.skip(wt, fn);
        }
        break;
      default:
        throw new Error("cant skip wire type " + wireType);
    }
    this.assertBounds();
    return this.buf.subarray(start, this.pos);
  }
  /**
   * Throws error if position in byte array is out of range.
   */
  assertBounds() {
    if (this.pos > this.len)
      throw new RangeError("premature EOF");
  }
  /**
   * Read a `int32` field, a signed 32 bit varint.
   */
  int32() {
    return this.uint32() | 0;
  }
  /**
   * Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.
   */
  sint32() {
    let zze = this.uint32();
    return zze >>> 1 ^ -(zze & 1);
  }
  /**
   * Read a `int64` field, a signed 64-bit varint.
   */
  int64() {
    return protoInt64.dec(...this.varint64());
  }
  /**
   * Read a `uint64` field, an unsigned 64-bit varint.
   */
  uint64() {
    return protoInt64.uDec(...this.varint64());
  }
  /**
   * Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.
   */
  sint64() {
    let [lo, hi] = this.varint64();
    let s = -(lo & 1);
    lo = (lo >>> 1 | (hi & 1) << 31) ^ s;
    hi = hi >>> 1 ^ s;
    return protoInt64.dec(lo, hi);
  }
  /**
   * Read a `bool` field, a variant.
   */
  bool() {
    let [lo, hi] = this.varint64();
    return lo !== 0 || hi !== 0;
  }
  /**
   * Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.
   */
  fixed32() {
    return this.view.getUint32((this.pos += 4) - 4, true);
  }
  /**
   * Read a `sfixed32` field, a signed, fixed-length 32-bit integer.
   */
  sfixed32() {
    return this.view.getInt32((this.pos += 4) - 4, true);
  }
  /**
   * Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.
   */
  fixed64() {
    return protoInt64.uDec(this.sfixed32(), this.sfixed32());
  }
  /**
   * Read a `fixed64` field, a signed, fixed-length 64-bit integer.
   */
  sfixed64() {
    return protoInt64.dec(this.sfixed32(), this.sfixed32());
  }
  /**
   * Read a `float` field, 32-bit floating point number.
   */
  float() {
    return this.view.getFloat32((this.pos += 4) - 4, true);
  }
  /**
   * Read a `double` field, a 64-bit floating point number.
   */
  double() {
    return this.view.getFloat64((this.pos += 8) - 8, true);
  }
  /**
   * Read a `bytes` field, length-delimited arbitrary data.
   */
  bytes() {
    let len = this.uint32(), start = this.pos;
    this.pos += len;
    this.assertBounds();
    return this.buf.subarray(start, start + len);
  }
  /**
   * Read a `string` field, length-delimited data converted to UTF-8 text.
   */
  string() {
    return this.decodeUtf8(this.bytes());
  }
};
__name(_BinaryReader, "BinaryReader");
var BinaryReader = _BinaryReader;
function assertInt32(arg) {
  if (typeof arg == "string") {
    arg = Number(arg);
  } else if (typeof arg != "number") {
    throw new Error("invalid int32: " + typeof arg);
  }
  if (!Number.isInteger(arg) || arg > INT32_MAX || arg < INT32_MIN)
    throw new Error("invalid int32: " + arg);
}
__name(assertInt32, "assertInt32");
function assertUInt32(arg) {
  if (typeof arg == "string") {
    arg = Number(arg);
  } else if (typeof arg != "number") {
    throw new Error("invalid uint32: " + typeof arg);
  }
  if (!Number.isInteger(arg) || arg > UINT32_MAX || arg < 0)
    throw new Error("invalid uint32: " + arg);
}
__name(assertUInt32, "assertUInt32");
function assertFloat32(arg) {
  if (typeof arg == "string") {
    const o = arg;
    arg = Number(arg);
    if (Number.isNaN(arg) && o !== "NaN") {
      throw new Error("invalid float32: " + o);
    }
  } else if (typeof arg != "number") {
    throw new Error("invalid float32: " + typeof arg);
  }
  if (Number.isFinite(arg) && (arg > FLOAT32_MAX || arg < FLOAT32_MIN))
    throw new Error("invalid float32: " + arg);
}
__name(assertFloat32, "assertFloat32");

// dist/protos/generated/misc/params.js
var SearchFilter_Prioritize = {
  RELEVANCE: 0,
  0: "RELEVANCE",
  POPULARITY: 3,
  3: "POPULARITY",
  UNRECOGNIZED: -1,
  "-1": "UNRECOGNIZED"
};
var SearchFilter_Filters_UploadDate = {
  ANY_DATE: 0,
  0: "ANY_DATE",
  TODAY: 2,
  2: "TODAY",
  WEEK: 3,
  3: "WEEK",
  MONTH: 4,
  4: "MONTH",
  YEAR: 5,
  5: "YEAR",
  UNRECOGNIZED: -1,
  "-1": "UNRECOGNIZED"
};
var SearchFilter_Filters_SearchType = {
  ANY_TYPE: 0,
  0: "ANY_TYPE",
  VIDEO: 1,
  1: "VIDEO",
  CHANNEL: 2,
  2: "CHANNEL",
  PLAYLIST: 3,
  3: "PLAYLIST",
  MOVIE: 4,
  4: "MOVIE",
  SHORTS: 9,
  9: "SHORTS",
  UNRECOGNIZED: -1,
  "-1": "UNRECOGNIZED"
};
var SearchFilter_Filters_Duration = {
  ANY_DURATION: 0,
  0: "ANY_DURATION",
  OVER_TWENTY_MINS: 2,
  2: "OVER_TWENTY_MINS",
  UNDER_THREE_MINS: 4,
  4: "UNDER_THREE_MINS",
  THREE_TO_TWENTY_MINS: 5,
  5: "THREE_TO_TWENTY_MINS",
  UNRECOGNIZED: -1,
  "-1": "UNRECOGNIZED"
};
function createBaseVisitorData() {
  return { id: "", timestamp: 0 };
}
__name(createBaseVisitorData, "createBaseVisitorData");
var VisitorData = {
  encode(message, writer = new BinaryWriter()) {
    if (message.id !== "") {
      writer.uint32(10).string(message.id);
    }
    if (message.timestamp !== 0) {
      writer.uint32(40).int32(message.timestamp);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseVisitorData();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.id = reader.string();
          continue;
        }
        case 5: {
          if (tag !== 40) {
            break;
          }
          message.timestamp = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseSearchFilter() {
  return { prioritize: void 0, filters: void 0 };
}
__name(createBaseSearchFilter, "createBaseSearchFilter");
var SearchFilter = {
  encode(message, writer = new BinaryWriter()) {
    if (message.prioritize !== void 0) {
      writer.uint32(8).int32(message.prioritize);
    }
    if (message.filters !== void 0) {
      SearchFilter_Filters.encode(message.filters, writer.uint32(18).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseSearchFilter();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.prioritize = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.filters = SearchFilter_Filters.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseSearchFilter_Filters() {
  return {
    uploadDate: void 0,
    type: void 0,
    duration: void 0,
    musicSearchType: void 0,
    featuresHd: void 0,
    featuresSubtitles: void 0,
    featuresCreativeCommons: void 0,
    features3d: void 0,
    featuresLive: void 0,
    featuresPurchased: void 0,
    features4k: void 0,
    features360: void 0,
    featuresLocation: void 0,
    featuresHdr: void 0,
    featuresVr180: void 0
  };
}
__name(createBaseSearchFilter_Filters, "createBaseSearchFilter_Filters");
var SearchFilter_Filters = {
  encode(message, writer = new BinaryWriter()) {
    if (message.uploadDate !== void 0) {
      writer.uint32(8).int32(message.uploadDate);
    }
    if (message.type !== void 0) {
      writer.uint32(16).int32(message.type);
    }
    if (message.duration !== void 0) {
      writer.uint32(24).int32(message.duration);
    }
    if (message.musicSearchType !== void 0) {
      SearchFilter_Filters_MusicSearchType.encode(message.musicSearchType, writer.uint32(138).fork()).join();
    }
    if (message.featuresHd !== void 0) {
      writer.uint32(32).bool(message.featuresHd);
    }
    if (message.featuresSubtitles !== void 0) {
      writer.uint32(40).bool(message.featuresSubtitles);
    }
    if (message.featuresCreativeCommons !== void 0) {
      writer.uint32(48).bool(message.featuresCreativeCommons);
    }
    if (message.features3d !== void 0) {
      writer.uint32(56).bool(message.features3d);
    }
    if (message.featuresLive !== void 0) {
      writer.uint32(64).bool(message.featuresLive);
    }
    if (message.featuresPurchased !== void 0) {
      writer.uint32(72).bool(message.featuresPurchased);
    }
    if (message.features4k !== void 0) {
      writer.uint32(112).bool(message.features4k);
    }
    if (message.features360 !== void 0) {
      writer.uint32(120).bool(message.features360);
    }
    if (message.featuresLocation !== void 0) {
      writer.uint32(184).bool(message.featuresLocation);
    }
    if (message.featuresHdr !== void 0) {
      writer.uint32(200).bool(message.featuresHdr);
    }
    if (message.featuresVr180 !== void 0) {
      writer.uint32(208).bool(message.featuresVr180);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseSearchFilter_Filters();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.uploadDate = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.type = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.duration = reader.int32();
          continue;
        }
        case 17: {
          if (tag !== 138) {
            break;
          }
          message.musicSearchType = SearchFilter_Filters_MusicSearchType.decode(reader, reader.uint32());
          continue;
        }
        case 4: {
          if (tag !== 32) {
            break;
          }
          message.featuresHd = reader.bool();
          continue;
        }
        case 5: {
          if (tag !== 40) {
            break;
          }
          message.featuresSubtitles = reader.bool();
          continue;
        }
        case 6: {
          if (tag !== 48) {
            break;
          }
          message.featuresCreativeCommons = reader.bool();
          continue;
        }
        case 7: {
          if (tag !== 56) {
            break;
          }
          message.features3d = reader.bool();
          continue;
        }
        case 8: {
          if (tag !== 64) {
            break;
          }
          message.featuresLive = reader.bool();
          continue;
        }
        case 9: {
          if (tag !== 72) {
            break;
          }
          message.featuresPurchased = reader.bool();
          continue;
        }
        case 14: {
          if (tag !== 112) {
            break;
          }
          message.features4k = reader.bool();
          continue;
        }
        case 15: {
          if (tag !== 120) {
            break;
          }
          message.features360 = reader.bool();
          continue;
        }
        case 23: {
          if (tag !== 184) {
            break;
          }
          message.featuresLocation = reader.bool();
          continue;
        }
        case 25: {
          if (tag !== 200) {
            break;
          }
          message.featuresHdr = reader.bool();
          continue;
        }
        case 26: {
          if (tag !== 208) {
            break;
          }
          message.featuresVr180 = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseSearchFilter_Filters_MusicSearchType() {
  return { song: void 0, video: void 0, album: void 0, artist: void 0, playlist: void 0 };
}
__name(createBaseSearchFilter_Filters_MusicSearchType, "createBaseSearchFilter_Filters_MusicSearchType");
var SearchFilter_Filters_MusicSearchType = {
  encode(message, writer = new BinaryWriter()) {
    if (message.song !== void 0) {
      writer.uint32(8).bool(message.song);
    }
    if (message.video !== void 0) {
      writer.uint32(16).bool(message.video);
    }
    if (message.album !== void 0) {
      writer.uint32(24).bool(message.album);
    }
    if (message.artist !== void 0) {
      writer.uint32(32).bool(message.artist);
    }
    if (message.playlist !== void 0) {
      writer.uint32(40).bool(message.playlist);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseSearchFilter_Filters_MusicSearchType();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.song = reader.bool();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.video = reader.bool();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.album = reader.bool();
          continue;
        }
        case 4: {
          if (tag !== 32) {
            break;
          }
          message.artist = reader.bool();
          continue;
        }
        case 5: {
          if (tag !== 40) {
            break;
          }
          message.playlist = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseNotificationPreferences() {
  return { channelId: "", prefId: void 0, number0: void 0, number1: void 0 };
}
__name(createBaseNotificationPreferences, "createBaseNotificationPreferences");
var NotificationPreferences = {
  encode(message, writer = new BinaryWriter()) {
    if (message.channelId !== "") {
      writer.uint32(10).string(message.channelId);
    }
    if (message.prefId !== void 0) {
      NotificationPreferences_Preference.encode(message.prefId, writer.uint32(18).fork()).join();
    }
    if (message.number0 !== void 0) {
      writer.uint32(24).int32(message.number0);
    }
    if (message.number1 !== void 0) {
      writer.uint32(32).int32(message.number1);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseNotificationPreferences();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.channelId = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.prefId = NotificationPreferences_Preference.decode(reader, reader.uint32());
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.number0 = reader.int32();
          continue;
        }
        case 4: {
          if (tag !== 32) {
            break;
          }
          message.number1 = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseNotificationPreferences_Preference() {
  return { index: 0 };
}
__name(createBaseNotificationPreferences_Preference, "createBaseNotificationPreferences_Preference");
var NotificationPreferences_Preference = {
  encode(message, writer = new BinaryWriter()) {
    if (message.index !== 0) {
      writer.uint32(8).int32(message.index);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseNotificationPreferences_Preference();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.index = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseLiveMessageParams() {
  return { params: void 0, number0: void 0, number1: void 0 };
}
__name(createBaseLiveMessageParams, "createBaseLiveMessageParams");
var LiveMessageParams = {
  encode(message, writer = new BinaryWriter()) {
    if (message.params !== void 0) {
      LiveMessageParams_Params.encode(message.params, writer.uint32(10).fork()).join();
    }
    if (message.number0 !== void 0) {
      writer.uint32(16).int32(message.number0);
    }
    if (message.number1 !== void 0) {
      writer.uint32(24).int32(message.number1);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseLiveMessageParams();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.params = LiveMessageParams_Params.decode(reader, reader.uint32());
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.number0 = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.number1 = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseLiveMessageParams_Params() {
  return { ids: void 0 };
}
__name(createBaseLiveMessageParams_Params, "createBaseLiveMessageParams_Params");
var LiveMessageParams_Params = {
  encode(message, writer = new BinaryWriter()) {
    if (message.ids !== void 0) {
      LiveMessageParams_Params_Ids.encode(message.ids, writer.uint32(42).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseLiveMessageParams_Params();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.ids = LiveMessageParams_Params_Ids.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseLiveMessageParams_Params_Ids() {
  return { channelId: "", videoId: "" };
}
__name(createBaseLiveMessageParams_Params_Ids, "createBaseLiveMessageParams_Params_Ids");
var LiveMessageParams_Params_Ids = {
  encode(message, writer = new BinaryWriter()) {
    if (message.channelId !== "") {
      writer.uint32(10).string(message.channelId);
    }
    if (message.videoId !== "") {
      writer.uint32(18).string(message.videoId);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseLiveMessageParams_Params_Ids();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.channelId = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.videoId = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseGetCommentsSectionParams() {
  return { ctx: void 0, unkParam: 0, params: void 0 };
}
__name(createBaseGetCommentsSectionParams, "createBaseGetCommentsSectionParams");
var GetCommentsSectionParams = {
  encode(message, writer = new BinaryWriter()) {
    if (message.ctx !== void 0) {
      GetCommentsSectionParams_Context.encode(message.ctx, writer.uint32(18).fork()).join();
    }
    if (message.unkParam !== 0) {
      writer.uint32(24).int32(message.unkParam);
    }
    if (message.params !== void 0) {
      GetCommentsSectionParams_Params.encode(message.params, writer.uint32(50).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseGetCommentsSectionParams();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.ctx = GetCommentsSectionParams_Context.decode(reader, reader.uint32());
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.unkParam = reader.int32();
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.params = GetCommentsSectionParams_Params.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseGetCommentsSectionParams_Context() {
  return { videoId: "" };
}
__name(createBaseGetCommentsSectionParams_Context, "createBaseGetCommentsSectionParams_Context");
var GetCommentsSectionParams_Context = {
  encode(message, writer = new BinaryWriter()) {
    if (message.videoId !== "") {
      writer.uint32(18).string(message.videoId);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseGetCommentsSectionParams_Context();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.videoId = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseGetCommentsSectionParams_Params() {
  return { unkToken: void 0, opts: void 0, repliesOpts: void 0, page: void 0, target: "" };
}
__name(createBaseGetCommentsSectionParams_Params, "createBaseGetCommentsSectionParams_Params");
var GetCommentsSectionParams_Params = {
  encode(message, writer = new BinaryWriter()) {
    if (message.unkToken !== void 0) {
      writer.uint32(10).string(message.unkToken);
    }
    if (message.opts !== void 0) {
      GetCommentsSectionParams_Params_Options.encode(message.opts, writer.uint32(34).fork()).join();
    }
    if (message.repliesOpts !== void 0) {
      GetCommentsSectionParams_Params_RepliesOptions.encode(message.repliesOpts, writer.uint32(26).fork()).join();
    }
    if (message.page !== void 0) {
      writer.uint32(40).int32(message.page);
    }
    if (message.target !== "") {
      writer.uint32(66).string(message.target);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseGetCommentsSectionParams_Params();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.unkToken = reader.string();
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.opts = GetCommentsSectionParams_Params_Options.decode(reader, reader.uint32());
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.repliesOpts = GetCommentsSectionParams_Params_RepliesOptions.decode(reader, reader.uint32());
          continue;
        }
        case 5: {
          if (tag !== 40) {
            break;
          }
          message.page = reader.int32();
          continue;
        }
        case 8: {
          if (tag !== 66) {
            break;
          }
          message.target = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseGetCommentsSectionParams_Params_Options() {
  return { videoId: "", sortBy: 0, type: 0, commentId: void 0 };
}
__name(createBaseGetCommentsSectionParams_Params_Options, "createBaseGetCommentsSectionParams_Params_Options");
var GetCommentsSectionParams_Params_Options = {
  encode(message, writer = new BinaryWriter()) {
    if (message.videoId !== "") {
      writer.uint32(34).string(message.videoId);
    }
    if (message.sortBy !== 0) {
      writer.uint32(48).int32(message.sortBy);
    }
    if (message.type !== 0) {
      writer.uint32(120).int32(message.type);
    }
    if (message.commentId !== void 0) {
      writer.uint32(130).string(message.commentId);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseGetCommentsSectionParams_Params_Options();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.videoId = reader.string();
          continue;
        }
        case 6: {
          if (tag !== 48) {
            break;
          }
          message.sortBy = reader.int32();
          continue;
        }
        case 15: {
          if (tag !== 120) {
            break;
          }
          message.type = reader.int32();
          continue;
        }
        case 16: {
          if (tag !== 130) {
            break;
          }
          message.commentId = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseGetCommentsSectionParams_Params_RepliesOptions() {
  return { commentId: "", unkopts: void 0, channelId: void 0, videoId: "", unkParam1: 0, unkParam2: 0 };
}
__name(createBaseGetCommentsSectionParams_Params_RepliesOptions, "createBaseGetCommentsSectionParams_Params_RepliesOptions");
var GetCommentsSectionParams_Params_RepliesOptions = {
  encode(message, writer = new BinaryWriter()) {
    if (message.commentId !== "") {
      writer.uint32(18).string(message.commentId);
    }
    if (message.unkopts !== void 0) {
      GetCommentsSectionParams_Params_RepliesOptions_UnkOpts.encode(message.unkopts, writer.uint32(34).fork()).join();
    }
    if (message.channelId !== void 0) {
      writer.uint32(42).string(message.channelId);
    }
    if (message.videoId !== "") {
      writer.uint32(50).string(message.videoId);
    }
    if (message.unkParam1 !== 0) {
      writer.uint32(64).int32(message.unkParam1);
    }
    if (message.unkParam2 !== 0) {
      writer.uint32(72).int32(message.unkParam2);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseGetCommentsSectionParams_Params_RepliesOptions();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.commentId = reader.string();
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.unkopts = GetCommentsSectionParams_Params_RepliesOptions_UnkOpts.decode(reader, reader.uint32());
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.channelId = reader.string();
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.videoId = reader.string();
          continue;
        }
        case 8: {
          if (tag !== 64) {
            break;
          }
          message.unkParam1 = reader.int32();
          continue;
        }
        case 9: {
          if (tag !== 72) {
            break;
          }
          message.unkParam2 = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseGetCommentsSectionParams_Params_RepliesOptions_UnkOpts() {
  return { unkParam: 0 };
}
__name(createBaseGetCommentsSectionParams_Params_RepliesOptions_UnkOpts, "createBaseGetCommentsSectionParams_Params_RepliesOptions_UnkOpts");
var GetCommentsSectionParams_Params_RepliesOptions_UnkOpts = {
  encode(message, writer = new BinaryWriter()) {
    if (message.unkParam !== 0) {
      writer.uint32(8).int32(message.unkParam);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseGetCommentsSectionParams_Params_RepliesOptions_UnkOpts();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.unkParam = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseCreateCommentParams() {
  return { videoId: "", params: void 0, number: 0 };
}
__name(createBaseCreateCommentParams, "createBaseCreateCommentParams");
var CreateCommentParams = {
  encode(message, writer = new BinaryWriter()) {
    if (message.videoId !== "") {
      writer.uint32(18).string(message.videoId);
    }
    if (message.params !== void 0) {
      CreateCommentParams_Params.encode(message.params, writer.uint32(42).fork()).join();
    }
    if (message.number !== 0) {
      writer.uint32(80).int32(message.number);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseCreateCommentParams();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.videoId = reader.string();
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.params = CreateCommentParams_Params.decode(reader, reader.uint32());
          continue;
        }
        case 10: {
          if (tag !== 80) {
            break;
          }
          message.number = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseCreateCommentParams_Params() {
  return { index: 0 };
}
__name(createBaseCreateCommentParams_Params, "createBaseCreateCommentParams_Params");
var CreateCommentParams_Params = {
  encode(message, writer = new BinaryWriter()) {
    if (message.index !== 0) {
      writer.uint32(8).int32(message.index);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseCreateCommentParams_Params();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.index = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBasePeformCommentActionParams() {
  return {
    type: 0,
    commentId: "",
    videoId: "",
    unkNum: void 0,
    channelId: void 0,
    translateCommentParams: void 0
  };
}
__name(createBasePeformCommentActionParams, "createBasePeformCommentActionParams");
var PeformCommentActionParams = {
  encode(message, writer = new BinaryWriter()) {
    if (message.type !== 0) {
      writer.uint32(8).int32(message.type);
    }
    if (message.commentId !== "") {
      writer.uint32(26).string(message.commentId);
    }
    if (message.videoId !== "") {
      writer.uint32(42).string(message.videoId);
    }
    if (message.unkNum !== void 0) {
      writer.uint32(16).int32(message.unkNum);
    }
    if (message.channelId !== void 0) {
      writer.uint32(186).string(message.channelId);
    }
    if (message.translateCommentParams !== void 0) {
      PeformCommentActionParams_TranslateCommentParams.encode(message.translateCommentParams, writer.uint32(250).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBasePeformCommentActionParams();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.type = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.commentId = reader.string();
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.videoId = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.unkNum = reader.int32();
          continue;
        }
        case 23: {
          if (tag !== 186) {
            break;
          }
          message.channelId = reader.string();
          continue;
        }
        case 31: {
          if (tag !== 250) {
            break;
          }
          message.translateCommentParams = PeformCommentActionParams_TranslateCommentParams.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBasePeformCommentActionParams_TranslateCommentParams() {
  return { params: void 0, commentId: "", targetLanguage: "" };
}
__name(createBasePeformCommentActionParams_TranslateCommentParams, "createBasePeformCommentActionParams_TranslateCommentParams");
var PeformCommentActionParams_TranslateCommentParams = {
  encode(message, writer = new BinaryWriter()) {
    if (message.params !== void 0) {
      PeformCommentActionParams_TranslateCommentParams_Params.encode(message.params, writer.uint32(26).fork()).join();
    }
    if (message.commentId !== "") {
      writer.uint32(18).string(message.commentId);
    }
    if (message.targetLanguage !== "") {
      writer.uint32(34).string(message.targetLanguage);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBasePeformCommentActionParams_TranslateCommentParams();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.params = PeformCommentActionParams_TranslateCommentParams_Params.decode(reader, reader.uint32());
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.commentId = reader.string();
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.targetLanguage = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBasePeformCommentActionParams_TranslateCommentParams_Params() {
  return { comment: void 0 };
}
__name(createBasePeformCommentActionParams_TranslateCommentParams_Params, "createBasePeformCommentActionParams_TranslateCommentParams_Params");
var PeformCommentActionParams_TranslateCommentParams_Params = {
  encode(message, writer = new BinaryWriter()) {
    if (message.comment !== void 0) {
      PeformCommentActionParams_TranslateCommentParams_Params_Comment.encode(message.comment, writer.uint32(10).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBasePeformCommentActionParams_TranslateCommentParams_Params();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.comment = PeformCommentActionParams_TranslateCommentParams_Params_Comment.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBasePeformCommentActionParams_TranslateCommentParams_Params_Comment() {
  return { text: "" };
}
__name(createBasePeformCommentActionParams_TranslateCommentParams_Params_Comment, "createBasePeformCommentActionParams_TranslateCommentParams_Params_Comment");
var PeformCommentActionParams_TranslateCommentParams_Params_Comment = {
  encode(message, writer = new BinaryWriter()) {
    if (message.text !== "") {
      writer.uint32(10).string(message.text);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBasePeformCommentActionParams_TranslateCommentParams_Params_Comment();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.text = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseHashtag() {
  return { params: void 0 };
}
__name(createBaseHashtag, "createBaseHashtag");
var Hashtag = {
  encode(message, writer = new BinaryWriter()) {
    if (message.params !== void 0) {
      Hashtag_Params.encode(message.params, writer.uint32(746).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseHashtag();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 93: {
          if (tag !== 746) {
            break;
          }
          message.params = Hashtag_Params.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseHashtag_Params() {
  return { hashtag: "", type: 0 };
}
__name(createBaseHashtag_Params, "createBaseHashtag_Params");
var Hashtag_Params = {
  encode(message, writer = new BinaryWriter()) {
    if (message.hashtag !== "") {
      writer.uint32(10).string(message.hashtag);
    }
    if (message.type !== 0) {
      writer.uint32(24).int32(message.type);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseHashtag_Params();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.hashtag = reader.string();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.type = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseReelSequence() {
  return { shortId: "", params: void 0, feature2: 0, feature3: 0 };
}
__name(createBaseReelSequence, "createBaseReelSequence");
var ReelSequence = {
  encode(message, writer = new BinaryWriter()) {
    if (message.shortId !== "") {
      writer.uint32(10).string(message.shortId);
    }
    if (message.params !== void 0) {
      ReelSequence_Params.encode(message.params, writer.uint32(42).fork()).join();
    }
    if (message.feature2 !== 0) {
      writer.uint32(80).int32(message.feature2);
    }
    if (message.feature3 !== 0) {
      writer.uint32(104).int32(message.feature3);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseReelSequence();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.shortId = reader.string();
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.params = ReelSequence_Params.decode(reader, reader.uint32());
          continue;
        }
        case 10: {
          if (tag !== 80) {
            break;
          }
          message.feature2 = reader.int32();
          continue;
        }
        case 13: {
          if (tag !== 104) {
            break;
          }
          message.feature3 = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseReelSequence_Params() {
  return { number: 0 };
}
__name(createBaseReelSequence_Params, "createBaseReelSequence_Params");
var ReelSequence_Params = {
  encode(message, writer = new BinaryWriter()) {
    if (message.number !== 0) {
      writer.uint32(24).int32(message.number);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseReelSequence_Params();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.number = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseNextParams() {
  return { videoId: [], playlistTitle: void 0 };
}
__name(createBaseNextParams, "createBaseNextParams");
var NextParams = {
  encode(message, writer = new BinaryWriter()) {
    for (const v of message.videoId) {
      writer.uint32(42).string(v);
    }
    if (message.playlistTitle !== void 0) {
      writer.uint32(50).string(message.playlistTitle);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseNextParams();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.videoId.push(reader.string());
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.playlistTitle = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseCommunityPostParams() {
  return { f1: void 0 };
}
__name(createBaseCommunityPostParams, "createBaseCommunityPostParams");
var CommunityPostParams = {
  encode(message, writer = new BinaryWriter()) {
    if (message.f1 !== void 0) {
      CommunityPostParams_Field1.encode(message.f1, writer.uint32(450).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseCommunityPostParams();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 56: {
          if (tag !== 450) {
            break;
          }
          message.f1 = CommunityPostParams_Field1.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseCommunityPostParams_Field1() {
  return { ucid1: "", postId: "", ucid2: "" };
}
__name(createBaseCommunityPostParams_Field1, "createBaseCommunityPostParams_Field1");
var CommunityPostParams_Field1 = {
  encode(message, writer = new BinaryWriter()) {
    if (message.ucid1 !== "") {
      writer.uint32(18).string(message.ucid1);
    }
    if (message.postId !== "") {
      writer.uint32(26).string(message.postId);
    }
    if (message.ucid2 !== "") {
      writer.uint32(90).string(message.ucid2);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseCommunityPostParams_Field1();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.ucid1 = reader.string();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.postId = reader.string();
          continue;
        }
        case 11: {
          if (tag !== 90) {
            break;
          }
          message.ucid2 = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseCommunityPostCommentsParamContainer() {
  return { f0: void 0 };
}
__name(createBaseCommunityPostCommentsParamContainer, "createBaseCommunityPostCommentsParamContainer");
var CommunityPostCommentsParamContainer = {
  encode(message, writer = new BinaryWriter()) {
    if (message.f0 !== void 0) {
      CommunityPostCommentsParamContainer_Container.encode(message.f0, writer.uint32(641815778).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseCommunityPostCommentsParamContainer();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 80226972: {
          if (tag !== 641815778) {
            break;
          }
          message.f0 = CommunityPostCommentsParamContainer_Container.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseCommunityPostCommentsParamContainer_Container() {
  return { location: "", protoData: "" };
}
__name(createBaseCommunityPostCommentsParamContainer_Container, "createBaseCommunityPostCommentsParamContainer_Container");
var CommunityPostCommentsParamContainer_Container = {
  encode(message, writer = new BinaryWriter()) {
    if (message.location !== "") {
      writer.uint32(18).string(message.location);
    }
    if (message.protoData !== "") {
      writer.uint32(26).string(message.protoData);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseCommunityPostCommentsParamContainer_Container();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.location = reader.string();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.protoData = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseCommunityPostCommentsParam() {
  return { title: "", commentDataContainer: void 0 };
}
__name(createBaseCommunityPostCommentsParam, "createBaseCommunityPostCommentsParam");
var CommunityPostCommentsParam = {
  encode(message, writer = new BinaryWriter()) {
    if (message.title !== "") {
      writer.uint32(18).string(message.title);
    }
    if (message.commentDataContainer !== void 0) {
      CommunityPostCommentsParam_CommentDataContainer.encode(message.commentDataContainer, writer.uint32(426).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseCommunityPostCommentsParam();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.title = reader.string();
          continue;
        }
        case 53: {
          if (tag !== 426) {
            break;
          }
          message.commentDataContainer = CommunityPostCommentsParam_CommentDataContainer.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseCommunityPostCommentsParam_CommentDataContainer() {
  return { commentData: void 0, f0: 0, title: "" };
}
__name(createBaseCommunityPostCommentsParam_CommentDataContainer, "createBaseCommunityPostCommentsParam_CommentDataContainer");
var CommunityPostCommentsParam_CommentDataContainer = {
  encode(message, writer = new BinaryWriter()) {
    if (message.commentData !== void 0) {
      CommunityPostCommentsParam_CommentDataContainer_CommentData.encode(message.commentData, writer.uint32(34).fork()).join();
    }
    if (message.f0 !== 0) {
      writer.uint32(56).int32(message.f0);
    }
    if (message.title !== "") {
      writer.uint32(66).string(message.title);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseCommunityPostCommentsParam_CommentDataContainer();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.commentData = CommunityPostCommentsParam_CommentDataContainer_CommentData.decode(reader, reader.uint32());
          continue;
        }
        case 7: {
          if (tag !== 56) {
            break;
          }
          message.f0 = reader.int32();
          continue;
        }
        case 8: {
          if (tag !== 66) {
            break;
          }
          message.title = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseCommunityPostCommentsParam_CommentDataContainer_CommentData() {
  return { sortBy: 0, f0: 0, f1: 0, postId: "", channelId: "" };
}
__name(createBaseCommunityPostCommentsParam_CommentDataContainer_CommentData, "createBaseCommunityPostCommentsParam_CommentDataContainer_CommentData");
var CommunityPostCommentsParam_CommentDataContainer_CommentData = {
  encode(message, writer = new BinaryWriter()) {
    if (message.sortBy !== 0) {
      writer.uint32(48).int32(message.sortBy);
    }
    if (message.f0 !== 0) {
      writer.uint32(120).int32(message.f0);
    }
    if (message.f1 !== 0) {
      writer.uint32(200).int32(message.f1);
    }
    if (message.postId !== "") {
      writer.uint32(234).string(message.postId);
    }
    if (message.channelId !== "") {
      writer.uint32(242).string(message.channelId);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseCommunityPostCommentsParam_CommentDataContainer_CommentData();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 6: {
          if (tag !== 48) {
            break;
          }
          message.sortBy = reader.int32();
          continue;
        }
        case 15: {
          if (tag !== 120) {
            break;
          }
          message.f0 = reader.int32();
          continue;
        }
        case 25: {
          if (tag !== 200) {
            break;
          }
          message.f1 = reader.int32();
          continue;
        }
        case 29: {
          if (tag !== 234) {
            break;
          }
          message.postId = reader.string();
          continue;
        }
        case 30: {
          if (tag !== 242) {
            break;
          }
          message.channelId = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};

// dist/src/utils/ProtoUtils.js
function encodeVisitorData(id, timestamp) {
  const writer = VisitorData.encode({ id, timestamp });
  return encodeURIComponent(u8ToBase64(writer.finish()).replace(/\+/g, "-").replace(/\//g, "_"));
}
__name(encodeVisitorData, "encodeVisitorData");
function decodeVisitorData(visitor_data) {
  return VisitorData.decode(base64ToU8(decodeURIComponent(visitor_data).replace(/-/g, "+").replace(/_/g, "/")));
}
__name(decodeVisitorData, "decodeVisitorData");
function encodeCommentActionParams(type, args = {}) {
  const data = {
    type,
    commentId: args.comment_id || " ",
    videoId: args.video_id || " ",
    channelId: " ",
    unkNum: 2
  };
  if (args.hasOwnProperty("text")) {
    if (typeof args.target_language !== "string")
      throw new Error("target_language must be a string");
    if (args.comment_id)
      delete data.unkNum;
    data.translateCommentParams = {
      params: {
        comment: {
          text: args.text
        }
      },
      commentId: args.comment_id || " ",
      targetLanguage: args.target_language
    };
  }
  const writer = PeformCommentActionParams.encode(data);
  return encodeURIComponent(u8ToBase64(writer.finish()));
}
__name(encodeCommentActionParams, "encodeCommentActionParams");
function encodeNextParams(video_ids, playlist_title) {
  const writer = NextParams.encode({ videoId: video_ids, playlistTitle: playlist_title });
  return encodeURIComponent(u8ToBase64(writer.finish()).replace(/\+/g, "-").replace(/\//g, "_"));
}
__name(encodeNextParams, "encodeNextParams");

// dist/src/utils/javascript/helpers.js
var helpers_exports2 = {};
__export(helpers_exports2, {
  WALK_STOP: () => WALK_STOP,
  createWrapperFunction: () => createWrapperFunction,
  extractNodeSource: () => extractNodeSource,
  getNodeSourceRange: () => getNodeSourceRange,
  indent: () => indent,
  jsBuiltIns: () => jsBuiltIns,
  memberBaseName: () => memberBaseName,
  memberToString: () => memberToString,
  walkAst: () => walkAst
});
var WALK_STOP = Symbol("WALK_STOP");
var jsBuiltIns = /* @__PURE__ */ new Set([
  "AbortController",
  "AbortSignal",
  "Array",
  "ArrayBuffer",
  "AsyncContext",
  "Atomics",
  "AudioContext",
  "BigInt",
  "BigInt64Array",
  "BigUint64Array",
  "Blob",
  "Boolean",
  "BroadcastChannel",
  "Buffer",
  "CanvasRenderingContext2D",
  "clearImmediate",
  "clearInterval",
  "clearTimeout",
  "confirm",
  "console",
  "Crypto",
  "CustomEvent",
  "DataView",
  "Date",
  "decodeURI",
  "decodeURIComponent",
  "document",
  "Element",
  "encodeURI",
  "encodeURIComponent",
  "Error",
  "escape",
  "eval",
  "Event",
  "EventTarget",
  "fetch",
  "File",
  "FileReader",
  "Float32Array",
  "Float64Array",
  "FormData",
  "function",
  "global",
  "globalThis",
  "hasOwnProperty",
  "Headers",
  "History",
  "HTMLElement",
  "HTMLCollection",
  "IDBKeyRange",
  "Infinity",
  "Int16Array",
  "Int32Array",
  "Int8Array",
  "Intl",
  "IntersectionObserver",
  "isFinite",
  "isNaN",
  "isPrototypeOf",
  "JSON",
  "location",
  "log",
  "Map",
  "Math",
  "MediaRecorder",
  "MediaSource",
  "MediaStream",
  "MemberExpression",
  "MutationObserver",
  "NaN",
  "navigator",
  "Node",
  "NodeList",
  "Number",
  "Object",
  "OfflineAudioContext",
  "parse",
  "parseFloat",
  "parseInt",
  "Performance",
  "process",
  "Promise",
  "prompt",
  "prototype",
  "Proxy",
  "ReadableStream",
  "Reflect",
  "RegExp",
  "requestAnimationFrame",
  "requestIdleCallback",
  "Request",
  "Response",
  "ResizeObserver",
  "Screen",
  "setImmediate",
  "setInterval",
  "setTimeout",
  "SharedArrayBuffer",
  "SharedWorker",
  "SourceBuffer",
  "split",
  "String",
  "stringify",
  "structuredClone",
  "SubtleCrypto",
  "Symbol",
  "TextDecoder",
  "TextEncoder",
  "this",
  "toString",
  "TransformStream",
  "Uint16Array",
  "Uint32Array",
  "Uint8Array",
  "Uint8ClampedArray",
  "undefined",
  "unescape",
  "URL",
  "URLSearchParams",
  "valueOf",
  "WeakMap",
  "WeakSet",
  "WebAssembly",
  "WebGLRenderingContext",
  "window",
  "Worker",
  "WritableStream",
  "XMLHttpRequest",
  "alert",
  "arguments",
  "atob",
  "btoa",
  "cancelAnimationFrame",
  "cancelIdleCallback",
  "queueMicrotask"
]);
var indent = "  ";
function walkAst(root, visitor) {
  if (!root || typeof root !== "object")
    return;
  const stack = [{ node: root, parent: null, exit: false }];
  const ancestors = [];
  const enter = typeof visitor === "function" ? visitor : visitor.enter ?? null;
  const leave = typeof visitor === "function" ? null : visitor.leave ?? null;
  let shouldStop = false;
  while (!shouldStop && stack.length > 0) {
    const frame = stack.pop();
    const { node, parent, exit } = frame;
    if (exit) {
      ancestors.pop();
      if (leave && leave(node, parent, ancestors) === WALK_STOP) {
        shouldStop = true;
      }
      continue;
    }
    if (!node || typeof node.type !== "string")
      continue;
    const result = enter ? enter(node, parent, ancestors) : void 0;
    if (result === WALK_STOP) {
      shouldStop = true;
      continue;
    }
    if (result === true)
      continue;
    stack.push({ node, parent, exit: true });
    ancestors.push(node);
    for (const key in node) {
      if (key === "loc" || key === "range" || key === "start" || key === "end")
        continue;
      if (!Object.prototype.hasOwnProperty.call(node, key))
        continue;
      const value = node[key];
      if (!value)
        continue;
      if (Array.isArray(value)) {
        for (let i = value.length - 1; i >= 0; i--) {
          const item = value[i];
          if (item && typeof item.type === "string") {
            stack.push({ node: item, parent: node, exit: false });
          }
        }
      } else if (typeof value === "object" && typeof value.type === "string") {
        stack.push({ node: value, parent: node, exit: false });
      }
    }
  }
}
__name(walkAst, "walkAst");
function getNodeSourceRange(node) {
  if (!node)
    return null;
  if (Array.isArray(node.range))
    return node.range;
  if (typeof node.start === "number" && typeof node.end === "number")
    return [node.start, node.end];
  return null;
}
__name(getNodeSourceRange, "getNodeSourceRange");
function extractNodeSource(node, source) {
  const range = getNodeSourceRange(node);
  return range ? source.slice(range[0], range[1]) : null;
}
__name(extractNodeSource, "extractNodeSource");
function memberToString(memberExpression, source) {
  if (memberExpression.type !== "MemberExpression")
    return null;
  const segments = [];
  let cur = memberExpression;
  while (cur && cur.type === "MemberExpression") {
    const member = cur;
    const prop = member.property;
    if (!prop)
      return null;
    if (member.computed) {
      const propSource = extractNodeSource(prop, source);
      if (!propSource)
        return null;
      segments.unshift(`[${propSource.trim()}]`);
    } else {
      if (prop.type !== "Identifier")
        return null;
      segments.unshift(`.${prop.name}`);
    }
    cur = member.object;
  }
  let base = null;
  if (cur?.type === "Identifier") {
    base = cur.name;
  } else if (cur?.type === "ThisExpression") {
    base = "this";
  }
  return base ? base + segments.join("") : null;
}
__name(memberToString, "memberToString");
function memberBaseName(memberExpression, source) {
  let target = memberExpression.object;
  while (target && target.type === "MemberExpression") {
    const parentName = memberToString(target, source);
    if (parentName)
      return parentName;
    target = target.object;
  }
  if (target?.type === "Identifier")
    return target.name;
  if (target?.type === "ThisExpression")
    return "this";
  return null;
}
__name(memberBaseName, "memberBaseName");
function createWrapperFunction(analyzer, name, node) {
  if (node.type === "CallExpression" && node.callee.type === "Identifier" && analyzer.declaredVariables.has(node.callee.name)) {
    return generateWrapper(name, node.callee.name, parseFunctionArguments(analyzer, node.arguments));
  } else if (node.type === "VariableDeclarator" && node.init?.type === "FunctionExpression" && node.id.type === "Identifier") {
    return generateWrapper(name, node.id.name, parseFunctionArguments(analyzer, node.init.params));
  } else if (node.type === "NewExpression" && node.callee.type === "MemberExpression" && node.callee.object.type === "Identifier") {
    const targetFunction = memberToString(node.callee, analyzer.getSource());
    if (!targetFunction)
      return void 0;
    return generateWrapper(name, targetFunction, parseFunctionArguments(analyzer, node.arguments), true);
  }
}
__name(createWrapperFunction, "createWrapperFunction");
function generateWrapper(functionName, targetFunction, args, useNew = false) {
  return [
    `${indent}function ${functionName}(${args.join(", ")}) {`,
    `${indent}${indent}return ${useNew ? "new " : ""}${targetFunction}(${args.join(", ")});`,
    `${indent}}`
  ].join("\n");
}
__name(generateWrapper, "generateWrapper");
function parseFunctionArguments(analyzer, args) {
  const params = [];
  for (const arg of args) {
    if (arg.type === "Identifier" && analyzer.declaredVariables.has(arg.name)) {
      params.push(arg.name);
    } else if (arg.type === "Literal" && (typeof arg.value === "string" || typeof arg.value === "number")) {
      params.push(JSON.stringify(arg.value));
    } else if (arg.type === "UnaryExpression") {
      const argSource = extractNodeSource(arg, analyzer.getSource());
      if (argSource) {
        params.push(argSource.trim());
      }
    } else if (arg.type === "AssignmentPattern" && arg.left.type === "Identifier") {
      params.push(arg.left.name);
    } else if (arg.type === "Identifier") {
      params.push(arg.name);
    } else if (!params.includes("input"))
      params.push("input");
  }
  return params;
}
__name(parseFunctionArguments, "parseFunctionArguments");

// dist/src/utils/javascript/matchers.js
var matchers_exports = {};
__export(matchers_exports, {
  nsigMatcher: () => nsigMatcher,
  timestampMatcher: () => timestampMatcher
});
function nsigMatcher(node) {
  if (node.type !== "VariableDeclarator")
    return false;
  const init = node.init;
  if (!init || init.type !== "FunctionExpression")
    return false;
  if (init.params.length < 3)
    return false;
  const [url, sigName, sigValue] = init.params;
  if (url.type !== "Identifier" || sigName.type !== "AssignmentPattern" || sigValue.type !== "AssignmentPattern")
    return false;
  const body = init.body;
  const blockStatementBody = body?.body || [];
  let hasUrlCtor = false;
  let hasSetAlr = false;
  for (const statement of blockStatementBody) {
    if (statement.type !== "ExpressionStatement")
      continue;
    const expr = statement.expression;
    if (expr.type === "AssignmentExpression" && expr.operator === "=" && expr.left.type === "Identifier" && expr.left.name === url.name) {
      const right = expr.right;
      if (right.type === "NewExpression" && right.callee.type === "MemberExpression") {
        hasUrlCtor = true;
      }
    }
    if (expr.type === "CallExpression" && expr.callee.type === "MemberExpression") {
      const args = expr.arguments;
      if (args.length === 2 && args[0].type === "Literal" && args[0].value === "alr" && args[1].type === "Literal" && args[1].value === "yes") {
        hasSetAlr = true;
      }
    }
  }
  if (!hasUrlCtor || !hasSetAlr)
    return false;
  return node;
}
__name(nsigMatcher, "nsigMatcher");
function timestampMatcher(node) {
  if (node.type !== "VariableDeclarator" || node.init?.type !== "FunctionExpression") {
    return false;
  }
  const funcBody = node.init.body;
  if (!funcBody)
    return false;
  let foundObject = null;
  walkAst(funcBody, (innerNode) => {
    if (innerNode.type === "ObjectExpression") {
      for (const prop of innerNode.properties) {
        if (prop.type === "Property" && prop.key.type === "Identifier" && prop.key.name === "signatureTimestamp") {
          foundObject = prop;
          return WALK_STOP;
        }
      }
    }
  });
  return foundObject || false;
}
__name(timestampMatcher, "timestampMatcher");

// node_modules/meriyah/dist/meriyah.mjs
var unicodeLookup = ((compressed, lookup) => {
  const result = new Uint32Array(69632);
  let index = 0;
  let subIndex = 0;
  while (index < 2571) {
    const inst = compressed[index++];
    if (inst < 0) {
      subIndex -= inst;
    } else {
      let code = compressed[index++];
      if (inst & 2)
        code = lookup[code];
      if (inst & 1) {
        result.fill(code, subIndex, subIndex += compressed[index++]);
      } else {
        result[subIndex++] = code;
      }
    }
  }
  return result;
})([-1, 2, 26, 2, 27, 2, 5, -1, 0, 77595648, 3, 44, 2, 3, 0, 14, 2, 63, 2, 64, 3, 0, 3, 0, 3168796671, 0, 4294956992, 2, 1, 2, 0, 2, 41, 3, 0, 4, 0, 4294966523, 3, 0, 4, 2, 16, 2, 65, 2, 0, 0, 4294836735, 0, 3221225471, 0, 4294901942, 2, 66, 0, 134152192, 3, 0, 2, 0, 4294951935, 3, 0, 2, 0, 2683305983, 0, 2684354047, 2, 18, 2, 0, 0, 4294961151, 3, 0, 2, 2, 19, 2, 0, 0, 608174079, 2, 0, 2, 60, 2, 7, 2, 6, 0, 4286611199, 3, 0, 2, 2, 1, 3, 0, 3, 0, 4294901711, 2, 40, 0, 4089839103, 0, 2961209759, 0, 1342439375, 0, 4294543342, 0, 3547201023, 0, 1577204103, 0, 4194240, 0, 4294688750, 2, 2, 0, 80831, 0, 4261478351, 0, 4294549486, 2, 2, 0, 2967484831, 0, 196559, 0, 3594373100, 0, 3288319768, 0, 8469959, 0, 65472, 2, 3, 0, 4093640191, 0, 660618719, 0, 65487, 0, 4294828015, 0, 4092591615, 0, 1616920031, 0, 982991, 2, 3, 2, 0, 0, 2163244511, 0, 4227923919, 0, 4236247022, 2, 71, 0, 4284449919, 0, 851904, 2, 4, 2, 12, 0, 67076095, -1, 2, 72, 0, 1073741743, 0, 4093607775, -1, 0, 50331649, 0, 3265266687, 2, 33, 0, 4294844415, 0, 4278190047, 2, 20, 2, 137, -1, 3, 0, 2, 2, 23, 2, 0, 2, 10, 2, 0, 2, 15, 2, 22, 3, 0, 10, 2, 74, 2, 0, 2, 75, 2, 76, 2, 77, 2, 0, 2, 78, 2, 0, 2, 11, 0, 261632, 2, 25, 3, 0, 2, 2, 13, 2, 4, 3, 0, 18, 2, 79, 2, 5, 3, 0, 2, 2, 80, 0, 2151677951, 2, 29, 2, 9, 0, 909311, 3, 0, 2, 0, 814743551, 2, 49, 0, 67090432, 3, 0, 2, 2, 42, 2, 0, 2, 6, 2, 0, 2, 30, 2, 8, 0, 268374015, 2, 110, 2, 51, 2, 0, 2, 81, 0, 134153215, -1, 2, 7, 2, 0, 2, 8, 0, 2684354559, 0, 67044351, 0, 3221160064, 2, 17, -1, 3, 0, 2, 2, 53, 0, 1046528, 3, 0, 3, 2, 9, 2, 0, 2, 54, 0, 4294960127, 2, 10, 2, 6, 2, 11, 0, 4294377472, 2, 12, 3, 0, 16, 2, 13, 2, 0, 2, 82, 2, 10, 2, 0, 2, 83, 2, 84, 2, 85, 0, 12288, 2, 55, 0, 1048577, 2, 86, 2, 14, -1, 2, 14, 0, 131042, 2, 87, 2, 88, 2, 89, 2, 0, 2, 34, -83, 3, 0, 7, 0, 1046559, 2, 0, 2, 15, 2, 0, 0, 2147516671, 2, 21, 3, 90, 2, 2, 0, -16, 2, 91, 0, 524222462, 2, 4, 2, 0, 0, 4269801471, 2, 4, 3, 0, 2, 2, 28, 2, 16, 3, 0, 2, 2, 17, 2, 0, -1, 2, 18, -16, 3, 0, 206, -2, 3, 0, 692, 2, 73, -1, 2, 18, 2, 10, 3, 0, 8, 2, 93, 2, 133, 2, 0, 0, 3220242431, 3, 0, 3, 2, 19, 2, 94, 2, 95, 3, 0, 2, 2, 96, 2, 0, 2, 97, 2, 46, 2, 0, 0, 4351, 2, 0, 2, 9, 3, 0, 2, 0, 67043391, 0, 3909091327, 2, 0, 2, 24, 2, 9, 2, 20, 3, 0, 2, 0, 67076097, 2, 8, 2, 0, 2, 21, 0, 67059711, 0, 4236247039, 3, 0, 2, 0, 939524103, 0, 8191999, 2, 101, 2, 102, 2, 22, 2, 23, 3, 0, 3, 0, 67057663, 3, 0, 349, 2, 103, 2, 104, 2, 7, -264, 3, 0, 11, 2, 24, 3, 0, 2, 2, 32, -1, 0, 3774349439, 2, 105, 2, 106, 3, 0, 2, 2, 19, 2, 107, 3, 0, 10, 2, 10, 2, 18, 2, 0, 2, 47, 2, 0, 2, 31, 2, 108, 2, 25, 0, 1638399, 0, 57344, 2, 109, 3, 0, 3, 2, 20, 2, 26, 2, 27, 2, 5, 2, 28, 2, 0, 2, 8, 2, 111, -1, 2, 112, 2, 113, 2, 114, -1, 3, 0, 3, 2, 12, -2, 2, 0, 2, 29, -3, 0, 536870912, -4, 2, 20, 2, 0, 2, 36, 0, 1, 2, 0, 2, 67, 2, 6, 2, 12, 2, 10, 2, 0, 2, 115, -1, 3, 0, 4, 2, 10, 2, 23, 2, 116, 2, 7, 2, 0, 2, 117, 2, 0, 2, 118, 2, 119, 2, 120, 2, 0, 2, 9, 3, 0, 9, 2, 21, 2, 30, 2, 31, 2, 121, 2, 122, -2, 2, 123, 2, 124, 2, 30, 2, 21, 2, 8, -2, 2, 125, 2, 30, 2, 32, -2, 2, 0, 2, 39, -2, 0, 4277137519, 0, 2269118463, -1, 3, 20, 2, -1, 2, 33, 2, 38, 2, 0, 3, 30, 2, 2, 35, 2, 19, -3, 3, 0, 2, 2, 34, -1, 2, 0, 2, 35, 2, 0, 2, 35, 2, 0, 2, 48, 2, 0, 0, 4294950463, 2, 37, -7, 2, 0, 0, 203775, 2, 57, 0, 4026531840, 2, 20, 2, 43, 2, 36, 2, 18, 2, 37, 2, 18, 2, 126, 2, 21, 3, 0, 2, 2, 38, 0, 2151677888, 2, 0, 2, 12, 0, 4294901764, 2, 144, 2, 0, 2, 58, 2, 56, 0, 5242879, 3, 0, 2, 0, 402644511, -1, 2, 128, 2, 39, 0, 3, -1, 2, 129, 2, 130, 2, 0, 0, 67045375, 2, 40, 0, 4226678271, 0, 3766565279, 0, 2039759, 2, 132, 2, 41, 0, 1046437, 0, 6, 3, 0, 2, 0, 3288270847, 0, 3, 3, 0, 2, 0, 67043519, -5, 2, 0, 0, 4282384383, 0, 1056964609, -1, 3, 0, 2, 0, 67043345, -1, 2, 0, 2, 42, 2, 23, 2, 50, 2, 11, 2, 61, 2, 38, -5, 2, 0, 2, 12, -3, 3, 0, 2, 0, 2147484671, 2, 134, 0, 4190109695, 2, 52, -2, 2, 135, 0, 4244635647, 0, 27, 2, 0, 2, 8, 2, 43, 2, 0, 2, 68, 2, 18, 2, 0, 2, 42, -6, 2, 0, 2, 45, 2, 59, 2, 44, 2, 45, 2, 46, 2, 47, 0, 8388351, -2, 2, 136, 0, 3028287487, 2, 48, 2, 138, 0, 33259519, 2, 49, -9, 2, 21, 0, 4294836223, 0, 3355443199, 0, 134152199, -2, 2, 69, -2, 3, 0, 28, 2, 32, -3, 3, 0, 3, 2, 17, 3, 0, 6, 2, 50, -81, 2, 18, 3, 0, 2, 2, 36, 3, 0, 33, 2, 25, 2, 30, 3, 0, 124, 2, 12, 3, 0, 18, 2, 38, -213, 2, 0, 2, 32, -54, 3, 0, 17, 2, 42, 2, 8, 2, 23, 2, 0, 2, 8, 2, 23, 2, 51, 2, 0, 2, 21, 2, 52, 2, 139, 2, 25, -13, 2, 0, 2, 53, -6, 3, 0, 2, -4, 3, 0, 2, 0, 4294936575, 2, 0, 0, 4294934783, -2, 0, 196635, 3, 0, 191, 2, 54, 3, 0, 38, 2, 30, 2, 55, 2, 34, -278, 2, 140, 3, 0, 9, 2, 141, 2, 142, 2, 56, 3, 0, 11, 2, 7, -72, 3, 0, 3, 2, 143, 0, 1677656575, -130, 2, 26, -16, 2, 0, 2, 24, 2, 38, -16, 0, 4161266656, 0, 4071, 0, 15360, -4, 2, 57, -13, 3, 0, 2, 2, 58, 2, 0, 2, 145, 2, 146, 2, 62, 2, 0, 2, 147, 2, 148, 2, 149, 3, 0, 10, 2, 150, 2, 151, 2, 22, 3, 58, 2, 3, 152, 2, 3, 59, 2, 0, 4294954999, 2, 0, -16, 2, 0, 2, 92, 2, 0, 0, 2105343, 0, 4160749584, 0, 65534, -34, 2, 8, 2, 154, -6, 0, 4194303871, 0, 4294903771, 2, 0, 2, 60, 2, 100, -3, 2, 0, 0, 1073684479, 0, 17407, -9, 2, 18, 2, 17, 2, 0, 2, 32, -14, 2, 18, 2, 32, -6, 2, 18, 2, 12, -15, 2, 155, 3, 0, 6, 0, 8323103, -1, 3, 0, 2, 2, 61, -37, 2, 62, 2, 156, 2, 157, 2, 158, 2, 159, 2, 160, -105, 2, 26, -32, 3, 0, 1335, -1, 3, 0, 129, 2, 32, 3, 0, 6, 2, 10, 3, 0, 180, 2, 161, 3, 0, 233, 2, 162, 3, 0, 18, 2, 10, -77, 3, 0, 16, 2, 10, -47, 3, 0, 154, 2, 6, 3, 0, 130, 2, 25, -22250, 3, 0, 7, 2, 25, -6130, 3, 5, 2, -1, 0, 69207040, 3, 44, 2, 3, 0, 14, 2, 63, 2, 64, -3, 0, 3168731136, 0, 4294956864, 2, 1, 2, 0, 2, 41, 3, 0, 4, 0, 4294966275, 3, 0, 4, 2, 16, 2, 65, 2, 0, 2, 34, -1, 2, 18, 2, 66, -1, 2, 0, 0, 2047, 0, 4294885376, 3, 0, 2, 0, 3145727, 0, 2617294944, 0, 4294770688, 2, 25, 2, 67, 3, 0, 2, 0, 131135, 2, 98, 0, 70256639, 0, 71303167, 0, 272, 2, 42, 2, 6, 0, 32511, 2, 0, 2, 49, -1, 2, 99, 2, 68, 0, 4278255616, 0, 4294836227, 0, 4294549473, 0, 600178175, 0, 2952806400, 0, 268632067, 0, 4294543328, 0, 57540095, 0, 1577058304, 0, 1835008, 0, 4294688736, 2, 70, 2, 69, 0, 33554435, 2, 131, 2, 70, 0, 2952790016, 0, 131075, 0, 3594373096, 0, 67094296, 2, 69, -1, 0, 4294828e3, 0, 603979263, 0, 654311424, 0, 3, 0, 4294828001, 0, 602930687, 0, 1610612736, 0, 393219, 0, 4294828016, 0, 671088639, 0, 2154840064, 0, 4227858435, 0, 4236247008, 2, 71, 2, 38, -1, 2, 4, 0, 917503, 2, 38, -1, 2, 72, 0, 537788335, 0, 4026531935, -1, 0, 1, -1, 2, 33, 2, 73, 0, 7936, -3, 2, 0, 0, 2147485695, 0, 1010761728, 0, 4292984930, 0, 16387, 2, 0, 2, 15, 2, 22, 3, 0, 10, 2, 74, 2, 0, 2, 75, 2, 76, 2, 77, 2, 0, 2, 78, 2, 0, 2, 12, -1, 2, 25, 3, 0, 2, 2, 13, 2, 4, 3, 0, 18, 2, 79, 2, 5, 3, 0, 2, 2, 80, 0, 2147745791, 3, 19, 2, 0, 122879, 2, 0, 2, 9, 0, 276824064, -2, 3, 0, 2, 2, 42, 2, 0, 0, 4294903295, 2, 0, 2, 30, 2, 8, -1, 2, 18, 2, 51, 2, 0, 2, 81, 2, 49, -1, 2, 21, 2, 0, 2, 29, -2, 0, 128, -2, 2, 28, 2, 9, 0, 8160, -1, 2, 127, 0, 4227907585, 2, 0, 2, 37, 2, 0, 2, 50, 0, 4227915776, 2, 10, 2, 6, 2, 11, -1, 0, 74440192, 3, 0, 6, -2, 3, 0, 8, 2, 13, 2, 0, 2, 82, 2, 10, 2, 0, 2, 83, 2, 84, 2, 85, -3, 2, 86, 2, 14, -3, 2, 87, 2, 88, 2, 89, 2, 0, 2, 34, -83, 3, 0, 7, 0, 817183, 2, 0, 2, 15, 2, 0, 0, 33023, 2, 21, 3, 90, 2, -17, 2, 91, 0, 524157950, 2, 4, 2, 0, 2, 92, 2, 4, 2, 0, 2, 22, 2, 28, 2, 16, 3, 0, 2, 2, 17, 2, 0, -1, 2, 18, -16, 3, 0, 206, -2, 3, 0, 692, 2, 73, -1, 2, 18, 2, 10, 3, 0, 8, 2, 93, 0, 3072, 2, 0, 0, 2147516415, 2, 10, 3, 0, 2, 2, 25, 2, 94, 2, 95, 3, 0, 2, 2, 96, 2, 0, 2, 97, 2, 46, 0, 4294965179, 0, 7, 2, 0, 2, 9, 2, 95, 2, 9, -1, 0, 1761345536, 2, 98, 0, 4294901823, 2, 38, 2, 20, 2, 99, 2, 35, 2, 100, 0, 2080440287, 2, 0, 2, 34, 2, 153, 0, 3296722943, 2, 0, 0, 1046675455, 0, 939524101, 0, 1837055, 2, 101, 2, 102, 2, 22, 2, 23, 3, 0, 3, 0, 7, 3, 0, 349, 2, 103, 2, 104, 2, 7, -264, 3, 0, 11, 2, 24, 3, 0, 2, 2, 32, -1, 0, 2700607615, 2, 105, 2, 106, 3, 0, 2, 2, 19, 2, 107, 3, 0, 10, 2, 10, 2, 18, 2, 0, 2, 47, 2, 0, 2, 31, 2, 108, -3, 2, 109, 3, 0, 3, 2, 20, -1, 3, 5, 2, 2, 110, 2, 0, 2, 8, 2, 111, -1, 2, 112, 2, 113, 2, 114, -1, 3, 0, 3, 2, 12, -2, 2, 0, 2, 29, -8, 2, 20, 2, 0, 2, 36, -1, 2, 0, 2, 67, 2, 6, 2, 30, 2, 10, 2, 0, 2, 115, -1, 3, 0, 4, 2, 10, 2, 18, 2, 116, 2, 7, 2, 0, 2, 117, 2, 0, 2, 118, 2, 119, 2, 120, 2, 0, 2, 9, 3, 0, 9, 2, 21, 2, 30, 2, 31, 2, 121, 2, 122, -2, 2, 123, 2, 124, 2, 30, 2, 21, 2, 8, -2, 2, 125, 2, 30, 2, 32, -2, 2, 0, 2, 39, -2, 0, 4277075969, 2, 30, -1, 3, 20, 2, -1, 2, 33, 2, 126, 2, 0, 3, 30, 2, 2, 35, 2, 19, -3, 3, 0, 2, 2, 34, -1, 2, 0, 2, 35, 2, 0, 2, 35, 2, 0, 2, 50, 2, 98, 0, 4294934591, 2, 37, -7, 2, 0, 0, 197631, 2, 57, -1, 2, 20, 2, 43, 2, 37, 2, 18, 0, 3, 2, 18, 2, 126, 2, 21, 2, 127, 2, 54, -1, 0, 2490368, 2, 127, 2, 25, 2, 18, 2, 34, 2, 127, 2, 38, 0, 4294901904, 0, 4718591, 2, 127, 2, 35, 0, 335544350, -1, 2, 128, 0, 2147487743, 0, 1, -1, 2, 129, 2, 130, 2, 8, -1, 2, 131, 2, 70, 0, 3758161920, 0, 3, 2, 132, 0, 12582911, 0, 655360, -1, 2, 0, 2, 29, 0, 2147485568, 0, 3, 2, 0, 2, 25, 0, 176, -5, 2, 0, 2, 17, 0, 251658240, -1, 2, 0, 2, 25, 0, 16, -1, 2, 0, 0, 16779263, -2, 2, 12, -1, 2, 38, -5, 2, 0, 2, 133, -3, 3, 0, 2, 2, 55, 2, 134, 0, 2147549183, 0, 2, -2, 2, 135, 2, 36, 0, 10, 0, 4294965249, 0, 67633151, 0, 4026597376, 2, 0, 0, 536871935, 2, 18, 2, 0, 2, 42, -6, 2, 0, 0, 1, 2, 59, 2, 17, 0, 1, 2, 46, 2, 25, -3, 2, 136, 2, 36, 2, 137, 2, 138, 0, 16778239, -10, 2, 35, 0, 4294836212, 2, 9, -3, 2, 69, -2, 3, 0, 28, 2, 32, -3, 3, 0, 3, 2, 17, 3, 0, 6, 2, 50, -81, 2, 18, 3, 0, 2, 2, 36, 3, 0, 33, 2, 25, 0, 126, 3, 0, 124, 2, 12, 3, 0, 18, 2, 38, -213, 2, 10, -55, 3, 0, 17, 2, 42, 2, 8, 2, 18, 2, 0, 2, 8, 2, 18, 2, 60, 2, 0, 2, 25, 2, 50, 2, 139, 2, 25, -13, 2, 0, 2, 73, -6, 3, 0, 2, -4, 3, 0, 2, 0, 67583, -1, 2, 107, -2, 0, 11, 3, 0, 191, 2, 54, 3, 0, 38, 2, 30, 2, 55, 2, 34, -278, 2, 140, 3, 0, 9, 2, 141, 2, 142, 2, 56, 3, 0, 11, 2, 7, -72, 3, 0, 3, 2, 143, 2, 144, -187, 3, 0, 2, 2, 58, 2, 0, 2, 145, 2, 146, 2, 62, 2, 0, 2, 147, 2, 148, 2, 149, 3, 0, 10, 2, 150, 2, 151, 2, 22, 3, 58, 2, 3, 152, 2, 3, 59, 2, 2, 153, -57, 2, 8, 2, 154, -7, 2, 18, 2, 0, 2, 60, -4, 2, 0, 0, 1065361407, 0, 16384, -9, 2, 18, 2, 60, 2, 0, 2, 133, -14, 2, 18, 2, 133, -6, 2, 18, 0, 81919, -15, 2, 155, 3, 0, 6, 2, 126, -1, 3, 0, 2, 0, 2063, -37, 2, 62, 2, 156, 2, 157, 2, 158, 2, 159, 2, 160, -138, 3, 0, 1335, -1, 3, 0, 129, 2, 32, 3, 0, 6, 2, 10, 3, 0, 180, 2, 161, 3, 0, 233, 2, 162, 3, 0, 18, 2, 10, -77, 3, 0, 16, 2, 10, -47, 3, 0, 154, 2, 6, 3, 0, 130, 2, 25, -28386], [4294967295, 4294967291, 4092460543, 4294828031, 4294967294, 134217726, 4294903807, 268435455, 2147483647, 1048575, 1073741823, 3892314111, 134217727, 1061158911, 536805376, 4294910143, 4294901759, 32767, 4294901760, 262143, 536870911, 8388607, 4160749567, 4294902783, 4294918143, 65535, 67043328, 2281701374, 4294967264, 2097151, 4194303, 255, 67108863, 4294967039, 511, 524287, 131071, 63, 127, 3238002687, 4294549487, 4290772991, 33554431, 4294901888, 4286578687, 67043329, 4294705152, 4294770687, 67043583, 1023, 15, 2047999, 67043343, 67051519, 16777215, 2147483648, 4294902e3, 28, 4292870143, 4294966783, 16383, 67047423, 4294967279, 262083, 20511, 41943039, 493567, 4294959104, 603979775, 65536, 602799615, 805044223, 4294965206, 8191, 1031749119, 4294917631, 2134769663, 4286578493, 4282253311, 4294942719, 33540095, 4294905855, 2868854591, 1608515583, 265232348, 534519807, 2147614720, 1060109444, 4093640016, 17376, 2139062143, 224, 4169138175, 4294909951, 4286578688, 4294967292, 4294965759, 535511039, 4294966272, 4294967280, 32768, 8289918, 4294934399, 4294901775, 4294965375, 1602223615, 4294967259, 4294443008, 268369920, 4292804608, 4294967232, 486341884, 4294963199, 3087007615, 1073692671, 4128527, 4279238655, 4294902015, 4160684047, 4290246655, 469499899, 4294967231, 134086655, 4294966591, 2445279231, 3670015, 31, 4294967288, 4294705151, 3221208447, 4294902271, 4294549472, 4294921215, 4095, 4285526655, 4294966527, 4294966143, 64, 4294966719, 3774873592, 1877934080, 262151, 2555904, 536807423, 67043839, 3758096383, 3959414372, 3755993023, 2080374783, 4294835295, 4294967103, 4160749565, 4294934527, 4087, 2016, 2147446655, 184024726, 2862017156, 1593309078, 268434431, 268434414, 4294901763, 4294901761]);
var isIDContinue = /* @__PURE__ */ __name((code) => (unicodeLookup[(code >>> 5) + 0] >>> code & 31 & 1) !== 0, "isIDContinue");
var isIDStart = /* @__PURE__ */ __name((code) => (unicodeLookup[(code >>> 5) + 34816] >>> code & 31 & 1) !== 0, "isIDStart");
function advanceChar(parser) {
  parser.column++;
  return parser.currentChar = parser.source.charCodeAt(++parser.index);
}
__name(advanceChar, "advanceChar");
function consumePossibleSurrogatePair(parser) {
  const hi = parser.currentChar;
  if ((hi & 64512) !== 55296)
    return 0;
  const lo = parser.source.charCodeAt(parser.index + 1);
  if ((lo & 64512) !== 56320)
    return 0;
  return 65536 + ((hi & 1023) << 10) + (lo & 1023);
}
__name(consumePossibleSurrogatePair, "consumePossibleSurrogatePair");
function consumeLineFeed(parser, state) {
  parser.currentChar = parser.source.charCodeAt(++parser.index);
  parser.flags |= 1;
  if ((state & 4) === 0) {
    parser.column = 0;
    parser.line++;
  }
}
__name(consumeLineFeed, "consumeLineFeed");
function scanNewLine(parser) {
  parser.flags |= 1;
  parser.currentChar = parser.source.charCodeAt(++parser.index);
  parser.column = 0;
  parser.line++;
}
__name(scanNewLine, "scanNewLine");
function isExoticECMAScriptWhitespace(ch) {
  return ch === 160 || ch === 65279 || ch === 133 || ch === 5760 || ch >= 8192 && ch <= 8203 || ch === 8239 || ch === 8287 || ch === 12288 || ch === 8201 || ch === 65519;
}
__name(isExoticECMAScriptWhitespace, "isExoticECMAScriptWhitespace");
function toHex(code) {
  return code < 65 ? code - 48 : code - 65 + 10 & 15;
}
__name(toHex, "toHex");
function convertTokenType(t) {
  switch (t) {
    case 134283266:
      return "NumericLiteral";
    case 134283267:
      return "StringLiteral";
    case 86021:
    case 86022:
      return "BooleanLiteral";
    case 86023:
      return "NullLiteral";
    case 65540:
      return "RegularExpression";
    case 67174408:
    case 67174409:
    case 131:
      return "TemplateLiteral";
    default:
      if ((t & 143360) === 143360)
        return "Identifier";
      if ((t & 4096) === 4096)
        return "Keyword";
      return "Punctuator";
  }
}
__name(convertTokenType, "convertTokenType");
var CharTypes = [
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  8 | 1024,
  0,
  0,
  8 | 2048,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  8192,
  0,
  1 | 2,
  0,
  0,
  8192,
  0,
  0,
  0,
  256,
  0,
  256 | 32768,
  0,
  0,
  2 | 16 | 128 | 32 | 64,
  2 | 16 | 128 | 32 | 64,
  2 | 16 | 32 | 64,
  2 | 16 | 32 | 64,
  2 | 16 | 32 | 64,
  2 | 16 | 32 | 64,
  2 | 16 | 32 | 64,
  2 | 16 | 32 | 64,
  2 | 16 | 512 | 64,
  2 | 16 | 512 | 64,
  0,
  0,
  16384,
  0,
  0,
  0,
  0,
  1 | 2 | 64,
  1 | 2 | 64,
  1 | 2 | 64,
  1 | 2 | 64,
  1 | 2 | 64,
  1 | 2 | 64,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  1 | 2,
  0,
  1,
  0,
  0,
  1 | 2 | 4096,
  0,
  1 | 2 | 4 | 64,
  1 | 2 | 4 | 64,
  1 | 2 | 4 | 64,
  1 | 2 | 4 | 64,
  1 | 2 | 4 | 64,
  1 | 2 | 4 | 64,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  1 | 2 | 4,
  16384,
  0,
  0,
  0,
  0
];
var isIdStart = [
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  1,
  0,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0
];
var isIdPart = [
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  1,
  0,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0
];
function isIdentifierStart(code) {
  return code <= 127 ? isIdStart[code] > 0 : isIDStart(code);
}
__name(isIdentifierStart, "isIdentifierStart");
function isIdentifierPart(code) {
  return code <= 127 ? isIdPart[code] > 0 : isIDContinue(code) || (code === 8204 || code === 8205);
}
__name(isIdentifierPart, "isIdentifierPart");
var CommentTypes = ["SingleLine", "MultiLine", "HTMLOpen", "HTMLClose", "HashbangComment"];
function skipHashBang(parser) {
  const { source } = parser;
  if (parser.currentChar === 35 && source.charCodeAt(parser.index + 1) === 33) {
    advanceChar(parser);
    advanceChar(parser);
    skipSingleLineComment(parser, source, 0, 4, parser.tokenStart);
  }
}
__name(skipHashBang, "skipHashBang");
function skipSingleHTMLComment(parser, source, state, context, type, start) {
  if (context & 2)
    parser.report(0);
  return skipSingleLineComment(parser, source, state, type, start);
}
__name(skipSingleHTMLComment, "skipSingleHTMLComment");
function skipSingleLineComment(parser, source, state, type, start) {
  const { index } = parser;
  parser.tokenIndex = parser.index;
  parser.tokenLine = parser.line;
  parser.tokenColumn = parser.column;
  while (parser.index < parser.end) {
    if (CharTypes[parser.currentChar] & 8) {
      const isCR = parser.currentChar === 13;
      scanNewLine(parser);
      if (isCR && parser.index < parser.end && parser.currentChar === 10)
        parser.currentChar = source.charCodeAt(++parser.index);
      break;
    } else if ((parser.currentChar ^ 8232) <= 1) {
      scanNewLine(parser);
      break;
    }
    advanceChar(parser);
    parser.tokenIndex = parser.index;
    parser.tokenLine = parser.line;
    parser.tokenColumn = parser.column;
  }
  if (parser.options.onComment) {
    const loc = {
      start: {
        line: start.line,
        column: start.column
      },
      end: {
        line: parser.tokenLine,
        column: parser.tokenColumn
      }
    };
    parser.options.onComment(CommentTypes[type & 255], source.slice(index, parser.tokenIndex), start.index, parser.tokenIndex, loc);
  }
  return state | 1;
}
__name(skipSingleLineComment, "skipSingleLineComment");
function skipMultiLineComment(parser, source, state) {
  const { index } = parser;
  while (parser.index < parser.end) {
    if (parser.currentChar < 43) {
      let skippedOneAsterisk = false;
      while (parser.currentChar === 42) {
        if (!skippedOneAsterisk) {
          state &= -5;
          skippedOneAsterisk = true;
        }
        if (advanceChar(parser) === 47) {
          advanceChar(parser);
          if (parser.options.onComment) {
            const loc = {
              start: {
                line: parser.tokenLine,
                column: parser.tokenColumn
              },
              end: {
                line: parser.line,
                column: parser.column
              }
            };
            parser.options.onComment(CommentTypes[1 & 255], source.slice(index, parser.index - 2), index - 2, parser.index, loc);
          }
          parser.tokenIndex = parser.index;
          parser.tokenLine = parser.line;
          parser.tokenColumn = parser.column;
          return state;
        }
      }
      if (skippedOneAsterisk) {
        continue;
      }
      if (CharTypes[parser.currentChar] & 8) {
        if (parser.currentChar === 13) {
          state |= 1 | 4;
          scanNewLine(parser);
        } else {
          consumeLineFeed(parser, state);
          state = state & -5 | 1;
        }
      } else {
        advanceChar(parser);
      }
    } else if ((parser.currentChar ^ 8232) <= 1) {
      state = state & -5 | 1;
      scanNewLine(parser);
    } else {
      state &= -5;
      advanceChar(parser);
    }
  }
  parser.report(18);
}
__name(skipMultiLineComment, "skipMultiLineComment");
var RegexState;
(function(RegexState2) {
  RegexState2[RegexState2["Empty"] = 0] = "Empty";
  RegexState2[RegexState2["Escape"] = 1] = "Escape";
  RegexState2[RegexState2["Class"] = 2] = "Class";
})(RegexState || (RegexState = {}));
var RegexFlags;
(function(RegexFlags2) {
  RegexFlags2[RegexFlags2["Empty"] = 0] = "Empty";
  RegexFlags2[RegexFlags2["IgnoreCase"] = 1] = "IgnoreCase";
  RegexFlags2[RegexFlags2["Global"] = 2] = "Global";
  RegexFlags2[RegexFlags2["Multiline"] = 4] = "Multiline";
  RegexFlags2[RegexFlags2["Unicode"] = 16] = "Unicode";
  RegexFlags2[RegexFlags2["Sticky"] = 8] = "Sticky";
  RegexFlags2[RegexFlags2["DotAll"] = 32] = "DotAll";
  RegexFlags2[RegexFlags2["Indices"] = 64] = "Indices";
  RegexFlags2[RegexFlags2["UnicodeSets"] = 128] = "UnicodeSets";
})(RegexFlags || (RegexFlags = {}));
function scanRegularExpression(parser) {
  const bodyStart = parser.index;
  let preparseState = RegexState.Empty;
  loop: while (true) {
    const ch = parser.currentChar;
    advanceChar(parser);
    if (preparseState & RegexState.Escape) {
      preparseState &= ~RegexState.Escape;
    } else {
      switch (ch) {
        case 47:
          if (!preparseState)
            break loop;
          else
            break;
        case 92:
          preparseState |= RegexState.Escape;
          break;
        case 91:
          preparseState |= RegexState.Class;
          break;
        case 93:
          preparseState &= RegexState.Escape;
          break;
      }
    }
    if (ch === 13 || ch === 10 || ch === 8232 || ch === 8233) {
      parser.report(34);
    }
    if (parser.index >= parser.source.length) {
      return parser.report(34);
    }
  }
  const bodyEnd = parser.index - 1;
  let mask = RegexFlags.Empty;
  let char = parser.currentChar;
  const { index: flagStart } = parser;
  while (isIdentifierPart(char)) {
    switch (char) {
      case 103:
        if (mask & RegexFlags.Global)
          parser.report(36, "g");
        mask |= RegexFlags.Global;
        break;
      case 105:
        if (mask & RegexFlags.IgnoreCase)
          parser.report(36, "i");
        mask |= RegexFlags.IgnoreCase;
        break;
      case 109:
        if (mask & RegexFlags.Multiline)
          parser.report(36, "m");
        mask |= RegexFlags.Multiline;
        break;
      case 117:
        if (mask & RegexFlags.Unicode)
          parser.report(36, "u");
        if (mask & RegexFlags.UnicodeSets)
          parser.report(36, "vu");
        mask |= RegexFlags.Unicode;
        break;
      case 118:
        if (mask & RegexFlags.Unicode)
          parser.report(36, "uv");
        if (mask & RegexFlags.UnicodeSets)
          parser.report(36, "v");
        mask |= RegexFlags.UnicodeSets;
        break;
      case 121:
        if (mask & RegexFlags.Sticky)
          parser.report(36, "y");
        mask |= RegexFlags.Sticky;
        break;
      case 115:
        if (mask & RegexFlags.DotAll)
          parser.report(36, "s");
        mask |= RegexFlags.DotAll;
        break;
      case 100:
        if (mask & RegexFlags.Indices)
          parser.report(36, "d");
        mask |= RegexFlags.Indices;
        break;
      default:
        parser.report(35);
    }
    char = advanceChar(parser);
  }
  const flags = parser.source.slice(flagStart, parser.index);
  const pattern = parser.source.slice(bodyStart, bodyEnd);
  parser.tokenRegExp = { pattern, flags };
  if (parser.options.raw)
    parser.tokenRaw = parser.source.slice(parser.tokenIndex, parser.index);
  parser.tokenValue = validate(parser, pattern, flags);
  return 65540;
}
__name(scanRegularExpression, "scanRegularExpression");
function validate(parser, pattern, flags) {
  try {
    return new RegExp(pattern, flags);
  } catch {
    try {
      new RegExp(pattern, flags);
      return null;
    } catch {
      parser.report(34);
    }
  }
}
__name(validate, "validate");
function scanString(parser, context, quote) {
  const { index: start } = parser;
  let ret = "";
  let char = advanceChar(parser);
  let marker = parser.index;
  while ((CharTypes[char] & 8) === 0) {
    if (char === quote) {
      ret += parser.source.slice(marker, parser.index);
      advanceChar(parser);
      if (parser.options.raw)
        parser.tokenRaw = parser.source.slice(start, parser.index);
      parser.tokenValue = ret;
      return 134283267;
    }
    if ((char & 8) === 8 && char === 92) {
      ret += parser.source.slice(marker, parser.index);
      char = advanceChar(parser);
      if (char < 127 || char === 8232 || char === 8233) {
        const code = parseEscape(parser, context, char);
        if (code >= 0)
          ret += String.fromCodePoint(code);
        else
          handleStringError(parser, code, 0);
      } else {
        ret += String.fromCodePoint(char);
      }
      marker = parser.index + 1;
    } else if (char === 8232 || char === 8233) {
      parser.column = -1;
      parser.line++;
    }
    if (parser.index >= parser.end)
      parser.report(16);
    char = advanceChar(parser);
  }
  parser.report(16);
}
__name(scanString, "scanString");
function parseEscape(parser, context, first, isTemplate = 0) {
  switch (first) {
    case 98:
      return 8;
    case 102:
      return 12;
    case 114:
      return 13;
    case 110:
      return 10;
    case 116:
      return 9;
    case 118:
      return 11;
    case 13: {
      if (parser.index < parser.end) {
        const nextChar = parser.source.charCodeAt(parser.index + 1);
        if (nextChar === 10) {
          parser.index = parser.index + 1;
          parser.currentChar = nextChar;
        }
      }
    }
    case 10:
    case 8232:
    case 8233:
      parser.column = -1;
      parser.line++;
      return -1;
    case 48:
    case 49:
    case 50:
    case 51: {
      let code = first - 48;
      let index = parser.index + 1;
      let column = parser.column + 1;
      if (index < parser.end) {
        const next = parser.source.charCodeAt(index);
        if ((CharTypes[next] & 32) === 0) {
          if (code !== 0 || CharTypes[next] & 512) {
            if (context & 1 || isTemplate)
              return -2;
            parser.flags |= 64;
          }
        } else if (context & 1 || isTemplate) {
          return -2;
        } else {
          parser.currentChar = next;
          code = code << 3 | next - 48;
          index++;
          column++;
          if (index < parser.end) {
            const next2 = parser.source.charCodeAt(index);
            if (CharTypes[next2] & 32) {
              parser.currentChar = next2;
              code = code << 3 | next2 - 48;
              index++;
              column++;
            }
          }
          parser.flags |= 64;
        }
        parser.index = index - 1;
        parser.column = column - 1;
      }
      return code;
    }
    case 52:
    case 53:
    case 54:
    case 55: {
      if (isTemplate || context & 1)
        return -2;
      let code = first - 48;
      const index = parser.index + 1;
      const column = parser.column + 1;
      if (index < parser.end) {
        const next = parser.source.charCodeAt(index);
        if (CharTypes[next] & 32) {
          code = code << 3 | next - 48;
          parser.currentChar = next;
          parser.index = index;
          parser.column = column;
        }
      }
      parser.flags |= 64;
      return code;
    }
    case 120: {
      const ch1 = advanceChar(parser);
      if ((CharTypes[ch1] & 64) === 0)
        return -4;
      const hi = toHex(ch1);
      const ch2 = advanceChar(parser);
      if ((CharTypes[ch2] & 64) === 0)
        return -4;
      const lo = toHex(ch2);
      return hi << 4 | lo;
    }
    case 117: {
      const ch = advanceChar(parser);
      if (parser.currentChar === 123) {
        let code = 0;
        while ((CharTypes[advanceChar(parser)] & 64) !== 0) {
          code = code << 4 | toHex(parser.currentChar);
          if (code > 1114111)
            return -5;
        }
        if (parser.currentChar < 1 || parser.currentChar !== 125) {
          return -4;
        }
        return code;
      } else {
        if ((CharTypes[ch] & 64) === 0)
          return -4;
        const ch2 = parser.source.charCodeAt(parser.index + 1);
        if ((CharTypes[ch2] & 64) === 0)
          return -4;
        const ch3 = parser.source.charCodeAt(parser.index + 2);
        if ((CharTypes[ch3] & 64) === 0)
          return -4;
        const ch4 = parser.source.charCodeAt(parser.index + 3);
        if ((CharTypes[ch4] & 64) === 0)
          return -4;
        parser.index += 3;
        parser.column += 3;
        parser.currentChar = parser.source.charCodeAt(parser.index);
        return toHex(ch) << 12 | toHex(ch2) << 8 | toHex(ch3) << 4 | toHex(ch4);
      }
    }
    case 56:
    case 57:
      if (isTemplate || !parser.options.webcompat || context & 1)
        return -3;
      parser.flags |= 4096;
    default:
      return first;
  }
}
__name(parseEscape, "parseEscape");
function handleStringError(parser, code, isTemplate) {
  switch (code) {
    case -1:
      return;
    case -2:
      parser.report(isTemplate ? 2 : 1);
    case -3:
      parser.report(isTemplate ? 3 : 14);
    case -4:
      parser.report(7);
    case -5:
      parser.report(104);
  }
}
__name(handleStringError, "handleStringError");
function scanTemplate(parser, context) {
  const { index: start } = parser;
  let token = 67174409;
  let ret = "";
  let char = advanceChar(parser);
  while (char !== 96) {
    if (char === 36 && parser.source.charCodeAt(parser.index + 1) === 123) {
      advanceChar(parser);
      token = 67174408;
      break;
    } else if (char === 92) {
      char = advanceChar(parser);
      if (char > 126) {
        ret += String.fromCodePoint(char);
      } else {
        const { index, line, column } = parser;
        const code = parseEscape(parser, context | 1, char, 1);
        if (code >= 0) {
          ret += String.fromCodePoint(code);
        } else if (code !== -1 && context & 64) {
          parser.index = index;
          parser.line = line;
          parser.column = column;
          ret = null;
          char = scanBadTemplate(parser, char);
          if (char < 0)
            token = 67174408;
          break;
        } else {
          handleStringError(parser, code, 1);
        }
      }
    } else if (parser.index < parser.end) {
      if (char === 13 && parser.source.charCodeAt(parser.index) === 10) {
        ret += String.fromCodePoint(char);
        parser.currentChar = parser.source.charCodeAt(++parser.index);
      }
      if ((char & 83) < 3 && char === 10 || (char ^ 8232) <= 1) {
        parser.column = -1;
        parser.line++;
      }
      ret += String.fromCodePoint(char);
    }
    if (parser.index >= parser.end)
      parser.report(17);
    char = advanceChar(parser);
  }
  advanceChar(parser);
  parser.tokenValue = ret;
  parser.tokenRaw = parser.source.slice(start + 1, parser.index - (token === 67174409 ? 1 : 2));
  return token;
}
__name(scanTemplate, "scanTemplate");
function scanBadTemplate(parser, ch) {
  while (ch !== 96) {
    switch (ch) {
      case 36: {
        const index = parser.index + 1;
        if (index < parser.end && parser.source.charCodeAt(index) === 123) {
          parser.index = index;
          parser.column++;
          return -ch;
        }
        break;
      }
      case 10:
      case 8232:
      case 8233:
        parser.column = -1;
        parser.line++;
    }
    if (parser.index >= parser.end)
      parser.report(17);
    ch = advanceChar(parser);
  }
  return ch;
}
__name(scanBadTemplate, "scanBadTemplate");
function scanTemplateTail(parser, context) {
  if (parser.index >= parser.end)
    parser.report(0);
  parser.index--;
  parser.column--;
  return scanTemplate(parser, context);
}
__name(scanTemplateTail, "scanTemplateTail");
var errorMessages = {
  [0]: "Unexpected token",
  [30]: "Unexpected token: '%0'",
  [1]: "Octal escape sequences are not allowed in strict mode",
  [2]: "Octal escape sequences are not allowed in template strings",
  [3]: "\\8 and \\9 are not allowed in template strings",
  [4]: "Private identifier #%0 is not defined",
  [5]: "Illegal Unicode escape sequence",
  [6]: "Invalid code point %0",
  [7]: "Invalid hexadecimal escape sequence",
  [9]: "Octal literals are not allowed in strict mode",
  [8]: "Decimal integer literals with a leading zero are forbidden in strict mode",
  [10]: "Expected number in radix %0",
  [151]: "Invalid left-hand side assignment to a destructible right-hand side",
  [11]: "Non-number found after exponent indicator",
  [12]: "Invalid BigIntLiteral",
  [13]: "No identifiers allowed directly after numeric literal",
  [14]: "Escapes \\8 or \\9 are not syntactically valid escapes",
  [15]: "Escapes \\8 or \\9 are not allowed in strict mode",
  [16]: "Unterminated string literal",
  [17]: "Unterminated template literal",
  [18]: "Multiline comment was not closed properly",
  [19]: "The identifier contained dynamic unicode escape that was not closed",
  [20]: "Illegal character '%0'",
  [21]: "Missing hexadecimal digits",
  [22]: "Invalid implicit octal",
  [23]: "Invalid line break in string literal",
  [24]: "Only unicode escapes are legal in identifier names",
  [25]: "Expected '%0'",
  [26]: "Invalid left-hand side in assignment",
  [27]: "Invalid left-hand side in async arrow",
  [28]: 'Calls to super must be in the "constructor" method of a class expression or class declaration that has a superclass',
  [29]: "Member access on super must be in a method",
  [31]: "Await expression not allowed in formal parameter",
  [32]: "Yield expression not allowed in formal parameter",
  [95]: "Unexpected token: 'escaped keyword'",
  [33]: "Unary expressions as the left operand of an exponentiation expression must be disambiguated with parentheses",
  [123]: "Async functions can only be declared at the top level or inside a block",
  [34]: "Unterminated regular expression",
  [35]: "Unexpected regular expression flag",
  [36]: "Duplicate regular expression flag '%0'",
  [37]: "%0 functions must have exactly %1 argument%2",
  [38]: "Setter function argument must not be a rest parameter",
  [39]: "%0 declaration must have a name in this context",
  [40]: "Function name may not contain any reserved words or be eval or arguments in strict mode",
  [41]: "The rest operator is missing an argument",
  [42]: "A getter cannot be a generator",
  [43]: "A setter cannot be a generator",
  [44]: "A computed property name must be followed by a colon or paren",
  [134]: "Object literal keys that are strings or numbers must be a method or have a colon",
  [46]: "Found `* async x(){}` but this should be `async * x(){}`",
  [45]: "Getters and setters can not be generators",
  [47]: "'%0' can not be generator method",
  [48]: "No line break is allowed after '=>'",
  [49]: "The left-hand side of the arrow can only be destructed through assignment",
  [50]: "The binding declaration is not destructible",
  [51]: "Async arrow can not be followed by new expression",
  [52]: "Classes may not have a static property named 'prototype'",
  [53]: "Class constructor may not be a %0",
  [54]: "Duplicate constructor method in class",
  [55]: "Invalid increment/decrement operand",
  [56]: "Invalid use of `new` keyword on an increment/decrement expression",
  [57]: "`=>` is an invalid assignment target",
  [58]: "Rest element may not have a trailing comma",
  [59]: "Missing initializer in %0 declaration",
  [60]: "'for-%0' loop head declarations can not have an initializer",
  [61]: "Invalid left-hand side in for-%0 loop: Must have a single binding",
  [62]: "Invalid shorthand property initializer",
  [63]: "Property name __proto__ appears more than once in object literal",
  [64]: "Let is disallowed as a lexically bound name",
  [65]: "Invalid use of '%0' inside new expression",
  [66]: "Illegal 'use strict' directive in function with non-simple parameter list",
  [67]: 'Identifier "let" disallowed as left-hand side expression in strict mode',
  [68]: "Illegal continue statement",
  [69]: "Illegal break statement",
  [70]: "Cannot have `let[...]` as a var name in strict mode",
  [71]: "Invalid destructuring assignment target",
  [72]: "Rest parameter may not have a default initializer",
  [73]: "The rest argument must the be last parameter",
  [74]: "Invalid rest argument",
  [76]: "In strict mode code, functions can only be declared at top level or inside a block",
  [77]: "In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement",
  [78]: "Without web compatibility enabled functions can not be declared at top level, inside a block, or as the body of an if statement",
  [79]: "Class declaration can't appear in single-statement context",
  [80]: "Invalid left-hand side in for-%0",
  [81]: "Invalid assignment in for-%0",
  [82]: "for await (... of ...) is only valid in async functions and async generators",
  [83]: "The first token after the template expression should be a continuation of the template",
  [85]: "`let` declaration not allowed here and `let` cannot be a regular var name in strict mode",
  [84]: "`let \n [` is a restricted production at the start of a statement",
  [86]: "Catch clause requires exactly one parameter, not more (and no trailing comma)",
  [87]: "Catch clause parameter does not support default values",
  [88]: "Missing catch or finally after try",
  [89]: "More than one default clause in switch statement",
  [90]: "Illegal newline after throw",
  [91]: "Strict mode code may not include a with statement",
  [92]: "Illegal return statement",
  [93]: "The left hand side of the for-header binding declaration is not destructible",
  [94]: "new.target only allowed within functions or static blocks",
  [96]: "'#' not followed by identifier",
  [102]: "Invalid keyword",
  [101]: "Can not use 'let' as a class name",
  [100]: "'A lexical declaration can't define a 'let' binding",
  [99]: "Can not use `let` as variable name in strict mode",
  [97]: "'%0' may not be used as an identifier in this context",
  [98]: "Await is only valid in async functions",
  [103]: "The %0 keyword can only be used with the module goal",
  [104]: "Unicode codepoint must not be greater than 0x10FFFF",
  [105]: "%0 source must be string",
  [106]: "Only a identifier or string can be used to indicate alias",
  [107]: "Only '*' or '{...}' can be imported after default",
  [108]: "Trailing decorator may be followed by method",
  [109]: "Decorators can't be used with a constructor",
  [110]: "Can not use `await` as identifier in module or async func",
  [111]: "Can not use `await` as identifier in module",
  [112]: "HTML comments are only allowed with web compatibility (Annex B)",
  [113]: "The identifier 'let' must not be in expression position in strict mode",
  [114]: "Cannot assign to `eval` and `arguments` in strict mode",
  [115]: "The left-hand side of a for-of loop may not start with 'let'",
  [116]: "Block body arrows can not be immediately invoked without a group",
  [117]: "Block body arrows can not be immediately accessed without a group",
  [118]: "Unexpected strict mode reserved word",
  [119]: "Unexpected eval or arguments in strict mode",
  [120]: "Decorators must not be followed by a semicolon",
  [121]: "Calling delete on expression not allowed in strict mode",
  [122]: "Pattern can not have a tail",
  [124]: "Can not have a `yield` expression on the left side of a ternary",
  [125]: "An arrow function can not have a postfix update operator",
  [126]: "Invalid object literal key character after generator star",
  [127]: "Private fields can not be deleted",
  [129]: "Classes may not have a field called constructor",
  [128]: "Classes may not have a private element named constructor",
  [130]: "A class field initializer or static block may not contain arguments",
  [131]: "Generators can only be declared at the top level or inside a block",
  [132]: "Async methods are a restricted production and cannot have a newline following it",
  [133]: "Unexpected character after object literal property name",
  [135]: "Invalid key token",
  [136]: "Label '%0' has already been declared",
  [137]: "continue statement must be nested within an iteration statement",
  [138]: "Undefined label '%0'",
  [139]: "Trailing comma is disallowed inside import(...) arguments",
  [140]: "Invalid binding in JSON import",
  [141]: "import() requires exactly one argument",
  [142]: "Cannot use new with import(...)",
  [143]: "... is not allowed in import()",
  [144]: "Expected '=>'",
  [145]: "Duplicate binding '%0'",
  [146]: "Duplicate private identifier #%0",
  [147]: "Cannot export a duplicate name '%0'",
  [150]: "Duplicate %0 for-binding",
  [148]: "Exported binding '%0' needs to refer to a top-level declared variable",
  [149]: "Unexpected private field",
  [153]: "Numeric separators are not allowed at the end of numeric literals",
  [152]: "Only one underscore is allowed as numeric separator",
  [154]: "JSX value should be either an expression or a quoted JSX text",
  [155]: "Expected corresponding JSX closing tag for %0",
  [156]: "Adjacent JSX elements must be wrapped in an enclosing tag",
  [157]: "JSX attributes must only be assigned a non-empty 'expression'",
  [158]: "'%0' has already been declared",
  [159]: "'%0' shadowed a catch clause binding",
  [160]: "Dot property must be an identifier",
  [161]: "Encountered invalid input after spread/rest argument",
  [162]: "Catch without try",
  [163]: "Finally without try",
  [164]: "Expected corresponding closing tag for JSX fragment",
  [165]: "Coalescing and logical operators used together in the same expression must be disambiguated with parentheses",
  [166]: "Invalid tagged template on optional chain",
  [167]: "Invalid optional chain from super property",
  [168]: "Invalid optional chain from new expression",
  [169]: 'Cannot use "import.meta" outside a module',
  [170]: "Leading decorators must be attached to a class declaration",
  [171]: "An export name cannot include a lone surrogate, found %0",
  [172]: "A string literal cannot be used as an exported binding without `from`",
  [173]: "Private fields can't be accessed on super",
  [174]: "The only valid meta property for import is 'import.meta'",
  [175]: "'import.meta' must not contain escaped characters",
  [176]: 'cannot use "await" as identifier inside an async function',
  [177]: 'cannot use "await" in static blocks'
};
var _ParseError = class _ParseError extends SyntaxError {
  constructor(start, end, type, ...params) {
    const description = errorMessages[type].replace(/%(\d+)/g, (_, i) => params[i]);
    const message = "[" + start.line + ":" + start.column + "-" + end.line + ":" + end.column + "]: " + description;
    super(message);
    __publicField(this, "start");
    __publicField(this, "end");
    __publicField(this, "range");
    __publicField(this, "loc");
    __publicField(this, "description");
    this.start = start.index;
    this.end = end.index;
    this.range = [start.index, end.index];
    this.loc = {
      start: { line: start.line, column: start.column },
      end: { line: end.line, column: end.column }
    };
    this.description = description;
  }
};
__name(_ParseError, "ParseError");
var ParseError = _ParseError;
function scanNumber(parser, context, kind) {
  let char = parser.currentChar;
  let value = 0;
  let digit = 9;
  let atStart = kind & 64 ? 0 : 1;
  let digits = 0;
  let allowSeparator = 0;
  if (kind & 64) {
    value = "." + scanDecimalDigitsOrSeparator(parser, char);
    char = parser.currentChar;
    if (char === 110)
      parser.report(12);
  } else {
    if (char === 48) {
      char = advanceChar(parser);
      if ((char | 32) === 120) {
        kind = 8 | 128;
        char = advanceChar(parser);
        while (CharTypes[char] & (64 | 4096)) {
          if (char === 95) {
            if (!allowSeparator)
              parser.report(152);
            allowSeparator = 0;
            char = advanceChar(parser);
            continue;
          }
          allowSeparator = 1;
          value = value * 16 + toHex(char);
          digits++;
          char = advanceChar(parser);
        }
        if (digits === 0 || !allowSeparator) {
          parser.report(digits === 0 ? 21 : 153);
        }
      } else if ((char | 32) === 111) {
        kind = 4 | 128;
        char = advanceChar(parser);
        while (CharTypes[char] & (32 | 4096)) {
          if (char === 95) {
            if (!allowSeparator) {
              parser.report(152);
            }
            allowSeparator = 0;
            char = advanceChar(parser);
            continue;
          }
          allowSeparator = 1;
          value = value * 8 + (char - 48);
          digits++;
          char = advanceChar(parser);
        }
        if (digits === 0 || !allowSeparator) {
          parser.report(digits === 0 ? 0 : 153);
        }
      } else if ((char | 32) === 98) {
        kind = 2 | 128;
        char = advanceChar(parser);
        while (CharTypes[char] & (128 | 4096)) {
          if (char === 95) {
            if (!allowSeparator) {
              parser.report(152);
            }
            allowSeparator = 0;
            char = advanceChar(parser);
            continue;
          }
          allowSeparator = 1;
          value = value * 2 + (char - 48);
          digits++;
          char = advanceChar(parser);
        }
        if (digits === 0 || !allowSeparator) {
          parser.report(digits === 0 ? 0 : 153);
        }
      } else if (CharTypes[char] & 32) {
        if (context & 1)
          parser.report(1);
        kind = 1;
        while (CharTypes[char] & 16) {
          if (CharTypes[char] & 512) {
            kind = 32;
            atStart = 0;
            break;
          }
          value = value * 8 + (char - 48);
          char = advanceChar(parser);
        }
      } else if (CharTypes[char] & 512) {
        if (context & 1)
          parser.report(1);
        parser.flags |= 64;
        kind = 32;
      } else if (char === 95) {
        parser.report(0);
      }
    }
    if (kind & 48) {
      if (atStart) {
        while (digit >= 0 && CharTypes[char] & (16 | 4096)) {
          if (char === 95) {
            char = advanceChar(parser);
            if (char === 95 || kind & 32) {
              throw new ParseError(parser.currentLocation, { index: parser.index + 1, line: parser.line, column: parser.column }, 152);
            }
            allowSeparator = 1;
            continue;
          }
          allowSeparator = 0;
          value = 10 * value + (char - 48);
          char = advanceChar(parser);
          --digit;
        }
        if (allowSeparator) {
          throw new ParseError(parser.currentLocation, { index: parser.index + 1, line: parser.line, column: parser.column }, 153);
        }
        if (digit >= 0 && !isIdentifierStart(char) && char !== 46) {
          parser.tokenValue = value;
          if (parser.options.raw)
            parser.tokenRaw = parser.source.slice(parser.tokenIndex, parser.index);
          return 134283266;
        }
      }
      value += scanDecimalDigitsOrSeparator(parser, char);
      char = parser.currentChar;
      if (char === 46) {
        if (advanceChar(parser) === 95)
          parser.report(0);
        kind = 64;
        value += "." + scanDecimalDigitsOrSeparator(parser, parser.currentChar);
        char = parser.currentChar;
      }
    }
  }
  const end = parser.index;
  let isBigInt = 0;
  if (char === 110 && kind & 128) {
    isBigInt = 1;
    char = advanceChar(parser);
  } else {
    if ((char | 32) === 101) {
      char = advanceChar(parser);
      if (CharTypes[char] & 256)
        char = advanceChar(parser);
      const { index } = parser;
      if ((CharTypes[char] & 16) === 0)
        parser.report(11);
      value += parser.source.substring(end, index) + scanDecimalDigitsOrSeparator(parser, char);
      char = parser.currentChar;
    }
  }
  if (parser.index < parser.end && CharTypes[char] & 16 || isIdentifierStart(char)) {
    parser.report(13);
  }
  if (isBigInt) {
    parser.tokenRaw = parser.source.slice(parser.tokenIndex, parser.index);
    parser.tokenValue = BigInt(parser.tokenRaw.slice(0, -1).replaceAll("_", ""));
    return 134283388;
  }
  parser.tokenValue = kind & (1 | 2 | 8 | 4) ? value : kind & 32 ? parseFloat(parser.source.substring(parser.tokenIndex, parser.index)) : +value;
  if (parser.options.raw)
    parser.tokenRaw = parser.source.slice(parser.tokenIndex, parser.index);
  return 134283266;
}
__name(scanNumber, "scanNumber");
function scanDecimalDigitsOrSeparator(parser, char) {
  let allowSeparator = 0;
  let start = parser.index;
  let ret = "";
  while (CharTypes[char] & (16 | 4096)) {
    if (char === 95) {
      const { index } = parser;
      char = advanceChar(parser);
      if (char === 95) {
        throw new ParseError(parser.currentLocation, { index: parser.index + 1, line: parser.line, column: parser.column }, 152);
      }
      allowSeparator = 1;
      ret += parser.source.substring(start, index);
      start = parser.index;
      continue;
    }
    allowSeparator = 0;
    char = advanceChar(parser);
  }
  if (allowSeparator) {
    throw new ParseError(parser.currentLocation, { index: parser.index + 1, line: parser.line, column: parser.column }, 153);
  }
  return ret + parser.source.substring(start, parser.index);
}
__name(scanDecimalDigitsOrSeparator, "scanDecimalDigitsOrSeparator");
var KeywordDescTable = [
  "end of source",
  "identifier",
  "number",
  "string",
  "regular expression",
  "false",
  "true",
  "null",
  "template continuation",
  "template tail",
  "=>",
  "(",
  "{",
  ".",
  "...",
  "}",
  ")",
  ";",
  ",",
  "[",
  "]",
  ":",
  "?",
  "'",
  '"',
  "++",
  "--",
  "=",
  "<<=",
  ">>=",
  ">>>=",
  "**=",
  "+=",
  "-=",
  "*=",
  "/=",
  "%=",
  "^=",
  "|=",
  "&=",
  "||=",
  "&&=",
  "??=",
  "typeof",
  "delete",
  "void",
  "!",
  "~",
  "+",
  "-",
  "in",
  "instanceof",
  "*",
  "%",
  "/",
  "**",
  "&&",
  "||",
  "===",
  "!==",
  "==",
  "!=",
  "<=",
  ">=",
  "<",
  ">",
  "<<",
  ">>",
  ">>>",
  "&",
  "|",
  "^",
  "var",
  "let",
  "const",
  "break",
  "case",
  "catch",
  "class",
  "continue",
  "debugger",
  "default",
  "do",
  "else",
  "export",
  "extends",
  "finally",
  "for",
  "function",
  "if",
  "import",
  "new",
  "return",
  "super",
  "switch",
  "this",
  "throw",
  "try",
  "while",
  "with",
  "implements",
  "interface",
  "package",
  "private",
  "protected",
  "public",
  "static",
  "yield",
  "as",
  "async",
  "await",
  "constructor",
  "get",
  "set",
  "accessor",
  "from",
  "of",
  "enum",
  "eval",
  "arguments",
  "escaped keyword",
  "escaped future reserved keyword",
  "reserved if strict",
  "#",
  "BigIntLiteral",
  "??",
  "?.",
  "WhiteSpace",
  "Illegal",
  "LineTerminator",
  "PrivateField",
  "Template",
  "@",
  "target",
  "meta",
  "LineFeed",
  "Escaped",
  "JSXText"
];
var descKeywordTable = {
  this: 86111,
  function: 86104,
  if: 20569,
  return: 20572,
  var: 86088,
  else: 20563,
  for: 20567,
  new: 86107,
  in: 8673330,
  typeof: 16863275,
  while: 20578,
  case: 20556,
  break: 20555,
  try: 20577,
  catch: 20557,
  delete: 16863276,
  throw: 86112,
  switch: 86110,
  continue: 20559,
  default: 20561,
  instanceof: 8411187,
  do: 20562,
  void: 16863277,
  finally: 20566,
  async: 209005,
  await: 209006,
  class: 86094,
  const: 86090,
  constructor: 12399,
  debugger: 20560,
  export: 20564,
  extends: 20565,
  false: 86021,
  from: 209011,
  get: 209008,
  implements: 36964,
  import: 86106,
  interface: 36965,
  let: 241737,
  null: 86023,
  of: 471156,
  package: 36966,
  private: 36967,
  protected: 36968,
  public: 36969,
  set: 209009,
  static: 36970,
  super: 86109,
  true: 86022,
  with: 20579,
  yield: 241771,
  enum: 86133,
  eval: 537079926,
  as: 77932,
  arguments: 537079927,
  target: 209029,
  meta: 209030,
  accessor: 12402
};
function matchOrInsertSemicolon(parser, context) {
  if ((parser.flags & 1) === 0 && (parser.getToken() & 1048576) !== 1048576) {
    parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  }
  if (!consumeOpt(parser, context, 1074790417)) {
    parser.options.onInsertedSemicolon?.(parser.startIndex);
  }
}
__name(matchOrInsertSemicolon, "matchOrInsertSemicolon");
function isValidStrictMode(parser, index, tokenIndex, tokenValue) {
  if (index - tokenIndex < 13 && tokenValue === "use strict") {
    if ((parser.getToken() & 1048576) === 1048576 || parser.flags & 1) {
      return 1;
    }
  }
  return 0;
}
__name(isValidStrictMode, "isValidStrictMode");
function optionalBit(parser, context, t) {
  if (parser.getToken() !== t)
    return 0;
  nextToken(parser, context);
  return 1;
}
__name(optionalBit, "optionalBit");
function consumeOpt(parser, context, t) {
  if (parser.getToken() !== t)
    return false;
  nextToken(parser, context);
  return true;
}
__name(consumeOpt, "consumeOpt");
function consume(parser, context, t) {
  if (parser.getToken() !== t)
    parser.report(25, KeywordDescTable[t & 255]);
  nextToken(parser, context);
}
__name(consume, "consume");
function reinterpretToPattern(parser, node) {
  switch (node.type) {
    case "ArrayExpression": {
      node.type = "ArrayPattern";
      const { elements } = node;
      for (let i = 0, n = elements.length; i < n; ++i) {
        const element = elements[i];
        if (element)
          reinterpretToPattern(parser, element);
      }
      return;
    }
    case "ObjectExpression": {
      node.type = "ObjectPattern";
      const { properties } = node;
      for (let i = 0, n = properties.length; i < n; ++i) {
        reinterpretToPattern(parser, properties[i]);
      }
      return;
    }
    case "AssignmentExpression":
      node.type = "AssignmentPattern";
      if (node.operator !== "=")
        parser.report(71);
      delete node.operator;
      reinterpretToPattern(parser, node.left);
      return;
    case "Property":
      reinterpretToPattern(parser, node.value);
      return;
    case "SpreadElement":
      node.type = "RestElement";
      reinterpretToPattern(parser, node.argument);
  }
}
__name(reinterpretToPattern, "reinterpretToPattern");
function validateBindingIdentifier(parser, context, kind, t, skipEvalArgCheck) {
  if (context & 1) {
    if ((t & 36864) === 36864) {
      parser.report(118);
    }
    if (!skipEvalArgCheck && (t & 537079808) === 537079808) {
      parser.report(119);
    }
  }
  if ((t & 20480) === 20480 || t === -2147483528) {
    parser.report(102);
  }
  if (kind & (8 | 16) && (t & 255) === (241737 & 255)) {
    parser.report(100);
  }
  if (context & (2048 | 2) && t === 209006) {
    parser.report(110);
  }
  if (context & (1024 | 1) && t === 241771) {
    parser.report(97, "yield");
  }
}
__name(validateBindingIdentifier, "validateBindingIdentifier");
function validateFunctionName(parser, context, t) {
  if (context & 1) {
    if ((t & 36864) === 36864) {
      parser.report(118);
    }
    if ((t & 537079808) === 537079808) {
      parser.report(119);
    }
    if (t === -2147483527) {
      parser.report(95);
    }
    if (t === -2147483528) {
      parser.report(95);
    }
  }
  if ((t & 20480) === 20480) {
    parser.report(102);
  }
  if (context & (2048 | 2) && t === 209006) {
    parser.report(110);
  }
  if (context & (1024 | 1) && t === 241771) {
    parser.report(97, "yield");
  }
}
__name(validateFunctionName, "validateFunctionName");
function isStrictReservedWord(parser, context, t) {
  if (t === 209006) {
    if (context & (2048 | 2))
      parser.report(110);
    parser.destructible |= 128;
  }
  if (t === 241771 && context & 1024)
    parser.report(97, "yield");
  return (t & 20480) === 20480 || (t & 36864) === 36864 || t == -2147483527;
}
__name(isStrictReservedWord, "isStrictReservedWord");
function isPropertyWithPrivateFieldKey(expr) {
  return !expr.property ? false : expr.property.type === "PrivateIdentifier";
}
__name(isPropertyWithPrivateFieldKey, "isPropertyWithPrivateFieldKey");
function isValidLabel(parser, labels, name, isIterationStatement) {
  while (labels) {
    if (labels["$" + name]) {
      if (isIterationStatement)
        parser.report(137);
      return 1;
    }
    if (isIterationStatement && labels.loop)
      isIterationStatement = 0;
    labels = labels["$"];
  }
  return 0;
}
__name(isValidLabel, "isValidLabel");
function validateAndDeclareLabel(parser, labels, name) {
  let set = labels;
  while (set) {
    if (set["$" + name])
      parser.report(136, name);
    set = set["$"];
  }
  labels["$" + name] = 1;
}
__name(validateAndDeclareLabel, "validateAndDeclareLabel");
function isEqualTagName(elementName) {
  switch (elementName.type) {
    case "JSXIdentifier":
      return elementName.name;
    case "JSXNamespacedName":
      return elementName.namespace + ":" + elementName.name;
    case "JSXMemberExpression":
      return isEqualTagName(elementName.object) + "." + isEqualTagName(elementName.property);
  }
}
__name(isEqualTagName, "isEqualTagName");
function isValidIdentifier(context, t) {
  if (context & (1 | 1024)) {
    if (context & 2 && t === 209006)
      return false;
    if (context & 1024 && t === 241771)
      return false;
    return (t & 12288) === 12288;
  }
  return (t & 12288) === 12288 || (t & 36864) === 36864;
}
__name(isValidIdentifier, "isValidIdentifier");
function classifyIdentifier(parser, context, t) {
  if ((t & 537079808) === 537079808) {
    if (context & 1)
      parser.report(119);
    parser.flags |= 512;
  }
  if (!isValidIdentifier(context, t))
    parser.report(0);
}
__name(classifyIdentifier, "classifyIdentifier");
function getOwnProperty(object, key) {
  return Object.hasOwn(object, key) ? object[key] : void 0;
}
__name(getOwnProperty, "getOwnProperty");
function scanIdentifier(parser, context, isValidAsKeyword) {
  while (isIdPart[advanceChar(parser)])
    ;
  parser.tokenValue = parser.source.slice(parser.tokenIndex, parser.index);
  return parser.currentChar !== 92 && parser.currentChar <= 126 ? getOwnProperty(descKeywordTable, parser.tokenValue) ?? 208897 : scanIdentifierSlowCase(parser, context, 0, isValidAsKeyword);
}
__name(scanIdentifier, "scanIdentifier");
function scanUnicodeIdentifier(parser, context) {
  const cookedChar = scanIdentifierUnicodeEscape(parser);
  if (!isIdentifierStart(cookedChar))
    parser.report(5);
  parser.tokenValue = String.fromCodePoint(cookedChar);
  return scanIdentifierSlowCase(parser, context, 1, CharTypes[cookedChar] & 4);
}
__name(scanUnicodeIdentifier, "scanUnicodeIdentifier");
function scanIdentifierSlowCase(parser, context, hasEscape, isValidAsKeyword) {
  let start = parser.index;
  while (parser.index < parser.end) {
    if (parser.currentChar === 92) {
      parser.tokenValue += parser.source.slice(start, parser.index);
      hasEscape = 1;
      const code = scanIdentifierUnicodeEscape(parser);
      if (!isIdentifierPart(code))
        parser.report(5);
      isValidAsKeyword = isValidAsKeyword && CharTypes[code] & 4;
      parser.tokenValue += String.fromCodePoint(code);
      start = parser.index;
    } else {
      const merged = consumePossibleSurrogatePair(parser);
      if (merged > 0) {
        if (!isIdentifierPart(merged)) {
          parser.report(20, String.fromCodePoint(merged));
        }
        parser.currentChar = merged;
        parser.index++;
        parser.column++;
      } else if (!isIdentifierPart(parser.currentChar)) {
        break;
      }
      advanceChar(parser);
    }
  }
  if (parser.index <= parser.end) {
    parser.tokenValue += parser.source.slice(start, parser.index);
  }
  const { length } = parser.tokenValue;
  if (isValidAsKeyword && length >= 2 && length <= 11) {
    const token = getOwnProperty(descKeywordTable, parser.tokenValue);
    if (token === void 0)
      return 208897 | (hasEscape ? -2147483648 : 0);
    if (!hasEscape)
      return token;
    if (token === 209006) {
      if ((context & (2 | 2048)) === 0) {
        return token | -2147483648;
      }
      return -2147483528;
    }
    if (context & 1) {
      if (token === 36970) {
        return -2147483527;
      }
      if ((token & 36864) === 36864) {
        return -2147483527;
      }
      if ((token & 20480) === 20480) {
        if (context & 262144 && (context & 8) === 0) {
          return token | -2147483648;
        } else {
          return -2147483528;
        }
      }
      return 209018 | -2147483648;
    }
    if (context & 262144 && (context & 8) === 0 && (token & 20480) === 20480) {
      return token | -2147483648;
    }
    if (token === 241771) {
      return context & 262144 ? 209018 | -2147483648 : context & 1024 ? -2147483528 : token | -2147483648;
    }
    if (token === 209005) {
      return 209018 | -2147483648;
    }
    if ((token & 36864) === 36864) {
      return token | 12288 | -2147483648;
    }
    return -2147483528;
  }
  return 208897 | (hasEscape ? -2147483648 : 0);
}
__name(scanIdentifierSlowCase, "scanIdentifierSlowCase");
function scanPrivateIdentifier(parser) {
  let char = advanceChar(parser);
  if (char === 92)
    return 130;
  const merged = consumePossibleSurrogatePair(parser);
  if (merged)
    char = merged;
  if (!isIdentifierStart(char))
    parser.report(96);
  return 130;
}
__name(scanPrivateIdentifier, "scanPrivateIdentifier");
function scanIdentifierUnicodeEscape(parser) {
  if (parser.source.charCodeAt(parser.index + 1) !== 117) {
    parser.report(5);
  }
  parser.currentChar = parser.source.charCodeAt(parser.index += 2);
  parser.column += 2;
  return scanUnicodeEscape(parser);
}
__name(scanIdentifierUnicodeEscape, "scanIdentifierUnicodeEscape");
function scanUnicodeEscape(parser) {
  let codePoint = 0;
  const char = parser.currentChar;
  if (char === 123) {
    const begin = parser.index - 2;
    while (CharTypes[advanceChar(parser)] & 64) {
      codePoint = codePoint << 4 | toHex(parser.currentChar);
      if (codePoint > 1114111)
        throw new ParseError({ index: begin, line: parser.line, column: parser.column }, parser.currentLocation, 104);
    }
    if (parser.currentChar !== 125) {
      throw new ParseError({ index: begin, line: parser.line, column: parser.column }, parser.currentLocation, 7);
    }
    advanceChar(parser);
    return codePoint;
  }
  if ((CharTypes[char] & 64) === 0)
    parser.report(7);
  const char2 = parser.source.charCodeAt(parser.index + 1);
  if ((CharTypes[char2] & 64) === 0)
    parser.report(7);
  const char3 = parser.source.charCodeAt(parser.index + 2);
  if ((CharTypes[char3] & 64) === 0)
    parser.report(7);
  const char4 = parser.source.charCodeAt(parser.index + 3);
  if ((CharTypes[char4] & 64) === 0)
    parser.report(7);
  codePoint = toHex(char) << 12 | toHex(char2) << 8 | toHex(char3) << 4 | toHex(char4);
  parser.currentChar = parser.source.charCodeAt(parser.index += 4);
  parser.column += 4;
  return codePoint;
}
__name(scanUnicodeEscape, "scanUnicodeEscape");
var TokenLookup = [
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  127,
  135,
  127,
  127,
  129,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  128,
  127,
  16842798,
  134283267,
  130,
  208897,
  8391477,
  8390213,
  134283267,
  67174411,
  16,
  8391476,
  25233968,
  18,
  25233969,
  67108877,
  8457014,
  134283266,
  134283266,
  134283266,
  134283266,
  134283266,
  134283266,
  134283266,
  134283266,
  134283266,
  134283266,
  21,
  1074790417,
  8456256,
  1077936155,
  8390721,
  22,
  132,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  208897,
  69271571,
  136,
  20,
  8389959,
  208897,
  131,
  4096,
  4096,
  4096,
  4096,
  4096,
  4096,
  4096,
  208897,
  4096,
  208897,
  208897,
  4096,
  208897,
  4096,
  208897,
  4096,
  208897,
  4096,
  4096,
  4096,
  208897,
  4096,
  4096,
  208897,
  4096,
  4096,
  2162700,
  8389702,
  1074790415,
  16842799,
  128
];
function nextToken(parser, context) {
  parser.flags = (parser.flags | 1) ^ 1;
  parser.startIndex = parser.index;
  parser.startColumn = parser.column;
  parser.startLine = parser.line;
  parser.setToken(scanSingleToken(parser, context, 0));
}
__name(nextToken, "nextToken");
function scanSingleToken(parser, context, state) {
  const isStartOfLine = parser.index === 0;
  const { source } = parser;
  let start = parser.currentLocation;
  while (parser.index < parser.end) {
    parser.tokenIndex = parser.index;
    parser.tokenColumn = parser.column;
    parser.tokenLine = parser.line;
    let char = parser.currentChar;
    if (char <= 126) {
      const token = TokenLookup[char];
      switch (token) {
        case 67174411:
        case 16:
        case 2162700:
        case 1074790415:
        case 69271571:
        case 20:
        case 21:
        case 1074790417:
        case 18:
        case 16842799:
        case 132:
        case 128:
          advanceChar(parser);
          return token;
        case 208897:
          return scanIdentifier(parser, context, 0);
        case 4096:
          return scanIdentifier(parser, context, 1);
        case 134283266:
          return scanNumber(parser, context, 16 | 128);
        case 134283267:
          return scanString(parser, context, char);
        case 131:
          return scanTemplate(parser, context);
        case 136:
          return scanUnicodeIdentifier(parser, context);
        case 130:
          return scanPrivateIdentifier(parser);
        case 127:
          advanceChar(parser);
          break;
        case 129:
          state |= 1 | 4;
          scanNewLine(parser);
          break;
        case 135:
          consumeLineFeed(parser, state);
          state = state & -5 | 1;
          break;
        case 8456256: {
          const ch = advanceChar(parser);
          if (parser.index < parser.end) {
            if (ch === 60) {
              if (parser.index < parser.end && advanceChar(parser) === 61) {
                advanceChar(parser);
                return 4194332;
              }
              return 8390978;
            } else if (ch === 61) {
              advanceChar(parser);
              return 8390718;
            }
            if (ch === 33) {
              const index = parser.index + 1;
              if (index + 1 < parser.end && source.charCodeAt(index) === 45 && source.charCodeAt(index + 1) == 45) {
                parser.column += 3;
                parser.currentChar = source.charCodeAt(parser.index += 3);
                state = skipSingleHTMLComment(parser, source, state, context, 2, parser.tokenStart);
                start = parser.tokenStart;
                continue;
              }
              return 8456256;
            }
          }
          return 8456256;
        }
        case 1077936155: {
          advanceChar(parser);
          const ch = parser.currentChar;
          if (ch === 61) {
            if (advanceChar(parser) === 61) {
              advanceChar(parser);
              return 8390458;
            }
            return 8390460;
          }
          if (ch === 62) {
            advanceChar(parser);
            return 10;
          }
          return 1077936155;
        }
        case 16842798:
          if (advanceChar(parser) !== 61) {
            return 16842798;
          }
          if (advanceChar(parser) !== 61) {
            return 8390461;
          }
          advanceChar(parser);
          return 8390459;
        case 8391477:
          if (advanceChar(parser) !== 61)
            return 8391477;
          advanceChar(parser);
          return 4194340;
        case 8391476: {
          advanceChar(parser);
          if (parser.index >= parser.end)
            return 8391476;
          const ch = parser.currentChar;
          if (ch === 61) {
            advanceChar(parser);
            return 4194338;
          }
          if (ch !== 42)
            return 8391476;
          if (advanceChar(parser) !== 61)
            return 8391735;
          advanceChar(parser);
          return 4194335;
        }
        case 8389959:
          if (advanceChar(parser) !== 61)
            return 8389959;
          advanceChar(parser);
          return 4194341;
        case 25233968: {
          advanceChar(parser);
          const ch = parser.currentChar;
          if (ch === 43) {
            advanceChar(parser);
            return 33619993;
          }
          if (ch === 61) {
            advanceChar(parser);
            return 4194336;
          }
          return 25233968;
        }
        case 25233969: {
          advanceChar(parser);
          const ch = parser.currentChar;
          if (ch === 45) {
            advanceChar(parser);
            if ((state & 1 || isStartOfLine) && parser.currentChar === 62) {
              if (!parser.options.webcompat)
                parser.report(112);
              advanceChar(parser);
              state = skipSingleHTMLComment(parser, source, state, context, 3, start);
              start = parser.tokenStart;
              continue;
            }
            return 33619994;
          }
          if (ch === 61) {
            advanceChar(parser);
            return 4194337;
          }
          return 25233969;
        }
        case 8457014: {
          advanceChar(parser);
          if (parser.index < parser.end) {
            const ch = parser.currentChar;
            if (ch === 47) {
              advanceChar(parser);
              state = skipSingleLineComment(parser, source, state, 0, parser.tokenStart);
              start = parser.tokenStart;
              continue;
            }
            if (ch === 42) {
              advanceChar(parser);
              state = skipMultiLineComment(parser, source, state);
              start = parser.tokenStart;
              continue;
            }
            if (context & 32) {
              return scanRegularExpression(parser);
            }
            if (ch === 61) {
              advanceChar(parser);
              return 4259875;
            }
          }
          return 8457014;
        }
        case 67108877: {
          const next = advanceChar(parser);
          if (next >= 48 && next <= 57)
            return scanNumber(parser, context, 64 | 16);
          if (next === 46) {
            const index = parser.index + 1;
            if (index < parser.end && source.charCodeAt(index) === 46) {
              parser.column += 2;
              parser.currentChar = source.charCodeAt(parser.index += 2);
              return 14;
            }
          }
          return 67108877;
        }
        case 8389702: {
          advanceChar(parser);
          const ch = parser.currentChar;
          if (ch === 124) {
            advanceChar(parser);
            if (parser.currentChar === 61) {
              advanceChar(parser);
              return 4194344;
            }
            return 8913465;
          }
          if (ch === 61) {
            advanceChar(parser);
            return 4194342;
          }
          return 8389702;
        }
        case 8390721: {
          advanceChar(parser);
          const ch = parser.currentChar;
          if (ch === 61) {
            advanceChar(parser);
            return 8390719;
          }
          if (ch !== 62)
            return 8390721;
          advanceChar(parser);
          if (parser.index < parser.end) {
            const ch2 = parser.currentChar;
            if (ch2 === 62) {
              if (advanceChar(parser) === 61) {
                advanceChar(parser);
                return 4194334;
              }
              return 8390980;
            }
            if (ch2 === 61) {
              advanceChar(parser);
              return 4194333;
            }
          }
          return 8390979;
        }
        case 8390213: {
          advanceChar(parser);
          const ch = parser.currentChar;
          if (ch === 38) {
            advanceChar(parser);
            if (parser.currentChar === 61) {
              advanceChar(parser);
              return 4194345;
            }
            return 8913720;
          }
          if (ch === 61) {
            advanceChar(parser);
            return 4194343;
          }
          return 8390213;
        }
        case 22: {
          let ch = advanceChar(parser);
          if (ch === 63) {
            advanceChar(parser);
            if (parser.currentChar === 61) {
              advanceChar(parser);
              return 4194346;
            }
            return 276824445;
          }
          if (ch === 46) {
            const index = parser.index + 1;
            if (index < parser.end) {
              ch = source.charCodeAt(index);
              if (!(ch >= 48 && ch <= 57)) {
                advanceChar(parser);
                return 67108990;
              }
            }
          }
          return 22;
        }
      }
    } else {
      if ((char ^ 8232) <= 1) {
        state = state & -5 | 1;
        scanNewLine(parser);
        continue;
      }
      const merged = consumePossibleSurrogatePair(parser);
      if (merged > 0)
        char = merged;
      if (isIDStart(char)) {
        parser.tokenValue = "";
        return scanIdentifierSlowCase(parser, context, 0, 0);
      }
      if (isExoticECMAScriptWhitespace(char)) {
        advanceChar(parser);
        continue;
      }
      parser.report(20, String.fromCodePoint(char));
    }
  }
  return 1048576;
}
__name(scanSingleToken, "scanSingleToken");
var entities = {
  AElig: "\xC6",
  AMP: "&",
  Aacute: "\xC1",
  Abreve: "\u0102",
  Acirc: "\xC2",
  Acy: "\u0410",
  Afr: "\u{1D504}",
  Agrave: "\xC0",
  Alpha: "\u0391",
  Amacr: "\u0100",
  And: "\u2A53",
  Aogon: "\u0104",
  Aopf: "\u{1D538}",
  ApplyFunction: "\u2061",
  Aring: "\xC5",
  Ascr: "\u{1D49C}",
  Assign: "\u2254",
  Atilde: "\xC3",
  Auml: "\xC4",
  Backslash: "\u2216",
  Barv: "\u2AE7",
  Barwed: "\u2306",
  Bcy: "\u0411",
  Because: "\u2235",
  Bernoullis: "\u212C",
  Beta: "\u0392",
  Bfr: "\u{1D505}",
  Bopf: "\u{1D539}",
  Breve: "\u02D8",
  Bscr: "\u212C",
  Bumpeq: "\u224E",
  CHcy: "\u0427",
  COPY: "\xA9",
  Cacute: "\u0106",
  Cap: "\u22D2",
  CapitalDifferentialD: "\u2145",
  Cayleys: "\u212D",
  Ccaron: "\u010C",
  Ccedil: "\xC7",
  Ccirc: "\u0108",
  Cconint: "\u2230",
  Cdot: "\u010A",
  Cedilla: "\xB8",
  CenterDot: "\xB7",
  Cfr: "\u212D",
  Chi: "\u03A7",
  CircleDot: "\u2299",
  CircleMinus: "\u2296",
  CirclePlus: "\u2295",
  CircleTimes: "\u2297",
  ClockwiseContourIntegral: "\u2232",
  CloseCurlyDoubleQuote: "\u201D",
  CloseCurlyQuote: "\u2019",
  Colon: "\u2237",
  Colone: "\u2A74",
  Congruent: "\u2261",
  Conint: "\u222F",
  ContourIntegral: "\u222E",
  Copf: "\u2102",
  Coproduct: "\u2210",
  CounterClockwiseContourIntegral: "\u2233",
  Cross: "\u2A2F",
  Cscr: "\u{1D49E}",
  Cup: "\u22D3",
  CupCap: "\u224D",
  DD: "\u2145",
  DDotrahd: "\u2911",
  DJcy: "\u0402",
  DScy: "\u0405",
  DZcy: "\u040F",
  Dagger: "\u2021",
  Darr: "\u21A1",
  Dashv: "\u2AE4",
  Dcaron: "\u010E",
  Dcy: "\u0414",
  Del: "\u2207",
  Delta: "\u0394",
  Dfr: "\u{1D507}",
  DiacriticalAcute: "\xB4",
  DiacriticalDot: "\u02D9",
  DiacriticalDoubleAcute: "\u02DD",
  DiacriticalGrave: "`",
  DiacriticalTilde: "\u02DC",
  Diamond: "\u22C4",
  DifferentialD: "\u2146",
  Dopf: "\u{1D53B}",
  Dot: "\xA8",
  DotDot: "\u20DC",
  DotEqual: "\u2250",
  DoubleContourIntegral: "\u222F",
  DoubleDot: "\xA8",
  DoubleDownArrow: "\u21D3",
  DoubleLeftArrow: "\u21D0",
  DoubleLeftRightArrow: "\u21D4",
  DoubleLeftTee: "\u2AE4",
  DoubleLongLeftArrow: "\u27F8",
  DoubleLongLeftRightArrow: "\u27FA",
  DoubleLongRightArrow: "\u27F9",
  DoubleRightArrow: "\u21D2",
  DoubleRightTee: "\u22A8",
  DoubleUpArrow: "\u21D1",
  DoubleUpDownArrow: "\u21D5",
  DoubleVerticalBar: "\u2225",
  DownArrow: "\u2193",
  DownArrowBar: "\u2913",
  DownArrowUpArrow: "\u21F5",
  DownBreve: "\u0311",
  DownLeftRightVector: "\u2950",
  DownLeftTeeVector: "\u295E",
  DownLeftVector: "\u21BD",
  DownLeftVectorBar: "\u2956",
  DownRightTeeVector: "\u295F",
  DownRightVector: "\u21C1",
  DownRightVectorBar: "\u2957",
  DownTee: "\u22A4",
  DownTeeArrow: "\u21A7",
  Downarrow: "\u21D3",
  Dscr: "\u{1D49F}",
  Dstrok: "\u0110",
  ENG: "\u014A",
  ETH: "\xD0",
  Eacute: "\xC9",
  Ecaron: "\u011A",
  Ecirc: "\xCA",
  Ecy: "\u042D",
  Edot: "\u0116",
  Efr: "\u{1D508}",
  Egrave: "\xC8",
  Element: "\u2208",
  Emacr: "\u0112",
  EmptySmallSquare: "\u25FB",
  EmptyVerySmallSquare: "\u25AB",
  Eogon: "\u0118",
  Eopf: "\u{1D53C}",
  Epsilon: "\u0395",
  Equal: "\u2A75",
  EqualTilde: "\u2242",
  Equilibrium: "\u21CC",
  Escr: "\u2130",
  Esim: "\u2A73",
  Eta: "\u0397",
  Euml: "\xCB",
  Exists: "\u2203",
  ExponentialE: "\u2147",
  Fcy: "\u0424",
  Ffr: "\u{1D509}",
  FilledSmallSquare: "\u25FC",
  FilledVerySmallSquare: "\u25AA",
  Fopf: "\u{1D53D}",
  ForAll: "\u2200",
  Fouriertrf: "\u2131",
  Fscr: "\u2131",
  GJcy: "\u0403",
  GT: ">",
  Gamma: "\u0393",
  Gammad: "\u03DC",
  Gbreve: "\u011E",
  Gcedil: "\u0122",
  Gcirc: "\u011C",
  Gcy: "\u0413",
  Gdot: "\u0120",
  Gfr: "\u{1D50A}",
  Gg: "\u22D9",
  Gopf: "\u{1D53E}",
  GreaterEqual: "\u2265",
  GreaterEqualLess: "\u22DB",
  GreaterFullEqual: "\u2267",
  GreaterGreater: "\u2AA2",
  GreaterLess: "\u2277",
  GreaterSlantEqual: "\u2A7E",
  GreaterTilde: "\u2273",
  Gscr: "\u{1D4A2}",
  Gt: "\u226B",
  HARDcy: "\u042A",
  Hacek: "\u02C7",
  Hat: "^",
  Hcirc: "\u0124",
  Hfr: "\u210C",
  HilbertSpace: "\u210B",
  Hopf: "\u210D",
  HorizontalLine: "\u2500",
  Hscr: "\u210B",
  Hstrok: "\u0126",
  HumpDownHump: "\u224E",
  HumpEqual: "\u224F",
  IEcy: "\u0415",
  IJlig: "\u0132",
  IOcy: "\u0401",
  Iacute: "\xCD",
  Icirc: "\xCE",
  Icy: "\u0418",
  Idot: "\u0130",
  Ifr: "\u2111",
  Igrave: "\xCC",
  Im: "\u2111",
  Imacr: "\u012A",
  ImaginaryI: "\u2148",
  Implies: "\u21D2",
  Int: "\u222C",
  Integral: "\u222B",
  Intersection: "\u22C2",
  InvisibleComma: "\u2063",
  InvisibleTimes: "\u2062",
  Iogon: "\u012E",
  Iopf: "\u{1D540}",
  Iota: "\u0399",
  Iscr: "\u2110",
  Itilde: "\u0128",
  Iukcy: "\u0406",
  Iuml: "\xCF",
  Jcirc: "\u0134",
  Jcy: "\u0419",
  Jfr: "\u{1D50D}",
  Jopf: "\u{1D541}",
  Jscr: "\u{1D4A5}",
  Jsercy: "\u0408",
  Jukcy: "\u0404",
  KHcy: "\u0425",
  KJcy: "\u040C",
  Kappa: "\u039A",
  Kcedil: "\u0136",
  Kcy: "\u041A",
  Kfr: "\u{1D50E}",
  Kopf: "\u{1D542}",
  Kscr: "\u{1D4A6}",
  LJcy: "\u0409",
  LT: "<",
  Lacute: "\u0139",
  Lambda: "\u039B",
  Lang: "\u27EA",
  Laplacetrf: "\u2112",
  Larr: "\u219E",
  Lcaron: "\u013D",
  Lcedil: "\u013B",
  Lcy: "\u041B",
  LeftAngleBracket: "\u27E8",
  LeftArrow: "\u2190",
  LeftArrowBar: "\u21E4",
  LeftArrowRightArrow: "\u21C6",
  LeftCeiling: "\u2308",
  LeftDoubleBracket: "\u27E6",
  LeftDownTeeVector: "\u2961",
  LeftDownVector: "\u21C3",
  LeftDownVectorBar: "\u2959",
  LeftFloor: "\u230A",
  LeftRightArrow: "\u2194",
  LeftRightVector: "\u294E",
  LeftTee: "\u22A3",
  LeftTeeArrow: "\u21A4",
  LeftTeeVector: "\u295A",
  LeftTriangle: "\u22B2",
  LeftTriangleBar: "\u29CF",
  LeftTriangleEqual: "\u22B4",
  LeftUpDownVector: "\u2951",
  LeftUpTeeVector: "\u2960",
  LeftUpVector: "\u21BF",
  LeftUpVectorBar: "\u2958",
  LeftVector: "\u21BC",
  LeftVectorBar: "\u2952",
  Leftarrow: "\u21D0",
  Leftrightarrow: "\u21D4",
  LessEqualGreater: "\u22DA",
  LessFullEqual: "\u2266",
  LessGreater: "\u2276",
  LessLess: "\u2AA1",
  LessSlantEqual: "\u2A7D",
  LessTilde: "\u2272",
  Lfr: "\u{1D50F}",
  Ll: "\u22D8",
  Lleftarrow: "\u21DA",
  Lmidot: "\u013F",
  LongLeftArrow: "\u27F5",
  LongLeftRightArrow: "\u27F7",
  LongRightArrow: "\u27F6",
  Longleftarrow: "\u27F8",
  Longleftrightarrow: "\u27FA",
  Longrightarrow: "\u27F9",
  Lopf: "\u{1D543}",
  LowerLeftArrow: "\u2199",
  LowerRightArrow: "\u2198",
  Lscr: "\u2112",
  Lsh: "\u21B0",
  Lstrok: "\u0141",
  Lt: "\u226A",
  Map: "\u2905",
  Mcy: "\u041C",
  MediumSpace: "\u205F",
  Mellintrf: "\u2133",
  Mfr: "\u{1D510}",
  MinusPlus: "\u2213",
  Mopf: "\u{1D544}",
  Mscr: "\u2133",
  Mu: "\u039C",
  NJcy: "\u040A",
  Nacute: "\u0143",
  Ncaron: "\u0147",
  Ncedil: "\u0145",
  Ncy: "\u041D",
  NegativeMediumSpace: "\u200B",
  NegativeThickSpace: "\u200B",
  NegativeThinSpace: "\u200B",
  NegativeVeryThinSpace: "\u200B",
  NestedGreaterGreater: "\u226B",
  NestedLessLess: "\u226A",
  NewLine: "\n",
  Nfr: "\u{1D511}",
  NoBreak: "\u2060",
  NonBreakingSpace: "\xA0",
  Nopf: "\u2115",
  Not: "\u2AEC",
  NotCongruent: "\u2262",
  NotCupCap: "\u226D",
  NotDoubleVerticalBar: "\u2226",
  NotElement: "\u2209",
  NotEqual: "\u2260",
  NotEqualTilde: "\u2242\u0338",
  NotExists: "\u2204",
  NotGreater: "\u226F",
  NotGreaterEqual: "\u2271",
  NotGreaterFullEqual: "\u2267\u0338",
  NotGreaterGreater: "\u226B\u0338",
  NotGreaterLess: "\u2279",
  NotGreaterSlantEqual: "\u2A7E\u0338",
  NotGreaterTilde: "\u2275",
  NotHumpDownHump: "\u224E\u0338",
  NotHumpEqual: "\u224F\u0338",
  NotLeftTriangle: "\u22EA",
  NotLeftTriangleBar: "\u29CF\u0338",
  NotLeftTriangleEqual: "\u22EC",
  NotLess: "\u226E",
  NotLessEqual: "\u2270",
  NotLessGreater: "\u2278",
  NotLessLess: "\u226A\u0338",
  NotLessSlantEqual: "\u2A7D\u0338",
  NotLessTilde: "\u2274",
  NotNestedGreaterGreater: "\u2AA2\u0338",
  NotNestedLessLess: "\u2AA1\u0338",
  NotPrecedes: "\u2280",
  NotPrecedesEqual: "\u2AAF\u0338",
  NotPrecedesSlantEqual: "\u22E0",
  NotReverseElement: "\u220C",
  NotRightTriangle: "\u22EB",
  NotRightTriangleBar: "\u29D0\u0338",
  NotRightTriangleEqual: "\u22ED",
  NotSquareSubset: "\u228F\u0338",
  NotSquareSubsetEqual: "\u22E2",
  NotSquareSuperset: "\u2290\u0338",
  NotSquareSupersetEqual: "\u22E3",
  NotSubset: "\u2282\u20D2",
  NotSubsetEqual: "\u2288",
  NotSucceeds: "\u2281",
  NotSucceedsEqual: "\u2AB0\u0338",
  NotSucceedsSlantEqual: "\u22E1",
  NotSucceedsTilde: "\u227F\u0338",
  NotSuperset: "\u2283\u20D2",
  NotSupersetEqual: "\u2289",
  NotTilde: "\u2241",
  NotTildeEqual: "\u2244",
  NotTildeFullEqual: "\u2247",
  NotTildeTilde: "\u2249",
  NotVerticalBar: "\u2224",
  Nscr: "\u{1D4A9}",
  Ntilde: "\xD1",
  Nu: "\u039D",
  OElig: "\u0152",
  Oacute: "\xD3",
  Ocirc: "\xD4",
  Ocy: "\u041E",
  Odblac: "\u0150",
  Ofr: "\u{1D512}",
  Ograve: "\xD2",
  Omacr: "\u014C",
  Omega: "\u03A9",
  Omicron: "\u039F",
  Oopf: "\u{1D546}",
  OpenCurlyDoubleQuote: "\u201C",
  OpenCurlyQuote: "\u2018",
  Or: "\u2A54",
  Oscr: "\u{1D4AA}",
  Oslash: "\xD8",
  Otilde: "\xD5",
  Otimes: "\u2A37",
  Ouml: "\xD6",
  OverBar: "\u203E",
  OverBrace: "\u23DE",
  OverBracket: "\u23B4",
  OverParenthesis: "\u23DC",
  PartialD: "\u2202",
  Pcy: "\u041F",
  Pfr: "\u{1D513}",
  Phi: "\u03A6",
  Pi: "\u03A0",
  PlusMinus: "\xB1",
  Poincareplane: "\u210C",
  Popf: "\u2119",
  Pr: "\u2ABB",
  Precedes: "\u227A",
  PrecedesEqual: "\u2AAF",
  PrecedesSlantEqual: "\u227C",
  PrecedesTilde: "\u227E",
  Prime: "\u2033",
  Product: "\u220F",
  Proportion: "\u2237",
  Proportional: "\u221D",
  Pscr: "\u{1D4AB}",
  Psi: "\u03A8",
  QUOT: '"',
  Qfr: "\u{1D514}",
  Qopf: "\u211A",
  Qscr: "\u{1D4AC}",
  RBarr: "\u2910",
  REG: "\xAE",
  Racute: "\u0154",
  Rang: "\u27EB",
  Rarr: "\u21A0",
  Rarrtl: "\u2916",
  Rcaron: "\u0158",
  Rcedil: "\u0156",
  Rcy: "\u0420",
  Re: "\u211C",
  ReverseElement: "\u220B",
  ReverseEquilibrium: "\u21CB",
  ReverseUpEquilibrium: "\u296F",
  Rfr: "\u211C",
  Rho: "\u03A1",
  RightAngleBracket: "\u27E9",
  RightArrow: "\u2192",
  RightArrowBar: "\u21E5",
  RightArrowLeftArrow: "\u21C4",
  RightCeiling: "\u2309",
  RightDoubleBracket: "\u27E7",
  RightDownTeeVector: "\u295D",
  RightDownVector: "\u21C2",
  RightDownVectorBar: "\u2955",
  RightFloor: "\u230B",
  RightTee: "\u22A2",
  RightTeeArrow: "\u21A6",
  RightTeeVector: "\u295B",
  RightTriangle: "\u22B3",
  RightTriangleBar: "\u29D0",
  RightTriangleEqual: "\u22B5",
  RightUpDownVector: "\u294F",
  RightUpTeeVector: "\u295C",
  RightUpVector: "\u21BE",
  RightUpVectorBar: "\u2954",
  RightVector: "\u21C0",
  RightVectorBar: "\u2953",
  Rightarrow: "\u21D2",
  Ropf: "\u211D",
  RoundImplies: "\u2970",
  Rrightarrow: "\u21DB",
  Rscr: "\u211B",
  Rsh: "\u21B1",
  RuleDelayed: "\u29F4",
  SHCHcy: "\u0429",
  SHcy: "\u0428",
  SOFTcy: "\u042C",
  Sacute: "\u015A",
  Sc: "\u2ABC",
  Scaron: "\u0160",
  Scedil: "\u015E",
  Scirc: "\u015C",
  Scy: "\u0421",
  Sfr: "\u{1D516}",
  ShortDownArrow: "\u2193",
  ShortLeftArrow: "\u2190",
  ShortRightArrow: "\u2192",
  ShortUpArrow: "\u2191",
  Sigma: "\u03A3",
  SmallCircle: "\u2218",
  Sopf: "\u{1D54A}",
  Sqrt: "\u221A",
  Square: "\u25A1",
  SquareIntersection: "\u2293",
  SquareSubset: "\u228F",
  SquareSubsetEqual: "\u2291",
  SquareSuperset: "\u2290",
  SquareSupersetEqual: "\u2292",
  SquareUnion: "\u2294",
  Sscr: "\u{1D4AE}",
  Star: "\u22C6",
  Sub: "\u22D0",
  Subset: "\u22D0",
  SubsetEqual: "\u2286",
  Succeeds: "\u227B",
  SucceedsEqual: "\u2AB0",
  SucceedsSlantEqual: "\u227D",
  SucceedsTilde: "\u227F",
  SuchThat: "\u220B",
  Sum: "\u2211",
  Sup: "\u22D1",
  Superset: "\u2283",
  SupersetEqual: "\u2287",
  Supset: "\u22D1",
  THORN: "\xDE",
  TRADE: "\u2122",
  TSHcy: "\u040B",
  TScy: "\u0426",
  Tab: "	",
  Tau: "\u03A4",
  Tcaron: "\u0164",
  Tcedil: "\u0162",
  Tcy: "\u0422",
  Tfr: "\u{1D517}",
  Therefore: "\u2234",
  Theta: "\u0398",
  ThickSpace: "\u205F\u200A",
  ThinSpace: "\u2009",
  Tilde: "\u223C",
  TildeEqual: "\u2243",
  TildeFullEqual: "\u2245",
  TildeTilde: "\u2248",
  Topf: "\u{1D54B}",
  TripleDot: "\u20DB",
  Tscr: "\u{1D4AF}",
  Tstrok: "\u0166",
  Uacute: "\xDA",
  Uarr: "\u219F",
  Uarrocir: "\u2949",
  Ubrcy: "\u040E",
  Ubreve: "\u016C",
  Ucirc: "\xDB",
  Ucy: "\u0423",
  Udblac: "\u0170",
  Ufr: "\u{1D518}",
  Ugrave: "\xD9",
  Umacr: "\u016A",
  UnderBar: "_",
  UnderBrace: "\u23DF",
  UnderBracket: "\u23B5",
  UnderParenthesis: "\u23DD",
  Union: "\u22C3",
  UnionPlus: "\u228E",
  Uogon: "\u0172",
  Uopf: "\u{1D54C}",
  UpArrow: "\u2191",
  UpArrowBar: "\u2912",
  UpArrowDownArrow: "\u21C5",
  UpDownArrow: "\u2195",
  UpEquilibrium: "\u296E",
  UpTee: "\u22A5",
  UpTeeArrow: "\u21A5",
  Uparrow: "\u21D1",
  Updownarrow: "\u21D5",
  UpperLeftArrow: "\u2196",
  UpperRightArrow: "\u2197",
  Upsi: "\u03D2",
  Upsilon: "\u03A5",
  Uring: "\u016E",
  Uscr: "\u{1D4B0}",
  Utilde: "\u0168",
  Uuml: "\xDC",
  VDash: "\u22AB",
  Vbar: "\u2AEB",
  Vcy: "\u0412",
  Vdash: "\u22A9",
  Vdashl: "\u2AE6",
  Vee: "\u22C1",
  Verbar: "\u2016",
  Vert: "\u2016",
  VerticalBar: "\u2223",
  VerticalLine: "|",
  VerticalSeparator: "\u2758",
  VerticalTilde: "\u2240",
  VeryThinSpace: "\u200A",
  Vfr: "\u{1D519}",
  Vopf: "\u{1D54D}",
  Vscr: "\u{1D4B1}",
  Vvdash: "\u22AA",
  Wcirc: "\u0174",
  Wedge: "\u22C0",
  Wfr: "\u{1D51A}",
  Wopf: "\u{1D54E}",
  Wscr: "\u{1D4B2}",
  Xfr: "\u{1D51B}",
  Xi: "\u039E",
  Xopf: "\u{1D54F}",
  Xscr: "\u{1D4B3}",
  YAcy: "\u042F",
  YIcy: "\u0407",
  YUcy: "\u042E",
  Yacute: "\xDD",
  Ycirc: "\u0176",
  Ycy: "\u042B",
  Yfr: "\u{1D51C}",
  Yopf: "\u{1D550}",
  Yscr: "\u{1D4B4}",
  Yuml: "\u0178",
  ZHcy: "\u0416",
  Zacute: "\u0179",
  Zcaron: "\u017D",
  Zcy: "\u0417",
  Zdot: "\u017B",
  ZeroWidthSpace: "\u200B",
  Zeta: "\u0396",
  Zfr: "\u2128",
  Zopf: "\u2124",
  Zscr: "\u{1D4B5}",
  aacute: "\xE1",
  abreve: "\u0103",
  ac: "\u223E",
  acE: "\u223E\u0333",
  acd: "\u223F",
  acirc: "\xE2",
  acute: "\xB4",
  acy: "\u0430",
  aelig: "\xE6",
  af: "\u2061",
  afr: "\u{1D51E}",
  agrave: "\xE0",
  alefsym: "\u2135",
  aleph: "\u2135",
  alpha: "\u03B1",
  amacr: "\u0101",
  amalg: "\u2A3F",
  amp: "&",
  and: "\u2227",
  andand: "\u2A55",
  andd: "\u2A5C",
  andslope: "\u2A58",
  andv: "\u2A5A",
  ang: "\u2220",
  ange: "\u29A4",
  angle: "\u2220",
  angmsd: "\u2221",
  angmsdaa: "\u29A8",
  angmsdab: "\u29A9",
  angmsdac: "\u29AA",
  angmsdad: "\u29AB",
  angmsdae: "\u29AC",
  angmsdaf: "\u29AD",
  angmsdag: "\u29AE",
  angmsdah: "\u29AF",
  angrt: "\u221F",
  angrtvb: "\u22BE",
  angrtvbd: "\u299D",
  angsph: "\u2222",
  angst: "\xC5",
  angzarr: "\u237C",
  aogon: "\u0105",
  aopf: "\u{1D552}",
  ap: "\u2248",
  apE: "\u2A70",
  apacir: "\u2A6F",
  ape: "\u224A",
  apid: "\u224B",
  apos: "'",
  approx: "\u2248",
  approxeq: "\u224A",
  aring: "\xE5",
  ascr: "\u{1D4B6}",
  ast: "*",
  asymp: "\u2248",
  asympeq: "\u224D",
  atilde: "\xE3",
  auml: "\xE4",
  awconint: "\u2233",
  awint: "\u2A11",
  bNot: "\u2AED",
  backcong: "\u224C",
  backepsilon: "\u03F6",
  backprime: "\u2035",
  backsim: "\u223D",
  backsimeq: "\u22CD",
  barvee: "\u22BD",
  barwed: "\u2305",
  barwedge: "\u2305",
  bbrk: "\u23B5",
  bbrktbrk: "\u23B6",
  bcong: "\u224C",
  bcy: "\u0431",
  bdquo: "\u201E",
  becaus: "\u2235",
  because: "\u2235",
  bemptyv: "\u29B0",
  bepsi: "\u03F6",
  bernou: "\u212C",
  beta: "\u03B2",
  beth: "\u2136",
  between: "\u226C",
  bfr: "\u{1D51F}",
  bigcap: "\u22C2",
  bigcirc: "\u25EF",
  bigcup: "\u22C3",
  bigodot: "\u2A00",
  bigoplus: "\u2A01",
  bigotimes: "\u2A02",
  bigsqcup: "\u2A06",
  bigstar: "\u2605",
  bigtriangledown: "\u25BD",
  bigtriangleup: "\u25B3",
  biguplus: "\u2A04",
  bigvee: "\u22C1",
  bigwedge: "\u22C0",
  bkarow: "\u290D",
  blacklozenge: "\u29EB",
  blacksquare: "\u25AA",
  blacktriangle: "\u25B4",
  blacktriangledown: "\u25BE",
  blacktriangleleft: "\u25C2",
  blacktriangleright: "\u25B8",
  blank: "\u2423",
  blk12: "\u2592",
  blk14: "\u2591",
  blk34: "\u2593",
  block: "\u2588",
  bne: "=\u20E5",
  bnequiv: "\u2261\u20E5",
  bnot: "\u2310",
  bopf: "\u{1D553}",
  bot: "\u22A5",
  bottom: "\u22A5",
  bowtie: "\u22C8",
  boxDL: "\u2557",
  boxDR: "\u2554",
  boxDl: "\u2556",
  boxDr: "\u2553",
  boxH: "\u2550",
  boxHD: "\u2566",
  boxHU: "\u2569",
  boxHd: "\u2564",
  boxHu: "\u2567",
  boxUL: "\u255D",
  boxUR: "\u255A",
  boxUl: "\u255C",
  boxUr: "\u2559",
  boxV: "\u2551",
  boxVH: "\u256C",
  boxVL: "\u2563",
  boxVR: "\u2560",
  boxVh: "\u256B",
  boxVl: "\u2562",
  boxVr: "\u255F",
  boxbox: "\u29C9",
  boxdL: "\u2555",
  boxdR: "\u2552",
  boxdl: "\u2510",
  boxdr: "\u250C",
  boxh: "\u2500",
  boxhD: "\u2565",
  boxhU: "\u2568",
  boxhd: "\u252C",
  boxhu: "\u2534",
  boxminus: "\u229F",
  boxplus: "\u229E",
  boxtimes: "\u22A0",
  boxuL: "\u255B",
  boxuR: "\u2558",
  boxul: "\u2518",
  boxur: "\u2514",
  boxv: "\u2502",
  boxvH: "\u256A",
  boxvL: "\u2561",
  boxvR: "\u255E",
  boxvh: "\u253C",
  boxvl: "\u2524",
  boxvr: "\u251C",
  bprime: "\u2035",
  breve: "\u02D8",
  brvbar: "\xA6",
  bscr: "\u{1D4B7}",
  bsemi: "\u204F",
  bsim: "\u223D",
  bsime: "\u22CD",
  bsol: "\\",
  bsolb: "\u29C5",
  bsolhsub: "\u27C8",
  bull: "\u2022",
  bullet: "\u2022",
  bump: "\u224E",
  bumpE: "\u2AAE",
  bumpe: "\u224F",
  bumpeq: "\u224F",
  cacute: "\u0107",
  cap: "\u2229",
  capand: "\u2A44",
  capbrcup: "\u2A49",
  capcap: "\u2A4B",
  capcup: "\u2A47",
  capdot: "\u2A40",
  caps: "\u2229\uFE00",
  caret: "\u2041",
  caron: "\u02C7",
  ccaps: "\u2A4D",
  ccaron: "\u010D",
  ccedil: "\xE7",
  ccirc: "\u0109",
  ccups: "\u2A4C",
  ccupssm: "\u2A50",
  cdot: "\u010B",
  cedil: "\xB8",
  cemptyv: "\u29B2",
  cent: "\xA2",
  centerdot: "\xB7",
  cfr: "\u{1D520}",
  chcy: "\u0447",
  check: "\u2713",
  checkmark: "\u2713",
  chi: "\u03C7",
  cir: "\u25CB",
  cirE: "\u29C3",
  circ: "\u02C6",
  circeq: "\u2257",
  circlearrowleft: "\u21BA",
  circlearrowright: "\u21BB",
  circledR: "\xAE",
  circledS: "\u24C8",
  circledast: "\u229B",
  circledcirc: "\u229A",
  circleddash: "\u229D",
  cire: "\u2257",
  cirfnint: "\u2A10",
  cirmid: "\u2AEF",
  cirscir: "\u29C2",
  clubs: "\u2663",
  clubsuit: "\u2663",
  colon: ":",
  colone: "\u2254",
  coloneq: "\u2254",
  comma: ",",
  commat: "@",
  comp: "\u2201",
  compfn: "\u2218",
  complement: "\u2201",
  complexes: "\u2102",
  cong: "\u2245",
  congdot: "\u2A6D",
  conint: "\u222E",
  copf: "\u{1D554}",
  coprod: "\u2210",
  copy: "\xA9",
  copysr: "\u2117",
  crarr: "\u21B5",
  cross: "\u2717",
  cscr: "\u{1D4B8}",
  csub: "\u2ACF",
  csube: "\u2AD1",
  csup: "\u2AD0",
  csupe: "\u2AD2",
  ctdot: "\u22EF",
  cudarrl: "\u2938",
  cudarrr: "\u2935",
  cuepr: "\u22DE",
  cuesc: "\u22DF",
  cularr: "\u21B6",
  cularrp: "\u293D",
  cup: "\u222A",
  cupbrcap: "\u2A48",
  cupcap: "\u2A46",
  cupcup: "\u2A4A",
  cupdot: "\u228D",
  cupor: "\u2A45",
  cups: "\u222A\uFE00",
  curarr: "\u21B7",
  curarrm: "\u293C",
  curlyeqprec: "\u22DE",
  curlyeqsucc: "\u22DF",
  curlyvee: "\u22CE",
  curlywedge: "\u22CF",
  curren: "\xA4",
  curvearrowleft: "\u21B6",
  curvearrowright: "\u21B7",
  cuvee: "\u22CE",
  cuwed: "\u22CF",
  cwconint: "\u2232",
  cwint: "\u2231",
  cylcty: "\u232D",
  dArr: "\u21D3",
  dHar: "\u2965",
  dagger: "\u2020",
  daleth: "\u2138",
  darr: "\u2193",
  dash: "\u2010",
  dashv: "\u22A3",
  dbkarow: "\u290F",
  dblac: "\u02DD",
  dcaron: "\u010F",
  dcy: "\u0434",
  dd: "\u2146",
  ddagger: "\u2021",
  ddarr: "\u21CA",
  ddotseq: "\u2A77",
  deg: "\xB0",
  delta: "\u03B4",
  demptyv: "\u29B1",
  dfisht: "\u297F",
  dfr: "\u{1D521}",
  dharl: "\u21C3",
  dharr: "\u21C2",
  diam: "\u22C4",
  diamond: "\u22C4",
  diamondsuit: "\u2666",
  diams: "\u2666",
  die: "\xA8",
  digamma: "\u03DD",
  disin: "\u22F2",
  div: "\xF7",
  divide: "\xF7",
  divideontimes: "\u22C7",
  divonx: "\u22C7",
  djcy: "\u0452",
  dlcorn: "\u231E",
  dlcrop: "\u230D",
  dollar: "$",
  dopf: "\u{1D555}",
  dot: "\u02D9",
  doteq: "\u2250",
  doteqdot: "\u2251",
  dotminus: "\u2238",
  dotplus: "\u2214",
  dotsquare: "\u22A1",
  doublebarwedge: "\u2306",
  downarrow: "\u2193",
  downdownarrows: "\u21CA",
  downharpoonleft: "\u21C3",
  downharpoonright: "\u21C2",
  drbkarow: "\u2910",
  drcorn: "\u231F",
  drcrop: "\u230C",
  dscr: "\u{1D4B9}",
  dscy: "\u0455",
  dsol: "\u29F6",
  dstrok: "\u0111",
  dtdot: "\u22F1",
  dtri: "\u25BF",
  dtrif: "\u25BE",
  duarr: "\u21F5",
  duhar: "\u296F",
  dwangle: "\u29A6",
  dzcy: "\u045F",
  dzigrarr: "\u27FF",
  eDDot: "\u2A77",
  eDot: "\u2251",
  eacute: "\xE9",
  easter: "\u2A6E",
  ecaron: "\u011B",
  ecir: "\u2256",
  ecirc: "\xEA",
  ecolon: "\u2255",
  ecy: "\u044D",
  edot: "\u0117",
  ee: "\u2147",
  efDot: "\u2252",
  efr: "\u{1D522}",
  eg: "\u2A9A",
  egrave: "\xE8",
  egs: "\u2A96",
  egsdot: "\u2A98",
  el: "\u2A99",
  elinters: "\u23E7",
  ell: "\u2113",
  els: "\u2A95",
  elsdot: "\u2A97",
  emacr: "\u0113",
  empty: "\u2205",
  emptyset: "\u2205",
  emptyv: "\u2205",
  emsp13: "\u2004",
  emsp14: "\u2005",
  emsp: "\u2003",
  eng: "\u014B",
  ensp: "\u2002",
  eogon: "\u0119",
  eopf: "\u{1D556}",
  epar: "\u22D5",
  eparsl: "\u29E3",
  eplus: "\u2A71",
  epsi: "\u03B5",
  epsilon: "\u03B5",
  epsiv: "\u03F5",
  eqcirc: "\u2256",
  eqcolon: "\u2255",
  eqsim: "\u2242",
  eqslantgtr: "\u2A96",
  eqslantless: "\u2A95",
  equals: "=",
  equest: "\u225F",
  equiv: "\u2261",
  equivDD: "\u2A78",
  eqvparsl: "\u29E5",
  erDot: "\u2253",
  erarr: "\u2971",
  escr: "\u212F",
  esdot: "\u2250",
  esim: "\u2242",
  eta: "\u03B7",
  eth: "\xF0",
  euml: "\xEB",
  euro: "\u20AC",
  excl: "!",
  exist: "\u2203",
  expectation: "\u2130",
  exponentiale: "\u2147",
  fallingdotseq: "\u2252",
  fcy: "\u0444",
  female: "\u2640",
  ffilig: "\uFB03",
  fflig: "\uFB00",
  ffllig: "\uFB04",
  ffr: "\u{1D523}",
  filig: "\uFB01",
  fjlig: "fj",
  flat: "\u266D",
  fllig: "\uFB02",
  fltns: "\u25B1",
  fnof: "\u0192",
  fopf: "\u{1D557}",
  forall: "\u2200",
  fork: "\u22D4",
  forkv: "\u2AD9",
  fpartint: "\u2A0D",
  frac12: "\xBD",
  frac13: "\u2153",
  frac14: "\xBC",
  frac15: "\u2155",
  frac16: "\u2159",
  frac18: "\u215B",
  frac23: "\u2154",
  frac25: "\u2156",
  frac34: "\xBE",
  frac35: "\u2157",
  frac38: "\u215C",
  frac45: "\u2158",
  frac56: "\u215A",
  frac58: "\u215D",
  frac78: "\u215E",
  frasl: "\u2044",
  frown: "\u2322",
  fscr: "\u{1D4BB}",
  gE: "\u2267",
  gEl: "\u2A8C",
  gacute: "\u01F5",
  gamma: "\u03B3",
  gammad: "\u03DD",
  gap: "\u2A86",
  gbreve: "\u011F",
  gcirc: "\u011D",
  gcy: "\u0433",
  gdot: "\u0121",
  ge: "\u2265",
  gel: "\u22DB",
  geq: "\u2265",
  geqq: "\u2267",
  geqslant: "\u2A7E",
  ges: "\u2A7E",
  gescc: "\u2AA9",
  gesdot: "\u2A80",
  gesdoto: "\u2A82",
  gesdotol: "\u2A84",
  gesl: "\u22DB\uFE00",
  gesles: "\u2A94",
  gfr: "\u{1D524}",
  gg: "\u226B",
  ggg: "\u22D9",
  gimel: "\u2137",
  gjcy: "\u0453",
  gl: "\u2277",
  glE: "\u2A92",
  gla: "\u2AA5",
  glj: "\u2AA4",
  gnE: "\u2269",
  gnap: "\u2A8A",
  gnapprox: "\u2A8A",
  gne: "\u2A88",
  gneq: "\u2A88",
  gneqq: "\u2269",
  gnsim: "\u22E7",
  gopf: "\u{1D558}",
  grave: "`",
  gscr: "\u210A",
  gsim: "\u2273",
  gsime: "\u2A8E",
  gsiml: "\u2A90",
  gt: ">",
  gtcc: "\u2AA7",
  gtcir: "\u2A7A",
  gtdot: "\u22D7",
  gtlPar: "\u2995",
  gtquest: "\u2A7C",
  gtrapprox: "\u2A86",
  gtrarr: "\u2978",
  gtrdot: "\u22D7",
  gtreqless: "\u22DB",
  gtreqqless: "\u2A8C",
  gtrless: "\u2277",
  gtrsim: "\u2273",
  gvertneqq: "\u2269\uFE00",
  gvnE: "\u2269\uFE00",
  hArr: "\u21D4",
  hairsp: "\u200A",
  half: "\xBD",
  hamilt: "\u210B",
  hardcy: "\u044A",
  harr: "\u2194",
  harrcir: "\u2948",
  harrw: "\u21AD",
  hbar: "\u210F",
  hcirc: "\u0125",
  hearts: "\u2665",
  heartsuit: "\u2665",
  hellip: "\u2026",
  hercon: "\u22B9",
  hfr: "\u{1D525}",
  hksearow: "\u2925",
  hkswarow: "\u2926",
  hoarr: "\u21FF",
  homtht: "\u223B",
  hookleftarrow: "\u21A9",
  hookrightarrow: "\u21AA",
  hopf: "\u{1D559}",
  horbar: "\u2015",
  hscr: "\u{1D4BD}",
  hslash: "\u210F",
  hstrok: "\u0127",
  hybull: "\u2043",
  hyphen: "\u2010",
  iacute: "\xED",
  ic: "\u2063",
  icirc: "\xEE",
  icy: "\u0438",
  iecy: "\u0435",
  iexcl: "\xA1",
  iff: "\u21D4",
  ifr: "\u{1D526}",
  igrave: "\xEC",
  ii: "\u2148",
  iiiint: "\u2A0C",
  iiint: "\u222D",
  iinfin: "\u29DC",
  iiota: "\u2129",
  ijlig: "\u0133",
  imacr: "\u012B",
  image: "\u2111",
  imagline: "\u2110",
  imagpart: "\u2111",
  imath: "\u0131",
  imof: "\u22B7",
  imped: "\u01B5",
  in: "\u2208",
  incare: "\u2105",
  infin: "\u221E",
  infintie: "\u29DD",
  inodot: "\u0131",
  int: "\u222B",
  intcal: "\u22BA",
  integers: "\u2124",
  intercal: "\u22BA",
  intlarhk: "\u2A17",
  intprod: "\u2A3C",
  iocy: "\u0451",
  iogon: "\u012F",
  iopf: "\u{1D55A}",
  iota: "\u03B9",
  iprod: "\u2A3C",
  iquest: "\xBF",
  iscr: "\u{1D4BE}",
  isin: "\u2208",
  isinE: "\u22F9",
  isindot: "\u22F5",
  isins: "\u22F4",
  isinsv: "\u22F3",
  isinv: "\u2208",
  it: "\u2062",
  itilde: "\u0129",
  iukcy: "\u0456",
  iuml: "\xEF",
  jcirc: "\u0135",
  jcy: "\u0439",
  jfr: "\u{1D527}",
  jmath: "\u0237",
  jopf: "\u{1D55B}",
  jscr: "\u{1D4BF}",
  jsercy: "\u0458",
  jukcy: "\u0454",
  kappa: "\u03BA",
  kappav: "\u03F0",
  kcedil: "\u0137",
  kcy: "\u043A",
  kfr: "\u{1D528}",
  kgreen: "\u0138",
  khcy: "\u0445",
  kjcy: "\u045C",
  kopf: "\u{1D55C}",
  kscr: "\u{1D4C0}",
  lAarr: "\u21DA",
  lArr: "\u21D0",
  lAtail: "\u291B",
  lBarr: "\u290E",
  lE: "\u2266",
  lEg: "\u2A8B",
  lHar: "\u2962",
  lacute: "\u013A",
  laemptyv: "\u29B4",
  lagran: "\u2112",
  lambda: "\u03BB",
  lang: "\u27E8",
  langd: "\u2991",
  langle: "\u27E8",
  lap: "\u2A85",
  laquo: "\xAB",
  larr: "\u2190",
  larrb: "\u21E4",
  larrbfs: "\u291F",
  larrfs: "\u291D",
  larrhk: "\u21A9",
  larrlp: "\u21AB",
  larrpl: "\u2939",
  larrsim: "\u2973",
  larrtl: "\u21A2",
  lat: "\u2AAB",
  latail: "\u2919",
  late: "\u2AAD",
  lates: "\u2AAD\uFE00",
  lbarr: "\u290C",
  lbbrk: "\u2772",
  lbrace: "{",
  lbrack: "[",
  lbrke: "\u298B",
  lbrksld: "\u298F",
  lbrkslu: "\u298D",
  lcaron: "\u013E",
  lcedil: "\u013C",
  lceil: "\u2308",
  lcub: "{",
  lcy: "\u043B",
  ldca: "\u2936",
  ldquo: "\u201C",
  ldquor: "\u201E",
  ldrdhar: "\u2967",
  ldrushar: "\u294B",
  ldsh: "\u21B2",
  le: "\u2264",
  leftarrow: "\u2190",
  leftarrowtail: "\u21A2",
  leftharpoondown: "\u21BD",
  leftharpoonup: "\u21BC",
  leftleftarrows: "\u21C7",
  leftrightarrow: "\u2194",
  leftrightarrows: "\u21C6",
  leftrightharpoons: "\u21CB",
  leftrightsquigarrow: "\u21AD",
  leftthreetimes: "\u22CB",
  leg: "\u22DA",
  leq: "\u2264",
  leqq: "\u2266",
  leqslant: "\u2A7D",
  les: "\u2A7D",
  lescc: "\u2AA8",
  lesdot: "\u2A7F",
  lesdoto: "\u2A81",
  lesdotor: "\u2A83",
  lesg: "\u22DA\uFE00",
  lesges: "\u2A93",
  lessapprox: "\u2A85",
  lessdot: "\u22D6",
  lesseqgtr: "\u22DA",
  lesseqqgtr: "\u2A8B",
  lessgtr: "\u2276",
  lesssim: "\u2272",
  lfisht: "\u297C",
  lfloor: "\u230A",
  lfr: "\u{1D529}",
  lg: "\u2276",
  lgE: "\u2A91",
  lhard: "\u21BD",
  lharu: "\u21BC",
  lharul: "\u296A",
  lhblk: "\u2584",
  ljcy: "\u0459",
  ll: "\u226A",
  llarr: "\u21C7",
  llcorner: "\u231E",
  llhard: "\u296B",
  lltri: "\u25FA",
  lmidot: "\u0140",
  lmoust: "\u23B0",
  lmoustache: "\u23B0",
  lnE: "\u2268",
  lnap: "\u2A89",
  lnapprox: "\u2A89",
  lne: "\u2A87",
  lneq: "\u2A87",
  lneqq: "\u2268",
  lnsim: "\u22E6",
  loang: "\u27EC",
  loarr: "\u21FD",
  lobrk: "\u27E6",
  longleftarrow: "\u27F5",
  longleftrightarrow: "\u27F7",
  longmapsto: "\u27FC",
  longrightarrow: "\u27F6",
  looparrowleft: "\u21AB",
  looparrowright: "\u21AC",
  lopar: "\u2985",
  lopf: "\u{1D55D}",
  loplus: "\u2A2D",
  lotimes: "\u2A34",
  lowast: "\u2217",
  lowbar: "_",
  loz: "\u25CA",
  lozenge: "\u25CA",
  lozf: "\u29EB",
  lpar: "(",
  lparlt: "\u2993",
  lrarr: "\u21C6",
  lrcorner: "\u231F",
  lrhar: "\u21CB",
  lrhard: "\u296D",
  lrm: "\u200E",
  lrtri: "\u22BF",
  lsaquo: "\u2039",
  lscr: "\u{1D4C1}",
  lsh: "\u21B0",
  lsim: "\u2272",
  lsime: "\u2A8D",
  lsimg: "\u2A8F",
  lsqb: "[",
  lsquo: "\u2018",
  lsquor: "\u201A",
  lstrok: "\u0142",
  lt: "<",
  ltcc: "\u2AA6",
  ltcir: "\u2A79",
  ltdot: "\u22D6",
  lthree: "\u22CB",
  ltimes: "\u22C9",
  ltlarr: "\u2976",
  ltquest: "\u2A7B",
  ltrPar: "\u2996",
  ltri: "\u25C3",
  ltrie: "\u22B4",
  ltrif: "\u25C2",
  lurdshar: "\u294A",
  luruhar: "\u2966",
  lvertneqq: "\u2268\uFE00",
  lvnE: "\u2268\uFE00",
  mDDot: "\u223A",
  macr: "\xAF",
  male: "\u2642",
  malt: "\u2720",
  maltese: "\u2720",
  map: "\u21A6",
  mapsto: "\u21A6",
  mapstodown: "\u21A7",
  mapstoleft: "\u21A4",
  mapstoup: "\u21A5",
  marker: "\u25AE",
  mcomma: "\u2A29",
  mcy: "\u043C",
  mdash: "\u2014",
  measuredangle: "\u2221",
  mfr: "\u{1D52A}",
  mho: "\u2127",
  micro: "\xB5",
  mid: "\u2223",
  midast: "*",
  midcir: "\u2AF0",
  middot: "\xB7",
  minus: "\u2212",
  minusb: "\u229F",
  minusd: "\u2238",
  minusdu: "\u2A2A",
  mlcp: "\u2ADB",
  mldr: "\u2026",
  mnplus: "\u2213",
  models: "\u22A7",
  mopf: "\u{1D55E}",
  mp: "\u2213",
  mscr: "\u{1D4C2}",
  mstpos: "\u223E",
  mu: "\u03BC",
  multimap: "\u22B8",
  mumap: "\u22B8",
  nGg: "\u22D9\u0338",
  nGt: "\u226B\u20D2",
  nGtv: "\u226B\u0338",
  nLeftarrow: "\u21CD",
  nLeftrightarrow: "\u21CE",
  nLl: "\u22D8\u0338",
  nLt: "\u226A\u20D2",
  nLtv: "\u226A\u0338",
  nRightarrow: "\u21CF",
  nVDash: "\u22AF",
  nVdash: "\u22AE",
  nabla: "\u2207",
  nacute: "\u0144",
  nang: "\u2220\u20D2",
  nap: "\u2249",
  napE: "\u2A70\u0338",
  napid: "\u224B\u0338",
  napos: "\u0149",
  napprox: "\u2249",
  natur: "\u266E",
  natural: "\u266E",
  naturals: "\u2115",
  nbsp: "\xA0",
  nbump: "\u224E\u0338",
  nbumpe: "\u224F\u0338",
  ncap: "\u2A43",
  ncaron: "\u0148",
  ncedil: "\u0146",
  ncong: "\u2247",
  ncongdot: "\u2A6D\u0338",
  ncup: "\u2A42",
  ncy: "\u043D",
  ndash: "\u2013",
  ne: "\u2260",
  neArr: "\u21D7",
  nearhk: "\u2924",
  nearr: "\u2197",
  nearrow: "\u2197",
  nedot: "\u2250\u0338",
  nequiv: "\u2262",
  nesear: "\u2928",
  nesim: "\u2242\u0338",
  nexist: "\u2204",
  nexists: "\u2204",
  nfr: "\u{1D52B}",
  ngE: "\u2267\u0338",
  nge: "\u2271",
  ngeq: "\u2271",
  ngeqq: "\u2267\u0338",
  ngeqslant: "\u2A7E\u0338",
  nges: "\u2A7E\u0338",
  ngsim: "\u2275",
  ngt: "\u226F",
  ngtr: "\u226F",
  nhArr: "\u21CE",
  nharr: "\u21AE",
  nhpar: "\u2AF2",
  ni: "\u220B",
  nis: "\u22FC",
  nisd: "\u22FA",
  niv: "\u220B",
  njcy: "\u045A",
  nlArr: "\u21CD",
  nlE: "\u2266\u0338",
  nlarr: "\u219A",
  nldr: "\u2025",
  nle: "\u2270",
  nleftarrow: "\u219A",
  nleftrightarrow: "\u21AE",
  nleq: "\u2270",
  nleqq: "\u2266\u0338",
  nleqslant: "\u2A7D\u0338",
  nles: "\u2A7D\u0338",
  nless: "\u226E",
  nlsim: "\u2274",
  nlt: "\u226E",
  nltri: "\u22EA",
  nltrie: "\u22EC",
  nmid: "\u2224",
  nopf: "\u{1D55F}",
  not: "\xAC",
  notin: "\u2209",
  notinE: "\u22F9\u0338",
  notindot: "\u22F5\u0338",
  notinva: "\u2209",
  notinvb: "\u22F7",
  notinvc: "\u22F6",
  notni: "\u220C",
  notniva: "\u220C",
  notnivb: "\u22FE",
  notnivc: "\u22FD",
  npar: "\u2226",
  nparallel: "\u2226",
  nparsl: "\u2AFD\u20E5",
  npart: "\u2202\u0338",
  npolint: "\u2A14",
  npr: "\u2280",
  nprcue: "\u22E0",
  npre: "\u2AAF\u0338",
  nprec: "\u2280",
  npreceq: "\u2AAF\u0338",
  nrArr: "\u21CF",
  nrarr: "\u219B",
  nrarrc: "\u2933\u0338",
  nrarrw: "\u219D\u0338",
  nrightarrow: "\u219B",
  nrtri: "\u22EB",
  nrtrie: "\u22ED",
  nsc: "\u2281",
  nsccue: "\u22E1",
  nsce: "\u2AB0\u0338",
  nscr: "\u{1D4C3}",
  nshortmid: "\u2224",
  nshortparallel: "\u2226",
  nsim: "\u2241",
  nsime: "\u2244",
  nsimeq: "\u2244",
  nsmid: "\u2224",
  nspar: "\u2226",
  nsqsube: "\u22E2",
  nsqsupe: "\u22E3",
  nsub: "\u2284",
  nsubE: "\u2AC5\u0338",
  nsube: "\u2288",
  nsubset: "\u2282\u20D2",
  nsubseteq: "\u2288",
  nsubseteqq: "\u2AC5\u0338",
  nsucc: "\u2281",
  nsucceq: "\u2AB0\u0338",
  nsup: "\u2285",
  nsupE: "\u2AC6\u0338",
  nsupe: "\u2289",
  nsupset: "\u2283\u20D2",
  nsupseteq: "\u2289",
  nsupseteqq: "\u2AC6\u0338",
  ntgl: "\u2279",
  ntilde: "\xF1",
  ntlg: "\u2278",
  ntriangleleft: "\u22EA",
  ntrianglelefteq: "\u22EC",
  ntriangleright: "\u22EB",
  ntrianglerighteq: "\u22ED",
  nu: "\u03BD",
  num: "#",
  numero: "\u2116",
  numsp: "\u2007",
  nvDash: "\u22AD",
  nvHarr: "\u2904",
  nvap: "\u224D\u20D2",
  nvdash: "\u22AC",
  nvge: "\u2265\u20D2",
  nvgt: ">\u20D2",
  nvinfin: "\u29DE",
  nvlArr: "\u2902",
  nvle: "\u2264\u20D2",
  nvlt: "<\u20D2",
  nvltrie: "\u22B4\u20D2",
  nvrArr: "\u2903",
  nvrtrie: "\u22B5\u20D2",
  nvsim: "\u223C\u20D2",
  nwArr: "\u21D6",
  nwarhk: "\u2923",
  nwarr: "\u2196",
  nwarrow: "\u2196",
  nwnear: "\u2927",
  oS: "\u24C8",
  oacute: "\xF3",
  oast: "\u229B",
  ocir: "\u229A",
  ocirc: "\xF4",
  ocy: "\u043E",
  odash: "\u229D",
  odblac: "\u0151",
  odiv: "\u2A38",
  odot: "\u2299",
  odsold: "\u29BC",
  oelig: "\u0153",
  ofcir: "\u29BF",
  ofr: "\u{1D52C}",
  ogon: "\u02DB",
  ograve: "\xF2",
  ogt: "\u29C1",
  ohbar: "\u29B5",
  ohm: "\u03A9",
  oint: "\u222E",
  olarr: "\u21BA",
  olcir: "\u29BE",
  olcross: "\u29BB",
  oline: "\u203E",
  olt: "\u29C0",
  omacr: "\u014D",
  omega: "\u03C9",
  omicron: "\u03BF",
  omid: "\u29B6",
  ominus: "\u2296",
  oopf: "\u{1D560}",
  opar: "\u29B7",
  operp: "\u29B9",
  oplus: "\u2295",
  or: "\u2228",
  orarr: "\u21BB",
  ord: "\u2A5D",
  order: "\u2134",
  orderof: "\u2134",
  ordf: "\xAA",
  ordm: "\xBA",
  origof: "\u22B6",
  oror: "\u2A56",
  orslope: "\u2A57",
  orv: "\u2A5B",
  oscr: "\u2134",
  oslash: "\xF8",
  osol: "\u2298",
  otilde: "\xF5",
  otimes: "\u2297",
  otimesas: "\u2A36",
  ouml: "\xF6",
  ovbar: "\u233D",
  par: "\u2225",
  para: "\xB6",
  parallel: "\u2225",
  parsim: "\u2AF3",
  parsl: "\u2AFD",
  part: "\u2202",
  pcy: "\u043F",
  percnt: "%",
  period: ".",
  permil: "\u2030",
  perp: "\u22A5",
  pertenk: "\u2031",
  pfr: "\u{1D52D}",
  phi: "\u03C6",
  phiv: "\u03D5",
  phmmat: "\u2133",
  phone: "\u260E",
  pi: "\u03C0",
  pitchfork: "\u22D4",
  piv: "\u03D6",
  planck: "\u210F",
  planckh: "\u210E",
  plankv: "\u210F",
  plus: "+",
  plusacir: "\u2A23",
  plusb: "\u229E",
  pluscir: "\u2A22",
  plusdo: "\u2214",
  plusdu: "\u2A25",
  pluse: "\u2A72",
  plusmn: "\xB1",
  plussim: "\u2A26",
  plustwo: "\u2A27",
  pm: "\xB1",
  pointint: "\u2A15",
  popf: "\u{1D561}",
  pound: "\xA3",
  pr: "\u227A",
  prE: "\u2AB3",
  prap: "\u2AB7",
  prcue: "\u227C",
  pre: "\u2AAF",
  prec: "\u227A",
  precapprox: "\u2AB7",
  preccurlyeq: "\u227C",
  preceq: "\u2AAF",
  precnapprox: "\u2AB9",
  precneqq: "\u2AB5",
  precnsim: "\u22E8",
  precsim: "\u227E",
  prime: "\u2032",
  primes: "\u2119",
  prnE: "\u2AB5",
  prnap: "\u2AB9",
  prnsim: "\u22E8",
  prod: "\u220F",
  profalar: "\u232E",
  profline: "\u2312",
  profsurf: "\u2313",
  prop: "\u221D",
  propto: "\u221D",
  prsim: "\u227E",
  prurel: "\u22B0",
  pscr: "\u{1D4C5}",
  psi: "\u03C8",
  puncsp: "\u2008",
  qfr: "\u{1D52E}",
  qint: "\u2A0C",
  qopf: "\u{1D562}",
  qprime: "\u2057",
  qscr: "\u{1D4C6}",
  quaternions: "\u210D",
  quatint: "\u2A16",
  quest: "?",
  questeq: "\u225F",
  quot: '"',
  rAarr: "\u21DB",
  rArr: "\u21D2",
  rAtail: "\u291C",
  rBarr: "\u290F",
  rHar: "\u2964",
  race: "\u223D\u0331",
  racute: "\u0155",
  radic: "\u221A",
  raemptyv: "\u29B3",
  rang: "\u27E9",
  rangd: "\u2992",
  range: "\u29A5",
  rangle: "\u27E9",
  raquo: "\xBB",
  rarr: "\u2192",
  rarrap: "\u2975",
  rarrb: "\u21E5",
  rarrbfs: "\u2920",
  rarrc: "\u2933",
  rarrfs: "\u291E",
  rarrhk: "\u21AA",
  rarrlp: "\u21AC",
  rarrpl: "\u2945",
  rarrsim: "\u2974",
  rarrtl: "\u21A3",
  rarrw: "\u219D",
  ratail: "\u291A",
  ratio: "\u2236",
  rationals: "\u211A",
  rbarr: "\u290D",
  rbbrk: "\u2773",
  rbrace: "}",
  rbrack: "]",
  rbrke: "\u298C",
  rbrksld: "\u298E",
  rbrkslu: "\u2990",
  rcaron: "\u0159",
  rcedil: "\u0157",
  rceil: "\u2309",
  rcub: "}",
  rcy: "\u0440",
  rdca: "\u2937",
  rdldhar: "\u2969",
  rdquo: "\u201D",
  rdquor: "\u201D",
  rdsh: "\u21B3",
  real: "\u211C",
  realine: "\u211B",
  realpart: "\u211C",
  reals: "\u211D",
  rect: "\u25AD",
  reg: "\xAE",
  rfisht: "\u297D",
  rfloor: "\u230B",
  rfr: "\u{1D52F}",
  rhard: "\u21C1",
  rharu: "\u21C0",
  rharul: "\u296C",
  rho: "\u03C1",
  rhov: "\u03F1",
  rightarrow: "\u2192",
  rightarrowtail: "\u21A3",
  rightharpoondown: "\u21C1",
  rightharpoonup: "\u21C0",
  rightleftarrows: "\u21C4",
  rightleftharpoons: "\u21CC",
  rightrightarrows: "\u21C9",
  rightsquigarrow: "\u219D",
  rightthreetimes: "\u22CC",
  ring: "\u02DA",
  risingdotseq: "\u2253",
  rlarr: "\u21C4",
  rlhar: "\u21CC",
  rlm: "\u200F",
  rmoust: "\u23B1",
  rmoustache: "\u23B1",
  rnmid: "\u2AEE",
  roang: "\u27ED",
  roarr: "\u21FE",
  robrk: "\u27E7",
  ropar: "\u2986",
  ropf: "\u{1D563}",
  roplus: "\u2A2E",
  rotimes: "\u2A35",
  rpar: ")",
  rpargt: "\u2994",
  rppolint: "\u2A12",
  rrarr: "\u21C9",
  rsaquo: "\u203A",
  rscr: "\u{1D4C7}",
  rsh: "\u21B1",
  rsqb: "]",
  rsquo: "\u2019",
  rsquor: "\u2019",
  rthree: "\u22CC",
  rtimes: "\u22CA",
  rtri: "\u25B9",
  rtrie: "\u22B5",
  rtrif: "\u25B8",
  rtriltri: "\u29CE",
  ruluhar: "\u2968",
  rx: "\u211E",
  sacute: "\u015B",
  sbquo: "\u201A",
  sc: "\u227B",
  scE: "\u2AB4",
  scap: "\u2AB8",
  scaron: "\u0161",
  sccue: "\u227D",
  sce: "\u2AB0",
  scedil: "\u015F",
  scirc: "\u015D",
  scnE: "\u2AB6",
  scnap: "\u2ABA",
  scnsim: "\u22E9",
  scpolint: "\u2A13",
  scsim: "\u227F",
  scy: "\u0441",
  sdot: "\u22C5",
  sdotb: "\u22A1",
  sdote: "\u2A66",
  seArr: "\u21D8",
  searhk: "\u2925",
  searr: "\u2198",
  searrow: "\u2198",
  sect: "\xA7",
  semi: ";",
  seswar: "\u2929",
  setminus: "\u2216",
  setmn: "\u2216",
  sext: "\u2736",
  sfr: "\u{1D530}",
  sfrown: "\u2322",
  sharp: "\u266F",
  shchcy: "\u0449",
  shcy: "\u0448",
  shortmid: "\u2223",
  shortparallel: "\u2225",
  shy: "\xAD",
  sigma: "\u03C3",
  sigmaf: "\u03C2",
  sigmav: "\u03C2",
  sim: "\u223C",
  simdot: "\u2A6A",
  sime: "\u2243",
  simeq: "\u2243",
  simg: "\u2A9E",
  simgE: "\u2AA0",
  siml: "\u2A9D",
  simlE: "\u2A9F",
  simne: "\u2246",
  simplus: "\u2A24",
  simrarr: "\u2972",
  slarr: "\u2190",
  smallsetminus: "\u2216",
  smashp: "\u2A33",
  smeparsl: "\u29E4",
  smid: "\u2223",
  smile: "\u2323",
  smt: "\u2AAA",
  smte: "\u2AAC",
  smtes: "\u2AAC\uFE00",
  softcy: "\u044C",
  sol: "/",
  solb: "\u29C4",
  solbar: "\u233F",
  sopf: "\u{1D564}",
  spades: "\u2660",
  spadesuit: "\u2660",
  spar: "\u2225",
  sqcap: "\u2293",
  sqcaps: "\u2293\uFE00",
  sqcup: "\u2294",
  sqcups: "\u2294\uFE00",
  sqsub: "\u228F",
  sqsube: "\u2291",
  sqsubset: "\u228F",
  sqsubseteq: "\u2291",
  sqsup: "\u2290",
  sqsupe: "\u2292",
  sqsupset: "\u2290",
  sqsupseteq: "\u2292",
  squ: "\u25A1",
  square: "\u25A1",
  squarf: "\u25AA",
  squf: "\u25AA",
  srarr: "\u2192",
  sscr: "\u{1D4C8}",
  ssetmn: "\u2216",
  ssmile: "\u2323",
  sstarf: "\u22C6",
  star: "\u2606",
  starf: "\u2605",
  straightepsilon: "\u03F5",
  straightphi: "\u03D5",
  strns: "\xAF",
  sub: "\u2282",
  subE: "\u2AC5",
  subdot: "\u2ABD",
  sube: "\u2286",
  subedot: "\u2AC3",
  submult: "\u2AC1",
  subnE: "\u2ACB",
  subne: "\u228A",
  subplus: "\u2ABF",
  subrarr: "\u2979",
  subset: "\u2282",
  subseteq: "\u2286",
  subseteqq: "\u2AC5",
  subsetneq: "\u228A",
  subsetneqq: "\u2ACB",
  subsim: "\u2AC7",
  subsub: "\u2AD5",
  subsup: "\u2AD3",
  succ: "\u227B",
  succapprox: "\u2AB8",
  succcurlyeq: "\u227D",
  succeq: "\u2AB0",
  succnapprox: "\u2ABA",
  succneqq: "\u2AB6",
  succnsim: "\u22E9",
  succsim: "\u227F",
  sum: "\u2211",
  sung: "\u266A",
  sup1: "\xB9",
  sup2: "\xB2",
  sup3: "\xB3",
  sup: "\u2283",
  supE: "\u2AC6",
  supdot: "\u2ABE",
  supdsub: "\u2AD8",
  supe: "\u2287",
  supedot: "\u2AC4",
  suphsol: "\u27C9",
  suphsub: "\u2AD7",
  suplarr: "\u297B",
  supmult: "\u2AC2",
  supnE: "\u2ACC",
  supne: "\u228B",
  supplus: "\u2AC0",
  supset: "\u2283",
  supseteq: "\u2287",
  supseteqq: "\u2AC6",
  supsetneq: "\u228B",
  supsetneqq: "\u2ACC",
  supsim: "\u2AC8",
  supsub: "\u2AD4",
  supsup: "\u2AD6",
  swArr: "\u21D9",
  swarhk: "\u2926",
  swarr: "\u2199",
  swarrow: "\u2199",
  swnwar: "\u292A",
  szlig: "\xDF",
  target: "\u2316",
  tau: "\u03C4",
  tbrk: "\u23B4",
  tcaron: "\u0165",
  tcedil: "\u0163",
  tcy: "\u0442",
  tdot: "\u20DB",
  telrec: "\u2315",
  tfr: "\u{1D531}",
  there4: "\u2234",
  therefore: "\u2234",
  theta: "\u03B8",
  thetasym: "\u03D1",
  thetav: "\u03D1",
  thickapprox: "\u2248",
  thicksim: "\u223C",
  thinsp: "\u2009",
  thkap: "\u2248",
  thksim: "\u223C",
  thorn: "\xFE",
  tilde: "\u02DC",
  times: "\xD7",
  timesb: "\u22A0",
  timesbar: "\u2A31",
  timesd: "\u2A30",
  tint: "\u222D",
  toea: "\u2928",
  top: "\u22A4",
  topbot: "\u2336",
  topcir: "\u2AF1",
  topf: "\u{1D565}",
  topfork: "\u2ADA",
  tosa: "\u2929",
  tprime: "\u2034",
  trade: "\u2122",
  triangle: "\u25B5",
  triangledown: "\u25BF",
  triangleleft: "\u25C3",
  trianglelefteq: "\u22B4",
  triangleq: "\u225C",
  triangleright: "\u25B9",
  trianglerighteq: "\u22B5",
  tridot: "\u25EC",
  trie: "\u225C",
  triminus: "\u2A3A",
  triplus: "\u2A39",
  trisb: "\u29CD",
  tritime: "\u2A3B",
  trpezium: "\u23E2",
  tscr: "\u{1D4C9}",
  tscy: "\u0446",
  tshcy: "\u045B",
  tstrok: "\u0167",
  twixt: "\u226C",
  twoheadleftarrow: "\u219E",
  twoheadrightarrow: "\u21A0",
  uArr: "\u21D1",
  uHar: "\u2963",
  uacute: "\xFA",
  uarr: "\u2191",
  ubrcy: "\u045E",
  ubreve: "\u016D",
  ucirc: "\xFB",
  ucy: "\u0443",
  udarr: "\u21C5",
  udblac: "\u0171",
  udhar: "\u296E",
  ufisht: "\u297E",
  ufr: "\u{1D532}",
  ugrave: "\xF9",
  uharl: "\u21BF",
  uharr: "\u21BE",
  uhblk: "\u2580",
  ulcorn: "\u231C",
  ulcorner: "\u231C",
  ulcrop: "\u230F",
  ultri: "\u25F8",
  umacr: "\u016B",
  uml: "\xA8",
  uogon: "\u0173",
  uopf: "\u{1D566}",
  uparrow: "\u2191",
  updownarrow: "\u2195",
  upharpoonleft: "\u21BF",
  upharpoonright: "\u21BE",
  uplus: "\u228E",
  upsi: "\u03C5",
  upsih: "\u03D2",
  upsilon: "\u03C5",
  upuparrows: "\u21C8",
  urcorn: "\u231D",
  urcorner: "\u231D",
  urcrop: "\u230E",
  uring: "\u016F",
  urtri: "\u25F9",
  uscr: "\u{1D4CA}",
  utdot: "\u22F0",
  utilde: "\u0169",
  utri: "\u25B5",
  utrif: "\u25B4",
  uuarr: "\u21C8",
  uuml: "\xFC",
  uwangle: "\u29A7",
  vArr: "\u21D5",
  vBar: "\u2AE8",
  vBarv: "\u2AE9",
  vDash: "\u22A8",
  vangrt: "\u299C",
  varepsilon: "\u03F5",
  varkappa: "\u03F0",
  varnothing: "\u2205",
  varphi: "\u03D5",
  varpi: "\u03D6",
  varpropto: "\u221D",
  varr: "\u2195",
  varrho: "\u03F1",
  varsigma: "\u03C2",
  varsubsetneq: "\u228A\uFE00",
  varsubsetneqq: "\u2ACB\uFE00",
  varsupsetneq: "\u228B\uFE00",
  varsupsetneqq: "\u2ACC\uFE00",
  vartheta: "\u03D1",
  vartriangleleft: "\u22B2",
  vartriangleright: "\u22B3",
  vcy: "\u0432",
  vdash: "\u22A2",
  vee: "\u2228",
  veebar: "\u22BB",
  veeeq: "\u225A",
  vellip: "\u22EE",
  verbar: "|",
  vert: "|",
  vfr: "\u{1D533}",
  vltri: "\u22B2",
  vnsub: "\u2282\u20D2",
  vnsup: "\u2283\u20D2",
  vopf: "\u{1D567}",
  vprop: "\u221D",
  vrtri: "\u22B3",
  vscr: "\u{1D4CB}",
  vsubnE: "\u2ACB\uFE00",
  vsubne: "\u228A\uFE00",
  vsupnE: "\u2ACC\uFE00",
  vsupne: "\u228B\uFE00",
  vzigzag: "\u299A",
  wcirc: "\u0175",
  wedbar: "\u2A5F",
  wedge: "\u2227",
  wedgeq: "\u2259",
  weierp: "\u2118",
  wfr: "\u{1D534}",
  wopf: "\u{1D568}",
  wp: "\u2118",
  wr: "\u2240",
  wreath: "\u2240",
  wscr: "\u{1D4CC}",
  xcap: "\u22C2",
  xcirc: "\u25EF",
  xcup: "\u22C3",
  xdtri: "\u25BD",
  xfr: "\u{1D535}",
  xhArr: "\u27FA",
  xharr: "\u27F7",
  xi: "\u03BE",
  xlArr: "\u27F8",
  xlarr: "\u27F5",
  xmap: "\u27FC",
  xnis: "\u22FB",
  xodot: "\u2A00",
  xopf: "\u{1D569}",
  xoplus: "\u2A01",
  xotime: "\u2A02",
  xrArr: "\u27F9",
  xrarr: "\u27F6",
  xscr: "\u{1D4CD}",
  xsqcup: "\u2A06",
  xuplus: "\u2A04",
  xutri: "\u25B3",
  xvee: "\u22C1",
  xwedge: "\u22C0",
  yacute: "\xFD",
  yacy: "\u044F",
  ycirc: "\u0177",
  ycy: "\u044B",
  yen: "\xA5",
  yfr: "\u{1D536}",
  yicy: "\u0457",
  yopf: "\u{1D56A}",
  yscr: "\u{1D4CE}",
  yucy: "\u044E",
  yuml: "\xFF",
  zacute: "\u017A",
  zcaron: "\u017E",
  zcy: "\u0437",
  zdot: "\u017C",
  zeetrf: "\u2128",
  zeta: "\u03B6",
  zfr: "\u{1D537}",
  zhcy: "\u0436",
  zigrarr: "\u21DD",
  zopf: "\u{1D56B}",
  zscr: "\u{1D4CF}",
  zwj: "\u200D",
  zwnj: "\u200C"
};
var decodeMap = {
  "0": 65533,
  "128": 8364,
  "130": 8218,
  "131": 402,
  "132": 8222,
  "133": 8230,
  "134": 8224,
  "135": 8225,
  "136": 710,
  "137": 8240,
  "138": 352,
  "139": 8249,
  "140": 338,
  "142": 381,
  "145": 8216,
  "146": 8217,
  "147": 8220,
  "148": 8221,
  "149": 8226,
  "150": 8211,
  "151": 8212,
  "152": 732,
  "153": 8482,
  "154": 353,
  "155": 8250,
  "156": 339,
  "158": 382,
  "159": 376
};
function decodeHTMLStrict(text) {
  return text.replace(/&(?:[a-zA-Z]+|#[xX][\da-fA-F]+|#\d+);/g, (key) => {
    if (key.charAt(1) === "#") {
      const secondChar = key.charAt(2);
      const codePoint = secondChar === "X" || secondChar === "x" ? parseInt(key.slice(3), 16) : parseInt(key.slice(2), 10);
      return decodeCodePoint(codePoint);
    }
    return getOwnProperty(entities, key.slice(1, -1)) ?? key;
  });
}
__name(decodeHTMLStrict, "decodeHTMLStrict");
function decodeCodePoint(codePoint) {
  if (codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111) {
    return "\uFFFD";
  }
  return String.fromCodePoint(getOwnProperty(decodeMap, codePoint) ?? codePoint);
}
__name(decodeCodePoint, "decodeCodePoint");
function scanJSXAttributeValue(parser, context) {
  parser.startIndex = parser.tokenIndex = parser.index;
  parser.startColumn = parser.tokenColumn = parser.column;
  parser.startLine = parser.tokenLine = parser.line;
  parser.setToken(CharTypes[parser.currentChar] & 8192 ? scanJSXString(parser) : scanSingleToken(parser, context, 0));
  return parser.getToken();
}
__name(scanJSXAttributeValue, "scanJSXAttributeValue");
function scanJSXString(parser) {
  const quote = parser.currentChar;
  let char = advanceChar(parser);
  const start = parser.index;
  while (char !== quote) {
    if (parser.index >= parser.end)
      parser.report(16);
    char = advanceChar(parser);
  }
  if (char !== quote)
    parser.report(16);
  parser.tokenValue = parser.source.slice(start, parser.index);
  advanceChar(parser);
  if (parser.options.raw)
    parser.tokenRaw = parser.source.slice(parser.tokenIndex, parser.index);
  return 134283267;
}
__name(scanJSXString, "scanJSXString");
function nextJSXToken(parser) {
  parser.startIndex = parser.tokenIndex = parser.index;
  parser.startColumn = parser.tokenColumn = parser.column;
  parser.startLine = parser.tokenLine = parser.line;
  if (parser.index >= parser.end) {
    parser.setToken(1048576);
    return;
  }
  if (parser.currentChar === 60) {
    advanceChar(parser);
    parser.setToken(8456256);
    return;
  }
  if (parser.currentChar === 123) {
    advanceChar(parser);
    parser.setToken(2162700);
    return;
  }
  let state = 0;
  while (parser.index < parser.end) {
    const type = CharTypes[parser.source.charCodeAt(parser.index)];
    if (type & 1024) {
      state |= 1 | 4;
      scanNewLine(parser);
    } else if (type & 2048) {
      consumeLineFeed(parser, state);
      state = state & -5 | 1;
    } else {
      advanceChar(parser);
    }
    if (CharTypes[parser.currentChar] & 16384)
      break;
  }
  if (parser.tokenIndex === parser.index)
    parser.report(0);
  const raw = parser.source.slice(parser.tokenIndex, parser.index);
  if (parser.options.raw)
    parser.tokenRaw = raw;
  parser.tokenValue = decodeHTMLStrict(raw);
  parser.setToken(137);
}
__name(nextJSXToken, "nextJSXToken");
function rescanJSXIdentifier(parser) {
  if ((parser.getToken() & 143360) === 143360) {
    const { index } = parser;
    let char = parser.currentChar;
    while (CharTypes[char] & (32768 | 2)) {
      char = advanceChar(parser);
    }
    parser.tokenValue += parser.source.slice(index, parser.index);
    parser.setToken(208897, true);
  }
  return parser.getToken();
}
__name(rescanJSXIdentifier, "rescanJSXIdentifier");
var _Scope = class _Scope {
  constructor(parser, type = 2, parent) {
    __publicField(this, "parser");
    __publicField(this, "type");
    __publicField(this, "parent");
    __publicField(this, "scopeError");
    __publicField(this, "variableBindings", /* @__PURE__ */ new Map());
    this.parser = parser;
    this.type = type;
    this.parent = parent;
  }
  createChildScope(type) {
    return new _Scope(this.parser, type, this);
  }
  addVarOrBlock(context, name, kind, origin) {
    if (kind & 4) {
      this.addVarName(context, name, kind);
    } else {
      this.addBlockName(context, name, kind, origin);
    }
    if (origin & 64) {
      this.parser.declareUnboundVariable(name);
    }
  }
  addVarName(context, name, kind) {
    const { parser } = this;
    let currentScope = this;
    while (currentScope && (currentScope.type & 128) === 0) {
      const { variableBindings } = currentScope;
      const value = variableBindings.get(name);
      if (value && value & 248) {
        if (parser.options.webcompat && (context & 1) === 0 && (kind & 128 && value & 68 || value & 128 && kind & 68)) ;
        else {
          parser.report(145, name);
        }
      }
      if (currentScope === this) {
        if (value && value & 1 && kind & 1) {
          currentScope.recordScopeError(145, name);
        }
      }
      if (value && (value & 256 || value & 512 && !parser.options.webcompat)) {
        parser.report(145, name);
      }
      currentScope.variableBindings.set(name, kind);
      currentScope = currentScope.parent;
    }
  }
  hasVariable(name) {
    return this.variableBindings.has(name);
  }
  addBlockName(context, name, kind, origin) {
    const { parser } = this;
    const value = this.variableBindings.get(name);
    if (value && (value & 2) === 0) {
      if (kind & 1) {
        this.recordScopeError(145, name);
      } else if (parser.options.webcompat && (context & 1) === 0 && origin & 2 && value === 64 && kind === 64) ;
      else {
        parser.report(145, name);
      }
    }
    if (this.type & 64 && this.parent?.hasVariable(name) && (this.parent.variableBindings.get(name) & 2) === 0) {
      parser.report(145, name);
    }
    if (this.type & 512 && value && (value & 2) === 0) {
      if (kind & 1) {
        this.recordScopeError(145, name);
      }
    }
    if (this.type & 32) {
      if (this.parent.variableBindings.get(name) & 768)
        parser.report(159, name);
    }
    this.variableBindings.set(name, kind);
  }
  recordScopeError(type, ...params) {
    this.scopeError = {
      type,
      params,
      start: this.parser.tokenStart,
      end: this.parser.currentLocation
    };
  }
  reportScopeError() {
    const { scopeError } = this;
    if (!scopeError) {
      return;
    }
    throw new ParseError(scopeError.start, scopeError.end, scopeError.type, ...scopeError.params);
  }
};
__name(_Scope, "Scope");
var Scope = _Scope;
function createArrowHeadParsingScope(parser, context, value) {
  const scope = parser.createScope().createChildScope(512);
  scope.addBlockName(context, value, 1, 0);
  return scope;
}
__name(createArrowHeadParsingScope, "createArrowHeadParsingScope");
var _PrivateScope = class _PrivateScope {
  constructor(parser, parent) {
    __publicField(this, "parser");
    __publicField(this, "parent");
    __publicField(this, "refs", /* @__PURE__ */ Object.create(null));
    __publicField(this, "privateIdentifiers", /* @__PURE__ */ new Map());
    this.parser = parser;
    this.parent = parent;
  }
  addPrivateIdentifier(name, kind) {
    const { privateIdentifiers } = this;
    let focusKind = kind & (32 | 768);
    if (!(focusKind & 768))
      focusKind |= 768;
    const value = privateIdentifiers.get(name);
    if (this.hasPrivateIdentifier(name) && ((value & 32) !== (focusKind & 32) || value & focusKind & 768)) {
      this.parser.report(146, name);
    }
    privateIdentifiers.set(name, this.hasPrivateIdentifier(name) ? value | focusKind : focusKind);
  }
  addPrivateIdentifierRef(name) {
    var _a;
    (_a = this.refs)[name] ?? (_a[name] = []);
    this.refs[name].push(this.parser.tokenStart);
  }
  isPrivateIdentifierDefined(name) {
    return this.hasPrivateIdentifier(name) || Boolean(this.parent?.isPrivateIdentifierDefined(name));
  }
  validatePrivateIdentifierRefs() {
    for (const name in this.refs) {
      if (!this.isPrivateIdentifierDefined(name)) {
        const { index, line, column } = this.refs[name][0];
        throw new ParseError({ index, line, column }, { index: index + name.length, line, column: column + name.length }, 4, name);
      }
    }
  }
  hasPrivateIdentifier(name) {
    return this.privateIdentifiers.has(name);
  }
};
__name(_PrivateScope, "PrivateScope");
var PrivateScope = _PrivateScope;
var _Parser = class _Parser {
  constructor(source, options = {}) {
    __publicField(this, "source");
    __publicField(this, "options");
    __publicField(this, "lastOnToken", null);
    __publicField(this, "token", 1048576);
    __publicField(this, "flags", 0);
    __publicField(this, "index", 0);
    __publicField(this, "line", 1);
    __publicField(this, "column", 0);
    __publicField(this, "startIndex", 0);
    __publicField(this, "end", 0);
    __publicField(this, "tokenIndex", 0);
    __publicField(this, "startColumn", 0);
    __publicField(this, "tokenColumn", 0);
    __publicField(this, "tokenLine", 1);
    __publicField(this, "startLine", 1);
    __publicField(this, "tokenValue", "");
    __publicField(this, "tokenRaw", "");
    __publicField(this, "tokenRegExp");
    __publicField(this, "currentChar", 0);
    __publicField(this, "exportedNames", /* @__PURE__ */ new Set());
    __publicField(this, "exportedBindings", /* @__PURE__ */ new Set());
    __publicField(this, "assignable", 1);
    __publicField(this, "destructible", 0);
    __publicField(this, "leadingDecorators", { decorators: [] });
    this.source = source;
    this.options = options;
    this.end = source.length;
    this.currentChar = source.charCodeAt(0);
  }
  getToken() {
    return this.token;
  }
  setToken(value, replaceLast = false) {
    this.token = value;
    const { onToken } = this.options;
    if (onToken) {
      if (value !== 1048576) {
        const loc = {
          start: {
            line: this.tokenLine,
            column: this.tokenColumn
          },
          end: {
            line: this.line,
            column: this.column
          }
        };
        if (!replaceLast && this.lastOnToken) {
          onToken(...this.lastOnToken);
        }
        this.lastOnToken = [convertTokenType(value), this.tokenIndex, this.index, loc];
      } else {
        if (this.lastOnToken) {
          onToken(...this.lastOnToken);
          this.lastOnToken = null;
        }
      }
    }
    return value;
  }
  get tokenStart() {
    return {
      index: this.tokenIndex,
      line: this.tokenLine,
      column: this.tokenColumn
    };
  }
  get currentLocation() {
    return { index: this.index, line: this.line, column: this.column };
  }
  finishNode(node, start, end) {
    if (this.options.ranges) {
      node.start = start.index;
      const endIndex = end ? end.index : this.startIndex;
      node.end = endIndex;
      node.range = [start.index, endIndex];
    }
    if (this.options.loc) {
      node.loc = {
        start: {
          line: start.line,
          column: start.column
        },
        end: end ? { line: end.line, column: end.column } : { line: this.startLine, column: this.startColumn }
      };
      if (this.options.source) {
        node.loc.source = this.options.source;
      }
    }
    return node;
  }
  addBindingToExports(name) {
    this.exportedBindings.add(name);
  }
  declareUnboundVariable(name) {
    const { exportedNames } = this;
    if (exportedNames.has(name)) {
      this.report(147, name);
    }
    exportedNames.add(name);
  }
  report(type, ...params) {
    throw new ParseError(this.tokenStart, this.currentLocation, type, ...params);
  }
  createScopeIfLexical(type, parent) {
    if (this.options.lexical) {
      return this.createScope(type, parent);
    }
    return void 0;
  }
  createScope(type, parent) {
    return new Scope(this, type, parent);
  }
  createPrivateScopeIfLexical(parent) {
    if (this.options.lexical) {
      return new PrivateScope(this, parent);
    }
    return void 0;
  }
};
__name(_Parser, "Parser");
var Parser = _Parser;
function pushComment(comments, options) {
  return function(type, value, start, end, loc) {
    const comment = {
      type,
      value
    };
    if (options.ranges) {
      comment.start = start;
      comment.end = end;
      comment.range = [start, end];
    }
    if (options.loc) {
      comment.loc = loc;
    }
    comments.push(comment);
  };
}
__name(pushComment, "pushComment");
function pushToken(tokens, options) {
  return function(type, start, end, loc) {
    const token = {
      token: type
    };
    if (options.ranges) {
      token.start = start;
      token.end = end;
      token.range = [start, end];
    }
    if (options.loc) {
      token.loc = loc;
    }
    tokens.push(token);
  };
}
__name(pushToken, "pushToken");
function normalizeOptions(rawOptions) {
  const options = { ...rawOptions };
  if (options.onComment) {
    options.onComment = Array.isArray(options.onComment) ? pushComment(options.onComment, options) : options.onComment;
  }
  if (options.onToken) {
    options.onToken = Array.isArray(options.onToken) ? pushToken(options.onToken, options) : options.onToken;
  }
  return options;
}
__name(normalizeOptions, "normalizeOptions");
function parseSource(source, rawOptions = {}, context = 0) {
  const options = normalizeOptions(rawOptions);
  if (options.module)
    context |= 2 | 1;
  if (options.globalReturn)
    context |= 4096;
  if (options.impliedStrict)
    context |= 1;
  const parser = new Parser(source, options);
  skipHashBang(parser);
  const scope = parser.createScopeIfLexical();
  let body = [];
  let sourceType = "script";
  if (context & 2) {
    sourceType = "module";
    body = parseModuleItemList(parser, context | 8, scope);
    if (scope) {
      for (const name of parser.exportedBindings) {
        if (!scope.hasVariable(name))
          parser.report(148, name);
      }
    }
  } else {
    body = parseStatementList(parser, context | 8, scope);
  }
  return parser.finishNode({
    type: "Program",
    sourceType,
    body
  }, { index: 0, line: 1, column: 0 }, parser.currentLocation);
}
__name(parseSource, "parseSource");
function parseStatementList(parser, context, scope) {
  nextToken(parser, context | 32 | 262144);
  const statements = [];
  while (parser.getToken() === 134283267) {
    const { index, tokenValue, tokenStart, tokenIndex } = parser;
    const token = parser.getToken();
    const expr = parseLiteral(parser, context);
    if (isValidStrictMode(parser, index, tokenIndex, tokenValue)) {
      context |= 1;
      if (parser.flags & 64) {
        throw new ParseError(parser.tokenStart, parser.currentLocation, 9);
      }
      if (parser.flags & 4096) {
        throw new ParseError(parser.tokenStart, parser.currentLocation, 15);
      }
    }
    statements.push(parseDirective(parser, context, expr, token, tokenStart));
  }
  while (parser.getToken() !== 1048576) {
    statements.push(parseStatementListItem(parser, context, scope, void 0, 4, {}));
  }
  return statements;
}
__name(parseStatementList, "parseStatementList");
function parseModuleItemList(parser, context, scope) {
  nextToken(parser, context | 32);
  const statements = [];
  while (parser.getToken() === 134283267) {
    const { tokenStart } = parser;
    const token = parser.getToken();
    statements.push(parseDirective(parser, context, parseLiteral(parser, context), token, tokenStart));
  }
  while (parser.getToken() !== 1048576) {
    statements.push(parseModuleItem(parser, context, scope));
  }
  return statements;
}
__name(parseModuleItemList, "parseModuleItemList");
function parseModuleItem(parser, context, scope) {
  if (parser.getToken() === 132) {
    Object.assign(parser.leadingDecorators, {
      start: parser.tokenStart,
      decorators: parseDecorators(parser, context, void 0)
    });
  }
  let moduleItem;
  switch (parser.getToken()) {
    case 20564:
      moduleItem = parseExportDeclaration(parser, context, scope);
      break;
    case 86106:
      moduleItem = parseImportDeclaration(parser, context, scope);
      break;
    default:
      moduleItem = parseStatementListItem(parser, context, scope, void 0, 4, {});
  }
  if (parser.leadingDecorators?.decorators.length) {
    parser.report(170);
  }
  return moduleItem;
}
__name(parseModuleItem, "parseModuleItem");
function parseStatementListItem(parser, context, scope, privateScope, origin, labels) {
  const start = parser.tokenStart;
  switch (parser.getToken()) {
    case 86104:
      return parseFunctionDeclaration(parser, context, scope, privateScope, origin, 1, 0, 0, start);
    case 132:
    case 86094:
      return parseClassDeclaration(parser, context, scope, privateScope, 0);
    case 86090:
      return parseLexicalDeclaration(parser, context, scope, privateScope, 16, 0);
    case 241737:
      return parseLetIdentOrVarDeclarationStatement(parser, context, scope, privateScope, origin);
    case 20564:
      parser.report(103, "export");
    case 86106:
      nextToken(parser, context);
      switch (parser.getToken()) {
        case 67174411:
          return parseImportCallDeclaration(parser, context, privateScope, start);
        case 67108877:
          return parseImportMetaDeclaration(parser, context, start);
        default:
          parser.report(103, "import");
      }
    case 209005:
      return parseAsyncArrowOrAsyncFunctionDeclaration(parser, context, scope, privateScope, origin, labels, 1);
    default:
      return parseStatement(parser, context, scope, privateScope, origin, labels, 1);
  }
}
__name(parseStatementListItem, "parseStatementListItem");
function parseStatement(parser, context, scope, privateScope, origin, labels, allowFuncDecl) {
  switch (parser.getToken()) {
    case 86088:
      return parseVariableStatement(parser, context, scope, privateScope, 0);
    case 20572:
      return parseReturnStatement(parser, context, privateScope);
    case 20569:
      return parseIfStatement(parser, context, scope, privateScope, labels);
    case 20567:
      return parseForStatement(parser, context, scope, privateScope, labels);
    case 20562:
      return parseDoWhileStatement(parser, context, scope, privateScope, labels);
    case 20578:
      return parseWhileStatement(parser, context, scope, privateScope, labels);
    case 86110:
      return parseSwitchStatement(parser, context, scope, privateScope, labels);
    case 1074790417:
      return parseEmptyStatement(parser, context);
    case 2162700:
      return parseBlock(parser, context, scope?.createChildScope(), privateScope, labels, parser.tokenStart);
    case 86112:
      return parseThrowStatement(parser, context, privateScope);
    case 20555:
      return parseBreakStatement(parser, context, labels);
    case 20559:
      return parseContinueStatement(parser, context, labels);
    case 20577:
      return parseTryStatement(parser, context, scope, privateScope, labels);
    case 20579:
      return parseWithStatement(parser, context, scope, privateScope, labels);
    case 20560:
      return parseDebuggerStatement(parser, context);
    case 209005:
      return parseAsyncArrowOrAsyncFunctionDeclaration(parser, context, scope, privateScope, origin, labels, 0);
    case 20557:
      parser.report(162);
    case 20566:
      parser.report(163);
    case 86104:
      parser.report(context & 1 ? 76 : !parser.options.webcompat ? 78 : 77);
    case 86094:
      parser.report(79);
    default:
      return parseExpressionOrLabelledStatement(parser, context, scope, privateScope, origin, labels, allowFuncDecl);
  }
}
__name(parseStatement, "parseStatement");
function parseExpressionOrLabelledStatement(parser, context, scope, privateScope, origin, labels, allowFuncDecl) {
  const { tokenValue, tokenStart } = parser;
  const token = parser.getToken();
  let expr;
  switch (token) {
    case 241737:
      expr = parseIdentifier(parser, context);
      if (context & 1)
        parser.report(85);
      if (parser.getToken() === 69271571)
        parser.report(84);
      break;
    default:
      expr = parsePrimaryExpression(parser, context, privateScope, 2, 0, 1, 0, 1, parser.tokenStart);
  }
  if (token & 143360 && parser.getToken() === 21) {
    return parseLabelledStatement(parser, context, scope, privateScope, origin, labels, tokenValue, expr, token, allowFuncDecl, tokenStart);
  }
  expr = parseMemberOrUpdateExpression(parser, context, privateScope, expr, 0, 0, tokenStart);
  expr = parseAssignmentExpression(parser, context, privateScope, 0, 0, tokenStart, expr);
  if (parser.getToken() === 18) {
    expr = parseSequenceExpression(parser, context, privateScope, 0, tokenStart, expr);
  }
  return parseExpressionStatement(parser, context, expr, tokenStart);
}
__name(parseExpressionOrLabelledStatement, "parseExpressionOrLabelledStatement");
function parseBlock(parser, context, scope, privateScope, labels, start = parser.tokenStart, type = "BlockStatement") {
  const body = [];
  consume(parser, context | 32, 2162700);
  while (parser.getToken() !== 1074790415) {
    body.push(parseStatementListItem(parser, context, scope, privateScope, 2, { $: labels }));
  }
  consume(parser, context | 32, 1074790415);
  return parser.finishNode({
    type,
    body
  }, start);
}
__name(parseBlock, "parseBlock");
function parseReturnStatement(parser, context, privateScope) {
  if ((context & 4096) === 0)
    parser.report(92);
  const start = parser.tokenStart;
  nextToken(parser, context | 32);
  const argument = parser.flags & 1 || parser.getToken() & 1048576 ? null : parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
  matchOrInsertSemicolon(parser, context | 32);
  return parser.finishNode({
    type: "ReturnStatement",
    argument
  }, start);
}
__name(parseReturnStatement, "parseReturnStatement");
function parseExpressionStatement(parser, context, expression, start) {
  matchOrInsertSemicolon(parser, context | 32);
  return parser.finishNode({
    type: "ExpressionStatement",
    expression
  }, start);
}
__name(parseExpressionStatement, "parseExpressionStatement");
function parseLabelledStatement(parser, context, scope, privateScope, origin, labels, value, expr, token, allowFuncDecl, start) {
  validateBindingIdentifier(parser, context, 0, token, 1);
  validateAndDeclareLabel(parser, labels, value);
  nextToken(parser, context | 32);
  const body = allowFuncDecl && (context & 1) === 0 && parser.options.webcompat && parser.getToken() === 86104 ? parseFunctionDeclaration(parser, context, scope?.createChildScope(), privateScope, origin, 0, 0, 0, parser.tokenStart) : parseStatement(parser, context, scope, privateScope, origin, labels, allowFuncDecl);
  return parser.finishNode({
    type: "LabeledStatement",
    label: expr,
    body
  }, start);
}
__name(parseLabelledStatement, "parseLabelledStatement");
function parseAsyncArrowOrAsyncFunctionDeclaration(parser, context, scope, privateScope, origin, labels, allowFuncDecl) {
  const { tokenValue, tokenStart: start } = parser;
  const token = parser.getToken();
  let expr = parseIdentifier(parser, context);
  if (parser.getToken() === 21) {
    return parseLabelledStatement(parser, context, scope, privateScope, origin, labels, tokenValue, expr, token, 1, start);
  }
  const asyncNewLine = parser.flags & 1;
  if (!asyncNewLine) {
    if (parser.getToken() === 86104) {
      if (!allowFuncDecl)
        parser.report(123);
      return parseFunctionDeclaration(parser, context, scope, privateScope, origin, 1, 0, 1, start);
    }
    if (isValidIdentifier(context, parser.getToken())) {
      expr = parseAsyncArrowAfterIdent(parser, context, privateScope, 1, start);
      if (parser.getToken() === 18)
        expr = parseSequenceExpression(parser, context, privateScope, 0, start, expr);
      return parseExpressionStatement(parser, context, expr, start);
    }
  }
  if (parser.getToken() === 67174411) {
    expr = parseAsyncArrowOrCallExpression(parser, context, privateScope, expr, 1, 1, 0, asyncNewLine, start);
  } else {
    if (parser.getToken() === 10) {
      classifyIdentifier(parser, context, token);
      if ((token & 36864) === 36864) {
        parser.flags |= 256;
      }
      expr = parseArrowFromIdentifier(parser, context | 2048, privateScope, parser.tokenValue, expr, 0, 1, 0, start);
    }
    parser.assignable = 1;
  }
  expr = parseMemberOrUpdateExpression(parser, context, privateScope, expr, 0, 0, start);
  expr = parseAssignmentExpression(parser, context, privateScope, 0, 0, start, expr);
  parser.assignable = 1;
  if (parser.getToken() === 18) {
    expr = parseSequenceExpression(parser, context, privateScope, 0, start, expr);
  }
  return parseExpressionStatement(parser, context, expr, start);
}
__name(parseAsyncArrowOrAsyncFunctionDeclaration, "parseAsyncArrowOrAsyncFunctionDeclaration");
function parseDirective(parser, context, expression, token, start) {
  const endIndex = parser.startIndex;
  if (token !== 1074790417) {
    parser.assignable = 2;
    expression = parseMemberOrUpdateExpression(parser, context, void 0, expression, 0, 0, start);
    if (parser.getToken() !== 1074790417) {
      expression = parseAssignmentExpression(parser, context, void 0, 0, 0, start, expression);
      if (parser.getToken() === 18) {
        expression = parseSequenceExpression(parser, context, void 0, 0, start, expression);
      }
    }
    matchOrInsertSemicolon(parser, context | 32);
  }
  const node = {
    type: "ExpressionStatement",
    expression
  };
  if (expression.type === "Literal" && typeof expression.value === "string") {
    node.directive = parser.source.slice(start.index + 1, endIndex - 1);
  }
  return parser.finishNode(node, start);
}
__name(parseDirective, "parseDirective");
function parseEmptyStatement(parser, context) {
  const start = parser.tokenStart;
  nextToken(parser, context | 32);
  return parser.finishNode({
    type: "EmptyStatement"
  }, start);
}
__name(parseEmptyStatement, "parseEmptyStatement");
function parseThrowStatement(parser, context, privateScope) {
  const start = parser.tokenStart;
  nextToken(parser, context | 32);
  if (parser.flags & 1)
    parser.report(90);
  const argument = parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
  matchOrInsertSemicolon(parser, context | 32);
  return parser.finishNode({
    type: "ThrowStatement",
    argument
  }, start);
}
__name(parseThrowStatement, "parseThrowStatement");
function parseIfStatement(parser, context, scope, privateScope, labels) {
  const start = parser.tokenStart;
  nextToken(parser, context);
  consume(parser, context | 32, 67174411);
  parser.assignable = 1;
  const test = parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
  consume(parser, context | 32, 16);
  const consequent = parseConsequentOrAlternative(parser, context, scope, privateScope, labels);
  let alternate = null;
  if (parser.getToken() === 20563) {
    nextToken(parser, context | 32);
    alternate = parseConsequentOrAlternative(parser, context, scope, privateScope, labels);
  }
  return parser.finishNode({
    type: "IfStatement",
    test,
    consequent,
    alternate
  }, start);
}
__name(parseIfStatement, "parseIfStatement");
function parseConsequentOrAlternative(parser, context, scope, privateScope, labels) {
  const { tokenStart } = parser;
  return context & 1 || !parser.options.webcompat || parser.getToken() !== 86104 ? parseStatement(parser, context, scope, privateScope, 0, { $: labels }, 0) : parseFunctionDeclaration(parser, context, scope?.createChildScope(), privateScope, 0, 0, 0, 0, tokenStart);
}
__name(parseConsequentOrAlternative, "parseConsequentOrAlternative");
function parseSwitchStatement(parser, context, scope, privateScope, labels) {
  const start = parser.tokenStart;
  nextToken(parser, context);
  consume(parser, context | 32, 67174411);
  const discriminant = parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
  consume(parser, context, 16);
  consume(parser, context, 2162700);
  const cases = [];
  let seenDefault = 0;
  scope = scope?.createChildScope(8);
  while (parser.getToken() !== 1074790415) {
    const { tokenStart } = parser;
    let test = null;
    const consequent = [];
    if (consumeOpt(parser, context | 32, 20556)) {
      test = parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
    } else {
      consume(parser, context | 32, 20561);
      if (seenDefault)
        parser.report(89);
      seenDefault = 1;
    }
    consume(parser, context | 32, 21);
    while (parser.getToken() !== 20556 && parser.getToken() !== 1074790415 && parser.getToken() !== 20561) {
      consequent.push(parseStatementListItem(parser, context | 4, scope, privateScope, 2, {
        $: labels
      }));
    }
    cases.push(parser.finishNode({
      type: "SwitchCase",
      test,
      consequent
    }, tokenStart));
  }
  consume(parser, context | 32, 1074790415);
  return parser.finishNode({
    type: "SwitchStatement",
    discriminant,
    cases
  }, start);
}
__name(parseSwitchStatement, "parseSwitchStatement");
function parseWhileStatement(parser, context, scope, privateScope, labels) {
  const start = parser.tokenStart;
  nextToken(parser, context);
  consume(parser, context | 32, 67174411);
  const test = parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
  consume(parser, context | 32, 16);
  const body = parseIterationStatementBody(parser, context, scope, privateScope, labels);
  return parser.finishNode({
    type: "WhileStatement",
    test,
    body
  }, start);
}
__name(parseWhileStatement, "parseWhileStatement");
function parseIterationStatementBody(parser, context, scope, privateScope, labels) {
  return parseStatement(parser, (context | 131072) ^ 131072 | 128, scope, privateScope, 0, { loop: 1, $: labels }, 0);
}
__name(parseIterationStatementBody, "parseIterationStatementBody");
function parseContinueStatement(parser, context, labels) {
  if ((context & 128) === 0)
    parser.report(68);
  const start = parser.tokenStart;
  nextToken(parser, context);
  let label = null;
  if ((parser.flags & 1) === 0 && parser.getToken() & 143360) {
    const { tokenValue } = parser;
    label = parseIdentifier(parser, context | 32);
    if (!isValidLabel(parser, labels, tokenValue, 1))
      parser.report(138, tokenValue);
  }
  matchOrInsertSemicolon(parser, context | 32);
  return parser.finishNode({
    type: "ContinueStatement",
    label
  }, start);
}
__name(parseContinueStatement, "parseContinueStatement");
function parseBreakStatement(parser, context, labels) {
  const start = parser.tokenStart;
  nextToken(parser, context | 32);
  let label = null;
  if ((parser.flags & 1) === 0 && parser.getToken() & 143360) {
    const { tokenValue } = parser;
    label = parseIdentifier(parser, context | 32);
    if (!isValidLabel(parser, labels, tokenValue, 0))
      parser.report(138, tokenValue);
  } else if ((context & (4 | 128)) === 0) {
    parser.report(69);
  }
  matchOrInsertSemicolon(parser, context | 32);
  return parser.finishNode({
    type: "BreakStatement",
    label
  }, start);
}
__name(parseBreakStatement, "parseBreakStatement");
function parseWithStatement(parser, context, scope, privateScope, labels) {
  const start = parser.tokenStart;
  nextToken(parser, context);
  if (context & 1)
    parser.report(91);
  consume(parser, context | 32, 67174411);
  const object = parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
  consume(parser, context | 32, 16);
  const body = parseStatement(parser, context, scope, privateScope, 2, labels, 0);
  return parser.finishNode({
    type: "WithStatement",
    object,
    body
  }, start);
}
__name(parseWithStatement, "parseWithStatement");
function parseDebuggerStatement(parser, context) {
  const start = parser.tokenStart;
  nextToken(parser, context | 32);
  matchOrInsertSemicolon(parser, context | 32);
  return parser.finishNode({
    type: "DebuggerStatement"
  }, start);
}
__name(parseDebuggerStatement, "parseDebuggerStatement");
function parseTryStatement(parser, context, scope, privateScope, labels) {
  const start = parser.tokenStart;
  nextToken(parser, context | 32);
  const firstScope = scope?.createChildScope(16);
  const block = parseBlock(parser, context, firstScope, privateScope, { $: labels });
  const { tokenStart } = parser;
  const handler = consumeOpt(parser, context | 32, 20557) ? parseCatchBlock(parser, context, scope, privateScope, labels, tokenStart) : null;
  let finalizer = null;
  if (parser.getToken() === 20566) {
    nextToken(parser, context | 32);
    const finalizerScope = scope?.createChildScope(4);
    const block2 = parseBlock(parser, context, finalizerScope, privateScope, { $: labels });
    finalizer = block2;
  }
  if (!handler && !finalizer) {
    parser.report(88);
  }
  return parser.finishNode({
    type: "TryStatement",
    block,
    handler,
    finalizer
  }, start);
}
__name(parseTryStatement, "parseTryStatement");
function parseCatchBlock(parser, context, scope, privateScope, labels, start) {
  let param = null;
  let additionalScope = scope;
  if (consumeOpt(parser, context, 67174411)) {
    scope = scope?.createChildScope(4);
    param = parseBindingPattern(parser, context, scope, privateScope, (parser.getToken() & 2097152) === 2097152 ? 256 : 512, 0);
    if (parser.getToken() === 18) {
      parser.report(86);
    } else if (parser.getToken() === 1077936155) {
      parser.report(87);
    }
    consume(parser, context | 32, 16);
  }
  additionalScope = scope?.createChildScope(32);
  const body = parseBlock(parser, context, additionalScope, privateScope, { $: labels });
  return parser.finishNode({
    type: "CatchClause",
    param,
    body
  }, start);
}
__name(parseCatchBlock, "parseCatchBlock");
function parseStaticBlock(parser, context, scope, privateScope, start) {
  scope = scope?.createChildScope();
  const ctorContext = 512 | 4096 | 1024 | 4 | 128;
  context = (context | ctorContext) ^ ctorContext | 256 | 2048 | 524288 | 65536;
  return parseBlock(parser, context, scope, privateScope, {}, start, "StaticBlock");
}
__name(parseStaticBlock, "parseStaticBlock");
function parseDoWhileStatement(parser, context, scope, privateScope, labels) {
  const start = parser.tokenStart;
  nextToken(parser, context | 32);
  const body = parseIterationStatementBody(parser, context, scope, privateScope, labels);
  consume(parser, context, 20578);
  consume(parser, context | 32, 67174411);
  const test = parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
  consume(parser, context | 32, 16);
  consumeOpt(parser, context | 32, 1074790417);
  return parser.finishNode({
    type: "DoWhileStatement",
    body,
    test
  }, start);
}
__name(parseDoWhileStatement, "parseDoWhileStatement");
function parseLetIdentOrVarDeclarationStatement(parser, context, scope, privateScope, origin) {
  const { tokenValue, tokenStart } = parser;
  const token = parser.getToken();
  let expr = parseIdentifier(parser, context);
  if (parser.getToken() & (143360 | 2097152)) {
    const declarations = parseVariableDeclarationList(parser, context, scope, privateScope, 8, 0);
    matchOrInsertSemicolon(parser, context | 32);
    return parser.finishNode({
      type: "VariableDeclaration",
      kind: "let",
      declarations
    }, tokenStart);
  }
  parser.assignable = 1;
  if (context & 1)
    parser.report(85);
  if (parser.getToken() === 21) {
    return parseLabelledStatement(parser, context, scope, privateScope, origin, {}, tokenValue, expr, token, 0, tokenStart);
  }
  if (parser.getToken() === 10) {
    let scope2 = void 0;
    if (parser.options.lexical)
      scope2 = createArrowHeadParsingScope(parser, context, tokenValue);
    parser.flags = (parser.flags | 128) ^ 128;
    expr = parseArrowFunctionExpression(parser, context, scope2, privateScope, [expr], 0, tokenStart);
  } else {
    expr = parseMemberOrUpdateExpression(parser, context, privateScope, expr, 0, 0, tokenStart);
    expr = parseAssignmentExpression(parser, context, privateScope, 0, 0, tokenStart, expr);
  }
  if (parser.getToken() === 18) {
    expr = parseSequenceExpression(parser, context, privateScope, 0, tokenStart, expr);
  }
  return parseExpressionStatement(parser, context, expr, tokenStart);
}
__name(parseLetIdentOrVarDeclarationStatement, "parseLetIdentOrVarDeclarationStatement");
function parseLexicalDeclaration(parser, context, scope, privateScope, kind, origin) {
  const start = parser.tokenStart;
  nextToken(parser, context);
  const declarations = parseVariableDeclarationList(parser, context, scope, privateScope, kind, origin);
  matchOrInsertSemicolon(parser, context | 32);
  return parser.finishNode({
    type: "VariableDeclaration",
    kind: kind & 8 ? "let" : "const",
    declarations
  }, start);
}
__name(parseLexicalDeclaration, "parseLexicalDeclaration");
function parseVariableStatement(parser, context, scope, privateScope, origin) {
  const start = parser.tokenStart;
  nextToken(parser, context);
  const declarations = parseVariableDeclarationList(parser, context, scope, privateScope, 4, origin);
  matchOrInsertSemicolon(parser, context | 32);
  return parser.finishNode({
    type: "VariableDeclaration",
    kind: "var",
    declarations
  }, start);
}
__name(parseVariableStatement, "parseVariableStatement");
function parseVariableDeclarationList(parser, context, scope, privateScope, kind, origin) {
  let bindingCount = 1;
  const list = [
    parseVariableDeclaration(parser, context, scope, privateScope, kind, origin)
  ];
  while (consumeOpt(parser, context, 18)) {
    bindingCount++;
    list.push(parseVariableDeclaration(parser, context, scope, privateScope, kind, origin));
  }
  if (bindingCount > 1 && origin & 32 && parser.getToken() & 262144) {
    parser.report(61, KeywordDescTable[parser.getToken() & 255]);
  }
  return list;
}
__name(parseVariableDeclarationList, "parseVariableDeclarationList");
function parseVariableDeclaration(parser, context, scope, privateScope, kind, origin) {
  const { tokenStart } = parser;
  const token = parser.getToken();
  let init = null;
  const id = parseBindingPattern(parser, context, scope, privateScope, kind, origin);
  if (parser.getToken() === 1077936155) {
    nextToken(parser, context | 32);
    init = parseExpression(parser, context, privateScope, 1, 0, parser.tokenStart);
    if (origin & 32 || (token & 2097152) === 0) {
      if (parser.getToken() === 471156 || parser.getToken() === 8673330 && (token & 2097152 || (kind & 4) === 0 || context & 1)) {
        throw new ParseError(tokenStart, parser.currentLocation, 60, parser.getToken() === 471156 ? "of" : "in");
      }
    }
  } else if ((kind & 16 || (token & 2097152) > 0) && (parser.getToken() & 262144) !== 262144) {
    parser.report(59, kind & 16 ? "const" : "destructuring");
  }
  return parser.finishNode({
    type: "VariableDeclarator",
    id,
    init
  }, tokenStart);
}
__name(parseVariableDeclaration, "parseVariableDeclaration");
function parseForStatement(parser, context, scope, privateScope, labels) {
  const start = parser.tokenStart;
  nextToken(parser, context);
  const forAwait = ((context & 2048) > 0 || (context & 2) > 0 && (context & 8) > 0) && consumeOpt(parser, context, 209006);
  consume(parser, context | 32, 67174411);
  scope = scope?.createChildScope(1);
  let test = null;
  let update = null;
  let destructible = 0;
  let init = null;
  let isVarDecl = parser.getToken() === 86088 || parser.getToken() === 241737 || parser.getToken() === 86090;
  let right;
  const { tokenStart } = parser;
  const token = parser.getToken();
  if (isVarDecl) {
    if (token === 241737) {
      init = parseIdentifier(parser, context);
      if (parser.getToken() & (143360 | 2097152)) {
        if (parser.getToken() === 8673330) {
          if (context & 1)
            parser.report(67);
        } else {
          init = parser.finishNode({
            type: "VariableDeclaration",
            kind: "let",
            declarations: parseVariableDeclarationList(parser, context | 131072, scope, privateScope, 8, 32)
          }, tokenStart);
        }
        parser.assignable = 1;
      } else if (context & 1) {
        parser.report(67);
      } else {
        isVarDecl = false;
        parser.assignable = 1;
        init = parseMemberOrUpdateExpression(parser, context, privateScope, init, 0, 0, tokenStart);
        if (parser.getToken() === 471156)
          parser.report(115);
      }
    } else {
      nextToken(parser, context);
      init = parser.finishNode(token === 86088 ? {
        type: "VariableDeclaration",
        kind: "var",
        declarations: parseVariableDeclarationList(parser, context | 131072, scope, privateScope, 4, 32)
      } : {
        type: "VariableDeclaration",
        kind: "const",
        declarations: parseVariableDeclarationList(parser, context | 131072, scope, privateScope, 16, 32)
      }, tokenStart);
      parser.assignable = 1;
    }
  } else if (token === 1074790417) {
    if (forAwait)
      parser.report(82);
  } else if ((token & 2097152) === 2097152) {
    const patternStart = parser.tokenStart;
    init = token === 2162700 ? parseObjectLiteralOrPattern(parser, context, void 0, privateScope, 1, 0, 0, 2, 32) : parseArrayExpressionOrPattern(parser, context, void 0, privateScope, 1, 0, 0, 2, 32);
    destructible = parser.destructible;
    if (destructible & 64) {
      parser.report(63);
    }
    parser.assignable = destructible & 16 ? 2 : 1;
    init = parseMemberOrUpdateExpression(parser, context | 131072, privateScope, init, 0, 0, patternStart);
  } else {
    init = parseLeftHandSideExpression(parser, context | 131072, privateScope, 1, 0, 1);
  }
  if ((parser.getToken() & 262144) === 262144) {
    if (parser.getToken() === 471156) {
      if (parser.assignable & 2)
        parser.report(80, forAwait ? "await" : "of");
      reinterpretToPattern(parser, init);
      nextToken(parser, context | 32);
      right = parseExpression(parser, context, privateScope, 1, 0, parser.tokenStart);
      consume(parser, context | 32, 16);
      const body3 = parseIterationStatementBody(parser, context, scope, privateScope, labels);
      return parser.finishNode({
        type: "ForOfStatement",
        left: init,
        right,
        body: body3,
        await: forAwait
      }, start);
    }
    if (parser.assignable & 2)
      parser.report(80, "in");
    reinterpretToPattern(parser, init);
    nextToken(parser, context | 32);
    if (forAwait)
      parser.report(82);
    right = parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
    consume(parser, context | 32, 16);
    const body2 = parseIterationStatementBody(parser, context, scope, privateScope, labels);
    return parser.finishNode({
      type: "ForInStatement",
      body: body2,
      left: init,
      right
    }, start);
  }
  if (forAwait)
    parser.report(82);
  if (!isVarDecl) {
    if (destructible & 8 && parser.getToken() !== 1077936155) {
      parser.report(80, "loop");
    }
    init = parseAssignmentExpression(parser, context | 131072, privateScope, 0, 0, tokenStart, init);
  }
  if (parser.getToken() === 18)
    init = parseSequenceExpression(parser, context, privateScope, 0, tokenStart, init);
  consume(parser, context | 32, 1074790417);
  if (parser.getToken() !== 1074790417)
    test = parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
  consume(parser, context | 32, 1074790417);
  if (parser.getToken() !== 16)
    update = parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart);
  consume(parser, context | 32, 16);
  const body = parseIterationStatementBody(parser, context, scope, privateScope, labels);
  return parser.finishNode({
    type: "ForStatement",
    init,
    test,
    update,
    body
  }, start);
}
__name(parseForStatement, "parseForStatement");
function parseRestrictedIdentifier(parser, context, scope) {
  if (!isValidIdentifier(context, parser.getToken()))
    parser.report(118);
  if ((parser.getToken() & 537079808) === 537079808)
    parser.report(119);
  scope?.addBlockName(context, parser.tokenValue, 8, 0);
  return parseIdentifier(parser, context);
}
__name(parseRestrictedIdentifier, "parseRestrictedIdentifier");
function parseImportDeclaration(parser, context, scope) {
  const start = parser.tokenStart;
  nextToken(parser, context);
  let source = null;
  const { tokenStart } = parser;
  let specifiers = [];
  if (parser.getToken() === 134283267) {
    source = parseLiteral(parser, context);
  } else {
    if (parser.getToken() & 143360) {
      const local = parseRestrictedIdentifier(parser, context, scope);
      specifiers = [
        parser.finishNode({
          type: "ImportDefaultSpecifier",
          local
        }, tokenStart)
      ];
      if (consumeOpt(parser, context, 18)) {
        switch (parser.getToken()) {
          case 8391476:
            specifiers.push(parseImportNamespaceSpecifier(parser, context, scope));
            break;
          case 2162700:
            parseImportSpecifierOrNamedImports(parser, context, scope, specifiers);
            break;
          default:
            parser.report(107);
        }
      }
    } else {
      switch (parser.getToken()) {
        case 8391476:
          specifiers = [parseImportNamespaceSpecifier(parser, context, scope)];
          break;
        case 2162700:
          parseImportSpecifierOrNamedImports(parser, context, scope, specifiers);
          break;
        case 67174411:
          return parseImportCallDeclaration(parser, context, void 0, start);
        case 67108877:
          return parseImportMetaDeclaration(parser, context, start);
        default:
          parser.report(30, KeywordDescTable[parser.getToken() & 255]);
      }
    }
    source = parseModuleSpecifier(parser, context);
  }
  const attributes = parseImportAttributes(parser, context);
  const node = {
    type: "ImportDeclaration",
    specifiers,
    source,
    attributes
  };
  matchOrInsertSemicolon(parser, context | 32);
  return parser.finishNode(node, start);
}
__name(parseImportDeclaration, "parseImportDeclaration");
function parseImportNamespaceSpecifier(parser, context, scope) {
  const { tokenStart } = parser;
  nextToken(parser, context);
  consume(parser, context, 77932);
  if ((parser.getToken() & 134217728) === 134217728) {
    throw new ParseError(tokenStart, parser.currentLocation, 30, KeywordDescTable[parser.getToken() & 255]);
  }
  return parser.finishNode({
    type: "ImportNamespaceSpecifier",
    local: parseRestrictedIdentifier(parser, context, scope)
  }, tokenStart);
}
__name(parseImportNamespaceSpecifier, "parseImportNamespaceSpecifier");
function parseModuleSpecifier(parser, context) {
  consume(parser, context, 209011);
  if (parser.getToken() !== 134283267)
    parser.report(105, "Import");
  return parseLiteral(parser, context);
}
__name(parseModuleSpecifier, "parseModuleSpecifier");
function parseImportSpecifierOrNamedImports(parser, context, scope, specifiers) {
  nextToken(parser, context);
  while (parser.getToken() & 143360 || parser.getToken() === 134283267) {
    let { tokenValue, tokenStart } = parser;
    const token = parser.getToken();
    const imported = parseModuleExportName(parser, context);
    let local;
    if (consumeOpt(parser, context, 77932)) {
      if ((parser.getToken() & 134217728) === 134217728 || parser.getToken() === 18) {
        parser.report(106);
      } else {
        validateBindingIdentifier(parser, context, 16, parser.getToken(), 0);
      }
      tokenValue = parser.tokenValue;
      local = parseIdentifier(parser, context);
    } else if (imported.type === "Identifier") {
      validateBindingIdentifier(parser, context, 16, token, 0);
      local = imported;
    } else {
      parser.report(25, KeywordDescTable[77932 & 255]);
    }
    scope?.addBlockName(context, tokenValue, 8, 0);
    specifiers.push(parser.finishNode({
      type: "ImportSpecifier",
      local,
      imported
    }, tokenStart));
    if (parser.getToken() !== 1074790415)
      consume(parser, context, 18);
  }
  consume(parser, context, 1074790415);
  return specifiers;
}
__name(parseImportSpecifierOrNamedImports, "parseImportSpecifierOrNamedImports");
function parseImportMetaDeclaration(parser, context, start) {
  let expr = parseImportMetaExpression(parser, context, parser.finishNode({
    type: "Identifier",
    name: "import"
  }, start), start);
  expr = parseMemberOrUpdateExpression(parser, context, void 0, expr, 0, 0, start);
  expr = parseAssignmentExpression(parser, context, void 0, 0, 0, start, expr);
  if (parser.getToken() === 18) {
    expr = parseSequenceExpression(parser, context, void 0, 0, start, expr);
  }
  return parseExpressionStatement(parser, context, expr, start);
}
__name(parseImportMetaDeclaration, "parseImportMetaDeclaration");
function parseImportCallDeclaration(parser, context, privateScope, start) {
  let expr = parseImportExpression(parser, context, privateScope, 0, start);
  expr = parseMemberOrUpdateExpression(parser, context, privateScope, expr, 0, 0, start);
  if (parser.getToken() === 18) {
    expr = parseSequenceExpression(parser, context, privateScope, 0, start, expr);
  }
  return parseExpressionStatement(parser, context, expr, start);
}
__name(parseImportCallDeclaration, "parseImportCallDeclaration");
function parseExportDeclaration(parser, context, scope) {
  const start = parser.leadingDecorators.decorators.length ? parser.leadingDecorators.start : parser.tokenStart;
  nextToken(parser, context | 32);
  const specifiers = [];
  let declaration = null;
  let source = null;
  let attributes = [];
  if (consumeOpt(parser, context | 32, 20561)) {
    switch (parser.getToken()) {
      case 86104: {
        declaration = parseFunctionDeclaration(parser, context, scope, void 0, 4, 1, 1, 0, parser.tokenStart);
        break;
      }
      case 132:
      case 86094:
        declaration = parseClassDeclaration(parser, context, scope, void 0, 1);
        break;
      case 209005: {
        const { tokenStart } = parser;
        declaration = parseIdentifier(parser, context);
        const { flags } = parser;
        if ((flags & 1) === 0) {
          if (parser.getToken() === 86104) {
            declaration = parseFunctionDeclaration(parser, context, scope, void 0, 4, 1, 1, 1, tokenStart);
          } else {
            if (parser.getToken() === 67174411) {
              declaration = parseAsyncArrowOrCallExpression(parser, context, void 0, declaration, 1, 1, 0, flags, tokenStart);
              declaration = parseMemberOrUpdateExpression(parser, context, void 0, declaration, 0, 0, tokenStart);
              declaration = parseAssignmentExpression(parser, context, void 0, 0, 0, tokenStart, declaration);
            } else if (parser.getToken() & 143360) {
              if (scope)
                scope = createArrowHeadParsingScope(parser, context, parser.tokenValue);
              declaration = parseIdentifier(parser, context);
              declaration = parseArrowFunctionExpression(parser, context, scope, void 0, [declaration], 1, tokenStart);
            }
          }
        }
        break;
      }
      default:
        declaration = parseExpression(parser, context, void 0, 1, 0, parser.tokenStart);
        matchOrInsertSemicolon(parser, context | 32);
    }
    if (scope)
      parser.declareUnboundVariable("default");
    return parser.finishNode({
      type: "ExportDefaultDeclaration",
      declaration
    }, start);
  }
  switch (parser.getToken()) {
    case 8391476: {
      nextToken(parser, context);
      let exported = null;
      const isNamedDeclaration = consumeOpt(parser, context, 77932);
      if (isNamedDeclaration) {
        if (scope)
          parser.declareUnboundVariable(parser.tokenValue);
        exported = parseModuleExportName(parser, context);
      }
      consume(parser, context, 209011);
      if (parser.getToken() !== 134283267)
        parser.report(105, "Export");
      source = parseLiteral(parser, context);
      const attributes2 = parseImportAttributes(parser, context);
      const node2 = {
        type: "ExportAllDeclaration",
        source,
        exported,
        attributes: attributes2
      };
      matchOrInsertSemicolon(parser, context | 32);
      return parser.finishNode(node2, start);
    }
    case 2162700: {
      nextToken(parser, context);
      const tmpExportedNames = [];
      const tmpExportedBindings = [];
      let hasLiteralLocal = 0;
      while (parser.getToken() & 143360 || parser.getToken() === 134283267) {
        const { tokenStart, tokenValue } = parser;
        const local = parseModuleExportName(parser, context);
        if (local.type === "Literal") {
          hasLiteralLocal = 1;
        }
        let exported;
        if (parser.getToken() === 77932) {
          nextToken(parser, context);
          if ((parser.getToken() & 143360) === 0 && parser.getToken() !== 134283267) {
            parser.report(106);
          }
          if (scope) {
            tmpExportedNames.push(parser.tokenValue);
            tmpExportedBindings.push(tokenValue);
          }
          exported = parseModuleExportName(parser, context);
        } else {
          if (scope) {
            tmpExportedNames.push(parser.tokenValue);
            tmpExportedBindings.push(parser.tokenValue);
          }
          exported = local;
        }
        specifiers.push(parser.finishNode({
          type: "ExportSpecifier",
          local,
          exported
        }, tokenStart));
        if (parser.getToken() !== 1074790415)
          consume(parser, context, 18);
      }
      consume(parser, context, 1074790415);
      if (consumeOpt(parser, context, 209011)) {
        if (parser.getToken() !== 134283267)
          parser.report(105, "Export");
        source = parseLiteral(parser, context);
        attributes = parseImportAttributes(parser, context);
        if (scope) {
          tmpExportedNames.forEach((n) => parser.declareUnboundVariable(n));
        }
      } else {
        if (hasLiteralLocal) {
          parser.report(172);
        }
        if (scope) {
          tmpExportedNames.forEach((n) => parser.declareUnboundVariable(n));
          tmpExportedBindings.forEach((b) => parser.addBindingToExports(b));
        }
      }
      matchOrInsertSemicolon(parser, context | 32);
      break;
    }
    case 132:
    case 86094:
      declaration = parseClassDeclaration(parser, context, scope, void 0, 2);
      break;
    case 86104:
      declaration = parseFunctionDeclaration(parser, context, scope, void 0, 4, 1, 2, 0, parser.tokenStart);
      break;
    case 241737:
      declaration = parseLexicalDeclaration(parser, context, scope, void 0, 8, 64);
      break;
    case 86090:
      declaration = parseLexicalDeclaration(parser, context, scope, void 0, 16, 64);
      break;
    case 86088:
      declaration = parseVariableStatement(parser, context, scope, void 0, 64);
      break;
    case 209005: {
      const { tokenStart } = parser;
      nextToken(parser, context);
      if ((parser.flags & 1) === 0 && parser.getToken() === 86104) {
        declaration = parseFunctionDeclaration(parser, context, scope, void 0, 4, 1, 2, 1, tokenStart);
        break;
      }
    }
    default:
      parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  }
  const node = {
    type: "ExportNamedDeclaration",
    declaration,
    specifiers,
    source,
    attributes
  };
  return parser.finishNode(node, start);
}
__name(parseExportDeclaration, "parseExportDeclaration");
function parseExpression(parser, context, privateScope, canAssign, inGroup, start) {
  let expr = parsePrimaryExpression(parser, context, privateScope, 2, 0, canAssign, inGroup, 1, start);
  expr = parseMemberOrUpdateExpression(parser, context, privateScope, expr, inGroup, 0, start);
  return parseAssignmentExpression(parser, context, privateScope, inGroup, 0, start, expr);
}
__name(parseExpression, "parseExpression");
function parseSequenceExpression(parser, context, privateScope, inGroup, start, expr) {
  const expressions = [expr];
  while (consumeOpt(parser, context | 32, 18)) {
    expressions.push(parseExpression(parser, context, privateScope, 1, inGroup, parser.tokenStart));
  }
  return parser.finishNode({
    type: "SequenceExpression",
    expressions
  }, start);
}
__name(parseSequenceExpression, "parseSequenceExpression");
function parseExpressions(parser, context, privateScope, inGroup, canAssign, start) {
  const expr = parseExpression(parser, context, privateScope, canAssign, inGroup, start);
  return parser.getToken() === 18 ? parseSequenceExpression(parser, context, privateScope, inGroup, start, expr) : expr;
}
__name(parseExpressions, "parseExpressions");
function parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, start, left) {
  const token = parser.getToken();
  if ((token & 4194304) === 4194304) {
    if (parser.assignable & 2)
      parser.report(26);
    if (!isPattern && token === 1077936155 && left.type === "ArrayExpression" || left.type === "ObjectExpression") {
      reinterpretToPattern(parser, left);
    }
    nextToken(parser, context | 32);
    const right = parseExpression(parser, context, privateScope, 1, inGroup, parser.tokenStart);
    parser.assignable = 2;
    return parser.finishNode(isPattern ? {
      type: "AssignmentPattern",
      left,
      right
    } : {
      type: "AssignmentExpression",
      left,
      operator: KeywordDescTable[token & 255],
      right
    }, start);
  }
  if ((token & 8388608) === 8388608) {
    left = parseBinaryExpression(parser, context, privateScope, inGroup, start, 4, token, left);
  }
  if (consumeOpt(parser, context | 32, 22)) {
    left = parseConditionalExpression(parser, context, privateScope, left, start);
  }
  return left;
}
__name(parseAssignmentExpression, "parseAssignmentExpression");
function parseAssignmentExpressionOrPattern(parser, context, privateScope, inGroup, isPattern, start, left) {
  const token = parser.getToken();
  nextToken(parser, context | 32);
  const right = parseExpression(parser, context, privateScope, 1, inGroup, parser.tokenStart);
  left = parser.finishNode(isPattern ? {
    type: "AssignmentPattern",
    left,
    right
  } : {
    type: "AssignmentExpression",
    left,
    operator: KeywordDescTable[token & 255],
    right
  }, start);
  parser.assignable = 2;
  return left;
}
__name(parseAssignmentExpressionOrPattern, "parseAssignmentExpressionOrPattern");
function parseConditionalExpression(parser, context, privateScope, test, start) {
  const consequent = parseExpression(parser, (context | 131072) ^ 131072, privateScope, 1, 0, parser.tokenStart);
  consume(parser, context | 32, 21);
  parser.assignable = 1;
  const alternate = parseExpression(parser, context, privateScope, 1, 0, parser.tokenStart);
  parser.assignable = 2;
  return parser.finishNode({
    type: "ConditionalExpression",
    test,
    consequent,
    alternate
  }, start);
}
__name(parseConditionalExpression, "parseConditionalExpression");
function parseBinaryExpression(parser, context, privateScope, inGroup, start, minPrecedence, operator, left) {
  const bit = -((context & 131072) > 0) & 8673330;
  let t;
  let precedence;
  parser.assignable = 2;
  while (parser.getToken() & 8388608) {
    t = parser.getToken();
    precedence = t & 3840;
    if (t & 524288 && operator & 268435456 || operator & 524288 && t & 268435456) {
      parser.report(165);
    }
    if (precedence + ((t === 8391735) << 8) - ((bit === t) << 12) <= minPrecedence)
      break;
    nextToken(parser, context | 32);
    left = parser.finishNode({
      type: t & 524288 || t & 268435456 ? "LogicalExpression" : "BinaryExpression",
      left,
      right: parseBinaryExpression(parser, context, privateScope, inGroup, parser.tokenStart, precedence, t, parseLeftHandSideExpression(parser, context, privateScope, 0, inGroup, 1)),
      operator: KeywordDescTable[t & 255]
    }, start);
  }
  if (parser.getToken() === 1077936155)
    parser.report(26);
  return left;
}
__name(parseBinaryExpression, "parseBinaryExpression");
function parseUnaryExpression(parser, context, privateScope, isLHS, inGroup) {
  if (!isLHS)
    parser.report(0);
  const { tokenStart } = parser;
  const unaryOperator = parser.getToken();
  nextToken(parser, context | 32);
  const arg = parseLeftHandSideExpression(parser, context, privateScope, 0, inGroup, 1);
  if (parser.getToken() === 8391735)
    parser.report(33);
  if (context & 1 && unaryOperator === 16863276) {
    if (arg.type === "Identifier") {
      parser.report(121);
    } else if (isPropertyWithPrivateFieldKey(arg)) {
      parser.report(127);
    }
  }
  parser.assignable = 2;
  return parser.finishNode({
    type: "UnaryExpression",
    operator: KeywordDescTable[unaryOperator & 255],
    argument: arg,
    prefix: true
  }, tokenStart);
}
__name(parseUnaryExpression, "parseUnaryExpression");
function parseAsyncExpression(parser, context, privateScope, inGroup, isLHS, canAssign, inNew, start) {
  const token = parser.getToken();
  const expr = parseIdentifier(parser, context);
  const { flags } = parser;
  if ((flags & 1) === 0) {
    if (parser.getToken() === 86104) {
      return parseFunctionExpression(parser, context, privateScope, 1, inGroup, start);
    }
    if (isValidIdentifier(context, parser.getToken())) {
      if (!isLHS)
        parser.report(0);
      if ((parser.getToken() & 36864) === 36864) {
        parser.flags |= 256;
      }
      return parseAsyncArrowAfterIdent(parser, context, privateScope, canAssign, start);
    }
  }
  if (!inNew && parser.getToken() === 67174411) {
    return parseAsyncArrowOrCallExpression(parser, context, privateScope, expr, canAssign, 1, 0, flags, start);
  }
  if (parser.getToken() === 10) {
    classifyIdentifier(parser, context, token);
    if (inNew)
      parser.report(51);
    if ((token & 36864) === 36864) {
      parser.flags |= 256;
    }
    return parseArrowFromIdentifier(parser, context, privateScope, parser.tokenValue, expr, inNew, canAssign, 0, start);
  }
  parser.assignable = 1;
  return expr;
}
__name(parseAsyncExpression, "parseAsyncExpression");
function parseYieldExpressionOrIdentifier(parser, context, privateScope, inGroup, canAssign, start) {
  if (inGroup)
    parser.destructible |= 256;
  if (context & 1024) {
    nextToken(parser, context | 32);
    if (context & 8192)
      parser.report(32);
    if (!canAssign)
      parser.report(26);
    if (parser.getToken() === 22)
      parser.report(124);
    let argument = null;
    let delegate = false;
    if ((parser.flags & 1) === 0) {
      delegate = consumeOpt(parser, context | 32, 8391476);
      if (parser.getToken() & (12288 | 65536) || delegate) {
        argument = parseExpression(parser, context, privateScope, 1, 0, parser.tokenStart);
      }
    } else if (parser.getToken() === 8391476) {
      parser.report(30, KeywordDescTable[parser.getToken() & 255]);
    }
    parser.assignable = 2;
    return parser.finishNode({
      type: "YieldExpression",
      argument,
      delegate
    }, start);
  }
  if (context & 1)
    parser.report(97, "yield");
  return parseIdentifierOrArrow(parser, context, privateScope);
}
__name(parseYieldExpressionOrIdentifier, "parseYieldExpressionOrIdentifier");
function parseAwaitExpressionOrIdentifier(parser, context, privateScope, inNew, inGroup, start) {
  if (inGroup)
    parser.destructible |= 128;
  if (context & 524288)
    parser.report(177);
  const possibleIdentifierOrArrowFunc = parseIdentifierOrArrow(parser, context, privateScope);
  const isIdentifier = possibleIdentifierOrArrowFunc.type === "ArrowFunctionExpression" || (parser.getToken() & 65536) === 0;
  if (isIdentifier) {
    if (context & 2048)
      throw new ParseError(start, { index: parser.startIndex, line: parser.startLine, column: parser.startColumn }, 176);
    if (context & 2)
      throw new ParseError(start, { index: parser.startIndex, line: parser.startLine, column: parser.startColumn }, 110);
    if (context & 8192 && context & 2048)
      throw new ParseError(start, { index: parser.startIndex, line: parser.startLine, column: parser.startColumn }, 110);
    return possibleIdentifierOrArrowFunc;
  }
  if (context & 8192) {
    throw new ParseError(start, { index: parser.startIndex, line: parser.startLine, column: parser.startColumn }, 31);
  }
  if (context & 2048 || context & 2 && context & 8) {
    if (inNew)
      throw new ParseError(start, { index: parser.startIndex, line: parser.startLine, column: parser.startColumn }, 0);
    const argument = parseLeftHandSideExpression(parser, context, privateScope, 0, 0, 1);
    if (parser.getToken() === 8391735)
      parser.report(33);
    parser.assignable = 2;
    return parser.finishNode({
      type: "AwaitExpression",
      argument
    }, start);
  }
  if (context & 2)
    throw new ParseError(start, { index: parser.startIndex, line: parser.startLine, column: parser.startColumn }, 98);
  return possibleIdentifierOrArrowFunc;
}
__name(parseAwaitExpressionOrIdentifier, "parseAwaitExpressionOrIdentifier");
function parseFunctionBody(parser, context, scope, privateScope, origin, funcNameToken, functionScope) {
  const { tokenStart } = parser;
  consume(parser, context | 32, 2162700);
  const body = [];
  if (parser.getToken() !== 1074790415) {
    while (parser.getToken() === 134283267) {
      const { index, tokenStart: tokenStart2, tokenIndex, tokenValue } = parser;
      const token = parser.getToken();
      const expr = parseLiteral(parser, context);
      if (isValidStrictMode(parser, index, tokenIndex, tokenValue)) {
        context |= 1;
        if (parser.flags & 128) {
          throw new ParseError(tokenStart2, parser.currentLocation, 66);
        }
        if (parser.flags & 64) {
          throw new ParseError(tokenStart2, parser.currentLocation, 9);
        }
        if (parser.flags & 4096) {
          throw new ParseError(tokenStart2, parser.currentLocation, 15);
        }
        functionScope?.reportScopeError();
      }
      body.push(parseDirective(parser, context, expr, token, tokenStart2));
    }
    if (context & 1) {
      if (funcNameToken) {
        if ((funcNameToken & 537079808) === 537079808) {
          parser.report(119);
        }
        if ((funcNameToken & 36864) === 36864) {
          parser.report(40);
        }
      }
      if (parser.flags & 512)
        parser.report(119);
      if (parser.flags & 256)
        parser.report(118);
    }
  }
  parser.flags = (parser.flags | 512 | 256 | 64 | 4096) ^ (512 | 256 | 64 | 4096);
  parser.destructible = (parser.destructible | 256) ^ 256;
  while (parser.getToken() !== 1074790415) {
    body.push(parseStatementListItem(parser, context, scope, privateScope, 4, {}));
  }
  consume(parser, origin & (16 | 8) ? context | 32 : context, 1074790415);
  parser.flags &= -4289;
  if (parser.getToken() === 1077936155)
    parser.report(26);
  return parser.finishNode({
    type: "BlockStatement",
    body
  }, tokenStart);
}
__name(parseFunctionBody, "parseFunctionBody");
function parseSuperExpression(parser, context) {
  const { tokenStart } = parser;
  nextToken(parser, context);
  switch (parser.getToken()) {
    case 67108990:
      parser.report(167);
    case 67174411: {
      if ((context & 512) === 0)
        parser.report(28);
      parser.assignable = 2;
      break;
    }
    case 69271571:
    case 67108877: {
      if ((context & 256) === 0)
        parser.report(29);
      parser.assignable = 1;
      break;
    }
    default:
      parser.report(30, "super");
  }
  return parser.finishNode({ type: "Super" }, tokenStart);
}
__name(parseSuperExpression, "parseSuperExpression");
function parseLeftHandSideExpression(parser, context, privateScope, canAssign, inGroup, isLHS) {
  const start = parser.tokenStart;
  const expression = parsePrimaryExpression(parser, context, privateScope, 2, 0, canAssign, inGroup, isLHS, start);
  return parseMemberOrUpdateExpression(parser, context, privateScope, expression, inGroup, 0, start);
}
__name(parseLeftHandSideExpression, "parseLeftHandSideExpression");
function parseUpdateExpression(parser, context, expr, start) {
  if (parser.assignable & 2)
    parser.report(55);
  const token = parser.getToken();
  nextToken(parser, context);
  parser.assignable = 2;
  return parser.finishNode({
    type: "UpdateExpression",
    argument: expr,
    operator: KeywordDescTable[token & 255],
    prefix: false
  }, start);
}
__name(parseUpdateExpression, "parseUpdateExpression");
function parseMemberOrUpdateExpression(parser, context, privateScope, expr, inGroup, inChain, start) {
  if ((parser.getToken() & 33619968) === 33619968 && (parser.flags & 1) === 0) {
    expr = parseUpdateExpression(parser, context, expr, start);
  } else if ((parser.getToken() & 67108864) === 67108864) {
    context = (context | 131072) ^ 131072;
    switch (parser.getToken()) {
      case 67108877: {
        nextToken(parser, (context | 262144 | 8) ^ 8);
        if (context & 16 && parser.getToken() === 130 && parser.tokenValue === "super") {
          parser.report(173);
        }
        parser.assignable = 1;
        const property = parsePropertyOrPrivatePropertyName(parser, context | 64, privateScope);
        expr = parser.finishNode({
          type: "MemberExpression",
          object: expr,
          computed: false,
          property,
          optional: false
        }, start);
        break;
      }
      case 69271571: {
        let restoreHasOptionalChaining = false;
        if ((parser.flags & 2048) === 2048) {
          restoreHasOptionalChaining = true;
          parser.flags = (parser.flags | 2048) ^ 2048;
        }
        nextToken(parser, context | 32);
        const { tokenStart } = parser;
        const property = parseExpressions(parser, context, privateScope, inGroup, 1, tokenStart);
        consume(parser, context, 20);
        parser.assignable = 1;
        expr = parser.finishNode({
          type: "MemberExpression",
          object: expr,
          computed: true,
          property,
          optional: false
        }, start);
        if (restoreHasOptionalChaining) {
          parser.flags |= 2048;
        }
        break;
      }
      case 67174411: {
        if ((parser.flags & 1024) === 1024) {
          parser.flags = (parser.flags | 1024) ^ 1024;
          return expr;
        }
        let restoreHasOptionalChaining = false;
        if ((parser.flags & 2048) === 2048) {
          restoreHasOptionalChaining = true;
          parser.flags = (parser.flags | 2048) ^ 2048;
        }
        const args = parseArguments(parser, context, privateScope, inGroup);
        parser.assignable = 2;
        expr = parser.finishNode({
          type: "CallExpression",
          callee: expr,
          arguments: args,
          optional: false
        }, start);
        if (restoreHasOptionalChaining) {
          parser.flags |= 2048;
        }
        break;
      }
      case 67108990: {
        nextToken(parser, (context | 262144 | 8) ^ 8);
        parser.flags |= 2048;
        parser.assignable = 2;
        expr = parseOptionalChain(parser, context, privateScope, expr, start);
        break;
      }
      default:
        if ((parser.flags & 2048) === 2048) {
          parser.report(166);
        }
        parser.assignable = 2;
        expr = parser.finishNode({
          type: "TaggedTemplateExpression",
          tag: expr,
          quasi: parser.getToken() === 67174408 ? parseTemplate(parser, context | 64, privateScope) : parseTemplateLiteral(parser, context)
        }, start);
    }
    expr = parseMemberOrUpdateExpression(parser, context, privateScope, expr, 0, 1, start);
  }
  if (inChain === 0 && (parser.flags & 2048) === 2048) {
    parser.flags = (parser.flags | 2048) ^ 2048;
    expr = parser.finishNode({
      type: "ChainExpression",
      expression: expr
    }, start);
  }
  return expr;
}
__name(parseMemberOrUpdateExpression, "parseMemberOrUpdateExpression");
function parseOptionalChain(parser, context, privateScope, expr, start) {
  let restoreHasOptionalChaining = false;
  let node;
  if (parser.getToken() === 69271571 || parser.getToken() === 67174411) {
    if ((parser.flags & 2048) === 2048) {
      restoreHasOptionalChaining = true;
      parser.flags = (parser.flags | 2048) ^ 2048;
    }
  }
  if (parser.getToken() === 69271571) {
    nextToken(parser, context | 32);
    const { tokenStart } = parser;
    const property = parseExpressions(parser, context, privateScope, 0, 1, tokenStart);
    consume(parser, context, 20);
    parser.assignable = 2;
    node = parser.finishNode({
      type: "MemberExpression",
      object: expr,
      computed: true,
      optional: true,
      property
    }, start);
  } else if (parser.getToken() === 67174411) {
    const args = parseArguments(parser, context, privateScope, 0);
    parser.assignable = 2;
    node = parser.finishNode({
      type: "CallExpression",
      callee: expr,
      arguments: args,
      optional: true
    }, start);
  } else {
    const property = parsePropertyOrPrivatePropertyName(parser, context, privateScope);
    parser.assignable = 2;
    node = parser.finishNode({
      type: "MemberExpression",
      object: expr,
      computed: false,
      optional: true,
      property
    }, start);
  }
  if (restoreHasOptionalChaining) {
    parser.flags |= 2048;
  }
  return node;
}
__name(parseOptionalChain, "parseOptionalChain");
function parsePropertyOrPrivatePropertyName(parser, context, privateScope) {
  if ((parser.getToken() & 143360) === 0 && parser.getToken() !== -2147483528 && parser.getToken() !== -2147483527 && parser.getToken() !== 130) {
    parser.report(160);
  }
  return parser.getToken() === 130 ? parsePrivateIdentifier(parser, context, privateScope, 0) : parseIdentifier(parser, context);
}
__name(parsePropertyOrPrivatePropertyName, "parsePropertyOrPrivatePropertyName");
function parseUpdateExpressionPrefixed(parser, context, privateScope, inNew, isLHS, start) {
  if (inNew)
    parser.report(56);
  if (!isLHS)
    parser.report(0);
  const token = parser.getToken();
  nextToken(parser, context | 32);
  const arg = parseLeftHandSideExpression(parser, context, privateScope, 0, 0, 1);
  if (parser.assignable & 2) {
    parser.report(55);
  }
  parser.assignable = 2;
  return parser.finishNode({
    type: "UpdateExpression",
    argument: arg,
    operator: KeywordDescTable[token & 255],
    prefix: true
  }, start);
}
__name(parseUpdateExpressionPrefixed, "parseUpdateExpressionPrefixed");
function parsePrimaryExpression(parser, context, privateScope, kind, inNew, canAssign, inGroup, isLHS, start) {
  if ((parser.getToken() & 143360) === 143360) {
    switch (parser.getToken()) {
      case 209006:
        return parseAwaitExpressionOrIdentifier(parser, context, privateScope, inNew, inGroup, start);
      case 241771:
        return parseYieldExpressionOrIdentifier(parser, context, privateScope, inGroup, canAssign, start);
      case 209005:
        return parseAsyncExpression(parser, context, privateScope, inGroup, isLHS, canAssign, inNew, start);
    }
    const { tokenValue } = parser;
    const token = parser.getToken();
    const expr = parseIdentifier(parser, context | 64);
    if (parser.getToken() === 10) {
      if (!isLHS)
        parser.report(0);
      classifyIdentifier(parser, context, token);
      if ((token & 36864) === 36864) {
        parser.flags |= 256;
      }
      return parseArrowFromIdentifier(parser, context, privateScope, tokenValue, expr, inNew, canAssign, 0, start);
    }
    if (context & 16 && !(context & 32768) && !(context & 8192) && parser.tokenValue === "arguments")
      parser.report(130);
    if ((token & 255) === (241737 & 255)) {
      if (context & 1)
        parser.report(113);
      if (kind & (8 | 16))
        parser.report(100);
    }
    parser.assignable = context & 1 && (token & 537079808) === 537079808 ? 2 : 1;
    return expr;
  }
  if ((parser.getToken() & 134217728) === 134217728) {
    return parseLiteral(parser, context);
  }
  switch (parser.getToken()) {
    case 33619993:
    case 33619994:
      return parseUpdateExpressionPrefixed(parser, context, privateScope, inNew, isLHS, start);
    case 16863276:
    case 16842798:
    case 16842799:
    case 25233968:
    case 25233969:
    case 16863275:
    case 16863277:
      return parseUnaryExpression(parser, context, privateScope, isLHS, inGroup);
    case 86104:
      return parseFunctionExpression(parser, context, privateScope, 0, inGroup, start);
    case 2162700:
      return parseObjectLiteral(parser, context, privateScope, canAssign ? 0 : 1, inGroup);
    case 69271571:
      return parseArrayLiteral(parser, context, privateScope, canAssign ? 0 : 1, inGroup);
    case 67174411:
      return parseParenthesizedExpression(parser, context | 64, privateScope, canAssign, 1, 0, start);
    case 86021:
    case 86022:
    case 86023:
      return parseNullOrTrueOrFalseLiteral(parser, context);
    case 86111:
      return parseThisExpression(parser, context);
    case 65540:
      return parseRegExpLiteral(parser, context);
    case 132:
    case 86094:
      return parseClassExpression(parser, context, privateScope, inGroup, start);
    case 86109:
      return parseSuperExpression(parser, context);
    case 67174409:
      return parseTemplateLiteral(parser, context);
    case 67174408:
      return parseTemplate(parser, context, privateScope);
    case 86107:
      return parseNewExpression(parser, context, privateScope, inGroup);
    case 134283388:
      return parseBigIntLiteral(parser, context);
    case 130:
      return parsePrivateIdentifier(parser, context, privateScope, 0);
    case 86106:
      return parseImportCallOrMetaExpression(parser, context, privateScope, inNew, inGroup, start);
    case 8456256:
      if (parser.options.jsx)
        return parseJSXRootElementOrFragment(parser, context, privateScope, 0, parser.tokenStart);
    default:
      if (isValidIdentifier(context, parser.getToken()))
        return parseIdentifierOrArrow(parser, context, privateScope);
      parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  }
}
__name(parsePrimaryExpression, "parsePrimaryExpression");
function parseImportCallOrMetaExpression(parser, context, privateScope, inNew, inGroup, start) {
  let expr = parseIdentifier(parser, context);
  if (parser.getToken() === 67108877) {
    return parseImportMetaExpression(parser, context, expr, start);
  }
  if (inNew)
    parser.report(142);
  expr = parseImportExpression(parser, context, privateScope, inGroup, start);
  parser.assignable = 2;
  return parseMemberOrUpdateExpression(parser, context, privateScope, expr, inGroup, 0, start);
}
__name(parseImportCallOrMetaExpression, "parseImportCallOrMetaExpression");
function parseImportMetaExpression(parser, context, meta, start) {
  if ((context & 2) === 0)
    parser.report(169);
  nextToken(parser, context);
  const token = parser.getToken();
  if (token !== 209030 && parser.tokenValue !== "meta") {
    parser.report(174);
  } else if (token & -2147483648) {
    parser.report(175);
  }
  parser.assignable = 2;
  return parser.finishNode({
    type: "MetaProperty",
    meta,
    property: parseIdentifier(parser, context)
  }, start);
}
__name(parseImportMetaExpression, "parseImportMetaExpression");
function parseImportExpression(parser, context, privateScope, inGroup, start) {
  consume(parser, context | 32, 67174411);
  if (parser.getToken() === 14)
    parser.report(143);
  const source = parseExpression(parser, context, privateScope, 1, inGroup, parser.tokenStart);
  let options = null;
  if (parser.getToken() === 18) {
    consume(parser, context, 18);
    if (parser.getToken() !== 16) {
      const expContext = (context | 131072) ^ 131072;
      options = parseExpression(parser, expContext, privateScope, 1, inGroup, parser.tokenStart);
    }
    consumeOpt(parser, context, 18);
  }
  const node = {
    type: "ImportExpression",
    source,
    options
  };
  consume(parser, context, 16);
  return parser.finishNode(node, start);
}
__name(parseImportExpression, "parseImportExpression");
function parseImportAttributes(parser, context) {
  if (!consumeOpt(parser, context, 20579))
    return [];
  consume(parser, context, 2162700);
  const attributes = [];
  const keysContent = /* @__PURE__ */ new Set();
  while (parser.getToken() !== 1074790415) {
    const start = parser.tokenStart;
    const key = parseIdentifierOrStringLiteral(parser, context);
    consume(parser, context, 21);
    const value = parseStringLiteral(parser, context);
    const keyContent = key.type === "Literal" ? key.value : key.name;
    if (keysContent.has(keyContent)) {
      parser.report(145, `${keyContent}`);
    }
    keysContent.add(keyContent);
    attributes.push(parser.finishNode({
      type: "ImportAttribute",
      key,
      value
    }, start));
    if (parser.getToken() !== 1074790415) {
      consume(parser, context, 18);
    }
  }
  consume(parser, context, 1074790415);
  return attributes;
}
__name(parseImportAttributes, "parseImportAttributes");
function parseStringLiteral(parser, context) {
  if (parser.getToken() === 134283267) {
    return parseLiteral(parser, context);
  } else {
    parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  }
}
__name(parseStringLiteral, "parseStringLiteral");
function parseIdentifierOrStringLiteral(parser, context) {
  if (parser.getToken() === 134283267) {
    return parseLiteral(parser, context);
  } else if (parser.getToken() & 143360) {
    return parseIdentifier(parser, context);
  } else {
    parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  }
}
__name(parseIdentifierOrStringLiteral, "parseIdentifierOrStringLiteral");
function validateStringWellFormed(parser, str) {
  const len = str.length;
  for (let i = 0; i < len; i++) {
    const code = str.charCodeAt(i);
    if ((code & 64512) !== 55296)
      continue;
    if (code > 56319 || ++i >= len || (str.charCodeAt(i) & 64512) !== 56320) {
      parser.report(171, JSON.stringify(str.charAt(i--)));
    }
  }
}
__name(validateStringWellFormed, "validateStringWellFormed");
function parseModuleExportName(parser, context) {
  if (parser.getToken() === 134283267) {
    validateStringWellFormed(parser, parser.tokenValue);
    return parseLiteral(parser, context);
  } else if (parser.getToken() & 143360) {
    return parseIdentifier(parser, context);
  } else {
    parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  }
}
__name(parseModuleExportName, "parseModuleExportName");
function parseBigIntLiteral(parser, context) {
  const { tokenRaw, tokenValue, tokenStart } = parser;
  nextToken(parser, context);
  parser.assignable = 2;
  const node = {
    type: "Literal",
    value: tokenValue,
    bigint: String(tokenValue)
  };
  if (parser.options.raw) {
    node.raw = tokenRaw;
  }
  return parser.finishNode(node, tokenStart);
}
__name(parseBigIntLiteral, "parseBigIntLiteral");
function parseTemplateLiteral(parser, context) {
  parser.assignable = 2;
  const { tokenValue, tokenRaw, tokenStart } = parser;
  consume(parser, context, 67174409);
  const quasis = [parseTemplateElement(parser, tokenValue, tokenRaw, tokenStart, true)];
  return parser.finishNode({
    type: "TemplateLiteral",
    expressions: [],
    quasis
  }, tokenStart);
}
__name(parseTemplateLiteral, "parseTemplateLiteral");
function parseTemplate(parser, context, privateScope) {
  context = (context | 131072) ^ 131072;
  const { tokenValue, tokenRaw, tokenStart } = parser;
  consume(parser, context & -65 | 32, 67174408);
  const quasis = [parseTemplateElement(parser, tokenValue, tokenRaw, tokenStart, false)];
  const expressions = [
    parseExpressions(parser, context & -65, privateScope, 0, 1, parser.tokenStart)
  ];
  if (parser.getToken() !== 1074790415)
    parser.report(83);
  while (parser.setToken(scanTemplateTail(parser, context), true) !== 67174409) {
    const { tokenValue: tokenValue2, tokenRaw: tokenRaw2, tokenStart: tokenStart2 } = parser;
    consume(parser, context & -65 | 32, 67174408);
    quasis.push(parseTemplateElement(parser, tokenValue2, tokenRaw2, tokenStart2, false));
    expressions.push(parseExpressions(parser, context, privateScope, 0, 1, parser.tokenStart));
    if (parser.getToken() !== 1074790415)
      parser.report(83);
  }
  {
    const { tokenValue: tokenValue2, tokenRaw: tokenRaw2, tokenStart: tokenStart2 } = parser;
    consume(parser, context, 67174409);
    quasis.push(parseTemplateElement(parser, tokenValue2, tokenRaw2, tokenStart2, true));
  }
  return parser.finishNode({
    type: "TemplateLiteral",
    expressions,
    quasis
  }, tokenStart);
}
__name(parseTemplate, "parseTemplate");
function parseTemplateElement(parser, cooked, raw, start, tail) {
  const node = parser.finishNode({
    type: "TemplateElement",
    value: {
      cooked,
      raw
    },
    tail
  }, start);
  const tailSize = tail ? 1 : 2;
  if (parser.options.ranges) {
    node.start += 1;
    node.range[0] += 1;
    node.end -= tailSize;
    node.range[1] -= tailSize;
  }
  if (parser.options.loc) {
    node.loc.start.column += 1;
    node.loc.end.column -= tailSize;
  }
  return node;
}
__name(parseTemplateElement, "parseTemplateElement");
function parseSpreadElement(parser, context, privateScope) {
  const start = parser.tokenStart;
  context = (context | 131072) ^ 131072;
  consume(parser, context | 32, 14);
  const argument = parseExpression(parser, context, privateScope, 1, 0, parser.tokenStart);
  parser.assignable = 1;
  return parser.finishNode({
    type: "SpreadElement",
    argument
  }, start);
}
__name(parseSpreadElement, "parseSpreadElement");
function parseArguments(parser, context, privateScope, inGroup) {
  nextToken(parser, context | 32);
  const args = [];
  if (parser.getToken() === 16) {
    nextToken(parser, context | 64);
    return args;
  }
  while (parser.getToken() !== 16) {
    if (parser.getToken() === 14) {
      args.push(parseSpreadElement(parser, context, privateScope));
    } else {
      args.push(parseExpression(parser, context, privateScope, 1, inGroup, parser.tokenStart));
    }
    if (parser.getToken() !== 18)
      break;
    nextToken(parser, context | 32);
    if (parser.getToken() === 16)
      break;
  }
  consume(parser, context | 64, 16);
  return args;
}
__name(parseArguments, "parseArguments");
function parseIdentifier(parser, context) {
  const { tokenValue, tokenStart } = parser;
  const allowRegex = tokenValue === "await" && (parser.getToken() & -2147483648) === 0;
  nextToken(parser, context | (allowRegex ? 32 : 0));
  return parser.finishNode({
    type: "Identifier",
    name: tokenValue
  }, tokenStart);
}
__name(parseIdentifier, "parseIdentifier");
function parseLiteral(parser, context) {
  const { tokenValue, tokenRaw, tokenStart } = parser;
  if (parser.getToken() === 134283388) {
    return parseBigIntLiteral(parser, context);
  }
  nextToken(parser, context);
  parser.assignable = 2;
  return parser.finishNode(parser.options.raw ? {
    type: "Literal",
    value: tokenValue,
    raw: tokenRaw
  } : {
    type: "Literal",
    value: tokenValue
  }, tokenStart);
}
__name(parseLiteral, "parseLiteral");
function parseNullOrTrueOrFalseLiteral(parser, context) {
  const start = parser.tokenStart;
  const raw = KeywordDescTable[parser.getToken() & 255];
  const value = parser.getToken() === 86023 ? null : raw === "true";
  nextToken(parser, context);
  parser.assignable = 2;
  return parser.finishNode(parser.options.raw ? {
    type: "Literal",
    value,
    raw
  } : {
    type: "Literal",
    value
  }, start);
}
__name(parseNullOrTrueOrFalseLiteral, "parseNullOrTrueOrFalseLiteral");
function parseThisExpression(parser, context) {
  const { tokenStart } = parser;
  nextToken(parser, context);
  parser.assignable = 2;
  return parser.finishNode({
    type: "ThisExpression"
  }, tokenStart);
}
__name(parseThisExpression, "parseThisExpression");
function parseFunctionDeclaration(parser, context, scope, privateScope, origin, allowGen, flags, isAsync, start) {
  nextToken(parser, context | 32);
  const isGenerator = allowGen ? optionalBit(parser, context, 8391476) : 0;
  let id = null;
  let funcNameToken;
  let functionScope = scope ? parser.createScope() : void 0;
  if (parser.getToken() === 67174411) {
    if ((flags & 1) === 0)
      parser.report(39, "Function");
  } else {
    const kind = origin & 4 && ((context & 8) === 0 || (context & 2) === 0) ? 4 : 64 | (isAsync ? 1024 : 0) | (isGenerator ? 1024 : 0);
    validateFunctionName(parser, context, parser.getToken());
    if (scope) {
      if (kind & 4) {
        scope.addVarName(context, parser.tokenValue, kind);
      } else {
        scope.addBlockName(context, parser.tokenValue, kind, origin);
      }
      functionScope = functionScope?.createChildScope(128);
      if (flags) {
        if (flags & 2) {
          parser.declareUnboundVariable(parser.tokenValue);
        }
      }
    }
    funcNameToken = parser.getToken();
    if (parser.getToken() & 143360) {
      id = parseIdentifier(parser, context);
    } else {
      parser.report(30, KeywordDescTable[parser.getToken() & 255]);
    }
  }
  {
    const modifierFlags2 = 256 | 512 | 1024 | 2048 | 8192 | 16384;
    context = (context | modifierFlags2) ^ modifierFlags2 | 65536 | (isAsync ? 2048 : 0) | (isGenerator ? 1024 : 0) | (isGenerator ? 0 : 262144);
  }
  functionScope = functionScope?.createChildScope(256);
  const params = parseFormalParametersOrFormalList(parser, (context | 8192) & -524289, functionScope, privateScope, 0, 1);
  const modifierFlags = 8 | 4 | 128 | 524288;
  const body = parseFunctionBody(parser, (context | modifierFlags) ^ modifierFlags | 32768 | 4096, functionScope?.createChildScope(64), privateScope, 8, funcNameToken, functionScope);
  return parser.finishNode({
    type: "FunctionDeclaration",
    id,
    params,
    body,
    async: isAsync === 1,
    generator: isGenerator === 1
  }, start);
}
__name(parseFunctionDeclaration, "parseFunctionDeclaration");
function parseFunctionExpression(parser, context, privateScope, isAsync, inGroup, start) {
  nextToken(parser, context | 32);
  const isGenerator = optionalBit(parser, context, 8391476);
  const generatorAndAsyncFlags = (isAsync ? 2048 : 0) | (isGenerator ? 1024 : 0);
  let id = null;
  let funcNameToken;
  let scope = parser.createScopeIfLexical();
  const modifierFlags = 256 | 512 | 1024 | 2048 | 8192 | 16384 | 524288;
  if (parser.getToken() & 143360) {
    validateFunctionName(parser, (context | modifierFlags) ^ modifierFlags | generatorAndAsyncFlags, parser.getToken());
    scope = scope?.createChildScope(128);
    funcNameToken = parser.getToken();
    id = parseIdentifier(parser, context);
  }
  context = (context | modifierFlags) ^ modifierFlags | 65536 | generatorAndAsyncFlags | (isGenerator ? 0 : 262144);
  scope = scope?.createChildScope(256);
  const params = parseFormalParametersOrFormalList(parser, (context | 8192) & -524289, scope, privateScope, inGroup, 1);
  const body = parseFunctionBody(parser, context & -131229 | 32768 | 4096, scope?.createChildScope(64), privateScope, 0, funcNameToken, scope);
  parser.assignable = 2;
  return parser.finishNode({
    type: "FunctionExpression",
    id,
    params,
    body,
    async: isAsync === 1,
    generator: isGenerator === 1
  }, start);
}
__name(parseFunctionExpression, "parseFunctionExpression");
function parseArrayLiteral(parser, context, privateScope, skipInitializer, inGroup) {
  const expr = parseArrayExpressionOrPattern(parser, context, void 0, privateScope, skipInitializer, inGroup, 0, 2, 0);
  if (parser.destructible & 64) {
    parser.report(63);
  }
  if (parser.destructible & 8) {
    parser.report(62);
  }
  return expr;
}
__name(parseArrayLiteral, "parseArrayLiteral");
function parseArrayExpressionOrPattern(parser, context, scope, privateScope, skipInitializer, inGroup, isPattern, kind, origin) {
  const { tokenStart: start } = parser;
  nextToken(parser, context | 32);
  const elements = [];
  let destructible = 0;
  context = (context | 131072) ^ 131072;
  while (parser.getToken() !== 20) {
    if (consumeOpt(parser, context | 32, 18)) {
      elements.push(null);
    } else {
      let left;
      const { tokenStart, tokenValue } = parser;
      const token = parser.getToken();
      if (token & 143360) {
        left = parsePrimaryExpression(parser, context, privateScope, kind, 0, 1, inGroup, 1, tokenStart);
        if (parser.getToken() === 1077936155) {
          if (parser.assignable & 2)
            parser.report(26);
          nextToken(parser, context | 32);
          scope?.addVarOrBlock(context, tokenValue, kind, origin);
          const right = parseExpression(parser, context, privateScope, 1, inGroup, parser.tokenStart);
          left = parser.finishNode(isPattern ? {
            type: "AssignmentPattern",
            left,
            right
          } : {
            type: "AssignmentExpression",
            operator: "=",
            left,
            right
          }, tokenStart);
          destructible |= parser.destructible & 256 ? 256 : 0 | parser.destructible & 128 ? 128 : 0;
        } else if (parser.getToken() === 18 || parser.getToken() === 20) {
          if (parser.assignable & 2) {
            destructible |= 16;
          } else {
            scope?.addVarOrBlock(context, tokenValue, kind, origin);
          }
          destructible |= parser.destructible & 256 ? 256 : 0 | parser.destructible & 128 ? 128 : 0;
        } else {
          destructible |= kind & 1 ? 32 : (kind & 2) === 0 ? 16 : 0;
          left = parseMemberOrUpdateExpression(parser, context, privateScope, left, inGroup, 0, tokenStart);
          if (parser.getToken() !== 18 && parser.getToken() !== 20) {
            if (parser.getToken() !== 1077936155)
              destructible |= 16;
            left = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart, left);
          } else if (parser.getToken() !== 1077936155) {
            destructible |= parser.assignable & 2 ? 16 : 32;
          }
        }
      } else if (token & 2097152) {
        left = parser.getToken() === 2162700 ? parseObjectLiteralOrPattern(parser, context, scope, privateScope, 0, inGroup, isPattern, kind, origin) : parseArrayExpressionOrPattern(parser, context, scope, privateScope, 0, inGroup, isPattern, kind, origin);
        destructible |= parser.destructible;
        parser.assignable = parser.destructible & 16 ? 2 : 1;
        if (parser.getToken() === 18 || parser.getToken() === 20) {
          if (parser.assignable & 2) {
            destructible |= 16;
          }
        } else if (parser.destructible & 8) {
          parser.report(71);
        } else {
          left = parseMemberOrUpdateExpression(parser, context, privateScope, left, inGroup, 0, tokenStart);
          destructible = parser.assignable & 2 ? 16 : 0;
          if (parser.getToken() !== 18 && parser.getToken() !== 20) {
            left = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart, left);
          } else if (parser.getToken() !== 1077936155) {
            destructible |= parser.assignable & 2 ? 16 : 32;
          }
        }
      } else if (token === 14) {
        left = parseSpreadOrRestElement(parser, context, scope, privateScope, 20, kind, origin, 0, inGroup, isPattern);
        destructible |= parser.destructible;
        if (parser.getToken() !== 18 && parser.getToken() !== 20)
          parser.report(30, KeywordDescTable[parser.getToken() & 255]);
      } else {
        left = parseLeftHandSideExpression(parser, context, privateScope, 1, 0, 1);
        if (parser.getToken() !== 18 && parser.getToken() !== 20) {
          left = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart, left);
          if ((kind & (2 | 1)) === 0 && token === 67174411)
            destructible |= 16;
        } else if (parser.assignable & 2) {
          destructible |= 16;
        } else if (token === 67174411) {
          destructible |= parser.assignable & 1 && kind & (2 | 1) ? 32 : 16;
        }
      }
      elements.push(left);
      if (consumeOpt(parser, context | 32, 18)) {
        if (parser.getToken() === 20)
          break;
      } else
        break;
    }
  }
  consume(parser, context, 20);
  const node = parser.finishNode({
    type: isPattern ? "ArrayPattern" : "ArrayExpression",
    elements
  }, start);
  if (!skipInitializer && parser.getToken() & 4194304) {
    return parseArrayOrObjectAssignmentPattern(parser, context, privateScope, destructible, inGroup, isPattern, start, node);
  }
  parser.destructible = destructible;
  return node;
}
__name(parseArrayExpressionOrPattern, "parseArrayExpressionOrPattern");
function parseArrayOrObjectAssignmentPattern(parser, context, privateScope, destructible, inGroup, isPattern, start, node) {
  if (parser.getToken() !== 1077936155)
    parser.report(26);
  nextToken(parser, context | 32);
  if (destructible & 16)
    parser.report(26);
  if (!isPattern)
    reinterpretToPattern(parser, node);
  const { tokenStart } = parser;
  const right = parseExpression(parser, context, privateScope, 1, inGroup, tokenStart);
  parser.destructible = (destructible | 64 | 8) ^ (8 | 64) | (parser.destructible & 128 ? 128 : 0) | (parser.destructible & 256 ? 256 : 0);
  return parser.finishNode(isPattern ? {
    type: "AssignmentPattern",
    left: node,
    right
  } : {
    type: "AssignmentExpression",
    left: node,
    operator: "=",
    right
  }, start);
}
__name(parseArrayOrObjectAssignmentPattern, "parseArrayOrObjectAssignmentPattern");
function parseSpreadOrRestElement(parser, context, scope, privateScope, closingToken, kind, origin, isAsync, inGroup, isPattern) {
  const { tokenStart: start } = parser;
  nextToken(parser, context | 32);
  let argument = null;
  let destructible = 0;
  const { tokenValue, tokenStart } = parser;
  let token = parser.getToken();
  if (token & 143360) {
    parser.assignable = 1;
    argument = parsePrimaryExpression(parser, context, privateScope, kind, 0, 1, inGroup, 1, tokenStart);
    token = parser.getToken();
    argument = parseMemberOrUpdateExpression(parser, context, privateScope, argument, inGroup, 0, tokenStart);
    if (parser.getToken() !== 18 && parser.getToken() !== closingToken) {
      if (parser.assignable & 2 && parser.getToken() === 1077936155)
        parser.report(71);
      destructible |= 16;
      argument = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart, argument);
    }
    if (parser.assignable & 2) {
      destructible |= 16;
    } else if (token === closingToken || token === 18) {
      scope?.addVarOrBlock(context, tokenValue, kind, origin);
    } else {
      destructible |= 32;
    }
    destructible |= parser.destructible & 128 ? 128 : 0;
  } else if (token === closingToken) {
    parser.report(41);
  } else if (token & 2097152) {
    argument = parser.getToken() === 2162700 ? parseObjectLiteralOrPattern(parser, context, scope, privateScope, 1, inGroup, isPattern, kind, origin) : parseArrayExpressionOrPattern(parser, context, scope, privateScope, 1, inGroup, isPattern, kind, origin);
    token = parser.getToken();
    if (token !== 1077936155 && token !== closingToken && token !== 18) {
      if (parser.destructible & 8)
        parser.report(71);
      argument = parseMemberOrUpdateExpression(parser, context, privateScope, argument, inGroup, 0, tokenStart);
      destructible |= parser.assignable & 2 ? 16 : 0;
      if ((parser.getToken() & 4194304) === 4194304) {
        if (parser.getToken() !== 1077936155)
          destructible |= 16;
        argument = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart, argument);
      } else {
        if ((parser.getToken() & 8388608) === 8388608) {
          argument = parseBinaryExpression(parser, context, privateScope, 1, tokenStart, 4, token, argument);
        }
        if (consumeOpt(parser, context | 32, 22)) {
          argument = parseConditionalExpression(parser, context, privateScope, argument, tokenStart);
        }
        destructible |= parser.assignable & 2 ? 16 : 32;
      }
    } else {
      destructible |= closingToken === 1074790415 && token !== 1077936155 ? 16 : parser.destructible;
    }
  } else {
    destructible |= 32;
    argument = parseLeftHandSideExpression(parser, context, privateScope, 1, inGroup, 1);
    const { tokenStart: tokenStart2 } = parser;
    const token2 = parser.getToken();
    if (token2 === 1077936155) {
      if (parser.assignable & 2)
        parser.report(26);
      argument = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart2, argument);
      destructible |= 16;
    } else {
      if (token2 === 18) {
        destructible |= 16;
      } else if (token2 !== closingToken) {
        argument = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart2, argument);
      }
      destructible |= parser.assignable & 1 ? 32 : 16;
    }
    parser.destructible = destructible;
    if (parser.getToken() !== closingToken && parser.getToken() !== 18)
      parser.report(161);
    return parser.finishNode({
      type: isPattern ? "RestElement" : "SpreadElement",
      argument
    }, start);
  }
  if (parser.getToken() !== closingToken) {
    if (kind & 1)
      destructible |= isAsync ? 16 : 32;
    if (consumeOpt(parser, context | 32, 1077936155)) {
      if (destructible & 16)
        parser.report(26);
      reinterpretToPattern(parser, argument);
      const right = parseExpression(parser, context, privateScope, 1, inGroup, parser.tokenStart);
      argument = parser.finishNode(isPattern ? {
        type: "AssignmentPattern",
        left: argument,
        right
      } : {
        type: "AssignmentExpression",
        left: argument,
        operator: "=",
        right
      }, tokenStart);
      destructible = 16;
    } else {
      destructible |= 16;
    }
  }
  parser.destructible = destructible;
  return parser.finishNode({
    type: isPattern ? "RestElement" : "SpreadElement",
    argument
  }, start);
}
__name(parseSpreadOrRestElement, "parseSpreadOrRestElement");
function parseMethodDefinition(parser, context, privateScope, kind, inGroup, start) {
  const modifierFlags = 1024 | 2048 | 8192 | ((kind & 64) === 0 ? 512 | 16384 : 0);
  context = (context | modifierFlags) ^ modifierFlags | (kind & 8 ? 1024 : 0) | (kind & 16 ? 2048 : 0) | (kind & 64 ? 16384 : 0) | 256 | 32768 | 65536;
  let scope = parser.createScopeIfLexical(256);
  const params = parseMethodFormals(parser, (context | 8192) & -524289, scope, privateScope, kind, 1, inGroup);
  scope = scope?.createChildScope(64);
  const body = parseFunctionBody(parser, context & -655373 | 32768 | 4096, scope, privateScope, 0, void 0, scope?.parent);
  return parser.finishNode({
    type: "FunctionExpression",
    params,
    body,
    async: (kind & 16) > 0,
    generator: (kind & 8) > 0,
    id: null
  }, start);
}
__name(parseMethodDefinition, "parseMethodDefinition");
function parseObjectLiteral(parser, context, privateScope, skipInitializer, inGroup) {
  const expr = parseObjectLiteralOrPattern(parser, context, void 0, privateScope, skipInitializer, inGroup, 0, 2, 0);
  if (parser.destructible & 64) {
    parser.report(63);
  }
  if (parser.destructible & 8) {
    parser.report(62);
  }
  return expr;
}
__name(parseObjectLiteral, "parseObjectLiteral");
function parseObjectLiteralOrPattern(parser, context, scope, privateScope, skipInitializer, inGroup, isPattern, kind, origin) {
  const { tokenStart: start } = parser;
  nextToken(parser, context);
  const properties = [];
  let destructible = 0;
  let prototypeCount = 0;
  context = (context | 131072) ^ 131072;
  while (parser.getToken() !== 1074790415) {
    const { tokenValue, tokenStart } = parser;
    const token = parser.getToken();
    if (token === 14) {
      properties.push(parseSpreadOrRestElement(parser, context, scope, privateScope, 1074790415, kind, origin, 0, inGroup, isPattern));
    } else {
      let state = 0;
      let key = null;
      let value;
      if (parser.getToken() & 143360 || parser.getToken() === -2147483528 || parser.getToken() === -2147483527) {
        if (parser.getToken() === -2147483527)
          destructible |= 16;
        key = parseIdentifier(parser, context);
        if (parser.getToken() === 18 || parser.getToken() === 1074790415 || parser.getToken() === 1077936155) {
          state |= 4;
          if (context & 1 && (token & 537079808) === 537079808) {
            destructible |= 16;
          } else {
            validateBindingIdentifier(parser, context, kind, token, 0);
          }
          scope?.addVarOrBlock(context, tokenValue, kind, origin);
          if (consumeOpt(parser, context | 32, 1077936155)) {
            destructible |= 8;
            const right = parseExpression(parser, context, privateScope, 1, inGroup, parser.tokenStart);
            destructible |= parser.destructible & 256 ? 256 : 0 | parser.destructible & 128 ? 128 : 0;
            value = parser.finishNode({
              type: "AssignmentPattern",
              left: parser.options.uniqueKeyInPattern ? Object.assign({}, key) : key,
              right
            }, tokenStart);
          } else {
            destructible |= (token === 209006 ? 128 : 0) | (token === -2147483528 ? 16 : 0);
            value = parser.options.uniqueKeyInPattern ? Object.assign({}, key) : key;
          }
        } else if (consumeOpt(parser, context | 32, 21)) {
          const { tokenStart: tokenStart2 } = parser;
          if (tokenValue === "__proto__")
            prototypeCount++;
          if (parser.getToken() & 143360) {
            const tokenAfterColon = parser.getToken();
            const valueAfterColon = parser.tokenValue;
            value = parsePrimaryExpression(parser, context, privateScope, kind, 0, 1, inGroup, 1, tokenStart2);
            const token2 = parser.getToken();
            value = parseMemberOrUpdateExpression(parser, context, privateScope, value, inGroup, 0, tokenStart2);
            if (parser.getToken() === 18 || parser.getToken() === 1074790415) {
              if (token2 === 1077936155 || token2 === 1074790415 || token2 === 18) {
                destructible |= parser.destructible & 128 ? 128 : 0;
                if (parser.assignable & 2) {
                  destructible |= 16;
                } else if ((tokenAfterColon & 143360) === 143360) {
                  scope?.addVarOrBlock(context, valueAfterColon, kind, origin);
                }
              } else {
                destructible |= parser.assignable & 1 ? 32 : 16;
              }
            } else if ((parser.getToken() & 4194304) === 4194304) {
              if (parser.assignable & 2) {
                destructible |= 16;
              } else if (token2 !== 1077936155) {
                destructible |= 32;
              } else {
                scope?.addVarOrBlock(context, valueAfterColon, kind, origin);
              }
              value = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
            } else {
              destructible |= 16;
              if ((parser.getToken() & 8388608) === 8388608) {
                value = parseBinaryExpression(parser, context, privateScope, 1, tokenStart2, 4, token2, value);
              }
              if (consumeOpt(parser, context | 32, 22)) {
                value = parseConditionalExpression(parser, context, privateScope, value, tokenStart2);
              }
            }
          } else if ((parser.getToken() & 2097152) === 2097152) {
            value = parser.getToken() === 69271571 ? parseArrayExpressionOrPattern(parser, context, scope, privateScope, 0, inGroup, isPattern, kind, origin) : parseObjectLiteralOrPattern(parser, context, scope, privateScope, 0, inGroup, isPattern, kind, origin);
            destructible = parser.destructible;
            parser.assignable = destructible & 16 ? 2 : 1;
            if (parser.getToken() === 18 || parser.getToken() === 1074790415) {
              if (parser.assignable & 2)
                destructible |= 16;
            } else if (parser.destructible & 8) {
              parser.report(71);
            } else {
              value = parseMemberOrUpdateExpression(parser, context, privateScope, value, inGroup, 0, tokenStart2);
              destructible = parser.assignable & 2 ? 16 : 0;
              if ((parser.getToken() & 4194304) === 4194304) {
                value = parseAssignmentExpressionOrPattern(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
              } else {
                if ((parser.getToken() & 8388608) === 8388608) {
                  value = parseBinaryExpression(parser, context, privateScope, 1, tokenStart2, 4, token, value);
                }
                if (consumeOpt(parser, context | 32, 22)) {
                  value = parseConditionalExpression(parser, context, privateScope, value, tokenStart2);
                }
                destructible |= parser.assignable & 2 ? 16 : 32;
              }
            }
          } else {
            value = parseLeftHandSideExpression(parser, context, privateScope, 1, inGroup, 1);
            destructible |= parser.assignable & 1 ? 32 : 16;
            if (parser.getToken() === 18 || parser.getToken() === 1074790415) {
              if (parser.assignable & 2)
                destructible |= 16;
            } else {
              value = parseMemberOrUpdateExpression(parser, context, privateScope, value, inGroup, 0, tokenStart2);
              destructible = parser.assignable & 2 ? 16 : 0;
              if (parser.getToken() !== 18 && token !== 1074790415) {
                if (parser.getToken() !== 1077936155)
                  destructible |= 16;
                value = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
              }
            }
          }
        } else if (parser.getToken() === 69271571) {
          destructible |= 16;
          if (token === 209005)
            state |= 16;
          state |= (token === 209008 ? 256 : token === 209009 ? 512 : 1) | 2;
          key = parseComputedPropertyName(parser, context, privateScope, inGroup);
          destructible |= parser.assignable;
          value = parseMethodDefinition(parser, context, privateScope, state, inGroup, parser.tokenStart);
        } else if (parser.getToken() & 143360) {
          destructible |= 16;
          if (token === -2147483528)
            parser.report(95);
          if (token === 209005) {
            if (parser.flags & 1)
              parser.report(132);
            state |= 16 | 1;
          } else if (token === 209008) {
            state |= 256;
          } else if (token === 209009) {
            state |= 512;
          } else {
            parser.report(0);
          }
          key = parseIdentifier(parser, context);
          value = parseMethodDefinition(parser, context, privateScope, state, inGroup, parser.tokenStart);
        } else if (parser.getToken() === 67174411) {
          destructible |= 16;
          state |= 1;
          value = parseMethodDefinition(parser, context, privateScope, state, inGroup, parser.tokenStart);
        } else if (parser.getToken() === 8391476) {
          destructible |= 16;
          if (token === 209008) {
            parser.report(42);
          } else if (token === 209009) {
            parser.report(43);
          } else if (token !== 209005) {
            parser.report(30, KeywordDescTable[8391476 & 255]);
          }
          nextToken(parser, context);
          state |= 8 | 1 | (token === 209005 ? 16 : 0);
          if (parser.getToken() & 143360) {
            key = parseIdentifier(parser, context);
          } else if ((parser.getToken() & 134217728) === 134217728) {
            key = parseLiteral(parser, context);
          } else if (parser.getToken() === 69271571) {
            state |= 2;
            key = parseComputedPropertyName(parser, context, privateScope, inGroup);
            destructible |= parser.assignable;
          } else {
            parser.report(30, KeywordDescTable[parser.getToken() & 255]);
          }
          value = parseMethodDefinition(parser, context, privateScope, state, inGroup, parser.tokenStart);
        } else if ((parser.getToken() & 134217728) === 134217728) {
          if (token === 209005)
            state |= 16;
          state |= token === 209008 ? 256 : token === 209009 ? 512 : 1;
          destructible |= 16;
          key = parseLiteral(parser, context);
          value = parseMethodDefinition(parser, context, privateScope, state, inGroup, parser.tokenStart);
        } else {
          parser.report(133);
        }
      } else if ((parser.getToken() & 134217728) === 134217728) {
        key = parseLiteral(parser, context);
        if (parser.getToken() === 21) {
          consume(parser, context | 32, 21);
          const { tokenStart: tokenStart2 } = parser;
          if (tokenValue === "__proto__")
            prototypeCount++;
          if (parser.getToken() & 143360) {
            value = parsePrimaryExpression(parser, context, privateScope, kind, 0, 1, inGroup, 1, tokenStart2);
            const { tokenValue: valueAfterColon } = parser;
            const token2 = parser.getToken();
            value = parseMemberOrUpdateExpression(parser, context, privateScope, value, inGroup, 0, tokenStart2);
            if (parser.getToken() === 18 || parser.getToken() === 1074790415) {
              if (token2 === 1077936155 || token2 === 1074790415 || token2 === 18) {
                if (parser.assignable & 2) {
                  destructible |= 16;
                } else {
                  scope?.addVarOrBlock(context, valueAfterColon, kind, origin);
                }
              } else {
                destructible |= parser.assignable & 1 ? 32 : 16;
              }
            } else if (parser.getToken() === 1077936155) {
              if (parser.assignable & 2)
                destructible |= 16;
              value = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
            } else {
              destructible |= 16;
              value = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
            }
          } else if ((parser.getToken() & 2097152) === 2097152) {
            value = parser.getToken() === 69271571 ? parseArrayExpressionOrPattern(parser, context, scope, privateScope, 0, inGroup, isPattern, kind, origin) : parseObjectLiteralOrPattern(parser, context, scope, privateScope, 0, inGroup, isPattern, kind, origin);
            destructible = parser.destructible;
            parser.assignable = destructible & 16 ? 2 : 1;
            if (parser.getToken() === 18 || parser.getToken() === 1074790415) {
              if (parser.assignable & 2) {
                destructible |= 16;
              }
            } else if ((parser.destructible & 8) !== 8) {
              value = parseMemberOrUpdateExpression(parser, context, privateScope, value, inGroup, 0, tokenStart2);
              destructible = parser.assignable & 2 ? 16 : 0;
              if ((parser.getToken() & 4194304) === 4194304) {
                value = parseAssignmentExpressionOrPattern(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
              } else {
                if ((parser.getToken() & 8388608) === 8388608) {
                  value = parseBinaryExpression(parser, context, privateScope, 1, tokenStart2, 4, token, value);
                }
                if (consumeOpt(parser, context | 32, 22)) {
                  value = parseConditionalExpression(parser, context, privateScope, value, tokenStart2);
                }
                destructible |= parser.assignable & 2 ? 16 : 32;
              }
            }
          } else {
            value = parseLeftHandSideExpression(parser, context, privateScope, 1, 0, 1);
            destructible |= parser.assignable & 1 ? 32 : 16;
            if (parser.getToken() === 18 || parser.getToken() === 1074790415) {
              if (parser.assignable & 2) {
                destructible |= 16;
              }
            } else {
              value = parseMemberOrUpdateExpression(parser, context, privateScope, value, inGroup, 0, tokenStart2);
              destructible = parser.assignable & 1 ? 0 : 16;
              if (parser.getToken() !== 18 && parser.getToken() !== 1074790415) {
                if (parser.getToken() !== 1077936155)
                  destructible |= 16;
                value = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
              }
            }
          }
        } else if (parser.getToken() === 67174411) {
          state |= 1;
          value = parseMethodDefinition(parser, context, privateScope, state, inGroup, parser.tokenStart);
          destructible = parser.assignable | 16;
        } else {
          parser.report(134);
        }
      } else if (parser.getToken() === 69271571) {
        key = parseComputedPropertyName(parser, context, privateScope, inGroup);
        destructible |= parser.destructible & 256 ? 256 : 0;
        state |= 2;
        if (parser.getToken() === 21) {
          nextToken(parser, context | 32);
          const { tokenStart: tokenStart2, tokenValue: tokenValue2 } = parser;
          const tokenAfterColon = parser.getToken();
          if (parser.getToken() & 143360) {
            value = parsePrimaryExpression(parser, context, privateScope, kind, 0, 1, inGroup, 1, tokenStart2);
            const token2 = parser.getToken();
            value = parseMemberOrUpdateExpression(parser, context, privateScope, value, inGroup, 0, tokenStart2);
            if ((parser.getToken() & 4194304) === 4194304) {
              destructible |= parser.assignable & 2 ? 16 : token2 === 1077936155 ? 0 : 32;
              value = parseAssignmentExpressionOrPattern(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
            } else if (parser.getToken() === 18 || parser.getToken() === 1074790415) {
              if (token2 === 1077936155 || token2 === 1074790415 || token2 === 18) {
                if (parser.assignable & 2) {
                  destructible |= 16;
                } else if ((tokenAfterColon & 143360) === 143360) {
                  scope?.addVarOrBlock(context, tokenValue2, kind, origin);
                }
              } else {
                destructible |= parser.assignable & 1 ? 32 : 16;
              }
            } else {
              destructible |= 16;
              value = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
            }
          } else if ((parser.getToken() & 2097152) === 2097152) {
            value = parser.getToken() === 69271571 ? parseArrayExpressionOrPattern(parser, context, scope, privateScope, 0, inGroup, isPattern, kind, origin) : parseObjectLiteralOrPattern(parser, context, scope, privateScope, 0, inGroup, isPattern, kind, origin);
            destructible = parser.destructible;
            parser.assignable = destructible & 16 ? 2 : 1;
            if (parser.getToken() === 18 || parser.getToken() === 1074790415) {
              if (parser.assignable & 2)
                destructible |= 16;
            } else if (destructible & 8) {
              parser.report(62);
            } else {
              value = parseMemberOrUpdateExpression(parser, context, privateScope, value, inGroup, 0, tokenStart2);
              destructible = parser.assignable & 2 ? destructible | 16 : 0;
              if ((parser.getToken() & 4194304) === 4194304) {
                if (parser.getToken() !== 1077936155)
                  destructible |= 16;
                value = parseAssignmentExpressionOrPattern(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
              } else {
                if ((parser.getToken() & 8388608) === 8388608) {
                  value = parseBinaryExpression(parser, context, privateScope, 1, tokenStart2, 4, token, value);
                }
                if (consumeOpt(parser, context | 32, 22)) {
                  value = parseConditionalExpression(parser, context, privateScope, value, tokenStart2);
                }
                destructible |= parser.assignable & 2 ? 16 : 32;
              }
            }
          } else {
            value = parseLeftHandSideExpression(parser, context, privateScope, 1, 0, 1);
            destructible |= parser.assignable & 1 ? 32 : 16;
            if (parser.getToken() === 18 || parser.getToken() === 1074790415) {
              if (parser.assignable & 2)
                destructible |= 16;
            } else {
              value = parseMemberOrUpdateExpression(parser, context, privateScope, value, inGroup, 0, tokenStart2);
              destructible = parser.assignable & 1 ? 0 : 16;
              if (parser.getToken() !== 18 && parser.getToken() !== 1074790415) {
                if (parser.getToken() !== 1077936155)
                  destructible |= 16;
                value = parseAssignmentExpression(parser, context, privateScope, inGroup, isPattern, tokenStart2, value);
              }
            }
          }
        } else if (parser.getToken() === 67174411) {
          state |= 1;
          value = parseMethodDefinition(parser, context, privateScope, state, inGroup, parser.tokenStart);
          destructible = 16;
        } else {
          parser.report(44);
        }
      } else if (token === 8391476) {
        consume(parser, context | 32, 8391476);
        state |= 8;
        if (parser.getToken() & 143360) {
          const token2 = parser.getToken();
          key = parseIdentifier(parser, context);
          state |= 1;
          if (parser.getToken() === 67174411) {
            destructible |= 16;
            value = parseMethodDefinition(parser, context, privateScope, state, inGroup, parser.tokenStart);
          } else {
            throw new ParseError(parser.tokenStart, parser.currentLocation, token2 === 209005 ? 46 : token2 === 209008 || parser.getToken() === 209009 ? 45 : 47, KeywordDescTable[token2 & 255]);
          }
        } else if ((parser.getToken() & 134217728) === 134217728) {
          destructible |= 16;
          key = parseLiteral(parser, context);
          state |= 1;
          value = parseMethodDefinition(parser, context, privateScope, state, inGroup, parser.tokenStart);
        } else if (parser.getToken() === 69271571) {
          destructible |= 16;
          state |= 2 | 1;
          key = parseComputedPropertyName(parser, context, privateScope, inGroup);
          value = parseMethodDefinition(parser, context, privateScope, state, inGroup, parser.tokenStart);
        } else {
          parser.report(126);
        }
      } else {
        parser.report(30, KeywordDescTable[token & 255]);
      }
      destructible |= parser.destructible & 128 ? 128 : 0;
      parser.destructible = destructible;
      properties.push(parser.finishNode({
        type: "Property",
        key,
        value,
        kind: !(state & 768) ? "init" : state & 512 ? "set" : "get",
        computed: (state & 2) > 0,
        method: (state & 1) > 0,
        shorthand: (state & 4) > 0
      }, tokenStart));
    }
    destructible |= parser.destructible;
    if (parser.getToken() !== 18)
      break;
    nextToken(parser, context);
  }
  consume(parser, context, 1074790415);
  if (prototypeCount > 1)
    destructible |= 64;
  const node = parser.finishNode({
    type: isPattern ? "ObjectPattern" : "ObjectExpression",
    properties
  }, start);
  if (!skipInitializer && parser.getToken() & 4194304) {
    return parseArrayOrObjectAssignmentPattern(parser, context, privateScope, destructible, inGroup, isPattern, start, node);
  }
  parser.destructible = destructible;
  return node;
}
__name(parseObjectLiteralOrPattern, "parseObjectLiteralOrPattern");
function parseMethodFormals(parser, context, scope, privateScope, kind, type, inGroup) {
  consume(parser, context, 67174411);
  const params = [];
  parser.flags = (parser.flags | 128) ^ 128;
  if (parser.getToken() === 16) {
    if (kind & 512) {
      parser.report(37, "Setter", "one", "");
    }
    nextToken(parser, context);
    return params;
  }
  if (kind & 256) {
    parser.report(37, "Getter", "no", "s");
  }
  if (kind & 512 && parser.getToken() === 14) {
    parser.report(38);
  }
  context = (context | 131072) ^ 131072;
  let setterArgs = 0;
  let isNonSimpleParameterList = 0;
  while (parser.getToken() !== 18) {
    let left = null;
    const { tokenStart } = parser;
    if (parser.getToken() & 143360) {
      if ((context & 1) === 0) {
        if ((parser.getToken() & 36864) === 36864) {
          parser.flags |= 256;
        }
        if ((parser.getToken() & 537079808) === 537079808) {
          parser.flags |= 512;
        }
      }
      left = parseAndClassifyIdentifier(parser, context, scope, kind | 1, 0);
    } else {
      if (parser.getToken() === 2162700) {
        left = parseObjectLiteralOrPattern(parser, context, scope, privateScope, 1, inGroup, 1, type, 0);
      } else if (parser.getToken() === 69271571) {
        left = parseArrayExpressionOrPattern(parser, context, scope, privateScope, 1, inGroup, 1, type, 0);
      } else if (parser.getToken() === 14) {
        left = parseSpreadOrRestElement(parser, context, scope, privateScope, 16, type, 0, 0, inGroup, 1);
      }
      isNonSimpleParameterList = 1;
      if (parser.destructible & (32 | 16))
        parser.report(50);
    }
    if (parser.getToken() === 1077936155) {
      nextToken(parser, context | 32);
      isNonSimpleParameterList = 1;
      const right = parseExpression(parser, context, privateScope, 1, 0, parser.tokenStart);
      left = parser.finishNode({
        type: "AssignmentPattern",
        left,
        right
      }, tokenStart);
    }
    setterArgs++;
    params.push(left);
    if (!consumeOpt(parser, context, 18))
      break;
    if (parser.getToken() === 16) {
      break;
    }
  }
  if (kind & 512 && setterArgs !== 1) {
    parser.report(37, "Setter", "one", "");
  }
  scope?.reportScopeError();
  if (isNonSimpleParameterList)
    parser.flags |= 128;
  consume(parser, context, 16);
  return params;
}
__name(parseMethodFormals, "parseMethodFormals");
function parseComputedPropertyName(parser, context, privateScope, inGroup) {
  nextToken(parser, context | 32);
  const key = parseExpression(parser, (context | 131072) ^ 131072, privateScope, 1, inGroup, parser.tokenStart);
  consume(parser, context, 20);
  return key;
}
__name(parseComputedPropertyName, "parseComputedPropertyName");
function parseParenthesizedExpression(parser, context, privateScope, canAssign, kind, origin, start) {
  parser.flags = (parser.flags | 128) ^ 128;
  const parenthesesStart = parser.tokenStart;
  nextToken(parser, context | 32 | 262144);
  const scope = parser.createScopeIfLexical()?.createChildScope(512);
  context = (context | 131072) ^ 131072;
  if (consumeOpt(parser, context, 16)) {
    return parseParenthesizedArrow(parser, context, scope, privateScope, [], canAssign, 0, start);
  }
  let destructible = 0;
  parser.destructible &= -385;
  let expr;
  let expressions = [];
  let isSequence = 0;
  let isNonSimpleParameterList = 0;
  let hasStrictReserved = 0;
  const tokenAfterParenthesesStart = parser.tokenStart;
  parser.assignable = 1;
  while (parser.getToken() !== 16) {
    const { tokenStart } = parser;
    const token = parser.getToken();
    if (token & 143360) {
      scope?.addBlockName(context, parser.tokenValue, 1, 0);
      if ((token & 537079808) === 537079808) {
        isNonSimpleParameterList = 1;
      } else if ((token & 36864) === 36864) {
        hasStrictReserved = 1;
      }
      expr = parsePrimaryExpression(parser, context, privateScope, kind, 0, 1, 1, 1, tokenStart);
      if (parser.getToken() === 16 || parser.getToken() === 18) {
        if (parser.assignable & 2) {
          destructible |= 16;
          isNonSimpleParameterList = 1;
        }
      } else {
        if (parser.getToken() === 1077936155) {
          isNonSimpleParameterList = 1;
        } else {
          destructible |= 16;
        }
        expr = parseMemberOrUpdateExpression(parser, context, privateScope, expr, 1, 0, tokenStart);
        if (parser.getToken() !== 16 && parser.getToken() !== 18) {
          expr = parseAssignmentExpression(parser, context, privateScope, 1, 0, tokenStart, expr);
        }
      }
    } else if ((token & 2097152) === 2097152) {
      expr = token === 2162700 ? parseObjectLiteralOrPattern(parser, context | 262144, scope, privateScope, 0, 1, 0, kind, origin) : parseArrayExpressionOrPattern(parser, context | 262144, scope, privateScope, 0, 1, 0, kind, origin);
      destructible |= parser.destructible;
      isNonSimpleParameterList = 1;
      parser.assignable = 2;
      if (parser.getToken() !== 16 && parser.getToken() !== 18) {
        if (destructible & 8)
          parser.report(122);
        expr = parseMemberOrUpdateExpression(parser, context, privateScope, expr, 0, 0, tokenStart);
        destructible |= 16;
        if (parser.getToken() !== 16 && parser.getToken() !== 18) {
          expr = parseAssignmentExpression(parser, context, privateScope, 0, 0, tokenStart, expr);
        }
      }
    } else if (token === 14) {
      expr = parseSpreadOrRestElement(parser, context, scope, privateScope, 16, kind, origin, 0, 1, 0);
      if (parser.destructible & 16)
        parser.report(74);
      isNonSimpleParameterList = 1;
      if (isSequence && (parser.getToken() === 16 || parser.getToken() === 18)) {
        expressions.push(expr);
      }
      destructible |= 8;
      break;
    } else {
      destructible |= 16;
      expr = parseExpression(parser, context, privateScope, 1, 1, tokenStart);
      if (isSequence && (parser.getToken() === 16 || parser.getToken() === 18)) {
        expressions.push(expr);
      }
      if (parser.getToken() === 18) {
        if (!isSequence) {
          isSequence = 1;
          expressions = [expr];
        }
      }
      if (isSequence) {
        while (consumeOpt(parser, context | 32, 18)) {
          expressions.push(parseExpression(parser, context, privateScope, 1, 1, parser.tokenStart));
        }
        parser.assignable = 2;
        expr = parser.finishNode({
          type: "SequenceExpression",
          expressions
        }, tokenAfterParenthesesStart);
      }
      consume(parser, context, 16);
      parser.destructible = destructible;
      return parser.options.preserveParens ? parser.finishNode({
        type: "ParenthesizedExpression",
        expression: expr
      }, parenthesesStart) : expr;
    }
    if (isSequence && (parser.getToken() === 16 || parser.getToken() === 18)) {
      expressions.push(expr);
    }
    if (!consumeOpt(parser, context | 32, 18))
      break;
    if (!isSequence) {
      isSequence = 1;
      expressions = [expr];
    }
    if (parser.getToken() === 16) {
      destructible |= 8;
      break;
    }
  }
  if (isSequence) {
    parser.assignable = 2;
    expr = parser.finishNode({
      type: "SequenceExpression",
      expressions
    }, tokenAfterParenthesesStart);
  }
  consume(parser, context, 16);
  if (destructible & 16 && destructible & 8)
    parser.report(151);
  destructible |= parser.destructible & 256 ? 256 : 0 | parser.destructible & 128 ? 128 : 0;
  if (parser.getToken() === 10) {
    if (destructible & (32 | 16))
      parser.report(49);
    if (context & (2048 | 2) && destructible & 128)
      parser.report(31);
    if (context & (1 | 1024) && destructible & 256) {
      parser.report(32);
    }
    if (isNonSimpleParameterList)
      parser.flags |= 128;
    if (hasStrictReserved)
      parser.flags |= 256;
    return parseParenthesizedArrow(parser, context, scope, privateScope, isSequence ? expressions : [expr], canAssign, 0, start);
  }
  if (destructible & 64) {
    parser.report(63);
  }
  if (destructible & 8) {
    parser.report(144);
  }
  parser.destructible = (parser.destructible | 256) ^ 256 | destructible;
  return parser.options.preserveParens ? parser.finishNode({
    type: "ParenthesizedExpression",
    expression: expr
  }, parenthesesStart) : expr;
}
__name(parseParenthesizedExpression, "parseParenthesizedExpression");
function parseIdentifierOrArrow(parser, context, privateScope) {
  const { tokenStart: start } = parser;
  const { tokenValue } = parser;
  let isNonSimpleParameterList = 0;
  let hasStrictReserved = 0;
  if ((parser.getToken() & 537079808) === 537079808) {
    isNonSimpleParameterList = 1;
  } else if ((parser.getToken() & 36864) === 36864) {
    hasStrictReserved = 1;
  }
  const expr = parseIdentifier(parser, context);
  parser.assignable = 1;
  if (parser.getToken() === 10) {
    const scope = parser.options.lexical ? createArrowHeadParsingScope(parser, context, tokenValue) : void 0;
    if (isNonSimpleParameterList)
      parser.flags |= 128;
    if (hasStrictReserved)
      parser.flags |= 256;
    return parseArrowFunctionExpression(parser, context, scope, privateScope, [expr], 0, start);
  }
  return expr;
}
__name(parseIdentifierOrArrow, "parseIdentifierOrArrow");
function parseArrowFromIdentifier(parser, context, privateScope, value, expr, inNew, canAssign, isAsync, start) {
  if (!canAssign)
    parser.report(57);
  if (inNew)
    parser.report(51);
  parser.flags &= -129;
  const scope = parser.options.lexical ? createArrowHeadParsingScope(parser, context, value) : void 0;
  return parseArrowFunctionExpression(parser, context, scope, privateScope, [expr], isAsync, start);
}
__name(parseArrowFromIdentifier, "parseArrowFromIdentifier");
function parseParenthesizedArrow(parser, context, scope, privateScope, params, canAssign, isAsync, start) {
  if (!canAssign)
    parser.report(57);
  for (let i = 0; i < params.length; ++i)
    reinterpretToPattern(parser, params[i]);
  return parseArrowFunctionExpression(parser, context, scope, privateScope, params, isAsync, start);
}
__name(parseParenthesizedArrow, "parseParenthesizedArrow");
function parseArrowFunctionExpression(parser, context, scope, privateScope, params, isAsync, start) {
  if (parser.flags & 1)
    parser.report(48);
  consume(parser, context | 32, 10);
  const modifierFlags = 1024 | 2048 | 8192 | 524288;
  context = (context | modifierFlags) ^ modifierFlags | (isAsync ? 2048 : 0);
  const expression = parser.getToken() !== 2162700;
  let body;
  scope?.reportScopeError();
  if (expression) {
    parser.flags = (parser.flags | 512 | 256 | 64 | 4096) ^ (512 | 256 | 64 | 4096);
    body = parseExpression(parser, context, privateScope, 1, 0, parser.tokenStart);
  } else {
    scope = scope?.createChildScope(64);
    const modifierFlags2 = 4 | 131072 | 8;
    body = parseFunctionBody(parser, (context | modifierFlags2) ^ modifierFlags2 | 4096, scope, privateScope, 16, void 0, void 0);
    switch (parser.getToken()) {
      case 69271571:
        if ((parser.flags & 1) === 0) {
          parser.report(116);
        }
        break;
      case 67108877:
      case 67174409:
      case 22:
        parser.report(117);
      case 67174411:
        if ((parser.flags & 1) === 0) {
          parser.report(116);
        }
        parser.flags |= 1024;
        break;
    }
    if ((parser.getToken() & 8388608) === 8388608 && (parser.flags & 1) === 0)
      parser.report(30, KeywordDescTable[parser.getToken() & 255]);
    if ((parser.getToken() & 33619968) === 33619968)
      parser.report(125);
  }
  parser.assignable = 2;
  return parser.finishNode({
    type: "ArrowFunctionExpression",
    params,
    body,
    async: isAsync === 1,
    expression,
    generator: false
  }, start);
}
__name(parseArrowFunctionExpression, "parseArrowFunctionExpression");
function parseFormalParametersOrFormalList(parser, context, scope, privateScope, inGroup, kind) {
  consume(parser, context, 67174411);
  parser.flags = (parser.flags | 128) ^ 128;
  const params = [];
  if (consumeOpt(parser, context, 16))
    return params;
  context = (context | 131072) ^ 131072;
  let isNonSimpleParameterList = 0;
  while (parser.getToken() !== 18) {
    let left;
    const { tokenStart } = parser;
    const token = parser.getToken();
    if (token & 143360) {
      if ((context & 1) === 0) {
        if ((token & 36864) === 36864) {
          parser.flags |= 256;
        }
        if ((token & 537079808) === 537079808) {
          parser.flags |= 512;
        }
      }
      left = parseAndClassifyIdentifier(parser, context, scope, kind | 1, 0);
    } else {
      if (token === 2162700) {
        left = parseObjectLiteralOrPattern(parser, context, scope, privateScope, 1, inGroup, 1, kind, 0);
      } else if (token === 69271571) {
        left = parseArrayExpressionOrPattern(parser, context, scope, privateScope, 1, inGroup, 1, kind, 0);
      } else if (token === 14) {
        left = parseSpreadOrRestElement(parser, context, scope, privateScope, 16, kind, 0, 0, inGroup, 1);
      } else {
        parser.report(30, KeywordDescTable[token & 255]);
      }
      isNonSimpleParameterList = 1;
      if (parser.destructible & (32 | 16)) {
        parser.report(50);
      }
    }
    if (parser.getToken() === 1077936155) {
      nextToken(parser, context | 32);
      isNonSimpleParameterList = 1;
      const right = parseExpression(parser, context, privateScope, 1, inGroup, parser.tokenStart);
      left = parser.finishNode({
        type: "AssignmentPattern",
        left,
        right
      }, tokenStart);
    }
    params.push(left);
    if (!consumeOpt(parser, context, 18))
      break;
    if (parser.getToken() === 16) {
      break;
    }
  }
  if (isNonSimpleParameterList)
    parser.flags |= 128;
  if (isNonSimpleParameterList || context & 1) {
    scope?.reportScopeError();
  }
  consume(parser, context, 16);
  return params;
}
__name(parseFormalParametersOrFormalList, "parseFormalParametersOrFormalList");
function parseMemberExpressionNoCall(parser, context, privateScope, expr, inGroup, start) {
  const token = parser.getToken();
  if (token & 67108864) {
    if (token === 67108877) {
      nextToken(parser, context | 262144);
      parser.assignable = 1;
      const property = parsePropertyOrPrivatePropertyName(parser, context, privateScope);
      return parseMemberExpressionNoCall(parser, context, privateScope, parser.finishNode({
        type: "MemberExpression",
        object: expr,
        computed: false,
        property,
        optional: false
      }, start), 0, start);
    } else if (token === 69271571) {
      nextToken(parser, context | 32);
      const { tokenStart } = parser;
      const property = parseExpressions(parser, context, privateScope, inGroup, 1, tokenStart);
      consume(parser, context, 20);
      parser.assignable = 1;
      return parseMemberExpressionNoCall(parser, context, privateScope, parser.finishNode({
        type: "MemberExpression",
        object: expr,
        computed: true,
        property,
        optional: false
      }, start), 0, start);
    } else if (token === 67174408 || token === 67174409) {
      parser.assignable = 2;
      return parseMemberExpressionNoCall(parser, context, privateScope, parser.finishNode({
        type: "TaggedTemplateExpression",
        tag: expr,
        quasi: parser.getToken() === 67174408 ? parseTemplate(parser, context | 64, privateScope) : parseTemplateLiteral(parser, context | 64)
      }, start), 0, start);
    }
  }
  return expr;
}
__name(parseMemberExpressionNoCall, "parseMemberExpressionNoCall");
function parseNewExpression(parser, context, privateScope, inGroup) {
  const { tokenStart: start } = parser;
  const id = parseIdentifier(parser, context | 32);
  const { tokenStart } = parser;
  if (consumeOpt(parser, context, 67108877)) {
    if (context & 65536 && parser.getToken() === 209029) {
      parser.assignable = 2;
      return parseMetaProperty(parser, context, id, start);
    }
    parser.report(94);
  }
  parser.assignable = 2;
  if ((parser.getToken() & 16842752) === 16842752) {
    parser.report(65, KeywordDescTable[parser.getToken() & 255]);
  }
  const expr = parsePrimaryExpression(parser, context, privateScope, 2, 1, 0, inGroup, 1, tokenStart);
  context = (context | 131072) ^ 131072;
  if (parser.getToken() === 67108990)
    parser.report(168);
  const callee = parseMemberExpressionNoCall(parser, context, privateScope, expr, inGroup, tokenStart);
  parser.assignable = 2;
  return parser.finishNode({
    type: "NewExpression",
    callee,
    arguments: parser.getToken() === 67174411 ? parseArguments(parser, context, privateScope, inGroup) : []
  }, start);
}
__name(parseNewExpression, "parseNewExpression");
function parseMetaProperty(parser, context, meta, start) {
  const property = parseIdentifier(parser, context);
  return parser.finishNode({
    type: "MetaProperty",
    meta,
    property
  }, start);
}
__name(parseMetaProperty, "parseMetaProperty");
function parseAsyncArrowAfterIdent(parser, context, privateScope, canAssign, start) {
  if (parser.getToken() === 209006)
    parser.report(31);
  if (context & (1 | 1024) && parser.getToken() === 241771) {
    parser.report(32);
  }
  classifyIdentifier(parser, context, parser.getToken());
  if ((parser.getToken() & 36864) === 36864) {
    parser.flags |= 256;
  }
  return parseArrowFromIdentifier(parser, context & -524289 | 2048, privateScope, parser.tokenValue, parseIdentifier(parser, context), 0, canAssign, 1, start);
}
__name(parseAsyncArrowAfterIdent, "parseAsyncArrowAfterIdent");
function parseAsyncArrowOrCallExpression(parser, context, privateScope, callee, canAssign, kind, origin, flags, start) {
  nextToken(parser, context | 32);
  const scope = parser.createScopeIfLexical()?.createChildScope(512);
  context = (context | 131072) ^ 131072;
  if (consumeOpt(parser, context, 16)) {
    if (parser.getToken() === 10) {
      if (flags & 1)
        parser.report(48);
      return parseParenthesizedArrow(parser, context, scope, privateScope, [], canAssign, 1, start);
    }
    return parser.finishNode({
      type: "CallExpression",
      callee,
      arguments: [],
      optional: false
    }, start);
  }
  let destructible = 0;
  let expr = null;
  let isNonSimpleParameterList = 0;
  parser.destructible = (parser.destructible | 256 | 128) ^ (256 | 128);
  const params = [];
  while (parser.getToken() !== 16) {
    const { tokenStart } = parser;
    const token = parser.getToken();
    if (token & 143360) {
      scope?.addBlockName(context, parser.tokenValue, kind, 0);
      if ((token & 537079808) === 537079808) {
        parser.flags |= 512;
      } else if ((token & 36864) === 36864) {
        parser.flags |= 256;
      }
      expr = parsePrimaryExpression(parser, context, privateScope, kind, 0, 1, 1, 1, tokenStart);
      if (parser.getToken() === 16 || parser.getToken() === 18) {
        if (parser.assignable & 2) {
          destructible |= 16;
          isNonSimpleParameterList = 1;
        }
      } else {
        if (parser.getToken() === 1077936155) {
          isNonSimpleParameterList = 1;
        } else {
          destructible |= 16;
        }
        expr = parseMemberOrUpdateExpression(parser, context, privateScope, expr, 1, 0, tokenStart);
        if (parser.getToken() !== 16 && parser.getToken() !== 18) {
          expr = parseAssignmentExpression(parser, context, privateScope, 1, 0, tokenStart, expr);
        }
      }
    } else if (token & 2097152) {
      expr = token === 2162700 ? parseObjectLiteralOrPattern(parser, context, scope, privateScope, 0, 1, 0, kind, origin) : parseArrayExpressionOrPattern(parser, context, scope, privateScope, 0, 1, 0, kind, origin);
      destructible |= parser.destructible;
      isNonSimpleParameterList = 1;
      if (parser.getToken() !== 16 && parser.getToken() !== 18) {
        if (destructible & 8)
          parser.report(122);
        expr = parseMemberOrUpdateExpression(parser, context, privateScope, expr, 0, 0, tokenStart);
        destructible |= 16;
        if ((parser.getToken() & 8388608) === 8388608) {
          expr = parseBinaryExpression(parser, context, privateScope, 1, start, 4, token, expr);
        }
        if (consumeOpt(parser, context | 32, 22)) {
          expr = parseConditionalExpression(parser, context, privateScope, expr, start);
        }
      }
    } else if (token === 14) {
      expr = parseSpreadOrRestElement(parser, context, scope, privateScope, 16, kind, origin, 1, 1, 0);
      destructible |= (parser.getToken() === 16 ? 0 : 16) | parser.destructible;
      isNonSimpleParameterList = 1;
    } else {
      expr = parseExpression(parser, context, privateScope, 1, 0, tokenStart);
      destructible = parser.assignable;
      params.push(expr);
      while (consumeOpt(parser, context | 32, 18)) {
        params.push(parseExpression(parser, context, privateScope, 1, 0, tokenStart));
      }
      destructible |= parser.assignable;
      consume(parser, context, 16);
      parser.destructible = destructible | 16;
      parser.assignable = 2;
      return parser.finishNode({
        type: "CallExpression",
        callee,
        arguments: params,
        optional: false
      }, start);
    }
    params.push(expr);
    if (!consumeOpt(parser, context | 32, 18))
      break;
  }
  consume(parser, context, 16);
  destructible |= parser.destructible & 256 ? 256 : 0 | parser.destructible & 128 ? 128 : 0;
  if (parser.getToken() === 10) {
    if (destructible & (32 | 16))
      parser.report(27);
    if (parser.flags & 1 || flags & 1)
      parser.report(48);
    if (destructible & 128)
      parser.report(31);
    if (context & (1 | 1024) && destructible & 256)
      parser.report(32);
    if (isNonSimpleParameterList)
      parser.flags |= 128;
    return parseParenthesizedArrow(parser, context | 2048, scope, privateScope, params, canAssign, 1, start);
  }
  if (destructible & 64) {
    parser.report(63);
  }
  if (destructible & 8) {
    parser.report(62);
  }
  parser.assignable = 2;
  return parser.finishNode({
    type: "CallExpression",
    callee,
    arguments: params,
    optional: false
  }, start);
}
__name(parseAsyncArrowOrCallExpression, "parseAsyncArrowOrCallExpression");
function parseRegExpLiteral(parser, context) {
  const { tokenRaw, tokenRegExp, tokenValue, tokenStart } = parser;
  nextToken(parser, context);
  parser.assignable = 2;
  const node = {
    type: "Literal",
    value: tokenValue,
    regex: tokenRegExp
  };
  if (parser.options.raw) {
    node.raw = tokenRaw;
  }
  return parser.finishNode(node, tokenStart);
}
__name(parseRegExpLiteral, "parseRegExpLiteral");
function parseClassDeclaration(parser, context, scope, privateScope, flags) {
  let start;
  let decorators;
  if (parser.leadingDecorators.decorators.length) {
    if (parser.getToken() === 132) {
      parser.report(30, "@");
    }
    start = parser.leadingDecorators.start;
    decorators = [...parser.leadingDecorators.decorators];
    parser.leadingDecorators.decorators.length = 0;
  } else {
    start = parser.tokenStart;
    decorators = parseDecorators(parser, context, privateScope);
  }
  context = (context | 16384 | 1) ^ 16384;
  nextToken(parser, context);
  let id = null;
  let superClass = null;
  const { tokenValue } = parser;
  if (parser.getToken() & 4096 && parser.getToken() !== 20565) {
    if (isStrictReservedWord(parser, context, parser.getToken())) {
      parser.report(118);
    }
    if ((parser.getToken() & 537079808) === 537079808) {
      parser.report(119);
    }
    if (scope) {
      scope.addBlockName(context, tokenValue, 32, 0);
      if (flags) {
        if (flags & 2) {
          parser.declareUnboundVariable(tokenValue);
        }
      }
    }
    id = parseIdentifier(parser, context);
  } else {
    if ((flags & 1) === 0)
      parser.report(39, "Class");
  }
  let inheritedContext = context;
  if (consumeOpt(parser, context | 32, 20565)) {
    superClass = parseLeftHandSideExpression(parser, context, privateScope, 0, 0, 0);
    inheritedContext |= 512;
  } else {
    inheritedContext = (inheritedContext | 512) ^ 512;
  }
  const body = parseClassBody(parser, inheritedContext, context, scope, privateScope, 2, 8, 0);
  return parser.finishNode({
    type: "ClassDeclaration",
    id,
    superClass,
    body,
    ...parser.options.next ? { decorators } : null
  }, start);
}
__name(parseClassDeclaration, "parseClassDeclaration");
function parseClassExpression(parser, context, privateScope, inGroup, start) {
  let id = null;
  let superClass = null;
  const decorators = parseDecorators(parser, context, privateScope);
  context = (context | 1 | 16384) ^ 16384;
  nextToken(parser, context);
  if (parser.getToken() & 4096 && parser.getToken() !== 20565) {
    if (isStrictReservedWord(parser, context, parser.getToken()))
      parser.report(118);
    if ((parser.getToken() & 537079808) === 537079808) {
      parser.report(119);
    }
    id = parseIdentifier(parser, context);
  }
  let inheritedContext = context;
  if (consumeOpt(parser, context | 32, 20565)) {
    superClass = parseLeftHandSideExpression(parser, context, privateScope, 0, inGroup, 0);
    inheritedContext |= 512;
  } else {
    inheritedContext = (inheritedContext | 512) ^ 512;
  }
  const body = parseClassBody(parser, inheritedContext, context, void 0, privateScope, 2, 0, inGroup);
  parser.assignable = 2;
  return parser.finishNode({
    type: "ClassExpression",
    id,
    superClass,
    body,
    ...parser.options.next ? { decorators } : null
  }, start);
}
__name(parseClassExpression, "parseClassExpression");
function parseDecorators(parser, context, privateScope) {
  const list = [];
  if (parser.options.next) {
    while (parser.getToken() === 132) {
      list.push(parseDecoratorList(parser, context, privateScope));
    }
  }
  return list;
}
__name(parseDecorators, "parseDecorators");
function parseDecoratorList(parser, context, privateScope) {
  const start = parser.tokenStart;
  nextToken(parser, context | 32);
  let expression = parsePrimaryExpression(parser, context, privateScope, 2, 0, 1, 0, 1, start);
  expression = parseMemberOrUpdateExpression(parser, context, privateScope, expression, 0, 0, parser.tokenStart);
  return parser.finishNode({
    type: "Decorator",
    expression
  }, start);
}
__name(parseDecoratorList, "parseDecoratorList");
function parseClassBody(parser, context, inheritedContext, scope, parentScope, kind, origin, inGroup) {
  const { tokenStart } = parser;
  const privateScope = parser.createPrivateScopeIfLexical(parentScope);
  consume(parser, context | 32, 2162700);
  const modifierFlags = 131072 | 524288;
  context = (context | modifierFlags) ^ modifierFlags;
  const hasConstr = parser.flags & 32;
  parser.flags = (parser.flags | 32) ^ 32;
  const body = [];
  while (parser.getToken() !== 1074790415) {
    const decoratorStart = parser.tokenStart;
    const decorators = parseDecorators(parser, context, privateScope);
    if (decorators.length > 0 && parser.tokenValue === "constructor") {
      parser.report(109);
    }
    if (parser.getToken() === 1074790415)
      parser.report(108);
    if (consumeOpt(parser, context, 1074790417)) {
      if (decorators.length > 0)
        parser.report(120);
      continue;
    }
    body.push(parseClassElementList(parser, context, scope, privateScope, inheritedContext, kind, decorators, 0, inGroup, decorators.length > 0 ? decoratorStart : parser.tokenStart));
  }
  consume(parser, origin & 8 ? context | 32 : context, 1074790415);
  privateScope?.validatePrivateIdentifierRefs();
  parser.flags = parser.flags & -33 | hasConstr;
  return parser.finishNode({
    type: "ClassBody",
    body
  }, tokenStart);
}
__name(parseClassBody, "parseClassBody");
function parseClassElementList(parser, context, scope, privateScope, inheritedContext, type, decorators, isStatic, inGroup, start) {
  let kind = isStatic ? 32 : 0;
  let key = null;
  const token = parser.getToken();
  if (token & (143360 | 36864) || token === -2147483528) {
    key = parseIdentifier(parser, context);
    switch (token) {
      case 36970:
        if (!isStatic && parser.getToken() !== 67174411 && (parser.getToken() & 1048576) !== 1048576 && parser.getToken() !== 1077936155) {
          return parseClassElementList(parser, context, scope, privateScope, inheritedContext, type, decorators, 1, inGroup, start);
        }
        break;
      case 209005:
        if (parser.getToken() !== 67174411 && (parser.flags & 1) === 0) {
          if ((parser.getToken() & 1073741824) === 1073741824) {
            return parsePropertyDefinition(parser, context, privateScope, key, kind, decorators, start);
          }
          kind |= 16 | (optionalBit(parser, context, 8391476) ? 8 : 0);
        }
        break;
      case 209008:
        if (parser.getToken() !== 67174411) {
          if ((parser.getToken() & 1073741824) === 1073741824) {
            return parsePropertyDefinition(parser, context, privateScope, key, kind, decorators, start);
          }
          kind |= 256;
        }
        break;
      case 209009:
        if (parser.getToken() !== 67174411) {
          if ((parser.getToken() & 1073741824) === 1073741824) {
            return parsePropertyDefinition(parser, context, privateScope, key, kind, decorators, start);
          }
          kind |= 512;
        }
        break;
      case 12402:
        if (parser.getToken() !== 67174411 && (parser.flags & 1) === 0) {
          if ((parser.getToken() & 1073741824) === 1073741824) {
            return parsePropertyDefinition(parser, context, privateScope, key, kind, decorators, start);
          }
          if (parser.options.next)
            kind |= 1024;
        }
        break;
    }
  } else if (token === 69271571) {
    kind |= 2;
    key = parseComputedPropertyName(parser, inheritedContext, privateScope, inGroup);
  } else if ((token & 134217728) === 134217728) {
    key = parseLiteral(parser, context);
  } else if (token === 8391476) {
    kind |= 8;
    nextToken(parser, context);
  } else if (parser.getToken() === 130) {
    kind |= 8192;
    key = parsePrivateIdentifier(parser, context | 16, privateScope, 768);
  } else if ((parser.getToken() & 1073741824) === 1073741824) {
    kind |= 128;
  } else if (isStatic && token === 2162700) {
    return parseStaticBlock(parser, context | 16, scope, privateScope, start);
  } else if (token === -2147483527) {
    key = parseIdentifier(parser, context);
    if (parser.getToken() !== 67174411)
      parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  } else {
    parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  }
  if (kind & (8 | 16 | 768 | 1024)) {
    if (parser.getToken() & 143360 || parser.getToken() === -2147483528 || parser.getToken() === -2147483527) {
      key = parseIdentifier(parser, context);
    } else if ((parser.getToken() & 134217728) === 134217728) {
      key = parseLiteral(parser, context);
    } else if (parser.getToken() === 69271571) {
      kind |= 2;
      key = parseComputedPropertyName(parser, context, privateScope, 0);
    } else if (parser.getToken() === 130) {
      kind |= 8192;
      key = parsePrivateIdentifier(parser, context, privateScope, kind);
    } else
      parser.report(135);
  }
  if ((kind & 2) === 0) {
    if (parser.tokenValue === "constructor") {
      if ((parser.getToken() & 1073741824) === 1073741824) {
        parser.report(129);
      } else if ((kind & 32) === 0 && parser.getToken() === 67174411) {
        if (kind & (768 | 16 | 128 | 8)) {
          parser.report(53, "accessor");
        } else if ((context & 512) === 0) {
          if (parser.flags & 32)
            parser.report(54);
          else
            parser.flags |= 32;
        }
      }
      kind |= 64;
    } else if ((kind & 8192) === 0 && kind & 32 && parser.tokenValue === "prototype") {
      parser.report(52);
    }
  }
  if (kind & 1024 || parser.getToken() !== 67174411 && (kind & 768) === 0) {
    return parsePropertyDefinition(parser, context, privateScope, key, kind, decorators, start);
  }
  const value = parseMethodDefinition(parser, context | 16, privateScope, kind, inGroup, parser.tokenStart);
  return parser.finishNode({
    type: "MethodDefinition",
    kind: (kind & 32) === 0 && kind & 64 ? "constructor" : kind & 256 ? "get" : kind & 512 ? "set" : "method",
    static: (kind & 32) > 0,
    computed: (kind & 2) > 0,
    key,
    value,
    ...parser.options.next ? { decorators } : null
  }, start);
}
__name(parseClassElementList, "parseClassElementList");
function parsePrivateIdentifier(parser, context, privateScope, kind) {
  const { tokenStart } = parser;
  nextToken(parser, context);
  const { tokenValue } = parser;
  if (tokenValue === "constructor")
    parser.report(128);
  if (parser.options.lexical) {
    if (!privateScope)
      parser.report(4, tokenValue);
    if (kind) {
      privateScope.addPrivateIdentifier(tokenValue, kind);
    } else {
      privateScope.addPrivateIdentifierRef(tokenValue);
    }
  }
  nextToken(parser, context);
  return parser.finishNode({
    type: "PrivateIdentifier",
    name: tokenValue
  }, tokenStart);
}
__name(parsePrivateIdentifier, "parsePrivateIdentifier");
function parsePropertyDefinition(parser, context, privateScope, key, state, decorators, start) {
  let value = null;
  if (state & 8)
    parser.report(0);
  if (parser.getToken() === 1077936155) {
    nextToken(parser, context | 32);
    const { tokenStart } = parser;
    if (parser.getToken() === 537079927)
      parser.report(119);
    const modifierFlags = 1024 | 2048 | 8192 | ((state & 64) === 0 ? 512 | 16384 : 0);
    context = (context | modifierFlags) ^ modifierFlags | (state & 8 ? 1024 : 0) | (state & 16 ? 2048 : 0) | (state & 64 ? 16384 : 0) | 256 | 65536;
    value = parsePrimaryExpression(parser, context | 16, privateScope, 2, 0, 1, 0, 1, tokenStart);
    if ((parser.getToken() & 1073741824) !== 1073741824 || (parser.getToken() & 4194304) === 4194304) {
      value = parseMemberOrUpdateExpression(parser, context | 16, privateScope, value, 0, 0, tokenStart);
      value = parseAssignmentExpression(parser, context | 16, privateScope, 0, 0, tokenStart, value);
    }
  }
  matchOrInsertSemicolon(parser, context);
  return parser.finishNode({
    type: state & 1024 ? "AccessorProperty" : "PropertyDefinition",
    key,
    value,
    static: (state & 32) > 0,
    computed: (state & 2) > 0,
    ...parser.options.next ? { decorators } : null
  }, start);
}
__name(parsePropertyDefinition, "parsePropertyDefinition");
function parseBindingPattern(parser, context, scope, privateScope, type, origin) {
  if (parser.getToken() & 143360 || (context & 1) === 0 && parser.getToken() === -2147483527)
    return parseAndClassifyIdentifier(parser, context, scope, type, origin);
  if ((parser.getToken() & 2097152) !== 2097152)
    parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  const left = parser.getToken() === 69271571 ? parseArrayExpressionOrPattern(parser, context, scope, privateScope, 1, 0, 1, type, origin) : parseObjectLiteralOrPattern(parser, context, scope, privateScope, 1, 0, 1, type, origin);
  if (parser.destructible & 16)
    parser.report(50);
  if (parser.destructible & 32)
    parser.report(50);
  return left;
}
__name(parseBindingPattern, "parseBindingPattern");
function parseAndClassifyIdentifier(parser, context, scope, kind, origin) {
  const token = parser.getToken();
  if (context & 1) {
    if ((token & 537079808) === 537079808) {
      parser.report(119);
    } else if ((token & 36864) === 36864 || token === -2147483527) {
      parser.report(118);
    }
  }
  if ((token & 20480) === 20480) {
    parser.report(102);
  }
  if (token === 241771) {
    if (context & 1024)
      parser.report(32);
    if (context & 2)
      parser.report(111);
  }
  if ((token & 255) === (241737 & 255)) {
    if (kind & (8 | 16))
      parser.report(100);
  }
  if (token === 209006) {
    if (context & 2048)
      parser.report(176);
    if (context & 2)
      parser.report(110);
  }
  const { tokenValue, tokenStart: start } = parser;
  nextToken(parser, context);
  scope?.addVarOrBlock(context, tokenValue, kind, origin);
  return parser.finishNode({
    type: "Identifier",
    name: tokenValue
  }, start);
}
__name(parseAndClassifyIdentifier, "parseAndClassifyIdentifier");
function parseJSXRootElementOrFragment(parser, context, privateScope, inJSXChild, start) {
  if (!inJSXChild)
    consume(parser, context, 8456256);
  if (parser.getToken() === 8390721) {
    const openingFragment = parseJSXOpeningFragment(parser, start);
    const [children2, closingFragment] = parseJSXChildrenAndClosingFragment(parser, context, privateScope, inJSXChild);
    return parser.finishNode({
      type: "JSXFragment",
      openingFragment,
      children: children2,
      closingFragment
    }, start);
  }
  if (parser.getToken() === 8457014)
    parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  let closingElement = null;
  let children = [];
  const openingElement = parseJSXOpeningElementOrSelfCloseElement(parser, context, privateScope, inJSXChild, start);
  if (!openingElement.selfClosing) {
    [children, closingElement] = parseJSXChildrenAndClosingElement(parser, context, privateScope, inJSXChild);
    const close = isEqualTagName(closingElement.name);
    if (isEqualTagName(openingElement.name) !== close)
      parser.report(155, close);
  }
  return parser.finishNode({
    type: "JSXElement",
    children,
    openingElement,
    closingElement
  }, start);
}
__name(parseJSXRootElementOrFragment, "parseJSXRootElementOrFragment");
function parseJSXOpeningFragment(parser, start) {
  nextJSXToken(parser);
  return parser.finishNode({
    type: "JSXOpeningFragment"
  }, start);
}
__name(parseJSXOpeningFragment, "parseJSXOpeningFragment");
function parseJSXClosingElement(parser, context, inJSXChild, start) {
  consume(parser, context, 8457014);
  const name = parseJSXElementName(parser, context);
  if (parser.getToken() !== 8390721) {
    parser.report(25, KeywordDescTable[8390721 & 255]);
  }
  if (inJSXChild) {
    nextJSXToken(parser);
  } else {
    nextToken(parser, context);
  }
  return parser.finishNode({
    type: "JSXClosingElement",
    name
  }, start);
}
__name(parseJSXClosingElement, "parseJSXClosingElement");
function parseJSXClosingFragment(parser, context, inJSXChild, start) {
  consume(parser, context, 8457014);
  if (parser.getToken() !== 8390721) {
    parser.report(25, KeywordDescTable[8390721 & 255]);
  }
  if (inJSXChild) {
    nextJSXToken(parser);
  } else {
    nextToken(parser, context);
  }
  return parser.finishNode({
    type: "JSXClosingFragment"
  }, start);
}
__name(parseJSXClosingFragment, "parseJSXClosingFragment");
function parseJSXChildrenAndClosingElement(parser, context, privateScope, inJSXChild) {
  const children = [];
  while (true) {
    const child = parseJSXChildOrClosingElement(parser, context, privateScope, inJSXChild);
    if (child.type === "JSXClosingElement") {
      return [children, child];
    }
    children.push(child);
  }
}
__name(parseJSXChildrenAndClosingElement, "parseJSXChildrenAndClosingElement");
function parseJSXChildrenAndClosingFragment(parser, context, privateScope, inJSXChild) {
  const children = [];
  while (true) {
    const child = parseJSXChildOrClosingFragment(parser, context, privateScope, inJSXChild);
    if (child.type === "JSXClosingFragment") {
      return [children, child];
    }
    children.push(child);
  }
}
__name(parseJSXChildrenAndClosingFragment, "parseJSXChildrenAndClosingFragment");
function parseJSXChildOrClosingElement(parser, context, privateScope, inJSXChild) {
  if (parser.getToken() === 137)
    return parseJSXText(parser, context);
  if (parser.getToken() === 2162700)
    return parseJSXExpressionContainer(parser, context, privateScope, 1, 0);
  if (parser.getToken() === 8456256) {
    const { tokenStart } = parser;
    nextToken(parser, context);
    if (parser.getToken() === 8457014)
      return parseJSXClosingElement(parser, context, inJSXChild, tokenStart);
    return parseJSXRootElementOrFragment(parser, context, privateScope, 1, tokenStart);
  }
  parser.report(0);
}
__name(parseJSXChildOrClosingElement, "parseJSXChildOrClosingElement");
function parseJSXChildOrClosingFragment(parser, context, privateScope, inJSXChild) {
  if (parser.getToken() === 137)
    return parseJSXText(parser, context);
  if (parser.getToken() === 2162700)
    return parseJSXExpressionContainer(parser, context, privateScope, 1, 0);
  if (parser.getToken() === 8456256) {
    const { tokenStart } = parser;
    nextToken(parser, context);
    if (parser.getToken() === 8457014)
      return parseJSXClosingFragment(parser, context, inJSXChild, tokenStart);
    return parseJSXRootElementOrFragment(parser, context, privateScope, 1, tokenStart);
  }
  parser.report(0);
}
__name(parseJSXChildOrClosingFragment, "parseJSXChildOrClosingFragment");
function parseJSXText(parser, context) {
  const start = parser.tokenStart;
  nextToken(parser, context);
  const node = {
    type: "JSXText",
    value: parser.tokenValue
  };
  if (parser.options.raw) {
    node.raw = parser.tokenRaw;
  }
  return parser.finishNode(node, start);
}
__name(parseJSXText, "parseJSXText");
function parseJSXOpeningElementOrSelfCloseElement(parser, context, privateScope, inJSXChild, start) {
  if ((parser.getToken() & 143360) !== 143360 && (parser.getToken() & 4096) !== 4096)
    parser.report(0);
  const tagName = parseJSXElementName(parser, context);
  const attributes = parseJSXAttributes(parser, context, privateScope);
  const selfClosing = parser.getToken() === 8457014;
  if (selfClosing)
    consume(parser, context, 8457014);
  if (parser.getToken() !== 8390721) {
    parser.report(25, KeywordDescTable[8390721 & 255]);
  }
  if (inJSXChild || !selfClosing) {
    nextJSXToken(parser);
  } else {
    nextToken(parser, context);
  }
  return parser.finishNode({
    type: "JSXOpeningElement",
    name: tagName,
    attributes,
    selfClosing
  }, start);
}
__name(parseJSXOpeningElementOrSelfCloseElement, "parseJSXOpeningElementOrSelfCloseElement");
function parseJSXElementName(parser, context) {
  const { tokenStart } = parser;
  rescanJSXIdentifier(parser);
  let key = parseJSXIdentifier(parser, context);
  if (parser.getToken() === 21)
    return parseJSXNamespacedName(parser, context, key, tokenStart);
  while (consumeOpt(parser, context, 67108877)) {
    rescanJSXIdentifier(parser);
    key = parseJSXMemberExpression(parser, context, key, tokenStart);
  }
  return key;
}
__name(parseJSXElementName, "parseJSXElementName");
function parseJSXMemberExpression(parser, context, object, start) {
  const property = parseJSXIdentifier(parser, context);
  return parser.finishNode({
    type: "JSXMemberExpression",
    object,
    property
  }, start);
}
__name(parseJSXMemberExpression, "parseJSXMemberExpression");
function parseJSXAttributes(parser, context, privateScope) {
  const attributes = [];
  while (parser.getToken() !== 8457014 && parser.getToken() !== 8390721 && parser.getToken() !== 1048576) {
    attributes.push(parseJsxAttribute(parser, context, privateScope));
  }
  return attributes;
}
__name(parseJSXAttributes, "parseJSXAttributes");
function parseJSXSpreadAttribute(parser, context, privateScope) {
  const start = parser.tokenStart;
  nextToken(parser, context);
  consume(parser, context, 14);
  const expression = parseExpression(parser, context, privateScope, 1, 0, parser.tokenStart);
  consume(parser, context, 1074790415);
  return parser.finishNode({
    type: "JSXSpreadAttribute",
    argument: expression
  }, start);
}
__name(parseJSXSpreadAttribute, "parseJSXSpreadAttribute");
function parseJsxAttribute(parser, context, privateScope) {
  const { tokenStart } = parser;
  if (parser.getToken() === 2162700)
    return parseJSXSpreadAttribute(parser, context, privateScope);
  rescanJSXIdentifier(parser);
  let value = null;
  let name = parseJSXIdentifier(parser, context);
  if (parser.getToken() === 21) {
    name = parseJSXNamespacedName(parser, context, name, tokenStart);
  }
  if (parser.getToken() === 1077936155) {
    const token = scanJSXAttributeValue(parser, context);
    switch (token) {
      case 134283267:
        value = parseLiteral(parser, context);
        break;
      case 8456256:
        value = parseJSXRootElementOrFragment(parser, context, privateScope, 0, parser.tokenStart);
        break;
      case 2162700:
        value = parseJSXExpressionContainer(parser, context, privateScope, 0, 1);
        break;
      default:
        parser.report(154);
    }
  }
  return parser.finishNode({
    type: "JSXAttribute",
    value,
    name
  }, tokenStart);
}
__name(parseJsxAttribute, "parseJsxAttribute");
function parseJSXNamespacedName(parser, context, namespace, start) {
  consume(parser, context, 21);
  const name = parseJSXIdentifier(parser, context);
  return parser.finishNode({
    type: "JSXNamespacedName",
    namespace,
    name
  }, start);
}
__name(parseJSXNamespacedName, "parseJSXNamespacedName");
function parseJSXExpressionContainer(parser, context, privateScope, inJSXChild, isAttr) {
  const { tokenStart: start } = parser;
  nextToken(parser, context | 32);
  const { tokenStart } = parser;
  if (parser.getToken() === 14)
    return parseJSXSpreadChild(parser, context, privateScope, start);
  let expression = null;
  if (parser.getToken() === 1074790415) {
    if (isAttr)
      parser.report(157);
    expression = parseJSXEmptyExpression(parser, {
      index: parser.startIndex,
      line: parser.startLine,
      column: parser.startColumn
    });
  } else {
    expression = parseExpression(parser, context, privateScope, 1, 0, tokenStart);
  }
  if (parser.getToken() !== 1074790415) {
    parser.report(25, KeywordDescTable[1074790415 & 255]);
  }
  if (inJSXChild) {
    nextJSXToken(parser);
  } else {
    nextToken(parser, context);
  }
  return parser.finishNode({
    type: "JSXExpressionContainer",
    expression
  }, start);
}
__name(parseJSXExpressionContainer, "parseJSXExpressionContainer");
function parseJSXSpreadChild(parser, context, privateScope, start) {
  consume(parser, context, 14);
  const expression = parseExpression(parser, context, privateScope, 1, 0, parser.tokenStart);
  consume(parser, context, 1074790415);
  return parser.finishNode({
    type: "JSXSpreadChild",
    expression
  }, start);
}
__name(parseJSXSpreadChild, "parseJSXSpreadChild");
function parseJSXEmptyExpression(parser, start) {
  return parser.finishNode({
    type: "JSXEmptyExpression"
  }, start, parser.tokenStart);
}
__name(parseJSXEmptyExpression, "parseJSXEmptyExpression");
function parseJSXIdentifier(parser, context) {
  const start = parser.tokenStart;
  if (!(parser.getToken() & 143360)) {
    parser.report(30, KeywordDescTable[parser.getToken() & 255]);
  }
  const { tokenValue } = parser;
  nextToken(parser, context);
  return parser.finishNode({
    type: "JSXIdentifier",
    name: tokenValue
  }, start);
}
__name(parseJSXIdentifier, "parseJSXIdentifier");
function parseScript(source, options) {
  return parseSource(source, options);
}
__name(parseScript, "parseScript");

// dist/src/utils/javascript/JsAnalyzer.js
var _JsAnalyzer = class _JsAnalyzer {
  /**
   * Creates a new instance over the provided source.
   * @param code JavaScript source to parse and inspect.
   * @param options Optional traversal settings.
   */
  constructor(code, options = {}) {
    __publicField(this, "source");
    __publicField(this, "programAst");
    __publicField(this, "hasExtractions");
    __publicField(this, "extractionStates");
    __publicField(this, "dependentsTracker", /* @__PURE__ */ new Map());
    __publicField(this, "pendingPrototypeAliasBinding", null);
    __publicField(this, "iifeParamName", null);
    __publicField(this, "declaredVariables", /* @__PURE__ */ new Map());
    this.source = code;
    const extractionConfigs = options.extractions ? Array.isArray(options.extractions) ? options.extractions : [options.extractions] : [];
    this.extractionStates = extractionConfigs.map((config) => ({
      config: { collectDependencies: true, stopWhenReady: true, ...config },
      dependencies: /* @__PURE__ */ new Set(),
      dependents: /* @__PURE__ */ new Set(),
      ready: false
    }));
    this.hasExtractions = this.extractionStates.length > 0;
    this.programAst = parseScript(code, {
      ranges: true,
      loc: false,
      module: false
    });
    this.analyzeAst();
  }
  /**
   * Walks the AST to collect declarations and resolve initial targets.
   */
  analyzeAst() {
    let iifeBody;
    for (const statement of this.programAst.body) {
      if (statement.type === "ExpressionStatement" && statement.expression.type === "CallExpression") {
        const callExpr = statement.expression;
        if (callExpr.callee.type === "FunctionExpression") {
          const funcExpr = callExpr.callee;
          const firstParam = funcExpr.params.length > 0 ? funcExpr.params[0] : null;
          if (!this.iifeParamName && firstParam?.type === "Identifier") {
            this.iifeParamName = firstParam.name;
          }
          if (funcExpr.body?.type === "BlockStatement") {
            iifeBody = funcExpr.body;
            break;
          }
        }
      }
    }
    if (!iifeBody)
      return;
    for (const currentNode of iifeBody.body) {
      switch (currentNode.type) {
        case "ExpressionStatement": {
          const assignment = currentNode.expression;
          if (assignment.type !== "AssignmentExpression")
            continue;
          const left = assignment.left;
          const right = assignment.right;
          if (right.type === "MemberExpression" && !right.computed && right.property.type === "Identifier" && right.property.name === "prototype") {
            const prototypeSourceExpr = memberToString(right, this.source);
            const aliasTargetExpr = left.type === "Identifier" ? left.name : memberToString(left, this.source);
            if (prototypeSourceExpr) {
              const prototypeOwnerMeta = this.declaredVariables.get(prototypeSourceExpr.replace(".prototype", ""));
              if (aliasTargetExpr && prototypeOwnerMeta) {
                const aliasedPrototypeMembers = /* @__PURE__ */ new Set();
                const aliasExpr = `${aliasTargetExpr}.`;
                this.pendingPrototypeAliasBinding = [aliasExpr, prototypeOwnerMeta];
                prototypeOwnerMeta.prototypeAliases.set(aliasExpr, aliasedPrototypeMembers);
              }
            }
          }
          if (left.type === "Identifier") {
            const existingVariable = this.declaredVariables.get(left.name);
            if (!existingVariable)
              continue;
            existingVariable.node.init = right;
            if (this.needsDependencyAnalysis(right)) {
              existingVariable.dependencies = this.findDependencies(assignment.right, left.name);
            }
            if (this.onMatch(existingVariable.node, existingVariable))
              return;
          } else if (assignment.left.type === "MemberExpression") {
            const memberName = memberToString(assignment.left, this.source);
            const activeAliasExpr = this.pendingPrototypeAliasBinding?.[0];
            if (activeAliasExpr && (memberName?.includes(activeAliasExpr) || memberName === activeAliasExpr.slice(0, -1))) {
              const aliasOwnerMeta = this.declaredVariables.get(this.pendingPrototypeAliasBinding?.[1].name || "");
              if (aliasOwnerMeta) {
                const existingAliasedMembers = aliasOwnerMeta.prototypeAliases.get(activeAliasExpr);
                const aliasedMemberMeta = {
                  name: memberName,
                  node: currentNode,
                  dependents: this.dependentsTracker.get(memberName) || /* @__PURE__ */ new Set(),
                  predeclared: false,
                  prototypeAliases: /* @__PURE__ */ new Map(),
                  dependencies: this.findDependencies(right, memberName)
                };
                if (existingAliasedMembers) {
                  existingAliasedMembers.add(aliasedMemberMeta);
                } else {
                  aliasOwnerMeta.prototypeAliases.set(activeAliasExpr, /* @__PURE__ */ new Set([aliasedMemberMeta]));
                }
              }
            } else {
              this.pendingPrototypeAliasBinding = null;
            }
            if (!memberName || this.declaredVariables.has(memberName))
              continue;
            const metadata = {
              name: memberName,
              node: currentNode,
              dependents: this.dependentsTracker.get(memberName) || /* @__PURE__ */ new Set(),
              predeclared: false,
              prototypeAliases: /* @__PURE__ */ new Map(),
              dependencies: this.findDependencies(right, memberName)
            };
            const baseName = memberBaseName(assignment.left, this.source);
            if (baseName && baseName !== memberName && !baseName.startsWith("this.")) {
              metadata.dependencies.add(baseName.replace(".prototype", ""));
            }
            if (this.dependentsTracker.has(memberName)) {
              this.dependentsTracker.delete(memberName);
            }
            this.declaredVariables.set(memberName, metadata);
            if (this.onMatch(currentNode, metadata))
              return;
          }
          break;
        }
        case "VariableDeclaration": {
          this.pendingPrototypeAliasBinding = null;
          for (const declaration of currentNode.declarations) {
            if (declaration.id.type !== "Identifier")
              continue;
            const metadata = {
              name: declaration.id.name,
              node: declaration,
              dependents: this.dependentsTracker.get(declaration.id.name) || /* @__PURE__ */ new Set(),
              prototypeAliases: /* @__PURE__ */ new Map(),
              dependencies: /* @__PURE__ */ new Set(),
              predeclared: false
            };
            const init = declaration.init;
            if (!init && currentNode.kind === "var") {
              metadata.predeclared = true;
            } else if (init && this.needsDependencyAnalysis(init)) {
              metadata.dependencies = this.findDependencies(init, metadata.name);
            }
            if (this.dependentsTracker.has(metadata.name)) {
              this.dependentsTracker.delete(metadata.name);
            }
            this.declaredVariables.set(metadata.name, metadata);
            if (this.onMatch(declaration, metadata))
              return;
          }
          break;
        }
      }
    }
  }
  /**
   * Quick check if node type requires dependency analysis
   */
  needsDependencyAnalysis(node) {
    if (!node)
      return false;
    switch (node.type) {
      case "FunctionExpression":
      case "ArrowFunctionExpression":
      case "ArrayExpression":
      case "LogicalExpression":
      case "CallExpression":
      case "NewExpression":
      case "MemberExpression":
      case "BinaryExpression":
      case "ConditionalExpression":
      case "ObjectExpression":
      case "SequenceExpression":
      case "ClassExpression":
      case "Identifier":
        return true;
      default:
        return false;
    }
  }
  /**
   * Records a match, attaches metadata, and updates readiness state.
   * @returns True when traversal can stop as a result of the match.
   */
  onMatch(node, metadata) {
    if (!this.hasExtractions)
      return false;
    let matched = false;
    let result = false;
    for (const state of this.extractionStates) {
      if (!state.node) {
        if (node.type === "VariableDeclarator" && !node.init)
          continue;
        result = state.config.match(node);
        if (!result)
          continue;
        state.node = node;
        matched = true;
        if (metadata) {
          state.metadata = metadata;
          state.dependents = metadata.dependents;
          state.dependencies = metadata.dependencies;
          if (typeof result !== "boolean")
            state.matchContext = result;
        }
        this.refreshExtractionState(state);
      } else if (state.node !== node) {
        this.refreshExtractionState(state);
        if (this.shouldStopTraversal()) {
          return true;
        }
      }
    }
    if (!matched)
      return false;
    return this.shouldStopTraversal();
  }
  /**
   * Refreshes the readiness state of an extraction target based on its dependencies
   * and/or configuration.
   * @param state - State to refresh.
   */
  refreshExtractionState(state) {
    if (!state.node) {
      state.ready = false;
      return;
    }
    if (state.config.collectDependencies === false) {
      state.ready = true;
      return;
    }
    if (!state.metadata) {
      state.ready = false;
      return;
    }
    state.ready = this.areDependenciesResolved(state.dependencies);
  }
  /**
   * Determines whether traversal should stop based on extraction states and configuration.
   */
  shouldStopTraversal() {
    if (!this.hasExtractions)
      return false;
    let hasStoppingTarget = false;
    for (const state of this.extractionStates) {
      if (state.config.stopWhenReady === false)
        continue;
      hasStoppingTarget = true;
      if (!state.node)
        return false;
      if (!state.ready)
        return false;
    }
    return hasStoppingTarget;
  }
  /**
   * Checks if every dependency resolves to a declaration or built-in symbol.
   * @param dependencies - Dependencies to validate.
   * @param seen - Tracks recursively visited identifiers.
   */
  areDependenciesResolved(dependencies, seen = /* @__PURE__ */ new Set()) {
    if (!dependencies || dependencies.size === 0)
      return true;
    for (const dependency of dependencies) {
      if (!dependency)
        continue;
      if (jsBuiltIns.has(dependency))
        continue;
      if (dependency === this.iifeParamName)
        continue;
      if (seen.has(dependency))
        continue;
      const depMeta = this.declaredVariables.get(dependency);
      if (!depMeta)
        return false;
      seen.add(dependency);
      if (!this.areDependenciesResolved(depMeta.dependencies, seen)) {
        return false;
      }
    }
    return true;
  }
  /**
   * Collects free identifier dependencies reachable from the provided AST node.
   * @param rootNode - AST node to search for dependencies.
   * @param identifierName - Name of the identifier represented by `rootNode`, used for tracking dependents.
   */
  findDependencies(rootNode, identifierName) {
    const dependencies = /* @__PURE__ */ new Set();
    if (!rootNode)
      return dependencies;
    const scopeStack = [
      {
        names: /* @__PURE__ */ new Set(),
        type: "block"
      }
    ];
    const currentScope = /* @__PURE__ */ __name(() => scopeStack[scopeStack.length - 1], "currentScope");
    const isInScope = /* @__PURE__ */ __name((name) => {
      for (let i = scopeStack.length - 1; i >= 0; i--) {
        if (scopeStack[i].names.has(name))
          return true;
      }
      return false;
    }, "isInScope");
    const rootIdentifierName = "id" in rootNode && rootNode?.id?.type === "Identifier" ? rootNode.id.name : void 0;
    const collectBindingIdentifiers = /* @__PURE__ */ __name((pattern, target) => {
      if (!pattern)
        return;
      switch (pattern.type) {
        case "Identifier":
          target.add(pattern.name);
          break;
        case "ObjectPattern":
          for (const prop of pattern.properties) {
            if (prop.type === "RestElement") {
              collectBindingIdentifiers(prop.argument, target);
            } else if (prop.type === "Property") {
              collectBindingIdentifiers(prop.value, target);
            }
          }
          break;
        case "ArrayPattern":
          for (const el of pattern.elements) {
            if (el)
              collectBindingIdentifiers(el, target);
          }
          break;
        case "RestElement":
          collectBindingIdentifiers(pattern.argument, target);
          break;
        case "AssignmentPattern":
          collectBindingIdentifiers(pattern.left, target);
          break;
      }
    }, "collectBindingIdentifiers");
    const collectParams = /* @__PURE__ */ __name((fnNode, target) => {
      if (!fnNode?.params)
        return;
      for (const p of fnNode.params)
        collectBindingIdentifiers(p, target);
    }, "collectParams");
    walkAst(rootNode, {
      enter: /* @__PURE__ */ __name((n, parent) => {
        switch (n.type) {
          // Note for anybody debugging this in the future:
          // *DO NOT* add MethodDefinition here.
          // MethodDefinition.value is a FunctionExpression, so it is already handled...
          case "FunctionDeclaration":
          case "FunctionExpression":
          case "ArrowFunctionExpression": {
            const isDecl = n.type === "FunctionDeclaration";
            const fnName = "id" in n ? n.id?.name : void 0;
            if (isDecl && fnName) {
              currentScope().names.add(fnName);
            }
            const fnScope = { names: /* @__PURE__ */ new Set(), type: "function" };
            if (n.type === "FunctionExpression" && fnName) {
              fnScope.names.add(fnName);
            }
            collectParams(n, fnScope.names);
            scopeStack.push(fnScope);
            break;
          }
          case "BlockStatement": {
            scopeStack.push({ names: /* @__PURE__ */ new Set(), type: "block" });
            break;
          }
          case "CatchClause": {
            const s = /* @__PURE__ */ new Set();
            if (n.param)
              collectBindingIdentifiers(n.param, s);
            scopeStack.push({ names: s, type: "block" });
            break;
          }
          case "VariableDeclaration": {
            const targetScope = n.kind === "var" ? scopeStack.findLast((s) => s.type === "function") ?? currentScope() : currentScope();
            for (const d of n.declarations) {
              collectBindingIdentifiers(d.id, targetScope.names);
            }
            break;
          }
          case "ClassDeclaration": {
            if (n.id?.name) {
              currentScope().names.add(n.id.name);
            }
            break;
          }
          case "LabeledStatement": {
            if (n.label?.type === "Identifier")
              currentScope().names.add(n.label.name);
            break;
          }
          case "Identifier": {
            if (n.name === rootIdentifierName)
              return;
            if (parent?.type === "Property" && parent.key === n && !parent.computed)
              return;
            if (parent?.type === "MethodDefinition" && parent.key === n && !parent.computed)
              return;
            if (parent?.type === "MemberExpression" && parent.property === n && !parent.computed) {
              if (parent.object.type === "ThisExpression")
                return;
              const full = memberToString(parent, this.source);
              if (!full)
                return;
              const declaredVariable2 = this.declaredVariables.get(full);
              if (declaredVariable2) {
                declaredVariable2.dependents.add(identifierName);
                dependencies.add(full);
              } else if (parent.object.type === "Identifier") {
                const baseName = parent.object.name;
                const declaredBaseVariable = this.declaredVariables.get(baseName);
                if ((declaredBaseVariable || baseName === this.iifeParamName) && !isInScope(baseName) && !jsBuiltIns.has(baseName)) {
                  declaredBaseVariable?.dependents.add(identifierName);
                  dependencies.add(full);
                  const existingTracker = this.dependentsTracker.get(full);
                  if (existingTracker) {
                    existingTracker.add(identifierName);
                  } else {
                    this.dependentsTracker.set(full, /* @__PURE__ */ new Set([identifierName]));
                  }
                }
              }
              return;
            }
            if (parent?.type === "MetaProperty") {
              return;
            }
            if (isInScope(n.name) || jsBuiltIns.has(n.name))
              return;
            dependencies.add(n.name);
            const declaredVariable = this.declaredVariables.get(n.name);
            if (declaredVariable) {
              declaredVariable.dependents.add(identifierName);
            } else {
              const existing = this.dependentsTracker.get(n.name);
              if (existing) {
                existing.add(identifierName);
              } else {
                this.dependentsTracker.set(n.name, /* @__PURE__ */ new Set([identifierName]));
              }
            }
            break;
          }
          case "ForStatement":
          case "ForInStatement":
          case "ForOfStatement": {
            scopeStack.push({ names: /* @__PURE__ */ new Set(), type: "block" });
            break;
          }
        }
      }, "enter"),
      leave: /* @__PURE__ */ __name((n) => {
        switch (n.type) {
          case "FunctionDeclaration":
          case "FunctionExpression":
          case "ArrowFunctionExpression":
          case "BlockStatement":
          case "CatchClause":
          case "ForStatement":
          case "ForInStatement":
          case "ForOfStatement":
            if (scopeStack.length > 1)
              scopeStack.pop();
            break;
        }
      }, "leave")
    });
    return dependencies;
  }
  /**
   * Returns the current set of matched extractions.
   */
  getExtractedMatches() {
    return this.extractionStates.filter((state) => !!state.node);
  }
  /**
   * Returns the raw, original source.
   */
  getSource() {
    return this.source;
  }
};
__name(_JsAnalyzer, "JsAnalyzer");
var JsAnalyzer = _JsAnalyzer;

// dist/src/utils/javascript/JsExtractor.js
var _JsExtractor = class _JsExtractor {
  constructor(analyzer) {
    __publicField(this, "analyzer");
    this.analyzer = analyzer;
  }
  /**
   * Checks if all provided arguments are safe initializers.
   * @param args - The arguments to check.
   * @param mode - The side effect mode to use ('strict' or 'loose').
   */
  areSafeArgs(args, mode = "strict") {
    return (args ?? []).every((arg) => {
      if (!arg)
        return false;
      if (arg.type === "SpreadElement")
        return false;
      return this.isSafeInitializer(arg, mode);
    });
  }
  /**
   * Determines if a given AST node is a safe initializer without side effects.
   * @param node - The AST node to evaluate.
   * @param mode - The side effect mode to use ('strict' or 'loose').
   */
  isSafeInitializer(node, mode = "strict") {
    if (!node)
      return true;
    switch (node.type) {
      case "ClassExpression":
        return true;
      case "Literal": {
        const literal = node;
        return typeof literal.value === "string" || typeof literal.value === "number" || typeof literal.value === "boolean" || literal.value === null || Boolean(literal.regex);
      }
      case "TemplateLiteral": {
        return node.expressions.every((expr) => this.isSafeInitializer(expr, mode));
      }
      case "ArrayExpression": {
        return node.elements.every((elem) => {
          if (!elem)
            return true;
          if (elem.type === "SpreadElement")
            return false;
          return this.isSafeInitializer(elem, mode);
        });
      }
      case "ObjectExpression": {
        return node.properties.every((prop) => {
          if (prop.type !== "Property")
            return false;
          if (prop.computed)
            return false;
          if (prop.kind !== "init")
            return false;
          const value = prop.value;
          if (!value)
            return false;
          return value.type === "FunctionExpression" || value.type === "ArrowFunctionExpression" || value.type === "Literal";
        });
      }
      case "CallExpression": {
        if (node.callee.type === "Identifier" && jsBuiltIns.has(node.callee.name)) {
          return this.areSafeArgs(node.arguments, mode);
        } else if (node.callee.type === "MemberExpression") {
          if (!this.isSafeInitializer(node.callee.object, mode))
            return false;
          if (mode === "strict") {
            const propertyName = node.callee.property.type === "Identifier" ? node.callee.property.name : "";
            if (node.callee.computed || !jsBuiltIns.has(propertyName)) {
              return false;
            }
          }
          return this.areSafeArgs(node.arguments, mode);
        }
        return false;
      }
      case "NewExpression": {
        if (node.callee.type === "Identifier") {
          if (jsBuiltIns.has(node.callee.name)) {
            return this.areSafeArgs(node.arguments, mode);
          }
          if (mode === "loose") {
            return this.areSafeArgs(node.arguments, mode);
          }
        }
        return false;
      }
      case "UnaryExpression": {
        return this.isSafeInitializer(node.argument, mode);
      }
      case "FunctionExpression":
      case "ArrowFunctionExpression":
      case "Identifier": {
        return true;
      }
      case "MemberExpression": {
        if (mode === "loose") {
          if (node.computed && !this.isSafeInitializer(node.property, mode)) {
            return false;
          }
          return this.isSafeInitializer(node.object, mode);
        }
        if (!node.computed && node.property.type === "Identifier" && node.property.name === "prototype") {
          return true;
        }
        return false;
      }
      case "LogicalExpression":
      case "BinaryExpression": {
        return this.isSafeInitializer(node.left, mode) && this.isSafeInitializer(node.right, mode);
      }
      case "ConditionalExpression": {
        if (mode === "loose") {
          return this.isSafeInitializer(node.test, mode) && this.isSafeInitializer(node.consequent, mode) && this.isSafeInitializer(node.alternate, mode);
        }
        return false;
      }
      case "SequenceExpression": {
        if (mode === "loose") {
          return node.expressions.every((expr) => this.isSafeInitializer(expr, mode));
        }
        return false;
      }
      case "AssignmentExpression": {
        if (node.left.type === "MemberExpression" && !node.left.computed) {
          const object = node.left.object;
          if (object.type === "Identifier" && this.analyzer.declaredVariables.get(object.name)?.node.init !== void 0) {
            return this.isSafeInitializer(node.right, mode);
          }
        } else if (node.left.type === "Identifier") {
          if (this.analyzer.declaredVariables.has(node.left.name)) {
            return this.isSafeInitializer(node.right, mode);
          }
        }
        return false;
      }
      // @todo: check for more?
      default:
        return false;
    }
  }
  /**
   * Provides a fallback initializer string based on the type of the initializer node.
   * @TODO: Check more cases.
   * @param init - The initializer expression to evaluate.
   */
  getInitializerFallback(init) {
    switch (init?.type) {
      case "ObjectExpression":
      case "NewExpression":
      case "MemberExpression":
      case "LogicalExpression":
        return "{}";
      case "ArrayExpression":
        return "[]";
      default:
        return "undefined";
    }
  }
  /**
   * Renders an AST node to JavaScript source code, with special handling for variable declarators.
   * @param node - The ESTree node to render.
   * @param preDeclared - Whether the variable has been previously declared.
   * @param options - Configuration options for the emitter.
   */
  renderNode(node, preDeclared, options = {}) {
    const source = this.analyzer.getSource();
    const declaredVariables = this.analyzer.declaredVariables;
    const sideEffectPolicy = options.disallowSideEffectInitializers;
    const sideEffectMode = typeof sideEffectPolicy === "object" && sideEffectPolicy !== null ? sideEffectPolicy.mode ?? "strict" : "strict";
    const canDisallow = Boolean(sideEffectPolicy);
    const assignmentTarget = node.type === "AssignmentExpression" ? node : node.type === "ExpressionStatement" && node.expression.type === "AssignmentExpression" ? node.expression : null;
    const init = assignmentTarget && assignmentTarget.operator === "=" ? assignmentTarget.right : node.type === "VariableDeclarator" ? node.init : null;
    const forceRemove = canDisallow && init && !this.isSafeInitializer(init, sideEffectMode);
    const initializerFallback = this.getInitializerFallback(init);
    let initSource = initializerFallback;
    if (!forceRemove && init) {
      if (!preDeclared && init.type === "Identifier" && !declaredVariables.has(init.name)) {
        initSource = initializerFallback;
      } else {
        const left = assignmentTarget?.left;
        const isPrototypeAlias = init?.type === "MemberExpression" && !init.computed && init.property.type === "Identifier" && init.property.name === "prototype";
        if (!isPrototypeAlias && left?.type === "MemberExpression" && init) {
          if (canDisallow && left.object.type === "Identifier" && init.type !== "FunctionExpression" && init.type !== "ArrowFunctionExpression" && init.type !== "LogicalExpression" && init.type !== "ClassExpression") {
            return `${indent}// Skipped ${memberToString(left, source)} assignment.`;
          }
        }
        initSource = extractNodeSource(init, source)?.trim().replace(/;\s*$/, "") || "undefined // [JsExtractor] Failed to extract initializer source.";
      }
    }
    if (!forceRemove && init && init.type === "SequenceExpression" && !initSource.startsWith("(")) {
      initSource = `(${initSource})`;
    }
    const idName = node.type === "VariableDeclarator" && node.id.type === "Identifier" ? node.id.name : assignmentTarget && assignmentTarget.left.type === "Identifier" ? assignmentTarget.left.name : assignmentTarget?.type === "AssignmentExpression" ? memberToString(assignmentTarget.left, source)?.trim() : "unknown";
    const assignmentExpression = `${idName} = ${initSource};`;
    if (node.type === "VariableDeclarator" && node.init && !preDeclared) {
      return `${indent}var ${assignmentExpression}`;
    }
    return `${indent}${assignmentExpression}`;
  }
  /**
   * Processes extracted matches from the analyzer, handles dependencies, predeclares
   * variables as needed, and generates an IIFE-wrapped output string containing the
   * code snippets and exported variables.
   * @param config - Configuration options for the emitter.
   */
  buildScript(config) {
    const { maxDepth = Infinity, forceVarPredeclaration = false, exportRawValues = false, rawValueOnly: skipEmitFor = [] } = config;
    const extractions = this.analyzer.getExtractedMatches();
    const seen = new Set(extractions.map((e) => e.metadata?.name || ""));
    const snippets = [];
    const predeclaredVarSet = /* @__PURE__ */ new Set();
    const exported = /* @__PURE__ */ new Map();
    const exportedRawValues = {};
    function registerPredeclaredVar(name) {
      if (!name || name.includes("."))
        return;
      predeclaredVarSet.add(name);
    }
    __name(registerPredeclaredVar, "registerPredeclaredVar");
    const visit = /* @__PURE__ */ __name((metadata, depth = 0, whitelistedDep) => {
      if (!metadata || depth > maxDepth)
        return;
      for (const dependency of metadata.dependencies) {
        if (whitelistedDep && whitelistedDep !== dependency) {
          if (!seen.has(whitelistedDep))
            continue;
          whitelistedDep = void 0;
        }
        if (seen.has(dependency))
          continue;
        seen.add(dependency);
        const dependencyMetadata = this.analyzer.declaredVariables.get(dependency);
        if (!dependencyMetadata)
          continue;
        const shouldPredeclare = forceVarPredeclaration || dependencyMetadata.predeclared;
        if (shouldPredeclare) {
          registerPredeclaredVar(dependency);
        }
        visit(dependencyMetadata, depth + 1, whitelistedDep);
        snippets.push(this.renderNode(dependencyMetadata.node, shouldPredeclare, config));
        if (dependencyMetadata.prototypeAliases.size > 0) {
          for (const [, aliasMembers] of dependencyMetadata.prototypeAliases) {
            for (const member of aliasMembers) {
              visit(member, depth);
              snippets.push(this.renderNode(member.node, shouldPredeclare, config));
            }
          }
        }
      }
    }, "visit");
    for (const extraction of extractions) {
      const fname = extraction.config.friendlyName;
      const shouldSkip = fname && skipEmitFor.includes(fname);
      if (extraction.metadata) {
        if (!shouldSkip)
          snippets.push(`${indent}//#region --- start [${fname || "Unknown"}] ---`);
        const shouldPredeclare = (forceVarPredeclaration || extraction.metadata.predeclared) && !shouldSkip;
        const onlyProcessMatchContext = extraction.config.onlyProcessMatchContext;
        if (shouldPredeclare) {
          registerPredeclaredVar(extraction.metadata.name);
        }
        if (extraction.config.collectDependencies && !shouldSkip) {
          let whitelistedDep;
          const matchContextNode = extraction.matchContext;
          if (matchContextNode?.type === "NewExpression" && onlyProcessMatchContext) {
            if (matchContextNode.callee.type === "Identifier") {
              whitelistedDep = matchContextNode.callee.name;
            } else if (matchContextNode.callee.type === "MemberExpression") {
              whitelistedDep = memberToString(matchContextNode.callee, this.analyzer.getSource()) || void 0;
            }
          }
          visit(extraction.metadata, void 0, whitelistedDep);
        }
        if (extraction.matchContext && fname) {
          exported.set(fname, extraction.matchContext);
          if (exportRawValues) {
            const ctx = extraction.matchContext;
            const src = this.analyzer.getSource();
            let rawValue = null;
            if (ctx.type === "Property") {
              rawValue = extractNodeSource(ctx.value, src);
            } else if (ctx.type === "Identifier") {
              rawValue = ctx.name;
            } else {
              rawValue = extractNodeSource(ctx, src);
            }
            exportedRawValues[fname] = rawValue;
          }
        }
        if (!shouldSkip) {
          if (!onlyProcessMatchContext) {
            snippets.push(this.renderNode(extraction.metadata.node, shouldPredeclare, config));
          }
          snippets.push(`${indent}//#endregion --- end [${fname || "Unknown"}] ---
`);
        }
      }
    }
    const output = [];
    output.push("const __jsExtractorGlobal = typeof globalThis !== 'undefined' ? globalThis :");
    output.push(`${indent}typeof self !== 'undefined' ? self :`);
    output.push(`${indent}typeof window !== 'undefined' ? window :`);
    output.push(`${indent}typeof global !== 'undefined' ? global : {};
`);
    output.push(`const exportedVars = (function(${this.analyzer.iifeParamName}) {`);
    output.push(`${indent}const window = typeof __jsExtractorGlobal.window !== 'undefined' ? __jsExtractorGlobal.window : Object.create(null);`);
    output.push(`${indent}const document = typeof __jsExtractorGlobal.document !== 'undefined' ? __jsExtractorGlobal.document : {};`);
    output.push(`${indent}const self = typeof __jsExtractorGlobal.self !== 'undefined' ? __jsExtractorGlobal.self : window;
`);
    if (predeclaredVarSet.size > 0) {
      output.push(`${indent}var ${Array.from(predeclaredVarSet).join(", ")};
`);
    }
    output.push(snippets.join("\n"));
    const exportedVars = [];
    for (const [friendlyName, node] of exported) {
      let currentFunctionNode = null;
      if (node.type === "Identifier") {
        const decl = this.analyzer.declaredVariables.get(node.name);
        if (decl?.node?.type === "VariableDeclarator" && decl.node.init?.type === "FunctionExpression") {
          currentFunctionNode = decl.node;
        }
      } else if (node.type === "CallExpression" || node.type === "NewExpression" || node.type === "VariableDeclarator") {
        currentFunctionNode = node;
      }
      if (currentFunctionNode) {
        const wrapper = createWrapperFunction(this.analyzer, friendlyName, currentFunctionNode);
        if (wrapper) {
          output.push(`${wrapper}
`);
          exportedVars.push(friendlyName);
        }
      }
    }
    if (exportRawValues) {
      const rawJson = JSON.stringify(exportedRawValues, null, indent.length);
      const rawJsonLines = rawJson.split("\n");
      const formattedRawJson = `${rawJsonLines[0]}
${rawJsonLines.slice(1).map((line) => indent + line).join("\n")}`;
      output.push(`${indent}const rawValues = ${formattedRawJson};
`);
      exportedVars.push("rawValues");
    }
    output.push(`${indent}return { ${exportedVars.join(", ")} };`);
    output.push("})({});\n");
    return {
      output: output.join("\n"),
      exported: exportedVars,
      exportedRawValues: exportRawValues ? exportedRawValues : void 0
    };
  }
};
__name(_JsExtractor, "JsExtractor");
var JsExtractor = _JsExtractor;

// dist/src/parser/classes/actions/OpenPopupAction.js
var _OpenPopupAction = class _OpenPopupAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "popup");
    __publicField(this, "popup_type");
    this.popup = parser_exports.parseItem(data.popup);
    this.popup_type = data.popupType;
  }
};
__name(_OpenPopupAction, "OpenPopupAction");
__publicField(_OpenPopupAction, "type", "OpenPopupAction");
var OpenPopupAction = _OpenPopupAction;

// dist/src/parser/classes/Button.js
var _Button = class _Button extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "label");
    __publicField(this, "tooltip");
    __publicField(this, "style");
    __publicField(this, "size");
    __publicField(this, "icon_type");
    __publicField(this, "is_disabled");
    __publicField(this, "target_id");
    __publicField(this, "endpoint");
    __publicField(this, "accessibility");
    if (Reflect.has(data, "text"))
      this.text = new Text2(data.text).toString();
    if (Reflect.has(data, "accessibility") && Reflect.has(data.accessibility, "label")) {
      this.label = data.accessibility.label;
    }
    if ("accessibilityData" in data && "accessibilityData" in data.accessibilityData) {
      this.accessibility = {
        accessibility_data: new AccessibilityData(data.accessibilityData.accessibilityData)
      };
    }
    if (Reflect.has(data, "tooltip"))
      this.tooltip = data.tooltip;
    if (Reflect.has(data, "style"))
      this.style = data.style;
    if (Reflect.has(data, "size"))
      this.size = data.size;
    if (Reflect.has(data, "icon") && Reflect.has(data.icon, "iconType"))
      this.icon_type = data.icon.iconType;
    if (Reflect.has(data, "isDisabled"))
      this.is_disabled = data.isDisabled;
    if (Reflect.has(data, "targetId"))
      this.target_id = data.targetId;
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint || data.serviceEndpoint || data.command);
  }
};
__name(_Button, "Button");
__publicField(_Button, "type", "Button");
var Button = _Button;

// dist/src/parser/classes/DropdownItem.js
var _DropdownItem = class _DropdownItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "label");
    __publicField(this, "selected");
    __publicField(this, "value");
    __publicField(this, "icon_type");
    __publicField(this, "description");
    __publicField(this, "endpoint");
    this.label = new Text2(data.label).toString();
    this.selected = !!data.isSelected;
    if (Reflect.has(data, "int32Value")) {
      this.value = data.int32Value;
    } else if (data.stringValue) {
      this.value = data.stringValue;
    }
    if (Reflect.has(data, "onSelectCommand")) {
      this.endpoint = new NavigationEndpoint(data.onSelectCommand);
    }
    if (Reflect.has(data, "icon")) {
      this.icon_type = data.icon?.iconType;
    }
    if (Reflect.has(data, "descriptionText")) {
      this.description = new Text2(data.descriptionText);
    }
  }
};
__name(_DropdownItem, "DropdownItem");
__publicField(_DropdownItem, "type", "DropdownItem");
var DropdownItem = _DropdownItem;

// dist/src/parser/classes/Dropdown.js
var _Dropdown = class _Dropdown extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "label");
    __publicField(this, "entries");
    this.label = data.label || "";
    this.entries = parser_exports.parseArray(data.entries, DropdownItem);
  }
};
__name(_Dropdown, "Dropdown");
__publicField(_Dropdown, "type", "Dropdown");
var Dropdown = _Dropdown;

// dist/src/parser/classes/CreatePlaylistDialog.js
var _CreatePlaylistDialog = class _CreatePlaylistDialog extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "title_placeholder");
    __publicField(this, "privacy_option");
    __publicField(this, "cancel_button");
    __publicField(this, "create_button");
    this.title = new Text2(data.dialogTitle).toString();
    this.title_placeholder = data.titlePlaceholder || "";
    this.privacy_option = parser_exports.parseItem(data.privacyOption, Dropdown);
    this.create_button = parser_exports.parseItem(data.cancelButton, Button);
    this.cancel_button = parser_exports.parseItem(data.cancelButton, Button);
  }
};
__name(_CreatePlaylistDialog, "CreatePlaylistDialog");
__publicField(_CreatePlaylistDialog, "type", "CreatePlaylistDialog");
var CreatePlaylistDialog = _CreatePlaylistDialog;

// dist/src/parser/classes/commands/CommandExecutorCommand.js
var _CommandExecutorCommand = class _CommandExecutorCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "commands");
    this.commands = parser_exports.parseCommands(data.commands);
  }
};
__name(_CommandExecutorCommand, "CommandExecutorCommand");
__publicField(_CommandExecutorCommand, "type", "CommandExecutorCommand");
var CommandExecutorCommand = _CommandExecutorCommand;

// dist/src/parser/classes/NavigationEndpoint.js
var _NavigationEndpoint = class _NavigationEndpoint extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "name");
    __publicField(this, "payload");
    __publicField(this, "dialog");
    __publicField(this, "modal");
    __publicField(this, "open_popup");
    __publicField(this, "next_endpoint");
    __publicField(this, "metadata");
    __publicField(this, "command");
    __publicField(this, "commands");
    if (data) {
      if (data.serialCommand || data.parallelCommand) {
        const raw_command = data.serialCommand || data.parallelCommand;
        this.commands = raw_command.commands.map((command) => new _NavigationEndpoint(command));
      }
      if (data.innertubeCommand || data.command || data.performOnceCommand) {
        data = data.innertubeCommand || data.command || data.performOnceCommand;
      }
    }
    this.command = parser_exports.parseCommand(data);
    if (Reflect.has(data || {}, "openPopupAction"))
      this.open_popup = new OpenPopupAction(data.openPopupAction);
    this.name = Object.keys(data || {}).find((item) => item.endsWith("Endpoint") || item.endsWith("Command"));
    this.payload = this.name ? Reflect.get(data, this.name) : {};
    if (Reflect.has(this.payload, "dialog") || Reflect.has(this.payload, "content")) {
      this.dialog = parser_exports.parseItem(this.payload.dialog || this.payload.content);
    }
    if (Reflect.has(this.payload, "modal")) {
      this.modal = parser_exports.parseItem(this.payload.modal);
    }
    if (Reflect.has(this.payload, "nextEndpoint")) {
      this.next_endpoint = new _NavigationEndpoint(this.payload.nextEndpoint);
    }
    if (data?.serviceEndpoint) {
      data = data.serviceEndpoint;
    }
    this.metadata = {};
    if (data?.commandMetadata?.webCommandMetadata?.url) {
      this.metadata.url = data.commandMetadata.webCommandMetadata.url;
    }
    if (data?.commandMetadata?.webCommandMetadata?.webPageType) {
      this.metadata.page_type = data.commandMetadata.webCommandMetadata.webPageType;
    }
    if (data?.commandMetadata?.webCommandMetadata?.apiUrl) {
      this.metadata.api_url = data.commandMetadata.webCommandMetadata.apiUrl.replace("/youtubei/v1/", "");
    } else if (this.name) {
      this.metadata.api_url = this.getPath(this.name);
    }
    if (data?.commandMetadata?.webCommandMetadata?.sendPost) {
      this.metadata.send_post = data.commandMetadata.webCommandMetadata.sendPost;
    }
    if (data?.createPlaylistEndpoint) {
      if (data?.createPlaylistEndpoint.createPlaylistDialog) {
        this.dialog = parser_exports.parseItem(data?.createPlaylistEndpoint.createPlaylistDialog, CreatePlaylistDialog);
      }
    }
  }
  /**
   * Sometimes InnerTube does not return an API url, in that case the library should set it based on the name of the payload object.
   * @deprecated This should be removed in the future.
   */
  getPath(name) {
    switch (name) {
      case "browseEndpoint":
        return "/browse";
      case "watchEndpoint":
      case "reelWatchEndpoint":
        return "/player";
      case "searchEndpoint":
        return "/search";
      case "watchPlaylistEndpoint":
        return "/next";
      case "liveChatItemContextMenuEndpoint":
        return "/live_chat/get_item_context_menu";
    }
  }
  call(actions, args) {
    if (!actions)
      throw new Error("An API caller must be provided");
    if (this.command) {
      let command = this.command;
      if (command.is(CommandExecutorCommand)) {
        command = command.commands.at(-1);
      }
      return actions.execute(command.getApiPath(), { ...command.buildRequest(), ...args });
    }
    if (!this.metadata.api_url)
      throw new Error("Expected an api_url, but none was found.");
    return actions.execute(this.metadata.api_url, { ...this.payload, ...args });
  }
  toURL() {
    if (!this.metadata.url)
      return void 0;
    if (!this.metadata.page_type)
      return void 0;
    return this.metadata.page_type === "WEB_PAGE_TYPE_UNKNOWN" ? this.metadata.url : `https://www.youtube.com${this.metadata.url}`;
  }
};
__name(_NavigationEndpoint, "NavigationEndpoint");
__publicField(_NavigationEndpoint, "type", "NavigationEndpoint");
var NavigationEndpoint = _NavigationEndpoint;

// dist/src/parser/classes/misc/Thumbnail.js
var _Thumbnail = class _Thumbnail {
  constructor(data) {
    __publicField(this, "url");
    __publicField(this, "width");
    __publicField(this, "height");
    this.url = data.url;
    this.width = data.width;
    this.height = data.height;
  }
  /**
   * Get thumbnails from response object.
   */
  static fromResponse(data) {
    if (!data)
      return [];
    let thumbnail_data;
    if (data.thumbnails) {
      thumbnail_data = data.thumbnails;
    } else if (data.sources) {
      thumbnail_data = data.sources;
    }
    if (thumbnail_data) {
      return thumbnail_data.map((x) => new _Thumbnail(x)).sort((a, b) => b.width - a.width);
    }
    return [];
  }
};
__name(_Thumbnail, "Thumbnail");
var Thumbnail = _Thumbnail;

// dist/src/parser/classes/misc/EmojiRun.js
var _EmojiRun = class _EmojiRun {
  constructor(data) {
    __publicField(this, "text");
    __publicField(this, "emoji");
    this.text = data.emoji?.emojiId || data.emoji?.shortcuts?.[0] || data.text || "";
    this.emoji = {
      emoji_id: data.emoji.emojiId,
      shortcuts: data.emoji?.shortcuts || [],
      search_terms: data.emoji?.searchTerms || [],
      image: Thumbnail.fromResponse(data.emoji.image),
      is_custom: !!data.emoji?.isCustomEmoji
    };
  }
  toString() {
    return this.text;
  }
  toHTML() {
    const escaped_text = escape(this.text);
    return `<img src="${this.emoji.image[0].url}" alt="${escaped_text}" title="${escaped_text}" style="display: inline-block; vertical-align: text-top; height: var(--yt-emoji-size, 1rem); width: var(--yt-emoji-size, 1rem);" loading="lazy" crossorigin="anonymous" />`;
  }
};
__name(_EmojiRun, "EmojiRun");
var EmojiRun = _EmojiRun;

// dist/src/parser/classes/misc/TextRun.js
var _TextRun = class _TextRun {
  constructor(data) {
    __publicField(this, "text");
    __publicField(this, "text_color");
    __publicField(this, "endpoint");
    __publicField(this, "bold");
    __publicField(this, "bracket");
    __publicField(this, "dark_mode_text_color");
    __publicField(this, "deemphasize");
    __publicField(this, "italics");
    __publicField(this, "strikethrough");
    __publicField(this, "error_underline");
    __publicField(this, "underline");
    __publicField(this, "font_face");
    __publicField(this, "attachment");
    this.text = data.text;
    this.bold = Boolean(data.bold);
    this.bracket = Boolean(data.bracket);
    this.italics = Boolean(data.italics);
    this.strikethrough = Boolean(data.strikethrough);
    this.error_underline = Boolean(data.error_underline);
    this.underline = Boolean(data.underline);
    this.deemphasize = Boolean(data.deemphasize);
    if ("textColor" in data) {
      this.text_color = data.textColor;
    }
    if ("navigationEndpoint" in data) {
      this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    }
    if ("darkModeTextColor" in data) {
      this.dark_mode_text_color = data.darkModeTextColor;
    }
    if ("fontFace" in data) {
      this.font_face = data.fontFace;
    }
    this.attachment = data.attachment;
  }
  toString() {
    return this.text;
  }
  toHTML() {
    const tags = [];
    if (this.bold)
      tags.push("b");
    if (this.italics)
      tags.push("i");
    if (this.strikethrough)
      tags.push("s");
    if (this.deemphasize)
      tags.push("small");
    if (this.underline)
      tags.push("u");
    if (this.error_underline)
      tags.push("u");
    if (!this.text?.length)
      return "";
    const escaped_text = escape(this.text);
    const styled_text = tags.map((tag) => `<${tag}>`).join("") + escaped_text + tags.map((tag) => `</${tag}>`).join("");
    const wrapped_text = `<span style="white-space: pre-wrap;">${styled_text}</span>`;
    if (this.attachment) {
      if (this.attachment.element.type.imageType.image.sources.length) {
        if (this.endpoint) {
          const { url } = this.attachment.element.type.imageType.image.sources[0];
          let image_el = "";
          if (url) {
            image_el = `<img src="${url}" style="vertical-align: middle; height: ${this.attachment.element.properties.layoutProperties.height.value}px; width: ${this.attachment.element.properties.layoutProperties.width.value}px;" alt="">`;
          }
          const nav_url = this.endpoint.toURL();
          if (nav_url)
            return `<a href="${nav_url}" class="yt-ch-link">${image_el}${wrapped_text}</a>`;
        }
      }
    }
    if (this.endpoint) {
      const url = this.endpoint.toURL();
      if (url)
        return `<a href="${url}">${wrapped_text}</a>`;
    }
    return wrapped_text;
  }
};
__name(_TextRun, "TextRun");
var TextRun = _TextRun;

// dist/src/parser/classes/misc/Text.js
function escape(text) {
  return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
}
__name(escape, "escape");
var TAG = "Text";
var _Text = class _Text {
  constructor(data) {
    /**
     * The plain text content.
     */
    __publicField(this, "text");
    /**
     * Individual text segments with their formatting.
     */
    __publicField(this, "runs");
    /**
     * Navigation endpoint associated with this text.
     */
    __publicField(this, "endpoint");
    /**
     * Accessibility data associated with this text.
     */
    __publicField(this, "accessibility");
    /**
     * Indicates if the text is right-to-left.
     */
    __publicField(this, "rtl");
    if (this.isRunsData(data)) {
      this.runs = data.runs.map((run) => run.emoji ? new EmojiRun(run) : new TextRun(run));
      this.text = this.runs.map((run) => run.text).join("");
    } else {
      this.text = data?.simpleText;
    }
    if (this.isObject(data) && "accessibility" in data && "accessibilityData" in data.accessibility) {
      this.accessibility = {
        accessibility_data: new AccessibilityData(data.accessibility.accessibilityData)
      };
    }
    this.rtl = !!data?.rtl;
    this.parseEndpoint(data);
  }
  isRunsData(data) {
    return this.isObject(data) && Reflect.has(data, "runs") && Array.isArray(data.runs);
  }
  parseEndpoint(data) {
    if (!this.isObject(data))
      return;
    if ("navigationEndpoint" in data) {
      this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    } else if ("titleNavigationEndpoint" in data) {
      this.endpoint = new NavigationEndpoint(data.titleNavigationEndpoint);
    } else if (this.runs?.[0]?.endpoint) {
      this.endpoint = (this.runs?.[0]).endpoint;
    }
  }
  isObject(data) {
    return typeof data === "object" && data !== null;
  }
  static fromAttributed(data) {
    const { content, commandRuns: command_runs, attachmentRuns: attachment_runs } = data;
    const runs = [
      {
        text: content,
        startIndex: 0
      }
    ];
    const style_runs = data.styleRuns?.map((run) => ({
      ...run,
      startIndex: run.startIndex ?? 0,
      length: run.length ?? content.length
    }));
    if (style_runs?.length)
      this.processStyleRuns(runs, style_runs, data);
    if (command_runs?.length)
      this.processCommandRuns(runs, command_runs, data);
    if (attachment_runs?.length)
      this.processAttachmentRuns(runs, attachment_runs, data);
    return new _Text({ runs });
  }
  static processStyleRuns(runs, style_runs, data) {
    for (const style_run of style_runs) {
      if (style_run.italic || style_run.strikethrough === "LINE_STYLE_SINGLE" || style_run.weightLabel === "FONT_WEIGHT_MEDIUM" || style_run.weightLabel === "FONT_WEIGHT_BOLD") {
        const matching_run = findMatchingRun(runs, style_run);
        if (!matching_run) {
          Log_exports.warn(TAG, "Unable to find matching run for style run. Skipping...", {
            style_run,
            input_data: data,
            // For performance reasons, web browser consoles only expand an object, when the user clicks on it,
            // So if we log the original runs object, it might have changed by the time the user looks at it.
            // Deep clone, so that we log the exact state of the runs at this point.
            parsed_runs: JSON.parse(JSON.stringify(runs))
          });
          continue;
        }
        insertSubRun(runs, matching_run, style_run, {
          bold: style_run.weightLabel === "FONT_WEIGHT_MEDIUM" || style_run.weightLabel === "FONT_WEIGHT_BOLD",
          italics: style_run.italic,
          strikethrough: style_run.strikethrough === "LINE_STYLE_SINGLE"
        });
      } else {
        Log_exports.debug(TAG, "Skipping style run as it is doesn't have any information that we parse.", {
          style_run,
          input_data: data
        });
      }
    }
  }
  static processCommandRuns(runs, command_runs, data) {
    for (const command_run of command_runs) {
      if (command_run.onTap) {
        const matching_run = findMatchingRun(runs, command_run);
        if (!matching_run) {
          Log_exports.warn(TAG, "Unable to find matching run for command run. Skipping...", {
            command_run,
            input_data: data,
            // For performance reasons, web browser consoles only expand an object, when the user clicks on it,
            // So if we log the original runs object, it might have changed by the time the user looks at it.
            // Deep clone, so that we log the exact state of the runs at this point.
            parsed_runs: JSON.parse(JSON.stringify(runs))
          });
          continue;
        }
        insertSubRun(runs, matching_run, command_run, {
          navigationEndpoint: command_run.onTap
        });
      } else {
        Log_exports.debug(TAG, 'Skipping command run as it is missing the "doTap" property.', {
          command_run,
          input_data: data
        });
      }
    }
  }
  static processAttachmentRuns(runs, attachment_runs, data) {
    for (const attachment_run of attachment_runs) {
      const matching_run = findMatchingRun(runs, attachment_run);
      if (!matching_run) {
        Log_exports.warn(TAG, "Unable to find matching run for attachment run. Skipping...", {
          attachment_run,
          input_data: data,
          // For performance reasons, web browser consoles only expand an object, when the user clicks on it,
          // So if we log the original runs object, it might have changed by the time the user looks at it.
          // Deep clone, so that we log the exact state of the runs at this point.
          parsed_runs: JSON.parse(JSON.stringify(runs))
        });
        continue;
      }
      if (attachment_run.length === 0) {
        matching_run.attachment = attachment_run;
      } else {
        const offset_start_index = attachment_run.startIndex - matching_run.startIndex;
        const text = matching_run.text.substring(offset_start_index, offset_start_index + attachment_run.length);
        const is_custom_emoji = /^:[^:]+:$/.test(text);
        if (attachment_run.element?.type?.imageType?.image && (is_custom_emoji || /^(?:\p{Emoji}|\u200d)+$/u.test(text))) {
          const emoji = {
            image: attachment_run.element.type.imageType.image,
            isCustomEmoji: is_custom_emoji,
            shortcuts: is_custom_emoji ? [text] : void 0
          };
          insertSubRun(runs, matching_run, attachment_run, { emoji });
        } else {
          insertSubRun(runs, matching_run, attachment_run, {
            attachment: attachment_run
          });
        }
      }
    }
  }
  /**
   * Converts the text to HTML.
   * @returns The HTML.
   */
  toHTML() {
    return this.runs ? this.runs.map((run) => run.toHTML()).join("") : this.text;
  }
  /**
   * Checks if the text is empty.
   * @returns Whether the text is empty.
   */
  isEmpty() {
    return this.text === void 0;
  }
  /**
   * Converts the text to a string.
   * @returns The text.
   */
  toString() {
    return this.text || "N/A";
  }
};
__name(_Text, "Text");
var Text2 = _Text;
function findMatchingRun(runs, response_run) {
  return runs.find((run) => {
    return run.startIndex <= response_run.startIndex && response_run.startIndex + response_run.length <= run.startIndex + run.text.length;
  });
}
__name(findMatchingRun, "findMatchingRun");
function insertSubRun(runs, original_run, response_run, properties_to_add) {
  const replace_index = runs.indexOf(original_run);
  const replacement_runs = [];
  const offset_start_index = response_run.startIndex - original_run.startIndex;
  if (response_run.startIndex > original_run.startIndex) {
    replacement_runs.push({
      ...original_run,
      text: original_run.text.substring(0, offset_start_index)
    });
  }
  replacement_runs.push({
    ...original_run,
    text: original_run.text.substring(offset_start_index, offset_start_index + response_run.length),
    startIndex: response_run.startIndex,
    ...properties_to_add
  });
  if (response_run.startIndex + response_run.length < original_run.startIndex + original_run.text.length) {
    replacement_runs.push({
      ...original_run,
      text: original_run.text.substring(offset_start_index + response_run.length),
      startIndex: response_run.startIndex + response_run.length
    });
  }
  runs.splice(replace_index, 1, ...replacement_runs);
}
__name(insertSubRun, "insertSubRun");

// dist/src/parser/classes/ChannelExternalLinkView.js
var _ChannelExternalLinkView = class _ChannelExternalLinkView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "link");
    __publicField(this, "favicon");
    this.title = Text2.fromAttributed(data.title);
    this.link = Text2.fromAttributed(data.link);
    this.favicon = Thumbnail.fromResponse(data.favicon);
  }
};
__name(_ChannelExternalLinkView, "ChannelExternalLinkView");
__publicField(_ChannelExternalLinkView, "type", "ChannelExternalLinkView");
var ChannelExternalLinkView = _ChannelExternalLinkView;

// dist/src/parser/classes/AboutChannelView.js
var _AboutChannelView = class _AboutChannelView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "description");
    __publicField(this, "description_label");
    __publicField(this, "country");
    __publicField(this, "custom_links_label");
    __publicField(this, "subscriber_count");
    __publicField(this, "view_count");
    __publicField(this, "joined_date");
    __publicField(this, "canonical_channel_url");
    __publicField(this, "channel_id");
    __publicField(this, "additional_info_label");
    __publicField(this, "custom_url_on_tap");
    __publicField(this, "video_count");
    __publicField(this, "sign_in_for_business_email");
    __publicField(this, "links");
    if (Reflect.has(data, "description")) {
      this.description = data.description;
    }
    if (Reflect.has(data, "descriptionLabel")) {
      this.description_label = Text2.fromAttributed(data.descriptionLabel);
    }
    if (Reflect.has(data, "country")) {
      this.country = data.country;
    }
    if (Reflect.has(data, "customLinksLabel")) {
      this.custom_links_label = Text2.fromAttributed(data.customLinksLabel);
    }
    if (Reflect.has(data, "subscriberCountText")) {
      this.subscriber_count = data.subscriberCountText;
    }
    if (Reflect.has(data, "viewCountText")) {
      this.view_count = data.viewCountText;
    }
    if (Reflect.has(data, "joinedDateText")) {
      this.joined_date = Text2.fromAttributed(data.joinedDateText);
    }
    if (Reflect.has(data, "canonicalChannelUrl")) {
      this.canonical_channel_url = data.canonicalChannelUrl;
    }
    if (Reflect.has(data, "channelId")) {
      this.channel_id = data.channelId;
    }
    if (Reflect.has(data, "additionalInfoLabel")) {
      this.additional_info_label = Text2.fromAttributed(data.additionalInfoLabel);
    }
    if (Reflect.has(data, "customUrlOnTap")) {
      this.custom_url_on_tap = new NavigationEndpoint(data.customUrlOnTap);
    }
    if (Reflect.has(data, "videoCountText")) {
      this.video_count = data.videoCountText;
    }
    if (Reflect.has(data, "signInForBusinessEmail")) {
      this.sign_in_for_business_email = Text2.fromAttributed(data.signInForBusinessEmail);
    }
    if (Reflect.has(data, "links")) {
      this.links = parser_exports.parseArray(data.links, ChannelExternalLinkView);
    } else {
      this.links = [];
    }
  }
};
__name(_AboutChannelView, "AboutChannelView");
__publicField(_AboutChannelView, "type", "AboutChannelView");
var AboutChannelView = _AboutChannelView;

// dist/src/parser/classes/AboutChannel.js
var _AboutChannel = class _AboutChannel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "metadata");
    __publicField(this, "share_channel");
    this.metadata = parser_exports.parseItem(data.metadata, AboutChannelView);
    this.share_channel = parser_exports.parseItem(data.shareChannel, Button);
  }
};
__name(_AboutChannel, "AboutChannel");
__publicField(_AboutChannel, "type", "AboutChannel");
var AboutChannel = _AboutChannel;

// dist/src/parser/classes/AccountChannel.js
var _AccountChannel = class _AccountChannel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "endpoint");
    this.title = new Text2(data.title);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
  }
};
__name(_AccountChannel, "AccountChannel");
__publicField(_AccountChannel, "type", "AccountChannel");
var AccountChannel = _AccountChannel;

// dist/src/parser/classes/AccountItem.js
var _AccountItem = class _AccountItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "account_name");
    __publicField(this, "account_photo");
    __publicField(this, "is_selected");
    __publicField(this, "is_disabled");
    __publicField(this, "has_channel");
    __publicField(this, "endpoint");
    __publicField(this, "account_byline");
    __publicField(this, "channel_handle");
    this.account_name = new Text2(data.accountName);
    this.account_photo = Thumbnail.fromResponse(data.accountPhoto);
    this.is_selected = !!data.isSelected;
    this.is_disabled = !!data.isDisabled;
    this.has_channel = !!data.hasChannel;
    this.endpoint = new NavigationEndpoint(data.serviceEndpoint);
    this.account_byline = new Text2(data.accountByline);
    this.channel_handle = new Text2(data.channelHandle);
  }
};
__name(_AccountItem, "AccountItem");
__publicField(_AccountItem, "type", "AccountItem");
var AccountItem = _AccountItem;

// dist/src/parser/classes/AccountItemSectionHeader.js
var _AccountItemSectionHeader = class _AccountItemSectionHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = new Text2(data.title);
  }
};
__name(_AccountItemSectionHeader, "AccountItemSectionHeader");
__publicField(_AccountItemSectionHeader, "type", "AccountItemSectionHeader");
var AccountItemSectionHeader = _AccountItemSectionHeader;

// dist/src/parser/classes/CompactLink.js
var _CompactLink = class _CompactLink extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "endpoint");
    __publicField(this, "style");
    __publicField(this, "icon_type");
    __publicField(this, "secondary_icon_type");
    this.title = new Text2(data.title).toString();
    if ("subtitle" in data)
      this.subtitle = new Text2(data.subtitle);
    if ("icon" in data && "iconType" in data.icon)
      this.icon_type = data.icon.iconType;
    if ("secondaryIcon" in data && "iconType" in data.secondaryIcon)
      this.secondary_icon_type = data.secondaryIcon.iconType;
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint || data.serviceEndpoint);
    this.style = data.style;
  }
};
__name(_CompactLink, "CompactLink");
__publicField(_CompactLink, "type", "CompactLink");
var CompactLink = _CompactLink;

// dist/src/parser/classes/AccountItemSection.js
var _AccountItemSection = class _AccountItemSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    __publicField(this, "header");
    this.contents = parser_exports.parseArray(data.contents, [AccountItem, CompactLink]);
    this.header = parser_exports.parseItem(data.header, AccountItemSectionHeader);
  }
};
__name(_AccountItemSection, "AccountItemSection");
__publicField(_AccountItemSection, "type", "AccountItemSection");
var AccountItemSection = _AccountItemSection;

// dist/src/parser/classes/AccountSectionList.js
var _AccountSectionList = class _AccountSectionList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    __publicField(this, "footers");
    this.contents = parser_exports.parseArray(data.contents, AccountItemSection);
    this.footers = parser_exports.parseArray(data.footers, AccountChannel);
  }
};
__name(_AccountSectionList, "AccountSectionList");
__publicField(_AccountSectionList, "type", "AccountSectionList");
var AccountSectionList = _AccountSectionList;

// dist/src/parser/classes/actions/AppendContinuationItemsAction.js
var _AppendContinuationItemsAction = class _AppendContinuationItemsAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    __publicField(this, "target");
    this.contents = parser_exports.parseArray(data.continuationItems);
    this.target = data.target;
  }
};
__name(_AppendContinuationItemsAction, "AppendContinuationItemsAction");
__publicField(_AppendContinuationItemsAction, "type", "AppendContinuationItemsAction");
var AppendContinuationItemsAction = _AppendContinuationItemsAction;

// dist/src/parser/classes/actions/ChangeEngagementPanelVisibilityAction.js
var _ChangeEngagementPanelVisibilityAction = class _ChangeEngagementPanelVisibilityAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "target_id");
    __publicField(this, "visibility");
    this.target_id = data.targetId;
    this.visibility = data.visibility;
  }
};
__name(_ChangeEngagementPanelVisibilityAction, "ChangeEngagementPanelVisibilityAction");
__publicField(_ChangeEngagementPanelVisibilityAction, "type", "ChangeEngagementPanelVisibilityAction");
var ChangeEngagementPanelVisibilityAction = _ChangeEngagementPanelVisibilityAction;

// dist/src/parser/classes/menus/MultiPageMenu.js
var _MultiPageMenu = class _MultiPageMenu extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "sections");
    __publicField(this, "style");
    this.header = parser_exports.parseItem(data.header);
    this.sections = parser_exports.parseArray(data.sections);
    this.style = data.style;
  }
};
__name(_MultiPageMenu, "MultiPageMenu");
__publicField(_MultiPageMenu, "type", "MultiPageMenu");
var MultiPageMenu = _MultiPageMenu;

// dist/src/parser/classes/actions/GetMultiPageMenuAction.js
var _GetMultiPageMenuAction = class _GetMultiPageMenuAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "menu");
    this.menu = parser_exports.parseItem(data.menu, MultiPageMenu);
  }
};
__name(_GetMultiPageMenuAction, "GetMultiPageMenuAction");
__publicField(_GetMultiPageMenuAction, "type", "GetMultiPageMenuAction");
var GetMultiPageMenuAction = _GetMultiPageMenuAction;

// dist/src/parser/classes/actions/SendFeedbackAction.js
var _SendFeedbackAction = class _SendFeedbackAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "bucket");
    this.bucket = data.bucket;
  }
};
__name(_SendFeedbackAction, "SendFeedbackAction");
__publicField(_SendFeedbackAction, "type", "SendFeedbackAction");
var SendFeedbackAction = _SendFeedbackAction;

// dist/src/parser/classes/actions/SignalAction.js
var _SignalAction = class _SignalAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "signal");
    this.signal = data.signal;
  }
};
__name(_SignalAction, "SignalAction");
__publicField(_SignalAction, "type", "SignalAction");
var SignalAction = _SignalAction;

// dist/src/parser/classes/ChannelSwitcherPage.js
var _ChannelSwitcherPage = class _ChannelSwitcherPage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "contents");
    this.header = parser_exports.parseItem(data.header);
    this.contents = parser_exports.parse(data.contents, true);
  }
};
__name(_ChannelSwitcherPage, "ChannelSwitcherPage");
__publicField(_ChannelSwitcherPage, "type", "ChannelSwitcherPage");
var ChannelSwitcherPage = _ChannelSwitcherPage;

// dist/src/parser/classes/actions/UpdateChannelSwitcherPageAction.js
var _UpdateChannelSwitcherPageAction = class _UpdateChannelSwitcherPageAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "contents");
    const page = parser_exports.parseItem(data.page, ChannelSwitcherPage);
    if (page) {
      this.header = page.header;
      this.contents = page.contents;
    }
  }
};
__name(_UpdateChannelSwitcherPageAction, "UpdateChannelSwitcherPageAction");
__publicField(_UpdateChannelSwitcherPageAction, "type", "UpdateChannelSwitcherPageAction");
var UpdateChannelSwitcherPageAction = _UpdateChannelSwitcherPageAction;

// dist/src/parser/classes/SortFilterSubMenu.js
var _SortFilterSubMenu = class _SortFilterSubMenu extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "icon_type");
    __publicField(this, "tooltip");
    __publicField(this, "sub_menu_items");
    __publicField(this, "accessibility");
    if ("title" in data) {
      this.title = data.title;
    }
    if ("icon" in data) {
      this.icon_type = data.icon.iconType;
    }
    if ("tooltip" in data) {
      this.tooltip = data.tooltip;
    }
    if ("subMenuItems" in data) {
      this.sub_menu_items = data.subMenuItems.map((item) => ({
        title: item.title,
        selected: item.selected,
        continuation: item.continuation?.reloadContinuationData?.continuation,
        endpoint: new NavigationEndpoint(item.serviceEndpoint || item.navigationEndpoint),
        subtitle: item.subtitle || null
      }));
    }
    if ("accessibility" in data && "accessibilityData" in data.accessibility) {
      this.accessibility = {
        accessibility_data: new AccessibilityData(data.accessibility.accessibilityData)
      };
    }
  }
  get label() {
    return this.accessibility?.accessibility_data?.label;
  }
};
__name(_SortFilterSubMenu, "SortFilterSubMenu");
__publicField(_SortFilterSubMenu, "type", "SortFilterSubMenu");
var SortFilterSubMenu = _SortFilterSubMenu;

// dist/src/parser/classes/TranscriptFooter.js
var _TranscriptFooter = class _TranscriptFooter extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "language_menu");
    this.language_menu = parser_exports.parseItem(data.languageMenu, SortFilterSubMenu);
  }
};
__name(_TranscriptFooter, "TranscriptFooter");
__publicField(_TranscriptFooter, "type", "TranscriptFooter");
var TranscriptFooter = _TranscriptFooter;

// dist/src/parser/classes/TranscriptSearchBox.js
var _TranscriptSearchBox = class _TranscriptSearchBox extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "formatted_placeholder");
    __publicField(this, "clear_button");
    __publicField(this, "endpoint");
    __publicField(this, "search_button");
    this.formatted_placeholder = new Text2(data.formattedPlaceholder);
    this.clear_button = parser_exports.parseItem(data.clearButton, Button);
    this.endpoint = new NavigationEndpoint(data.onTextChangeCommand);
    this.search_button = parser_exports.parseItem(data.searchButton, Button);
  }
};
__name(_TranscriptSearchBox, "TranscriptSearchBox");
__publicField(_TranscriptSearchBox, "type", "TranscriptSearchBox");
var TranscriptSearchBox = _TranscriptSearchBox;

// dist/src/parser/classes/TranscriptSectionHeader.js
var _TranscriptSectionHeader = class _TranscriptSectionHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "start_ms");
    __publicField(this, "end_ms");
    __publicField(this, "snippet");
    this.start_ms = data.startMs;
    this.end_ms = data.endMs;
    this.snippet = new Text2(data.snippet);
  }
};
__name(_TranscriptSectionHeader, "TranscriptSectionHeader");
__publicField(_TranscriptSectionHeader, "type", "TranscriptSectionHeader");
var TranscriptSectionHeader = _TranscriptSectionHeader;

// dist/src/parser/classes/TranscriptSegment.js
var _TranscriptSegment = class _TranscriptSegment extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "start_ms");
    __publicField(this, "end_ms");
    __publicField(this, "snippet");
    __publicField(this, "start_time_text");
    __publicField(this, "target_id");
    this.start_ms = data.startMs;
    this.end_ms = data.endMs;
    this.snippet = new Text2(data.snippet);
    this.start_time_text = new Text2(data.startTimeText);
    this.target_id = data.targetId;
  }
};
__name(_TranscriptSegment, "TranscriptSegment");
__publicField(_TranscriptSegment, "type", "TranscriptSegment");
var TranscriptSegment = _TranscriptSegment;

// dist/src/parser/classes/TranscriptSegmentList.js
var _TranscriptSegmentList = class _TranscriptSegmentList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "initial_segments");
    __publicField(this, "no_result_label");
    __publicField(this, "retry_label");
    __publicField(this, "touch_captions_enabled");
    this.initial_segments = parser_exports.parseArray(data.initialSegments, [TranscriptSegment, TranscriptSectionHeader]);
    this.no_result_label = new Text2(data.noResultLabel);
    this.retry_label = new Text2(data.retryLabel);
    this.touch_captions_enabled = data.touchCaptionsEnabled;
  }
};
__name(_TranscriptSegmentList, "TranscriptSegmentList");
__publicField(_TranscriptSegmentList, "type", "TranscriptSegmentList");
var TranscriptSegmentList = _TranscriptSegmentList;

// dist/src/parser/classes/TranscriptSearchPanel.js
var _TranscriptSearchPanel = class _TranscriptSearchPanel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "body");
    __publicField(this, "footer");
    __publicField(this, "target_id");
    this.header = parser_exports.parseItem(data.header, TranscriptSearchBox);
    this.body = parser_exports.parseItem(data.body, TranscriptSegmentList);
    this.footer = parser_exports.parseItem(data.footer, TranscriptFooter);
    this.target_id = data.targetId;
  }
};
__name(_TranscriptSearchPanel, "TranscriptSearchPanel");
__publicField(_TranscriptSearchPanel, "type", "TranscriptSearchPanel");
var TranscriptSearchPanel = _TranscriptSearchPanel;

// dist/src/parser/classes/Transcript.js
var _Transcript = class _Transcript extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content");
    this.content = parser_exports.parseItem(data.content, TranscriptSearchPanel);
  }
};
__name(_Transcript, "Transcript");
__publicField(_Transcript, "type", "Transcript");
var Transcript = _Transcript;

// dist/src/parser/classes/actions/UpdateEngagementPanelAction.js
var _UpdateEngagementPanelAction = class _UpdateEngagementPanelAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "target_id");
    __publicField(this, "content");
    this.target_id = data.targetId;
    this.content = parser_exports.parseItem(data.content, Transcript);
  }
};
__name(_UpdateEngagementPanelAction, "UpdateEngagementPanelAction");
__publicField(_UpdateEngagementPanelAction, "type", "UpdateEngagementPanelAction");
var UpdateEngagementPanelAction = _UpdateEngagementPanelAction;

// dist/src/parser/classes/actions/UpdateSubscribeButtonAction.js
var _UpdateSubscribeButtonAction = class _UpdateSubscribeButtonAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "channel_id");
    __publicField(this, "subscribed");
    this.channel_id = data.channelId;
    this.subscribed = data.subscribed;
  }
};
__name(_UpdateSubscribeButtonAction, "UpdateSubscribeButtonAction");
__publicField(_UpdateSubscribeButtonAction, "type", "UpdateSubscribeButtonAction");
var UpdateSubscribeButtonAction = _UpdateSubscribeButtonAction;

// dist/src/parser/classes/ActiveAccountHeader.js
var _ActiveAccountHeader = class _ActiveAccountHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "account_name");
    __publicField(this, "account_photo");
    __publicField(this, "endpoint");
    __publicField(this, "manage_account_title");
    __publicField(this, "channel_handle");
    this.account_name = new Text2(data.accountName);
    this.account_photo = Thumbnail.fromResponse(data.accountPhoto);
    this.endpoint = new NavigationEndpoint(data.serviceEndpoint);
    this.manage_account_title = new Text2(data.manageAccountTitle);
    this.channel_handle = new Text2(data.channelHandle);
  }
};
__name(_ActiveAccountHeader, "ActiveAccountHeader");
__publicField(_ActiveAccountHeader, "type", "ActiveAccountHeader");
var ActiveAccountHeader = _ActiveAccountHeader;

// dist/src/parser/classes/MenuTitle.js
var _MenuTitle = class _MenuTitle extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = new Text2(data.title);
  }
};
__name(_MenuTitle, "MenuTitle");
__publicField(_MenuTitle, "type", "MenuTitle");
var MenuTitle = _MenuTitle;

// dist/src/parser/classes/PlaylistAddToOption.js
var _PlaylistAddToOption = class _PlaylistAddToOption extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "add_to_playlist_service_endpoint");
    __publicField(this, "contains_selected_videos");
    __publicField(this, "playlist_id");
    __publicField(this, "privacy");
    __publicField(this, "privacy_icon");
    __publicField(this, "remove_from_playlist_service_endpoint");
    __publicField(this, "title");
    this.add_to_playlist_service_endpoint = new NavigationEndpoint(data.addToPlaylistServiceEndpoint);
    this.contains_selected_videos = data.containsSelectedVideos;
    this.playlist_id = data.playlistId;
    this.privacy = data.privacy;
    this.privacy_icon = { icon_type: data.privacyIcon?.iconType || null };
    this.remove_from_playlist_service_endpoint = new NavigationEndpoint(data.removeFromPlaylistServiceEndpoint);
    this.title = new Text2(data.title);
  }
};
__name(_PlaylistAddToOption, "PlaylistAddToOption");
__publicField(_PlaylistAddToOption, "type", "PlaylistAddToOption");
var PlaylistAddToOption = _PlaylistAddToOption;

// dist/src/parser/classes/AddToPlaylist.js
var _AddToPlaylist = class _AddToPlaylist extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "actions");
    __publicField(this, "playlists");
    this.actions = parser_exports.parseArray(data.actions, [MenuTitle, Button]);
    this.playlists = parser_exports.parseArray(data.playlists, PlaylistAddToOption);
  }
};
__name(_AddToPlaylist, "AddToPlaylist");
__publicField(_AddToPlaylist, "type", "AddToPlaylist");
var AddToPlaylist = _AddToPlaylist;

// dist/src/parser/classes/Alert.js
var _Alert = class _Alert extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "alert_type");
    this.text = new Text2(data.text);
    this.alert_type = data.type;
  }
};
__name(_Alert, "Alert");
__publicField(_Alert, "type", "Alert");
var Alert = _Alert;

// dist/src/parser/classes/AlertWithButton.js
var _AlertWithButton = class _AlertWithButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "alert_type");
    __publicField(this, "dismiss_button");
    this.text = new Text2(data.text);
    this.alert_type = data.type;
    this.dismiss_button = parser_exports.parseItem(data.dismissButton, Button);
  }
};
__name(_AlertWithButton, "AlertWithButton");
__publicField(_AlertWithButton, "type", "AlertWithButton");
var AlertWithButton = _AlertWithButton;

// dist/src/parser/classes/AnimatedThumbnailOverlayView.js
var _AnimatedThumbnailOverlayView = class _AnimatedThumbnailOverlayView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
  }
};
__name(_AnimatedThumbnailOverlayView, "AnimatedThumbnailOverlayView");
__publicField(_AnimatedThumbnailOverlayView, "type", "AnimatedThumbnailOverlayView");
var AnimatedThumbnailOverlayView = _AnimatedThumbnailOverlayView;

// dist/src/parser/classes/AttributionView.js
var _AttributionView = class _AttributionView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "suffix");
    this.text = Text2.fromAttributed(data.text);
    this.suffix = Text2.fromAttributed(data.suffix);
  }
};
__name(_AttributionView, "AttributionView");
__publicField(_AttributionView, "type", "AttributionView");
var AttributionView = _AttributionView;

// dist/src/parser/classes/AudioOnlyPlayability.js
var _AudioOnlyPlayability = class _AudioOnlyPlayability extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "audio_only_availability");
    this.audio_only_availability = data.audioOnlyAvailability;
  }
};
__name(_AudioOnlyPlayability, "AudioOnlyPlayability");
__publicField(_AudioOnlyPlayability, "type", "AudioOnlyPlayability");
var AudioOnlyPlayability = _AudioOnlyPlayability;

// dist/src/parser/classes/AutomixPreviewVideo.js
var _AutomixPreviewVideo = class _AutomixPreviewVideo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "playlist_video");
    if (data?.content?.automixPlaylistVideoRenderer?.navigationEndpoint) {
      this.playlist_video = {
        endpoint: new NavigationEndpoint(data.content.automixPlaylistVideoRenderer.navigationEndpoint)
      };
    }
  }
};
__name(_AutomixPreviewVideo, "AutomixPreviewVideo");
__publicField(_AutomixPreviewVideo, "type", "AutomixPreviewVideo");
var AutomixPreviewVideo = _AutomixPreviewVideo;

// dist/src/parser/classes/AvatarView.js
var _AvatarView = class _AvatarView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "image");
    __publicField(this, "image_processor");
    __publicField(this, "avatar_image_size");
    this.image = Thumbnail.fromResponse(data.image);
    this.avatar_image_size = data.avatarImageSize;
    if (data.image.processor) {
      this.image_processor = {
        border_image_processor: {
          circular: data.image.processor.borderImageProcessor.circular
        }
      };
    }
  }
};
__name(_AvatarView, "AvatarView");
__publicField(_AvatarView, "type", "AvatarView");
var AvatarView = _AvatarView;

// dist/src/parser/classes/misc/CommandContext.js
var _CommandContext = class _CommandContext {
  constructor(data) {
    __publicField(this, "on_focus");
    __publicField(this, "on_hidden");
    __publicField(this, "on_touch_end");
    __publicField(this, "on_touch_move");
    __publicField(this, "on_long_press");
    __publicField(this, "on_tap");
    __publicField(this, "on_touch_start");
    __publicField(this, "on_visible");
    __publicField(this, "on_first_visible");
    __publicField(this, "on_hover");
    if ("onFocus" in data)
      this.on_focus = new NavigationEndpoint(data.onFocus);
    if ("onHidden" in data)
      this.on_hidden = new NavigationEndpoint(data.onHidden);
    if ("onTouchEnd" in data)
      this.on_touch_end = new NavigationEndpoint(data.onTouchEnd);
    if ("onTouchMove" in data)
      this.on_touch_move = new NavigationEndpoint(data.onTouchMove);
    if ("onLongPress" in data)
      this.on_long_press = new NavigationEndpoint(data.onLongPress);
    if ("onTap" in data)
      this.on_tap = new NavigationEndpoint(data.onTap);
    if ("onTouchStart" in data)
      this.on_touch_start = new NavigationEndpoint(data.onTouchStart);
    if ("onVisible" in data)
      this.on_visible = new NavigationEndpoint(data.onVisible);
    if ("onFirstVisible" in data)
      this.on_first_visible = new NavigationEndpoint(data.onFirstVisible);
    if ("onHover" in data)
      this.on_hover = new NavigationEndpoint(data.onHover);
  }
};
__name(_CommandContext, "CommandContext");
var CommandContext = _CommandContext;

// dist/src/parser/classes/misc/RendererContext.js
var _RendererContext = class _RendererContext {
  constructor(data) {
    __publicField(this, "command_context");
    __publicField(this, "accessibility_context");
    if (!data)
      return;
    if ("commandContext" in data) {
      this.command_context = new CommandContext(data.commandContext);
    }
    if ("accessibilityContext" in data) {
      this.accessibility_context = new AccessibilityContext(data.accessibilityContext);
    }
  }
};
__name(_RendererContext, "RendererContext");
var RendererContext = _RendererContext;

// dist/src/parser/classes/AvatarStackView.js
var _AvatarStackView = class _AvatarStackView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "avatars");
    __publicField(this, "text");
    __publicField(this, "renderer_context");
    this.avatars = parser_exports.parseArray(data.avatars, AvatarView);
    if (Reflect.has(data, "text"))
      this.text = Text2.fromAttributed(data.text);
    this.renderer_context = new RendererContext(data.rendererContext);
  }
};
__name(_AvatarStackView, "AvatarStackView");
__publicField(_AvatarStackView, "type", "AvatarStackView");
var AvatarStackView = _AvatarStackView;

// dist/src/parser/classes/ButtonView.js
var _ButtonView = class _ButtonView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "secondary_icon_image");
    __publicField(this, "icon_name");
    __publicField(this, "enable_icon_button");
    __publicField(this, "tooltip");
    __publicField(this, "icon_image_flip_for_rtl");
    __publicField(this, "button_size");
    __publicField(this, "icon_position");
    __publicField(this, "is_full_width");
    __publicField(this, "state");
    __publicField(this, "on_disabled_tap");
    __publicField(this, "custom_border_color");
    __publicField(this, "on_tap");
    __publicField(this, "style");
    __publicField(this, "icon_image");
    __publicField(this, "custom_dark_theme_border_color");
    __publicField(this, "title");
    __publicField(this, "target_id");
    __publicField(this, "enable_full_width_margins");
    __publicField(this, "custom_font_color");
    __publicField(this, "button_type");
    __publicField(this, "enabled");
    __publicField(this, "accessibility_id");
    __publicField(this, "custom_background_color");
    __publicField(this, "on_long_press");
    __publicField(this, "title_formatted");
    __publicField(this, "on_visible");
    __publicField(this, "icon_trailing");
    __publicField(this, "accessibility_text");
    if ("secondaryIconImage" in data)
      this.secondary_icon_image = Thumbnail.fromResponse(data.secondaryIconImage);
    if ("iconName" in data)
      this.icon_name = data.iconName;
    if ("enableIconButton" in data)
      this.enable_icon_button = data.enableIconButton;
    if ("tooltip" in data)
      this.tooltip = data.tooltip;
    if ("iconImageFlipForRtl" in data)
      this.icon_image_flip_for_rtl = data.iconImageFlipForRtl;
    if ("buttonSize" in data)
      this.button_size = data.buttonSize;
    if ("iconPosition" in data)
      this.icon_position = data.iconPosition;
    if ("isFullWidth" in data)
      this.is_full_width = data.isFullWidth;
    if ("state" in data)
      this.state = data.state;
    if ("onDisabledTap" in data)
      this.on_disabled_tap = new NavigationEndpoint(data.onDisabledTap);
    if ("customBorderColor" in data)
      this.custom_border_color = data.customBorderColor;
    if ("onTap" in data)
      this.on_tap = new NavigationEndpoint(data.onTap);
    if ("style" in data)
      this.style = data.style;
    if ("iconImage" in data)
      this.icon_image = data.iconImage;
    if ("customDarkThemeBorderColor" in data)
      this.custom_dark_theme_border_color = data.customDarkThemeBorderColor;
    if ("title" in data)
      this.title = data.title;
    if ("targetId" in data)
      this.target_id = data.targetId;
    if ("enableFullWidthMargins" in data)
      this.enable_full_width_margins = data.enableFullWidthMargins;
    if ("customFontColor" in data)
      this.custom_font_color = data.customFontColor;
    if ("type" in data)
      this.button_type = data.type;
    if ("enabled" in data)
      this.enabled = data.enabled;
    if ("accessibilityId" in data)
      this.accessibility_id = data.accessibilityId;
    if ("customBackgroundColor" in data)
      this.custom_background_color = data.customBackgroundColor;
    if ("onLongPress" in data)
      this.on_long_press = new NavigationEndpoint(data.onLongPress);
    if ("titleFormatted" in data)
      this.title_formatted = data.titleFormatted;
    if ("onVisible" in data)
      this.on_visible = data.onVisible;
    if ("iconTrailing" in data)
      this.icon_trailing = data.iconTrailing;
    if ("accessibilityText" in data)
      this.accessibility_text = data.accessibilityText;
  }
};
__name(_ButtonView, "ButtonView");
__publicField(_ButtonView, "type", "ButtonView");
var ButtonView = _ButtonView;

// dist/src/parser/classes/BackgroundPromo.js
var _BackgroundPromo = class _BackgroundPromo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "body_text");
    __publicField(this, "cta_button");
    __publicField(this, "icon_type");
    __publicField(this, "title");
    this.body_text = new Text2(data.bodyText);
    this.cta_button = parser_exports.parseItem(data.ctaButton, [Button, ButtonView]);
    if (Reflect.has(data, "icon"))
      this.icon_type = data.icon.iconType;
    this.title = new Text2(data.title);
  }
};
__name(_BackgroundPromo, "BackgroundPromo");
__publicField(_BackgroundPromo, "type", "BackgroundPromo");
var BackgroundPromo = _BackgroundPromo;

// dist/src/parser/classes/BackstageImage.js
var _BackstageImage = class _BackstageImage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "image");
    __publicField(this, "endpoint");
    this.image = Thumbnail.fromResponse(data.image);
    this.endpoint = new NavigationEndpoint(data.command);
  }
};
__name(_BackstageImage, "BackstageImage");
__publicField(_BackstageImage, "type", "BackstageImage");
var BackstageImage = _BackstageImage;

// dist/src/parser/classes/ToggleButton.js
var _ToggleButton = class _ToggleButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "toggled_text");
    __publicField(this, "tooltip");
    __publicField(this, "toggled_tooltip");
    __publicField(this, "is_toggled");
    __publicField(this, "is_disabled");
    __publicField(this, "icon_type");
    __publicField(this, "like_count");
    __publicField(this, "short_like_count");
    __publicField(this, "endpoint");
    __publicField(this, "toggled_endpoint");
    __publicField(this, "button_id");
    __publicField(this, "target_id");
    this.text = new Text2(data.defaultText);
    this.toggled_text = new Text2(data.toggledText);
    this.tooltip = data.defaultTooltip;
    this.toggled_tooltip = data.toggledTooltip;
    this.is_toggled = data.isToggled;
    this.is_disabled = data.isDisabled;
    this.icon_type = data.defaultIcon?.iconType;
    const acc_label = data?.defaultText?.accessibility?.accessibilityData?.label || data?.accessibilityData?.accessibilityData?.label || data?.accessibility?.label;
    if (this.icon_type == "LIKE") {
      this.like_count = parseInt(acc_label.replace(/\D/g, ""));
      this.short_like_count = new Text2(data.defaultText).toString();
    }
    this.endpoint = data.defaultServiceEndpoint?.commandExecutorCommand?.commands ? new NavigationEndpoint(data.defaultServiceEndpoint.commandExecutorCommand.commands.pop()) : new NavigationEndpoint(data.defaultServiceEndpoint);
    this.toggled_endpoint = new NavigationEndpoint(data.toggledServiceEndpoint);
    if (Reflect.has(data, "toggleButtonSupportedData") && Reflect.has(data.toggleButtonSupportedData, "toggleButtonIdData")) {
      this.button_id = data.toggleButtonSupportedData.toggleButtonIdData.id;
    }
    if (Reflect.has(data, "targetId")) {
      this.target_id = data.targetId;
    }
  }
};
__name(_ToggleButton, "ToggleButton");
__publicField(_ToggleButton, "type", "ToggleButton");
var ToggleButton = _ToggleButton;

// dist/src/parser/classes/comments/CreatorHeart.js
var _CreatorHeart = class _CreatorHeart extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "creator_thumbnail");
    __publicField(this, "heart_icon_type");
    __publicField(this, "heart_color");
    __publicField(this, "hearted_tooltip");
    __publicField(this, "is_hearted");
    __publicField(this, "is_enabled");
    __publicField(this, "kennedy_heart_color_string");
    this.creator_thumbnail = Thumbnail.fromResponse(data.creatorThumbnail);
    if (Reflect.has(data, "heartIcon") && Reflect.has(data.heartIcon, "iconType")) {
      this.heart_icon_type = data.heartIcon.iconType;
    }
    this.heart_color = {
      basic_color_palette_data: {
        foreground_title_color: data.heartColor?.basicColorPaletteData?.foregroundTitleColor
      }
    };
    this.hearted_tooltip = data.heartedTooltip;
    this.is_hearted = data.isHearted;
    this.is_enabled = data.isEnabled;
    this.kennedy_heart_color_string = data.kennedyHeartColorString;
  }
};
__name(_CreatorHeart, "CreatorHeart");
__publicField(_CreatorHeart, "type", "CreatorHeart");
var CreatorHeart = _CreatorHeart;

// dist/src/parser/classes/comments/CommentActionButtons.js
var _CommentActionButtons = class _CommentActionButtons extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "like_button");
    __publicField(this, "dislike_button");
    __publicField(this, "reply_button");
    __publicField(this, "creator_heart");
    this.like_button = parser_exports.parseItem(data.likeButton, ToggleButton);
    this.dislike_button = parser_exports.parseItem(data.dislikeButton, ToggleButton);
    this.reply_button = parser_exports.parseItem(data.replyButton, Button);
    this.creator_heart = parser_exports.parseItem(data.creatorHeart, CreatorHeart);
  }
};
__name(_CommentActionButtons, "CommentActionButtons");
__publicField(_CommentActionButtons, "type", "CommentActionButtons");
var CommentActionButtons = _CommentActionButtons;

// dist/src/parser/classes/ToggleButtonView.js
var _ToggleButtonView = class _ToggleButtonView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "default_button");
    __publicField(this, "toggled_button");
    __publicField(this, "is_toggling_disabled");
    __publicField(this, "identifier");
    __publicField(this, "is_toggled");
    this.default_button = parser_exports.parseItem(data.defaultButtonViewModel, ButtonView);
    this.toggled_button = parser_exports.parseItem(data.toggledButtonViewModel, ButtonView);
    this.is_toggling_disabled = data.isTogglingDisabled;
    this.identifier = data.identifier;
    if (Reflect.has(data, "isToggled")) {
      this.is_toggled = data.isToggled;
    }
  }
};
__name(_ToggleButtonView, "ToggleButtonView");
__publicField(_ToggleButtonView, "type", "ToggleButtonView");
var ToggleButtonView = _ToggleButtonView;

// dist/src/parser/classes/LikeButtonView.js
var _LikeButtonView = class _LikeButtonView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "toggle_button");
    __publicField(this, "like_status_entity_key");
    __publicField(this, "like_status_entity");
    this.toggle_button = parser_exports.parseItem(data.toggleButtonViewModel, ToggleButtonView);
    this.like_status_entity_key = data.likeStatusEntityKey;
    this.like_status_entity = {
      key: data.likeStatusEntity.key,
      like_status: data.likeStatusEntity.likeStatus
    };
  }
};
__name(_LikeButtonView, "LikeButtonView");
__publicField(_LikeButtonView, "type", "LikeButtonView");
var LikeButtonView = _LikeButtonView;

// dist/src/parser/classes/DislikeButtonView.js
var _DislikeButtonView = class _DislikeButtonView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "toggle_button");
    __publicField(this, "dislike_entity_key");
    this.toggle_button = parser_exports.parseItem(data.toggleButtonViewModel, ToggleButtonView);
    this.dislike_entity_key = data.dislikeEntityKey;
  }
};
__name(_DislikeButtonView, "DislikeButtonView");
__publicField(_DislikeButtonView, "type", "DislikeButtonView");
var DislikeButtonView = _DislikeButtonView;

// dist/src/parser/classes/SegmentedLikeDislikeButtonView.js
var _SegmentedLikeDislikeButtonView = class _SegmentedLikeDislikeButtonView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "like_button");
    __publicField(this, "dislike_button");
    __publicField(this, "icon_type");
    __publicField(this, "like_count_entity");
    __publicField(this, "dynamic_like_count_update_data");
    __publicField(this, "like_count");
    __publicField(this, "short_like_count");
    this.like_button = parser_exports.parseItem(data.likeButtonViewModel, LikeButtonView);
    this.dislike_button = parser_exports.parseItem(data.dislikeButtonViewModel, DislikeButtonView);
    this.icon_type = data.iconType;
    if (this.like_button && this.like_button.toggle_button) {
      const toggle_button = this.like_button.toggle_button;
      if (toggle_button.default_button) {
        this.short_like_count = toggle_button.default_button.title;
        if (toggle_button.default_button.accessibility_text)
          this.like_count = parseInt(toggle_button.default_button.accessibility_text.replace(/\D/g, ""));
      } else if (toggle_button.toggled_button) {
        this.short_like_count = toggle_button.toggled_button.title;
        if (toggle_button.toggled_button.accessibility_text)
          this.like_count = parseInt(toggle_button.toggled_button.accessibility_text.replace(/\D/g, ""));
      }
    }
    this.like_count_entity = {
      key: data.likeCountEntity.key
    };
    this.dynamic_like_count_update_data = {
      update_status_key: data.dynamicLikeCountUpdateData.updateStatusKey,
      placeholder_like_count_values_key: data.dynamicLikeCountUpdateData.placeholderLikeCountValuesKey,
      update_delay_loop_id: data.dynamicLikeCountUpdateData.updateDelayLoopId,
      update_delay_sec: data.dynamicLikeCountUpdateData.updateDelaySec
    };
  }
};
__name(_SegmentedLikeDislikeButtonView, "SegmentedLikeDislikeButtonView");
__publicField(_SegmentedLikeDislikeButtonView, "type", "SegmentedLikeDislikeButtonView");
var SegmentedLikeDislikeButtonView = _SegmentedLikeDislikeButtonView;

// dist/src/parser/classes/menus/MenuServiceItem.js
var _MenuServiceItem = class _MenuServiceItem extends Button {
  constructor(data) {
    super(data);
  }
};
__name(_MenuServiceItem, "MenuServiceItem");
__publicField(_MenuServiceItem, "type", "MenuServiceItem");
var MenuServiceItem = _MenuServiceItem;

// dist/src/parser/classes/DownloadButton.js
var _DownloadButton = class _DownloadButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "style");
    __publicField(this, "size");
    // TODO: check this
    __publicField(this, "endpoint");
    __publicField(this, "target_id");
    this.style = data.style;
    this.size = data.size;
    this.endpoint = new NavigationEndpoint(data.command);
    this.target_id = data.targetId;
  }
};
__name(_DownloadButton, "DownloadButton");
__publicField(_DownloadButton, "type", "DownloadButton");
var DownloadButton = _DownloadButton;

// dist/src/parser/classes/menus/MenuServiceItemDownload.js
var _MenuServiceItemDownload = class _MenuServiceItemDownload extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "has_separator");
    __publicField(this, "endpoint");
    this.has_separator = !!data.hasSeparator;
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint || data.serviceEndpoint);
  }
};
__name(_MenuServiceItemDownload, "MenuServiceItemDownload");
__publicField(_MenuServiceItemDownload, "type", "MenuServiceItemDownload");
var MenuServiceItemDownload = _MenuServiceItemDownload;

// dist/src/parser/classes/SubscribeButtonView.js
var _SubscribeButtonView_instances, parseButtonContent_fn;
var _SubscribeButtonView = class _SubscribeButtonView extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _SubscribeButtonView_instances);
    __publicField(this, "subscribe_button_content");
    __publicField(this, "unsubscribe_button_content");
    __publicField(this, "disable_notification_bell");
    __publicField(this, "button_style");
    __publicField(this, "is_signed_out");
    __publicField(this, "background_style");
    __publicField(this, "disable_subscribe_button");
    __publicField(this, "on_show_subscription_options");
    __publicField(this, "channel_id");
    __publicField(this, "enable_subscribe_button_post_click_animation");
    __publicField(this, "bell_accessibility_data");
    this.subscribe_button_content = __privateMethod(this, _SubscribeButtonView_instances, parseButtonContent_fn).call(this, data.subscribeButtonContent);
    this.unsubscribe_button_content = __privateMethod(this, _SubscribeButtonView_instances, parseButtonContent_fn).call(this, data.unsubscribeButtonContent);
    this.disable_notification_bell = data.disableNotificationBell;
    if ("buttonStyle" in data) {
      this.button_style = {
        unsubscribed_state_style: data.buttonStyle?.unsubscribedStateStyle,
        subscribed_state_style: data.buttonStyle?.subscribedStateStyle
      };
    }
    this.is_signed_out = data.isSignedOut;
    this.background_style = data.backgroundStyle;
    this.disable_subscribe_button = data.disableSubscribeButton;
    if ("onShowSubscriptionOptions" in data) {
      this.on_show_subscription_options = new NavigationEndpoint(data.onShowSubscriptionOptions);
    }
    this.channel_id = data.channelId;
    this.enable_subscribe_button_post_click_animation = data.enableSubscribeButtonPostClickAnimation;
    if ("bellAccessibilityData" in data) {
      this.bell_accessibility_data = {
        off_label: data.bellAccessibilityData?.offLabel,
        all_label: data.bellAccessibilityData?.allLabel,
        occasional_label: data.bellAccessibilityData?.occasionalLabel,
        disabled_label: data.bellAccessibilityData?.disabledLabel
      };
    }
  }
};
_SubscribeButtonView_instances = new WeakSet();
parseButtonContent_fn = /* @__PURE__ */ __name(function(data) {
  return {
    button_text: data.buttonText,
    accessibility_text: data.accessibilityText,
    image_name: data.imageName,
    subscribe_state_subscribed: data.subscribeState.subscribed,
    endpoint: new NavigationEndpoint(data.onTapCommand)
  };
}, "#parseButtonContent");
__name(_SubscribeButtonView, "SubscribeButtonView");
__publicField(_SubscribeButtonView, "type", "SubscribeButtonView");
var SubscribeButtonView = _SubscribeButtonView;

// dist/src/parser/classes/ListItemView.js
var _ListItemView = class _ListItemView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "leading_accessory");
    __publicField(this, "renderer_context");
    __publicField(this, "trailing_buttons");
    if ("title" in data) {
      this.title = Text2.fromAttributed(data.title);
    }
    if ("subtitle" in data) {
      this.subtitle = Text2.fromAttributed(data.subtitle);
    }
    this.leading_accessory = parser_exports.parseItem(data.leadingAccessory, AvatarView);
    if ("rendererContext" in data) {
      this.renderer_context = new RendererContext(data.rendererContext);
    }
    this.trailing_buttons = parser_exports.parseArray(data.trailingButtons?.buttons, SubscribeButtonView);
  }
};
__name(_ListItemView, "ListItemView");
__publicField(_ListItemView, "type", "ListItemView");
var ListItemView = _ListItemView;

// dist/src/parser/classes/menus/MenuFlexibleItem.js
var _MenuFlexibleItem = class _MenuFlexibleItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "menu_item");
    __publicField(this, "top_level_button");
    this.menu_item = parser_exports.parseItem(data.menuItem, [ListItemView, MenuServiceItem, MenuServiceItemDownload]);
    this.top_level_button = parser_exports.parseItem(data.topLevelButton, [DownloadButton, ButtonView, Button]);
  }
};
__name(_MenuFlexibleItem, "MenuFlexibleItem");
__publicField(_MenuFlexibleItem, "type", "MenuFlexibleItem");
var MenuFlexibleItem = _MenuFlexibleItem;

// dist/src/parser/classes/LikeButton.js
var _LikeButton = class _LikeButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "target");
    __publicField(this, "like_status");
    __publicField(this, "likes_allowed");
    __publicField(this, "endpoints");
    this.target = {
      video_id: data.target.videoId
    };
    this.like_status = data.likeStatus;
    this.likes_allowed = data.likesAllowed;
    if (Reflect.has(data, "serviceEndpoints")) {
      this.endpoints = data.serviceEndpoints.map((endpoint) => new NavigationEndpoint(endpoint));
    }
  }
};
__name(_LikeButton, "LikeButton");
__publicField(_LikeButton, "type", "LikeButton");
var LikeButton = _LikeButton;

// dist/src/parser/classes/FlexibleActionsView.js
var _FlexibleActionsView = class _FlexibleActionsView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "actions_rows");
    __publicField(this, "style");
    this.actions_rows = data.actionsRows.map((row) => ({
      actions: parser_exports.parseArray(row.actions, [ButtonView, ToggleButtonView, SubscribeButtonView])
    }));
    this.style = data.style;
  }
};
__name(_FlexibleActionsView, "FlexibleActionsView");
__publicField(_FlexibleActionsView, "type", "FlexibleActionsView");
var FlexibleActionsView = _FlexibleActionsView;

// dist/src/parser/classes/menus/Menu.js
var _Menu = class _Menu extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    __publicField(this, "flexible_items");
    __publicField(this, "top_level_buttons");
    __publicField(this, "accessibility");
    this.items = parser_exports.parseArray(data.items);
    this.flexible_items = parser_exports.parseArray(data.flexibleItems, MenuFlexibleItem);
    this.top_level_buttons = parser_exports.parseArray(data.topLevelButtons, [ToggleButton, LikeButton, Button, ButtonView, SegmentedLikeDislikeButtonView, FlexibleActionsView]);
    if ("accessibility" in data && "accessibilityData" in data.accessibility) {
      this.accessibility = {
        accessibility_data: new AccessibilityData(data.accessibility.accessibilityData)
      };
    }
  }
  get label() {
    return this.accessibility?.accessibility_data?.label;
  }
  // XXX: alias for consistency
  get contents() {
    return this.items;
  }
};
__name(_Menu, "Menu");
__publicField(_Menu, "type", "Menu");
var Menu = _Menu;

// dist/src/parser/classes/BackstagePost.js
var _BackstagePost = class _BackstagePost extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "author");
    __publicField(this, "content");
    __publicField(this, "published");
    __publicField(this, "poll_status");
    __publicField(this, "vote_status");
    __publicField(this, "vote_count");
    __publicField(this, "menu");
    __publicField(this, "action_buttons");
    __publicField(this, "vote_button");
    __publicField(this, "surface");
    __publicField(this, "endpoint");
    __publicField(this, "attachment");
    this.id = data.postId;
    this.author = new Author({
      ...data.authorText,
      navigationEndpoint: data.authorEndpoint
    }, null, data.authorThumbnail);
    this.content = new Text2(data.contentText);
    this.published = new Text2(data.publishedTimeText);
    if (Reflect.has(data, "pollStatus")) {
      this.poll_status = data.pollStatus;
    }
    if (Reflect.has(data, "voteStatus")) {
      this.vote_status = data.voteStatus;
    }
    if (Reflect.has(data, "voteCount")) {
      this.vote_count = new Text2(data.voteCount);
    }
    if (Reflect.has(data, "actionMenu")) {
      this.menu = parser_exports.parseItem(data.actionMenu, Menu);
    }
    if (Reflect.has(data, "actionButtons")) {
      this.action_buttons = parser_exports.parseItem(data.actionButtons, CommentActionButtons);
    }
    if (Reflect.has(data, "voteButton")) {
      this.vote_button = parser_exports.parseItem(data.voteButton, Button);
    }
    if (Reflect.has(data, "navigationEndpoint")) {
      this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    }
    if (Reflect.has(data, "backstageAttachment")) {
      this.attachment = parser_exports.parseItem(data.backstageAttachment);
    }
    this.surface = data.surface;
  }
};
__name(_BackstagePost, "BackstagePost");
__publicField(_BackstagePost, "type", "BackstagePost");
var BackstagePost = _BackstagePost;

// dist/src/parser/classes/BackstagePostThread.js
var _BackstagePostThread = class _BackstagePostThread extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "post");
    this.post = parser_exports.parseItem(data.post);
  }
};
__name(_BackstagePostThread, "BackstagePostThread");
__publicField(_BackstagePostThread, "type", "BackstagePostThread");
var BackstagePostThread = _BackstagePostThread;

// dist/src/parser/classes/BadgeView.js
var _BadgeView = class _BadgeView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "style");
    __publicField(this, "accessibility_label");
    this.text = data.badgeText;
    this.style = data.badgeStyle;
    this.accessibility_label = data.accessibilityLabel;
  }
};
__name(_BadgeView, "BadgeView");
var BadgeView = _BadgeView;

// dist/src/parser/classes/SubFeedOption.js
var _SubFeedOption = class _SubFeedOption extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "name");
    __publicField(this, "is_selected");
    __publicField(this, "endpoint");
    this.name = new Text2(data.name);
    this.is_selected = data.isSelected;
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
  }
};
__name(_SubFeedOption, "SubFeedOption");
__publicField(_SubFeedOption, "type", "SubFeedOption");
var SubFeedOption = _SubFeedOption;

// dist/src/parser/classes/SubFeedSelector.js
var _SubFeedSelector = class _SubFeedSelector extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "options");
    this.title = new Text2(data.title);
    this.options = parser_exports.parseArray(data.options, SubFeedOption);
  }
};
__name(_SubFeedSelector, "SubFeedSelector");
__publicField(_SubFeedSelector, "type", "SubFeedSelector");
var SubFeedSelector = _SubFeedSelector;

// dist/src/parser/classes/EomSettingsDisclaimer.js
var _EomSettingsDisclaimer = class _EomSettingsDisclaimer extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "disclaimer");
    __publicField(this, "info_icon");
    __publicField(this, "usage_scenario");
    this.disclaimer = new Text2(data.disclaimer);
    this.info_icon = {
      icon_type: data.infoIcon.iconType
    };
    this.usage_scenario = data.usageScenario;
  }
};
__name(_EomSettingsDisclaimer, "EomSettingsDisclaimer");
__publicField(_EomSettingsDisclaimer, "type", "EomSettingsDisclaimer");
var EomSettingsDisclaimer = _EomSettingsDisclaimer;

// dist/src/parser/classes/SearchBox.js
var _SearchBox = class _SearchBox extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "endpoint");
    __publicField(this, "search_button");
    __publicField(this, "clear_button");
    __publicField(this, "placeholder_text");
    this.endpoint = new NavigationEndpoint(data.endpoint);
    this.search_button = parser_exports.parseItem(data.searchButton, Button);
    this.clear_button = parser_exports.parseItem(data.clearButton, Button);
    this.placeholder_text = new Text2(data.placeholderText);
  }
};
__name(_SearchBox, "SearchBox");
__publicField(_SearchBox, "type", "SearchBox");
var SearchBox = _SearchBox;

// dist/src/parser/classes/BrowseFeedActions.js
var _BrowseFeedActions = class _BrowseFeedActions extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    this.contents = parser_exports.parseArray(data.contents, [SubFeedSelector, EomSettingsDisclaimer, ToggleButton, CompactLink, SearchBox, Button]);
  }
};
__name(_BrowseFeedActions, "BrowseFeedActions");
__publicField(_BrowseFeedActions, "type", "BrowseFeedActions");
var BrowseFeedActions = _BrowseFeedActions;

// dist/src/parser/classes/BrowserMediaSession.js
var _BrowserMediaSession = class _BrowserMediaSession extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "album");
    __publicField(this, "thumbnails");
    this.album = new Text2(data.album);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnailDetails);
  }
};
__name(_BrowserMediaSession, "BrowserMediaSession");
__publicField(_BrowserMediaSession, "type", "BrowserMediaSession");
var BrowserMediaSession = _BrowserMediaSession;

// dist/src/parser/classes/ButtonCardView.js
var _ButtonCardView = class _ButtonCardView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "icon_name");
    __publicField(this, "renderer_context");
    this.title = data.title;
    this.icon_name = data.image.sources[0].clientResource.imageName;
    this.renderer_context = new RendererContext(data.rendererContext);
  }
};
__name(_ButtonCardView, "ButtonCardView");
__publicField(_ButtonCardView, "type", "ButtonCardView");
var ButtonCardView = _ButtonCardView;

// dist/src/parser/classes/ChannelHeaderLinks.js
var _HeaderLink = class _HeaderLink extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "endpoint");
    __publicField(this, "icon");
    __publicField(this, "title");
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.icon = Thumbnail.fromResponse(data.icon);
    this.title = new Text2(data.title);
  }
};
__name(_HeaderLink, "HeaderLink");
__publicField(_HeaderLink, "type", "HeaderLink");
var HeaderLink = _HeaderLink;
var _ChannelHeaderLinks = class _ChannelHeaderLinks extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "primary");
    __publicField(this, "secondary");
    this.primary = observe(data.primaryLinks?.map((link) => new HeaderLink(link)) || []);
    this.secondary = observe(data.secondaryLinks?.map((link) => new HeaderLink(link)) || []);
  }
};
__name(_ChannelHeaderLinks, "ChannelHeaderLinks");
__publicField(_ChannelHeaderLinks, "type", "ChannelHeaderLinks");
var ChannelHeaderLinks = _ChannelHeaderLinks;

// dist/src/parser/classes/ChannelHeaderLinksView.js
var _ChannelHeaderLinksView = class _ChannelHeaderLinksView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "first_link");
    __publicField(this, "more");
    if (Reflect.has(data, "firstLink")) {
      this.first_link = Text2.fromAttributed(data.firstLink);
    }
    if (Reflect.has(data, "more")) {
      this.more = Text2.fromAttributed(data.more);
    }
  }
};
__name(_ChannelHeaderLinksView, "ChannelHeaderLinksView");
__publicField(_ChannelHeaderLinksView, "type", "ChannelHeaderLinksView");
var ChannelHeaderLinksView = _ChannelHeaderLinksView;

// dist/src/parser/classes/ClipCreationTextInput.js
var _ClipCreationTextInput = class _ClipCreationTextInput extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "placeholder_text");
    __publicField(this, "max_character_limit");
    this.placeholder_text = new Text2(data.placeholderText);
    this.max_character_limit = data.maxCharacterLimit;
  }
};
__name(_ClipCreationTextInput, "ClipCreationTextInput");
__publicField(_ClipCreationTextInput, "type", "ClipCreationTextInput");
var ClipCreationTextInput = _ClipCreationTextInput;

// dist/src/parser/classes/ClipCreationScrubber.js
var _ClipCreationScrubber = class _ClipCreationScrubber extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "length_template");
    __publicField(this, "max_length_ms");
    __publicField(this, "min_length_ms");
    __publicField(this, "default_length_ms");
    __publicField(this, "window_size_ms");
    __publicField(this, "start_label");
    __publicField(this, "end_label");
    __publicField(this, "duration_label");
    this.length_template = data.lengthTemplate;
    this.max_length_ms = data.maxLengthMs;
    this.min_length_ms = data.minLengthMs;
    this.default_length_ms = data.defaultLengthMs;
    this.window_size_ms = data.windowSizeMs;
    this.start_label = data.startAccessibility?.accessibilityData?.label;
    this.end_label = data.endAccessibility?.accessibilityData?.label;
    this.duration_label = data.durationAccessibility?.accessibilityData?.label;
  }
};
__name(_ClipCreationScrubber, "ClipCreationScrubber");
__publicField(_ClipCreationScrubber, "type", "ClipCreationScrubber");
var ClipCreationScrubber = _ClipCreationScrubber;

// dist/src/parser/classes/ClipAdState.js
var _ClipAdState = class _ClipAdState extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "body");
    this.title = new Text2(data.title);
    this.body = new Text2(data.body);
  }
};
__name(_ClipAdState, "ClipAdState");
__publicField(_ClipAdState, "type", "ClipAdState");
var ClipAdState = _ClipAdState;

// dist/src/parser/classes/ClipCreation.js
var _ClipCreation = class _ClipCreation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "user_avatar");
    __publicField(this, "title_input");
    __publicField(this, "scrubber");
    __publicField(this, "save_button");
    __publicField(this, "display_name");
    __publicField(this, "publicity_label");
    __publicField(this, "cancel_button");
    __publicField(this, "ad_state_overlay");
    __publicField(this, "external_video_id");
    __publicField(this, "publicity_label_icon");
    this.user_avatar = Thumbnail.fromResponse(data.userAvatar);
    this.title_input = parser_exports.parseItem(data.titleInput, [ClipCreationTextInput]);
    this.scrubber = parser_exports.parseItem(data.scrubber, [ClipCreationScrubber]);
    this.save_button = parser_exports.parseItem(data.saveButton, [Button]);
    this.display_name = new Text2(data.displayName);
    this.publicity_label = data.publicityLabel;
    this.cancel_button = parser_exports.parseItem(data.cancelButton, [Button]);
    this.ad_state_overlay = parser_exports.parseItem(data.adStateOverlay, [ClipAdState]);
    this.external_video_id = data.externalVideoId;
    this.publicity_label_icon = data.publicityLabelIcon;
  }
};
__name(_ClipCreation, "ClipCreation");
__publicField(_ClipCreation, "type", "ClipCreation");
var ClipCreation = _ClipCreation;

// dist/src/parser/classes/ClipSection.js
var _ClipSection = class _ClipSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    this.contents = parser_exports.parse(data.contents, true, [ClipCreation]);
  }
};
__name(_ClipSection, "ClipSection");
__publicField(_ClipSection, "type", "ClipSection");
var ClipSection = _ClipSection;

// dist/src/parser/classes/ContinuationItem.js
var _ContinuationItem = class _ContinuationItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "trigger");
    __publicField(this, "button");
    __publicField(this, "endpoint");
    this.trigger = data.trigger;
    if (Reflect.has(data, "button")) {
      this.button = parser_exports.parseItem(data.button, Button);
    }
    this.endpoint = new NavigationEndpoint(data.continuationEndpoint);
  }
};
__name(_ContinuationItem, "ContinuationItem");
__publicField(_ContinuationItem, "type", "ContinuationItem");
var ContinuationItem = _ContinuationItem;

// dist/src/parser/classes/EngagementPanelTitleHeader.js
var _EngagementPanelTitleHeader = class _EngagementPanelTitleHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "visibility_button");
    __publicField(this, "contextual_info");
    __publicField(this, "menu");
    this.title = new Text2(data.title);
    this.contextual_info = data.contextualInfo ? new Text2(data.contextualInfo) : void 0;
    this.visibility_button = parser_exports.parseItem(data.visibilityButton, Button);
    this.menu = parser_exports.parseItem(data.menu);
  }
};
__name(_EngagementPanelTitleHeader, "EngagementPanelTitleHeader");
__publicField(_EngagementPanelTitleHeader, "type", "EngagementPanelTitleHeader");
var EngagementPanelTitleHeader = _EngagementPanelTitleHeader;

// dist/src/parser/classes/MacroMarkersInfoItem.js
var _MacroMarkersInfoItem = class _MacroMarkersInfoItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "info_text");
    __publicField(this, "menu");
    this.info_text = new Text2(data.infoText);
    this.menu = parser_exports.parseItem(data.menu, Menu);
  }
};
__name(_MacroMarkersInfoItem, "MacroMarkersInfoItem");
__publicField(_MacroMarkersInfoItem, "type", "MacroMarkersInfoItem");
var MacroMarkersInfoItem = _MacroMarkersInfoItem;

// dist/src/parser/classes/MacroMarkersListItem.js
var _MacroMarkersListItem = class _MacroMarkersListItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "time_description");
    __publicField(this, "thumbnail");
    __publicField(this, "on_tap_endpoint");
    __publicField(this, "layout");
    __publicField(this, "is_highlighted");
    this.title = new Text2(data.title);
    this.time_description = new Text2(data.timeDescription);
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.on_tap_endpoint = new NavigationEndpoint(data.onTap);
    this.layout = data.layout;
    this.is_highlighted = !!data.isHighlighted;
  }
};
__name(_MacroMarkersListItem, "MacroMarkersListItem");
__publicField(_MacroMarkersListItem, "type", "MacroMarkersListItem");
var MacroMarkersListItem = _MacroMarkersListItem;

// dist/src/parser/classes/MacroMarkersList.js
var _MacroMarkersList = class _MacroMarkersList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    __publicField(this, "sync_button_label");
    this.contents = parser_exports.parseArray(data.contents, [MacroMarkersInfoItem, MacroMarkersListItem]);
    this.sync_button_label = new Text2(data.syncButtonLabel);
  }
};
__name(_MacroMarkersList, "MacroMarkersList");
__publicField(_MacroMarkersList, "type", "MacroMarkersList");
var MacroMarkersList = _MacroMarkersList;

// dist/src/parser/classes/ProductList.js
var _ProductList = class _ProductList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    this.contents = parser_exports.parseArray(data.contents);
  }
};
__name(_ProductList, "ProductList");
__publicField(_ProductList, "type", "ProductList");
var ProductList = _ProductList;

// dist/src/parser/classes/SectionList.js
var _SectionList = class _SectionList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    __publicField(this, "target_id");
    __publicField(this, "continuation");
    __publicField(this, "header");
    __publicField(this, "sub_menu");
    this.contents = parser_exports.parseArray(data.contents);
    if (Reflect.has(data, "targetId")) {
      this.target_id = data.targetId;
    }
    if (Reflect.has(data, "continuations")) {
      if (Reflect.has(data.continuations[0], "nextContinuationData")) {
        this.continuation = data.continuations[0].nextContinuationData.continuation;
      } else if (Reflect.has(data.continuations[0], "reloadContinuationData")) {
        this.continuation = data.continuations[0].reloadContinuationData.continuation;
      }
    }
    if (Reflect.has(data, "header")) {
      this.header = parser_exports.parseItem(data.header);
    }
    if (Reflect.has(data, "subMenu")) {
      this.sub_menu = parser_exports.parseItem(data.subMenu);
    }
  }
};
__name(_SectionList, "SectionList");
__publicField(_SectionList, "type", "SectionList");
var SectionList = _SectionList;

// dist/src/parser/classes/ExpandableVideoDescriptionBody.js
var _ExpandableVideoDescriptionBody = class _ExpandableVideoDescriptionBody extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "show_more_text");
    __publicField(this, "show_less_text");
    __publicField(this, "attributed_description_body_text");
    this.show_more_text = new Text2(data.showMoreText);
    this.show_less_text = new Text2(data.showLessText);
    if (Reflect.has(data, "attributedDescriptionBodyText")) {
      this.attributed_description_body_text = Text2.fromAttributed(data.attributedDescriptionBodyText);
    }
  }
};
__name(_ExpandableVideoDescriptionBody, "ExpandableVideoDescriptionBody");
__publicField(_ExpandableVideoDescriptionBody, "type", "ExpandableVideoDescriptionBody");
var ExpandableVideoDescriptionBody = _ExpandableVideoDescriptionBody;

// dist/src/parser/classes/SearchRefinementCard.js
var _SearchRefinementCard = class _SearchRefinementCard extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnails");
    __publicField(this, "endpoint");
    __publicField(this, "query");
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.endpoint = new NavigationEndpoint(data.searchEndpoint);
    this.query = new Text2(data.query).toString();
  }
};
__name(_SearchRefinementCard, "SearchRefinementCard");
__publicField(_SearchRefinementCard, "type", "SearchRefinementCard");
var SearchRefinementCard = _SearchRefinementCard;

// dist/src/parser/classes/GameCard.js
var _GameCard = class _GameCard extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "game");
    this.game = parser_exports.parseItem(data.game);
  }
};
__name(_GameCard, "GameCard");
__publicField(_GameCard, "type", "GameCard");
var GameCard = _GameCard;

// dist/src/parser/classes/HorizontalList.js
var _HorizontalList = class _HorizontalList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "visible_item_count");
    __publicField(this, "items");
    this.visible_item_count = data.visibleItemCount;
    this.items = parser_exports.parseArray(data.items);
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_HorizontalList, "HorizontalList");
__publicField(_HorizontalList, "type", "HorizontalList");
var HorizontalList = _HorizontalList;

// dist/src/parser/classes/VideoSummaryParagraphView.js
var _VideoSummaryParagraphView = class _VideoSummaryParagraphView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    this.text = Text2.fromAttributed(data.text);
  }
};
__name(_VideoSummaryParagraphView, "VideoSummaryParagraphView");
__publicField(_VideoSummaryParagraphView, "type", "VideoSummaryParagraphView");
var VideoSummaryParagraphView = _VideoSummaryParagraphView;

// dist/src/parser/classes/VideoSummaryContentView.js
var _VideoSummaryContentView = class _VideoSummaryContentView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "dislike_button_view");
    __publicField(this, "like_button_view");
    __publicField(this, "paragraphs");
    if ("dislikeButtonViewModel" in data) {
      this.dislike_button_view = parser_exports.parseItem(data.dislikeButtonViewModel, DislikeButtonView);
    }
    if ("likeButtonViewModel" in data) {
      this.like_button_view = parser_exports.parseItem(data.likeButtonViewModel, LikeButtonView);
    }
    this.paragraphs = parser_exports.parseArray(data.paragraphs, VideoSummaryParagraphView);
  }
};
__name(_VideoSummaryContentView, "VideoSummaryContentView");
__publicField(_VideoSummaryContentView, "type", "VideoSummaryContentView");
var VideoSummaryContentView = _VideoSummaryContentView;

// dist/src/parser/classes/ExpandableMetadata.js
var _ExpandableMetadata = class _ExpandableMetadata extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "expanded_content");
    __publicField(this, "expand_button");
    __publicField(this, "collapse_button");
    if (Reflect.has(data, "header")) {
      this.header = {
        collapsed_title: new Text2(data.header.collapsedTitle),
        collapsed_thumbnail: Thumbnail.fromResponse(data.header.collapsedThumbnail),
        collapsed_label: new Text2(data.header.collapsedLabel),
        expanded_title: new Text2(data.header.expandedTitle)
      };
    }
    this.expanded_content = parser_exports.parseItem(data.expandedContent, [VideoSummaryContentView, HorizontalCardList, HorizontalList]);
    this.expand_button = parser_exports.parseItem(data.expandButton, Button);
    this.collapse_button = parser_exports.parseItem(data.collapseButton, Button);
  }
};
__name(_ExpandableMetadata, "ExpandableMetadata");
__publicField(_ExpandableMetadata, "type", "ExpandableMetadata");
var ExpandableMetadata = _ExpandableMetadata;

// dist/src/parser/classes/MetadataBadge.js
var _MetadataBadge = class _MetadataBadge extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "icon_type");
    __publicField(this, "style");
    __publicField(this, "label");
    __publicField(this, "tooltip");
    if (Reflect.has(data, "icon")) {
      this.icon_type = data.icon.iconType;
    }
    if (Reflect.has(data, "style")) {
      this.style = data.style;
    }
    if (Reflect.has(data, "label")) {
      this.label = data.label;
    }
    if (Reflect.has(data, "tooltip") || Reflect.has(data, "iconTooltip")) {
      this.tooltip = data.tooltip || data.iconTooltip;
    }
  }
};
__name(_MetadataBadge, "MetadataBadge");
__publicField(_MetadataBadge, "type", "MetadataBadge");
var MetadataBadge = _MetadataBadge;

// dist/src/parser/classes/ThumbnailOverlayTimeStatus.js
var _ThumbnailOverlayTimeStatus = class _ThumbnailOverlayTimeStatus extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "style");
    this.text = new Text2(data.text).toString();
    this.style = data.style;
  }
};
__name(_ThumbnailOverlayTimeStatus, "ThumbnailOverlayTimeStatus");
__publicField(_ThumbnailOverlayTimeStatus, "type", "ThumbnailOverlayTimeStatus");
var ThumbnailOverlayTimeStatus = _ThumbnailOverlayTimeStatus;

// dist/src/parser/classes/Video.js
var _Video = class _Video extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "video_id");
    __publicField(this, "title");
    __publicField(this, "untranslated_title");
    __publicField(this, "description_snippet");
    __publicField(this, "snippets");
    __publicField(this, "expandable_metadata");
    __publicField(this, "additional_metadatas");
    __publicField(this, "thumbnails");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "rich_thumbnail");
    __publicField(this, "author");
    __publicField(this, "badges");
    __publicField(this, "endpoint");
    __publicField(this, "published");
    __publicField(this, "view_count");
    __publicField(this, "short_view_count");
    __publicField(this, "upcoming");
    __publicField(this, "length_text");
    __publicField(this, "show_action_menu");
    __publicField(this, "is_watched");
    __publicField(this, "menu");
    __publicField(this, "byline_text");
    __publicField(this, "search_video_result_entity_key");
    __publicField(this, "service_endpoints");
    __publicField(this, "service_endpoint");
    __publicField(this, "style");
    this.title = new Text2(data.title);
    this.video_id = data.videoId;
    this.expandable_metadata = parser_exports.parseItem(data.expandableMetadata, ExpandableMetadata);
    if ("untranslatedTitle" in data)
      this.untranslated_title = new Text2(data.untranslatedTitle);
    if ("descriptionSnippet" in data)
      this.description_snippet = new Text2(data.descriptionSnippet);
    if ("detailedMetadataSnippets" in data) {
      this.snippets = data.detailedMetadataSnippets.map((snippet) => ({
        text: new Text2(snippet.snippetText),
        hover_text: new Text2(snippet.snippetHoverText)
      }));
    }
    if ("additionalMetadatas" in data)
      this.additional_metadatas = data.additionalMetadatas.map((meta) => new Text2(meta));
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
    if ("richThumbnail" in data)
      this.rich_thumbnail = parser_exports.parseItem(data.richThumbnail);
    this.author = new Author(data.ownerText, data.ownerBadges, data.channelThumbnailSupportedRenderers?.channelThumbnailWithLinkRenderer?.thumbnail);
    this.badges = parser_exports.parseArray(data.badges, MetadataBadge);
    if ("navigationEndpoint" in data)
      this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    if ("publishedTimeText" in data)
      this.published = new Text2(data.publishedTimeText);
    if ("viewCountText" in data)
      this.view_count = new Text2(data.viewCountText);
    if ("shortViewCountText" in data)
      this.short_view_count = new Text2(data.shortViewCountText);
    if ("upcomingEventData" in data)
      this.upcoming = new Date(Number(`${data.upcomingEventData.startTime}000`));
    this.show_action_menu = !!data.showActionMenu;
    this.is_watched = !!data.isWatched;
    this.menu = parser_exports.parseItem(data.menu, Menu);
    if ("searchVideoResultEntityKey" in data)
      this.search_video_result_entity_key = data.searchVideoResultEntityKey;
    if ("bylineText" in data)
      this.byline_text = new Text2(data.bylineText);
    if ("lengthText" in data)
      this.length_text = new Text2(data.lengthText);
    if ("serviceEndpoints" in data)
      this.service_endpoints = data.serviceEndpoints.map((endpoint) => new NavigationEndpoint(endpoint));
    if ("serviceEndpoint" in data)
      this.service_endpoint = new NavigationEndpoint(data.serviceEndpoint);
    if ("style" in data)
      this.style = data.style;
  }
  /**
   * @deprecated Use {@linkcode video_id} instead.
   */
  get id() {
    return this.video_id;
  }
  get description() {
    if (this.snippets)
      return this.snippets.map((snip) => snip.text.toString()).join("");
    return this.description_snippet?.toString() || "";
  }
  get is_live() {
    return this.badges.some((badge) => {
      if (badge.style === "BADGE_STYLE_TYPE_LIVE_NOW" || badge.label === "LIVE")
        return true;
    }) || this.thumbnail_overlays.firstOfType(ThumbnailOverlayTimeStatus)?.style === "LIVE";
  }
  get is_upcoming() {
    return this.upcoming && this.upcoming > /* @__PURE__ */ new Date();
  }
  get is_premiere() {
    return this.badges.some((badge) => badge.label === "PREMIERE");
  }
  get is_4k() {
    return this.badges.some((badge) => badge.label === "4K");
  }
  get has_captions() {
    return this.badges.some((badge) => badge.label === "CC");
  }
  get best_thumbnail() {
    return this.thumbnails[0];
  }
  get duration() {
    const overlay_time_status = this.thumbnail_overlays.firstOfType(ThumbnailOverlayTimeStatus);
    const length_text = this.length_text?.toString() || overlay_time_status?.text.toString();
    return {
      text: length_text,
      seconds: length_text ? timeToSeconds(length_text) : 0
    };
  }
};
__name(_Video, "Video");
__publicField(_Video, "type", "Video");
var Video = _Video;

// dist/src/parser/classes/VideoCard.js
var _VideoCard = class _VideoCard extends Video {
  constructor(data) {
    super(data);
    __publicField(this, "metadata_text");
    if (Reflect.has(data, "metadataText")) {
      this.metadata_text = new Text2(data.metadataText);
      if (this.metadata_text.text) {
        this.short_view_count = new Text2({ simpleText: this.metadata_text.text.split("\xB7")[0]?.trim() });
        this.published = new Text2({ simpleText: this.metadata_text.text.split("\xB7")[1]?.trim() });
      }
    }
    if (Reflect.has(data, "bylineText")) {
      this.author = new Author(data.bylineText, data.ownerBadges, data.channelThumbnailSupportedRenderers?.channelThumbnailWithLinkRenderer?.thumbnail);
    }
  }
};
__name(_VideoCard, "VideoCard");
__publicField(_VideoCard, "type", "VideoCard");
var VideoCard = _VideoCard;

// dist/src/parser/classes/ContentPreviewImageView.js
var _ContentPreviewImageView = class _ContentPreviewImageView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "image");
    __publicField(this, "style");
    this.image = Thumbnail.fromResponse(data.image);
    this.style = data.style;
  }
};
__name(_ContentPreviewImageView, "ContentPreviewImageView");
__publicField(_ContentPreviewImageView, "type", "ContentPreviewImageView");
var ContentPreviewImageView = _ContentPreviewImageView;

// dist/src/parser/classes/VideoAttributeView.js
var _VideoAttributeView = class _VideoAttributeView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "image");
    __publicField(this, "image_style");
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "secondary_subtitle");
    __publicField(this, "orientation");
    __publicField(this, "sizing_rule");
    __publicField(this, "overflow_menu_on_tap");
    __publicField(this, "overflow_menu_a11y_label");
    if (data.image?.sources) {
      this.image = Thumbnail.fromResponse(data.image);
    } else {
      this.image = parser_exports.parseItem(data.image, ContentPreviewImageView);
    }
    this.image_style = data.imageStyle;
    this.title = data.title;
    this.subtitle = data.subtitle;
    if (Reflect.has(data, "secondarySubtitle")) {
      this.secondary_subtitle = {
        content: data.secondarySubtitle.content
      };
    }
    this.orientation = data.orientation;
    this.sizing_rule = data.sizingRule;
    this.overflow_menu_on_tap = new NavigationEndpoint(data.overflowMenuOnTap);
    this.overflow_menu_a11y_label = data.overflowMenuA11yLabel;
  }
};
__name(_VideoAttributeView, "VideoAttributeView");
__publicField(_VideoAttributeView, "type", "VideoAttributeView");
var VideoAttributeView = _VideoAttributeView;

// dist/src/parser/classes/HorizontalCardList.js
var _HorizontalCardList = class _HorizontalCardList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "cards");
    __publicField(this, "header");
    __publicField(this, "previous_button");
    __publicField(this, "next_button");
    this.cards = parser_exports.parseArray(data.cards, [VideoAttributeView, SearchRefinementCard, MacroMarkersListItem, GameCard, VideoCard]);
    this.header = parser_exports.parseItem(data.header);
    this.previous_button = parser_exports.parseItem(data.previousButton, Button);
    this.next_button = parser_exports.parseItem(data.nextButton, Button);
  }
};
__name(_HorizontalCardList, "HorizontalCardList");
__publicField(_HorizontalCardList, "type", "HorizontalCardList");
var HorizontalCardList = _HorizontalCardList;

// dist/src/parser/classes/Factoid.js
var _Factoid = class _Factoid extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "label");
    __publicField(this, "value");
    __publicField(this, "accessibility_text");
    this.label = new Text2(data.label);
    this.value = new Text2(data.value);
    this.accessibility_text = data.accessibilityText;
  }
};
__name(_Factoid, "Factoid");
__publicField(_Factoid, "type", "Factoid");
var Factoid = _Factoid;

// dist/src/parser/classes/UploadTimeFactoid.js
var _UploadTimeFactoid = class _UploadTimeFactoid extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "factoid");
    this.factoid = parser_exports.parseItem(data.factoid, Factoid);
  }
};
__name(_UploadTimeFactoid, "UploadTimeFactoid");
__publicField(_UploadTimeFactoid, "type", "UploadTimeFactoid");
var UploadTimeFactoid = _UploadTimeFactoid;

// dist/src/parser/classes/ViewCountFactoid.js
var _ViewCountFactoid = class _ViewCountFactoid extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "view_count_entity_key");
    __publicField(this, "factoid");
    __publicField(this, "view_count_type");
    this.view_count_entity_key = data.viewCountEntityKey;
    this.factoid = parser_exports.parseItem(data.factoid, [Factoid]);
    this.view_count_type = data.viewCountType;
  }
};
__name(_ViewCountFactoid, "ViewCountFactoid");
__publicField(_ViewCountFactoid, "type", "ViewCountFactoid");
var ViewCountFactoid = _ViewCountFactoid;

// dist/src/parser/classes/HypePointsFactoid.js
var _HypePointsFactoid = class _HypePointsFactoid extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "factoid");
    this.factoid = parser_exports.parseItem(data.factoid, Factoid);
  }
};
__name(_HypePointsFactoid, "HypePointsFactoid");
__publicField(_HypePointsFactoid, "type", "HypePointsFactoid");
var HypePointsFactoid = _HypePointsFactoid;

// dist/src/parser/classes/VideoDescriptionHeader.js
var _VideoDescriptionHeader = class _VideoDescriptionHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "channel");
    __publicField(this, "channel_navigation_endpoint");
    __publicField(this, "channel_thumbnail");
    __publicField(this, "factoids");
    __publicField(this, "publish_date");
    __publicField(this, "title");
    __publicField(this, "views");
    this.title = new Text2(data.title);
    this.channel = new Text2(data.channel);
    this.channel_navigation_endpoint = new NavigationEndpoint(data.channelNavigationEndpoint);
    this.channel_thumbnail = Thumbnail.fromResponse(data.channelThumbnail);
    this.publish_date = new Text2(data.publishDate);
    this.views = new Text2(data.views);
    this.factoids = parser_exports.parseArray(data.factoid, [Factoid, HypePointsFactoid, ViewCountFactoid, UploadTimeFactoid]);
  }
};
__name(_VideoDescriptionHeader, "VideoDescriptionHeader");
__publicField(_VideoDescriptionHeader, "type", "VideoDescriptionHeader");
var VideoDescriptionHeader = _VideoDescriptionHeader;

// dist/src/parser/classes/VideoDescriptionInfocardsSection.js
var _VideoDescriptionInfocardsSection = class _VideoDescriptionInfocardsSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "section_title");
    __publicField(this, "creator_videos_button");
    __publicField(this, "creator_about_button");
    __publicField(this, "section_subtitle");
    __publicField(this, "channel_avatar");
    __publicField(this, "channel_endpoint");
    this.section_title = new Text2(data.sectionTitle);
    this.creator_videos_button = parser_exports.parseItem(data.creatorVideosButton, Button);
    this.creator_about_button = parser_exports.parseItem(data.creatorAboutButton, Button);
    this.section_subtitle = new Text2(data.sectionSubtitle);
    this.channel_avatar = Thumbnail.fromResponse(data.channelAvatar);
    this.channel_endpoint = new NavigationEndpoint(data.channelEndpoint);
  }
};
__name(_VideoDescriptionInfocardsSection, "VideoDescriptionInfocardsSection");
__publicField(_VideoDescriptionInfocardsSection, "type", "VideoDescriptionInfocardsSection");
var VideoDescriptionInfocardsSection = _VideoDescriptionInfocardsSection;

// dist/src/parser/classes/InfoRow.js
var _InfoRow = class _InfoRow extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "default_metadata");
    __publicField(this, "expanded_metadata");
    __publicField(this, "info_row_expand_status_key");
    this.title = new Text2(data.title);
    if (Reflect.has(data, "defaultMetadata")) {
      this.default_metadata = new Text2(data.defaultMetadata);
    }
    if (Reflect.has(data, "expandedMetadata")) {
      this.expanded_metadata = new Text2(data.expandedMetadata);
    }
    if (Reflect.has(data, "infoRowExpandStatusKey")) {
      this.info_row_expand_status_key = data.infoRowExpandStatusKey;
    }
  }
};
__name(_InfoRow, "InfoRow");
__publicField(_InfoRow, "type", "InfoRow");
var InfoRow = _InfoRow;

// dist/src/parser/classes/CompactVideo.js
var _CompactVideo = class _CompactVideo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "video_id");
    __publicField(this, "thumbnails");
    __publicField(this, "rich_thumbnail");
    __publicField(this, "title");
    __publicField(this, "author");
    __publicField(this, "view_count");
    __publicField(this, "short_view_count");
    __publicField(this, "short_byline_text");
    __publicField(this, "long_byline_text");
    __publicField(this, "published");
    __publicField(this, "badges");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "endpoint");
    __publicField(this, "menu");
    __publicField(this, "length_text");
    __publicField(this, "is_watched");
    __publicField(this, "service_endpoints");
    __publicField(this, "service_endpoint");
    __publicField(this, "style");
    this.video_id = data.videoId;
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.title = new Text2(data.title);
    this.author = new Author(data.longBylineText, data.ownerBadges, data.channelThumbnail);
    this.is_watched = !!data.isWatched;
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
    this.menu = parser_exports.parseItem(data.menu, Menu);
    this.badges = parser_exports.parseArray(data.badges, MetadataBadge);
    if ("publishedTimeText" in data)
      this.published = new Text2(data.publishedTimeText);
    if ("shortBylineText" in data)
      this.view_count = new Text2(data.viewCountText);
    if ("shortViewCountText" in data)
      this.short_view_count = new Text2(data.shortViewCountText);
    if ("richThumbnail" in data)
      this.rich_thumbnail = parser_exports.parseItem(data.richThumbnail);
    if ("shortBylineText" in data)
      this.short_byline_text = new Text2(data.shortBylineText);
    if ("longBylineText" in data)
      this.long_byline_text = new Text2(data.longBylineText);
    if ("lengthText" in data)
      this.length_text = new Text2(data.lengthText);
    if ("serviceEndpoints" in data)
      this.service_endpoints = data.serviceEndpoints.map((endpoint) => new NavigationEndpoint(endpoint));
    if ("serviceEndpoint" in data)
      this.service_endpoint = new NavigationEndpoint(data.serviceEndpoint);
    if ("navigationEndpoint" in data)
      this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    if ("style" in data)
      this.style = data.style;
  }
  /**
   * @deprecated Use {@linkcode video_id} instead.
   */
  get id() {
    return this.video_id;
  }
  get duration() {
    const overlay_time_status = this.thumbnail_overlays.firstOfType(ThumbnailOverlayTimeStatus);
    const length_text = this.length_text?.toString() || overlay_time_status?.text.toString();
    return {
      text: length_text,
      seconds: length_text ? timeToSeconds(length_text) : 0
    };
  }
  get best_thumbnail() {
    return this.thumbnails[0];
  }
  get is_fundraiser() {
    return this.badges.some((badge) => badge.label === "Fundraiser");
  }
  get is_live() {
    return this.badges.some((badge) => {
      if (badge.style === "BADGE_STYLE_TYPE_LIVE_NOW" || badge.label === "LIVE")
        return true;
    });
  }
  get is_new() {
    return this.badges.some((badge) => badge.label === "New");
  }
  get is_premiere() {
    return this.badges.some((badge) => badge.style === "PREMIERE");
  }
};
__name(_CompactVideo, "CompactVideo");
__publicField(_CompactVideo, "type", "CompactVideo");
var CompactVideo = _CompactVideo;

// dist/src/parser/classes/CarouselLockup.js
var _CarouselLockup = class _CarouselLockup extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "info_rows");
    __publicField(this, "video_lockup");
    this.info_rows = parser_exports.parseArray(data.infoRows, InfoRow);
    this.video_lockup = parser_exports.parseItem(data.videoLockup, CompactVideo);
  }
};
__name(_CarouselLockup, "CarouselLockup");
__publicField(_CarouselLockup, "type", "CarouselLockup");
var CarouselLockup = _CarouselLockup;

// dist/src/parser/classes/VideoDescriptionMusicSection.js
var _VideoDescriptionMusicSection = class _VideoDescriptionMusicSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "carousel_lockups");
    __publicField(this, "section_title");
    this.carousel_lockups = parser_exports.parseArray(data.carouselLockups, CarouselLockup);
    this.section_title = new Text2(data.sectionTitle);
  }
};
__name(_VideoDescriptionMusicSection, "VideoDescriptionMusicSection");
__publicField(_VideoDescriptionMusicSection, "type", "VideoDescriptionMusicSection");
var VideoDescriptionMusicSection = _VideoDescriptionMusicSection;

// dist/src/parser/classes/VideoDescriptionTranscriptSection.js
var _VideoDescriptionTranscriptSection = class _VideoDescriptionTranscriptSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "section_title");
    __publicField(this, "sub_header_text");
    __publicField(this, "primary_button");
    this.section_title = new Text2(data.sectionTitle);
    this.sub_header_text = new Text2(data.subHeaderText);
    this.primary_button = parser_exports.parseItem(data.primaryButton, Button);
  }
};
__name(_VideoDescriptionTranscriptSection, "VideoDescriptionTranscriptSection");
__publicField(_VideoDescriptionTranscriptSection, "type", "VideoDescriptionTranscriptSection");
var VideoDescriptionTranscriptSection = _VideoDescriptionTranscriptSection;

// dist/src/parser/classes/StructuredDescriptionPlaylistLockup.js
var _StructuredDescriptionPlaylistLockup = class _StructuredDescriptionPlaylistLockup extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    __publicField(this, "title");
    __publicField(this, "short_byline_text");
    __publicField(this, "video_count_short_text");
    __publicField(this, "endpoint");
    __publicField(this, "thumbnail_width");
    __publicField(this, "aspect_ratio");
    __publicField(this, "max_lines_title");
    __publicField(this, "max_lines_short_byline_text");
    __publicField(this, "overlay_position");
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.title = new Text2(data.title);
    this.short_byline_text = new Text2(data.shortBylineText);
    this.video_count_short_text = new Text2(data.videoCountShortText);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.thumbnail_width = data.thumbnailWidth;
    this.aspect_ratio = data.aspectRatio;
    this.max_lines_title = data.maxLinesTitle;
    this.max_lines_short_byline_text = data.maxLinesShortBylineText;
    this.overlay_position = data.overlayPosition;
  }
};
__name(_StructuredDescriptionPlaylistLockup, "StructuredDescriptionPlaylistLockup");
__publicField(_StructuredDescriptionPlaylistLockup, "type", "StructuredDescriptionPlaylistLockup");
var StructuredDescriptionPlaylistLockup = _StructuredDescriptionPlaylistLockup;

// dist/src/parser/classes/VideoDescriptionCourseSection.js
var _VideoDescriptionCourseSection = class _VideoDescriptionCourseSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "section_title");
    __publicField(this, "media_lockups");
    this.section_title = new Text2(data.sectionTitle);
    this.media_lockups = parser_exports.parseArray(data.mediaLockups, [StructuredDescriptionPlaylistLockup]);
  }
};
__name(_VideoDescriptionCourseSection, "VideoDescriptionCourseSection");
__publicField(_VideoDescriptionCourseSection, "type", "VideoDescriptionCourseSection");
var VideoDescriptionCourseSection = _VideoDescriptionCourseSection;

// dist/src/parser/classes/VideoAttributesSectionView.js
var _VideoAttributesSectionView = class _VideoAttributesSectionView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header_title");
    __publicField(this, "header_subtitle");
    __publicField(this, "video_attributes");
    __publicField(this, "previous_button");
    __publicField(this, "next_button");
    this.header_title = data.headerTitle;
    this.header_subtitle = data.headerSubtitle;
    this.video_attributes = parser_exports.parseArray(data.videoAttributeViewModels, VideoAttributeView);
    this.previous_button = parser_exports.parseItem(data.previousButton, ButtonView);
    this.next_button = parser_exports.parseItem(data.nextButton, ButtonView);
  }
};
__name(_VideoAttributesSectionView, "VideoAttributesSectionView");
__publicField(_VideoAttributesSectionView, "type", "VideoAttributesSectionView");
var VideoAttributesSectionView = _VideoAttributesSectionView;

// dist/src/parser/classes/HowThisWasMadeSectionView.js
var _HowThisWasMadeSectionView = class _HowThisWasMadeSectionView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "section_title");
    __publicField(this, "body_text");
    __publicField(this, "body_header");
    if (Reflect.has(data, "sectionText"))
      this.section_title = Text2.fromAttributed(data.sectionText);
    if (Reflect.has(data, "bodyText"))
      this.body_text = Text2.fromAttributed(data.bodyText);
    if (Reflect.has(data, "bodyHeader"))
      this.body_header = Text2.fromAttributed(data.bodyHeader);
  }
};
__name(_HowThisWasMadeSectionView, "HowThisWasMadeSectionView");
__publicField(_HowThisWasMadeSectionView, "type", "HowThisWasMadeSectionView");
var HowThisWasMadeSectionView = _HowThisWasMadeSectionView;

// dist/src/parser/classes/ReelShelf.js
var _ReelShelf = class _ReelShelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "items");
    __publicField(this, "endpoint");
    this.title = new Text2(data.title);
    this.items = parser_exports.parseArray(data.items);
    if (Reflect.has(data, "endpoint")) {
      this.endpoint = new NavigationEndpoint(data.endpoint);
    }
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_ReelShelf, "ReelShelf");
__publicField(_ReelShelf, "type", "ReelShelf");
var ReelShelf = _ReelShelf;

// dist/src/parser/classes/MerchandiseShelf.js
var _MerchandiseShelf = class _MerchandiseShelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "menu");
    __publicField(this, "items");
    this.title = data.title;
    this.menu = parser_exports.parseItem(data.actionButton);
    this.items = parser_exports.parseArray(data.items);
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_MerchandiseShelf, "MerchandiseShelf");
__publicField(_MerchandiseShelf, "type", "MerchandiseShelf");
var MerchandiseShelf = _MerchandiseShelf;

// dist/src/parser/classes/StructuredDescriptionContent.js
var _StructuredDescriptionContent = class _StructuredDescriptionContent extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    this.items = parser_exports.parseArray(data.items, [
      VideoDescriptionHeader,
      ExpandableVideoDescriptionBody,
      VideoDescriptionMusicSection,
      VideoDescriptionInfocardsSection,
      VideoDescriptionCourseSection,
      VideoDescriptionTranscriptSection,
      VideoDescriptionTranscriptSection,
      HorizontalCardList,
      ReelShelf,
      VideoAttributesSectionView,
      HowThisWasMadeSectionView,
      ExpandableMetadata,
      MerchandiseShelf
    ]);
  }
};
__name(_StructuredDescriptionContent, "StructuredDescriptionContent");
__publicField(_StructuredDescriptionContent, "type", "StructuredDescriptionContent");
var StructuredDescriptionContent = _StructuredDescriptionContent;

// dist/src/parser/classes/EngagementPanelSectionList.js
var _EngagementPanelSectionList = class _EngagementPanelSectionList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "content");
    __publicField(this, "target_id");
    __publicField(this, "panel_identifier");
    __publicField(this, "identifier");
    __publicField(this, "visibility");
    this.header = parser_exports.parseItem(data.header, EngagementPanelTitleHeader);
    this.content = parser_exports.parseItem(data.content, [VideoAttributeView, SectionList, ContinuationItem, ClipSection, StructuredDescriptionContent, MacroMarkersList, ProductList]);
    this.panel_identifier = data.panelIdentifier;
    this.identifier = data.identifier ? {
      surface: data.identifier.surface,
      tag: data.identifier.tag
    } : void 0;
    this.target_id = data.targetId;
    this.visibility = data.visibility;
  }
};
__name(_EngagementPanelSectionList, "EngagementPanelSectionList");
__publicField(_EngagementPanelSectionList, "type", "EngagementPanelSectionList");
var EngagementPanelSectionList = _EngagementPanelSectionList;

// dist/src/parser/classes/ChannelTagline.js
var _ChannelTagline = class _ChannelTagline extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content");
    __publicField(this, "max_lines");
    __publicField(this, "more_endpoint");
    __publicField(this, "more_icon_type");
    __publicField(this, "more_label");
    __publicField(this, "target_id");
    this.content = data.content;
    this.max_lines = data.maxLines;
    this.more_endpoint = data.moreEndpoint.showEngagementPanelEndpoint ? {
      show_engagement_panel_endpoint: {
        engagement_panel: parser_exports.parseItem(data.moreEndpoint.showEngagementPanelEndpoint.engagementPanel, EngagementPanelSectionList),
        engagement_panel_popup_type: data.moreEndpoint.showEngagementPanelEndpoint.engagementPanelPresentationConfigs.engagementPanelPopupPresentationConfig.popupType,
        identifier: {
          surface: data.moreEndpoint.showEngagementPanelEndpoint.identifier.surface,
          tag: data.moreEndpoint.showEngagementPanelEndpoint.identifier.tag
        }
      }
    } : new NavigationEndpoint(data.moreEndpoint);
    this.more_icon_type = data.moreIcon.iconType;
    this.more_label = data.moreLabel;
    this.target_id = data.targetId;
  }
};
__name(_ChannelTagline, "ChannelTagline");
__publicField(_ChannelTagline, "type", "ChannelTagline");
var ChannelTagline = _ChannelTagline;

// dist/src/parser/classes/SubscriptionNotificationToggleButton.js
var _SubscriptionNotificationToggleButton = class _SubscriptionNotificationToggleButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "states");
    __publicField(this, "current_state_id");
    __publicField(this, "target_id");
    this.states = data.states.map((data2) => ({
      id: data2.stateId,
      next_id: data2.nextStateId,
      state: parser_exports.parse(data2.state)
    }));
    this.current_state_id = data.currentStateId;
    this.target_id = data.targetId;
  }
};
__name(_SubscriptionNotificationToggleButton, "SubscriptionNotificationToggleButton");
__publicField(_SubscriptionNotificationToggleButton, "type", "SubscriptionNotificationToggleButton");
var SubscriptionNotificationToggleButton = _SubscriptionNotificationToggleButton;

// dist/src/parser/classes/SubscribeButton.js
var _SubscribeButton = class _SubscribeButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "button_text");
    __publicField(this, "subscribed");
    __publicField(this, "enabled");
    __publicField(this, "item_type");
    __publicField(this, "channel_id");
    __publicField(this, "show_preferences");
    __publicField(this, "subscribed_text");
    __publicField(this, "unsubscribed_text");
    __publicField(this, "unsubscribe_text");
    __publicField(this, "notification_preference_button");
    __publicField(this, "service_endpoints");
    __publicField(this, "on_subscribe_endpoints");
    __publicField(this, "on_unsubscribe_endpoints");
    __publicField(this, "subscribed_entity_key");
    __publicField(this, "target_id");
    __publicField(this, "subscribe_accessibility_label");
    __publicField(this, "unsubscribe_accessibility_label");
    this.button_text = new Text2(data.buttonText);
    this.subscribed = data.subscribed;
    this.enabled = data.enabled;
    this.item_type = data.type;
    this.channel_id = data.channelId;
    this.show_preferences = data.showPreferences;
    if (Reflect.has(data, "subscribedButtonText"))
      this.subscribed_text = new Text2(data.subscribedButtonText);
    if (Reflect.has(data, "unsubscribedButtonText"))
      this.unsubscribed_text = new Text2(data.unsubscribedButtonText);
    if (Reflect.has(data, "unsubscribeButtonText"))
      this.unsubscribe_text = new Text2(data.unsubscribeButtonText);
    this.notification_preference_button = parser_exports.parseItem(data.notificationPreferenceButton, SubscriptionNotificationToggleButton);
    if (Reflect.has(data, "serviceEndpoints"))
      this.service_endpoints = data.serviceEndpoints.map((endpoint) => new NavigationEndpoint(endpoint));
    if (Reflect.has(data, "onSubscribeEndpoints"))
      this.on_subscribe_endpoints = data.onSubscribeEndpoints.map((endpoint) => new NavigationEndpoint(endpoint));
    if (Reflect.has(data, "onUnsubscribeEndpoints"))
      this.on_unsubscribe_endpoints = data.onUnsubscribeEndpoints.map((endpoint) => new NavigationEndpoint(endpoint));
    if (Reflect.has(data, "subscribedEntityKey"))
      this.subscribed_entity_key = data.subscribedEntityKey;
    if (Reflect.has(data, "targetId"))
      this.target_id = data.targetId;
    if (Reflect.has(data, "subscribeAccessibility"))
      this.subscribe_accessibility_label = data.subscribeAccessibility.accessibilityData?.label;
    if (Reflect.has(data, "unsubscribeAccessibility"))
      this.unsubscribe_accessibility_label = data.unsubscribeAccessibility.accessibilityData?.label;
  }
};
__name(_SubscribeButton, "SubscribeButton");
__publicField(_SubscribeButton, "type", "SubscribeButton");
var SubscribeButton = _SubscribeButton;

// dist/src/parser/classes/C4TabbedHeader.js
var _C4TabbedHeader = class _C4TabbedHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "author");
    __publicField(this, "banner");
    __publicField(this, "tv_banner");
    __publicField(this, "mobile_banner");
    __publicField(this, "subscribers");
    __publicField(this, "videos_count");
    __publicField(this, "sponsor_button");
    __publicField(this, "subscribe_button");
    __publicField(this, "header_links");
    __publicField(this, "channel_handle");
    __publicField(this, "channel_id");
    __publicField(this, "tagline");
    this.author = new Author({
      simpleText: data.title,
      navigationEndpoint: data.navigationEndpoint
    }, data.badges, data.avatar);
    if (Reflect.has(data, "banner")) {
      this.banner = Thumbnail.fromResponse(data.banner);
    }
    if (Reflect.has(data, "tv_banner")) {
      this.tv_banner = Thumbnail.fromResponse(data.tvBanner);
    }
    if (Reflect.has(data, "mobile_banner")) {
      this.mobile_banner = Thumbnail.fromResponse(data.mobileBanner);
    }
    if (Reflect.has(data, "subscriberCountText")) {
      this.subscribers = new Text2(data.subscriberCountText);
    }
    if (Reflect.has(data, "videosCountText")) {
      this.videos_count = new Text2(data.videosCountText);
    }
    if (Reflect.has(data, "sponsorButton")) {
      this.sponsor_button = parser_exports.parseItem(data.sponsorButton, Button);
    }
    if (Reflect.has(data, "subscribeButton")) {
      this.subscribe_button = parser_exports.parseItem(data.subscribeButton, [SubscribeButton, Button]);
    }
    if (Reflect.has(data, "headerLinks")) {
      this.header_links = parser_exports.parseItem(data.headerLinks, [ChannelHeaderLinks, ChannelHeaderLinksView]);
    }
    if (Reflect.has(data, "channelHandleText")) {
      this.channel_handle = new Text2(data.channelHandleText);
    }
    if (Reflect.has(data, "channelId")) {
      this.channel_id = data.channelId;
    }
    if (Reflect.has(data, "tagline")) {
      this.tagline = parser_exports.parseItem(data.tagline, ChannelTagline);
    }
  }
};
__name(_C4TabbedHeader, "C4TabbedHeader");
__publicField(_C4TabbedHeader, "type", "C4TabbedHeader");
var C4TabbedHeader = _C4TabbedHeader;

// dist/src/parser/classes/CallToActionButton.js
var _CallToActionButton = class _CallToActionButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "label");
    __publicField(this, "icon_type");
    __publicField(this, "style");
    this.label = new Text2(data.label);
    this.icon_type = data.icon.iconType;
    this.style = data.style;
  }
};
__name(_CallToActionButton, "CallToActionButton");
__publicField(_CallToActionButton, "type", "CallToActionButton");
var CallToActionButton = _CallToActionButton;

// dist/src/parser/classes/Card.js
var _Card = class _Card extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "teaser");
    __publicField(this, "content");
    __publicField(this, "card_id");
    __publicField(this, "feature");
    __publicField(this, "cue_ranges");
    this.teaser = parser_exports.parseItem(data.teaser);
    this.content = parser_exports.parseItem(data.content);
    if (Reflect.has(data, "cardId")) {
      this.card_id = data.cardId;
    }
    if (Reflect.has(data, "feature")) {
      this.feature = data.feature;
    }
    this.cue_ranges = data.cueRanges.map((cr) => ({
      start_card_active_ms: cr.startCardActiveMs,
      end_card_active_ms: cr.endCardActiveMs,
      teaser_duration_ms: cr.teaserDurationMs,
      icon_after_teaser_ms: cr.iconAfterTeaserMs
    }));
  }
};
__name(_Card, "Card");
__publicField(_Card, "type", "Card");
var Card = _Card;

// dist/src/parser/classes/CardCollection.js
var _CardCollection = class _CardCollection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "cards");
    __publicField(this, "header");
    __publicField(this, "allow_teaser_dismiss");
    this.cards = parser_exports.parseArray(data.cards);
    this.header = new Text2(data.headerText);
    this.allow_teaser_dismiss = data.allowTeaserDismiss;
  }
};
__name(_CardCollection, "CardCollection");
__publicField(_CardCollection, "type", "CardCollection");
var CardCollection = _CardCollection;

// dist/src/parser/classes/CarouselHeader.js
var _CarouselHeader = class _CarouselHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    this.contents = parser_exports.parseArray(data.contents);
  }
};
__name(_CarouselHeader, "CarouselHeader");
__publicField(_CarouselHeader, "type", "CarouselHeader");
var CarouselHeader = _CarouselHeader;

// dist/src/parser/classes/CarouselItem.js
var _CarouselItem = class _CarouselItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    __publicField(this, "background_color");
    __publicField(this, "layout_style");
    __publicField(this, "pagination_thumbnails");
    __publicField(this, "paginator_alignment");
    this.items = parser_exports.parseArray(data.carouselItems);
    this.background_color = data.backgroundColor;
    this.layout_style = data.layoutStyle;
    this.pagination_thumbnails = Thumbnail.fromResponse(data.paginationThumbnails);
    this.paginator_alignment = data.paginatorAlignment;
  }
  // XXX: For consistency.
  get contents() {
    return this.items;
  }
};
__name(_CarouselItem, "CarouselItem");
__publicField(_CarouselItem, "type", "CarouselItem");
var CarouselItem = _CarouselItem;

// dist/src/parser/classes/TextCarouselItemView.js
var _TextCarouselItemView = class _TextCarouselItemView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "icon_name");
    __publicField(this, "text");
    __publicField(this, "on_tap_endpoint");
    __publicField(this, "button");
    this.icon_name = data.iconName;
    this.text = Text2.fromAttributed(data.text);
    this.on_tap_endpoint = new NavigationEndpoint(data.onTap);
    this.button = parser_exports.parseItem(data.button, ButtonView);
  }
};
__name(_TextCarouselItemView, "TextCarouselItemView");
__publicField(_TextCarouselItemView, "type", "TextCarouselItemView");
var TextCarouselItemView = _TextCarouselItemView;

// dist/src/parser/classes/CarouselItemView.js
var _CarouselItemView = class _CarouselItemView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "item_type");
    __publicField(this, "carousel_item");
    this.item_type = data.itemType;
    this.carousel_item = parser_exports.parseItem(data.carouselItem, TextCarouselItemView);
  }
};
__name(_CarouselItemView, "CarouselItemView");
__publicField(_CarouselItemView, "type", "CarouselItemView");
var CarouselItemView = _CarouselItemView;

// dist/src/parser/classes/CarouselTitleView.js
var _CarouselTitleView = class _CarouselTitleView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "previous_button");
    __publicField(this, "next_button");
    this.title = data.title;
    this.previous_button = parser_exports.parseItem(data.previousButton, ButtonView);
    this.next_button = parser_exports.parseItem(data.nextButton, ButtonView);
  }
};
__name(_CarouselTitleView, "CarouselTitleView");
__publicField(_CarouselTitleView, "type", "CarouselTitleView");
var CarouselTitleView = _CarouselTitleView;

// dist/src/parser/classes/Channel.js
var _Channel = class _Channel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "author");
    __publicField(this, "subscriber_count");
    __publicField(this, "video_count");
    __publicField(this, "long_byline");
    __publicField(this, "short_byline");
    __publicField(this, "endpoint");
    __publicField(this, "subscribe_button");
    __publicField(this, "description_snippet");
    this.id = data.channelId;
    this.author = new Author({
      ...data.title,
      navigationEndpoint: data.navigationEndpoint
    }, data.ownerBadges, data.thumbnail);
    this.subscriber_count = new Text2(data.subscriberCountText);
    this.video_count = new Text2(data.videoCountText);
    this.long_byline = new Text2(data.longBylineText);
    this.short_byline = new Text2(data.shortBylineText);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.subscribe_button = parser_exports.parseItem(data.subscribeButton, [SubscribeButton, Button]);
    this.description_snippet = new Text2(data.descriptionSnippet);
  }
};
__name(_Channel, "Channel");
__publicField(_Channel, "type", "Channel");
var Channel = _Channel;

// dist/src/parser/classes/ChannelAboutFullMetadata.js
var _ChannelAboutFullMetadata = class _ChannelAboutFullMetadata extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "name");
    __publicField(this, "avatar");
    __publicField(this, "canonical_channel_url");
    __publicField(this, "primary_links");
    __publicField(this, "view_count");
    __publicField(this, "joined_date");
    __publicField(this, "description");
    __publicField(this, "email_reveal");
    __publicField(this, "can_reveal_email");
    __publicField(this, "country");
    __publicField(this, "buttons");
    this.id = data.channelId;
    this.name = new Text2(data.title);
    this.avatar = Thumbnail.fromResponse(data.avatar);
    this.canonical_channel_url = data.canonicalChannelUrl;
    this.primary_links = data.primaryLinks?.map((link) => ({
      endpoint: new NavigationEndpoint(link.navigationEndpoint),
      icon: Thumbnail.fromResponse(link.icon),
      title: new Text2(link.title)
    })) ?? [];
    this.view_count = new Text2(data.viewCountText);
    this.joined_date = new Text2(data.joinedDateText);
    this.description = new Text2(data.description);
    this.email_reveal = new NavigationEndpoint(data.onBusinessEmailRevealClickCommand);
    this.can_reveal_email = !data.signInForBusinessEmail;
    this.country = new Text2(data.country);
    this.buttons = parser_exports.parseArray(data.actionButtons, Button);
  }
};
__name(_ChannelAboutFullMetadata, "ChannelAboutFullMetadata");
__publicField(_ChannelAboutFullMetadata, "type", "ChannelAboutFullMetadata");
var ChannelAboutFullMetadata = _ChannelAboutFullMetadata;

// dist/src/parser/classes/ChannelAgeGate.js
var _ChannelAgeGate = class _ChannelAgeGate extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "channel_title");
    __publicField(this, "avatar");
    __publicField(this, "header");
    __publicField(this, "main_text");
    __publicField(this, "sign_in_button");
    __publicField(this, "secondary_text");
    this.channel_title = data.channelTitle;
    this.avatar = Thumbnail.fromResponse(data.avatar);
    this.header = new Text2(data.header);
    this.main_text = new Text2(data.mainText);
    this.sign_in_button = parser_exports.parseItem(data.signInButton, Button);
    this.secondary_text = new Text2(data.secondaryText);
  }
};
__name(_ChannelAgeGate, "ChannelAgeGate");
__publicField(_ChannelAgeGate, "type", "ChannelAgeGate");
var ChannelAgeGate = _ChannelAgeGate;

// dist/src/parser/classes/ChannelFeaturedContent.js
var _ChannelFeaturedContent = class _ChannelFeaturedContent extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "items");
    this.title = new Text2(data.title);
    this.items = parser_exports.parseArray(data.items);
  }
};
__name(_ChannelFeaturedContent, "ChannelFeaturedContent");
__publicField(_ChannelFeaturedContent, "type", "ChannelFeaturedContent");
var ChannelFeaturedContent = _ChannelFeaturedContent;

// dist/src/parser/classes/ChannelMetadata.js
var _ChannelMetadata = class _ChannelMetadata extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "description");
    __publicField(this, "url");
    __publicField(this, "rss_url");
    __publicField(this, "vanity_channel_url");
    __publicField(this, "external_id");
    __publicField(this, "is_family_safe");
    __publicField(this, "keywords");
    __publicField(this, "avatar");
    __publicField(this, "music_artist_name");
    __publicField(this, "available_countries");
    __publicField(this, "android_deep_link");
    __publicField(this, "android_appindexing_link");
    __publicField(this, "ios_appindexing_link");
    this.title = data.title;
    this.description = data.description;
    this.url = data.channelUrl;
    this.rss_url = data.rssUrl;
    this.vanity_channel_url = data.vanityChannelUrl;
    this.external_id = data.externalId;
    this.is_family_safe = data.isFamilySafe;
    this.keywords = data.keywords;
    this.avatar = Thumbnail.fromResponse(data.avatar);
    this.music_artist_name = typeof data.musicArtistName === "string" && data.musicArtistName.length > 0 ? data.musicArtistName : void 0;
    this.available_countries = data.availableCountryCodes;
    this.android_deep_link = data.androidDeepLink;
    this.android_appindexing_link = data.androidAppindexingLink;
    this.ios_appindexing_link = data.iosAppindexingLink;
  }
};
__name(_ChannelMetadata, "ChannelMetadata");
__publicField(_ChannelMetadata, "type", "ChannelMetadata");
var ChannelMetadata = _ChannelMetadata;

// dist/src/parser/classes/ChannelMobileHeader.js
var _ChannelMobileHeader = class _ChannelMobileHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = new Text2(data.title);
  }
};
__name(_ChannelMobileHeader, "ChannelMobileHeader");
__publicField(_ChannelMobileHeader, "type", "ChannelMobileHeader");
var ChannelMobileHeader = _ChannelMobileHeader;

// dist/src/parser/classes/ChannelOptions.js
var _ChannelOptions = class _ChannelOptions extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "avatar");
    __publicField(this, "endpoint");
    __publicField(this, "name");
    __publicField(this, "links");
    this.avatar = Thumbnail.fromResponse(data.avatar);
    this.endpoint = new NavigationEndpoint(data.avatarEndpoint);
    this.name = data.name;
    this.links = data.links.map((link) => new Text2(link));
  }
};
__name(_ChannelOptions, "ChannelOptions");
__publicField(_ChannelOptions, "type", "ChannelOptions");
var ChannelOptions = _ChannelOptions;

// dist/src/parser/classes/ChannelOwnerEmptyState.js
var _ChannelOwnerEmptyState = class _ChannelOwnerEmptyState extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "illustration");
    __publicField(this, "description");
    this.illustration = Thumbnail.fromResponse(data.illustration);
    this.description = new Text2(data.description);
  }
};
__name(_ChannelOwnerEmptyState, "ChannelOwnerEmptyState");
__publicField(_ChannelOwnerEmptyState, "type", "ChannelOwnerEmptyState");
var ChannelOwnerEmptyState = _ChannelOwnerEmptyState;

// dist/src/parser/classes/ChannelSubMenu.js
var _ChannelSubMenu = class _ChannelSubMenu extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content_type_sub_menu_items");
    __publicField(this, "sort_setting");
    this.content_type_sub_menu_items = data.sortSetting?.sortFilterSubMenuRenderer?.subMenuItems?.map((item) => ({
      endpoint: new NavigationEndpoint(item.navigationEndpoint || item.endpoint),
      selected: item.selected,
      title: item.title
    })) || [];
    this.sort_setting = parser_exports.parseItem(data.sortSetting);
  }
};
__name(_ChannelSubMenu, "ChannelSubMenu");
__publicField(_ChannelSubMenu, "type", "ChannelSubMenu");
var ChannelSubMenu = _ChannelSubMenu;

// dist/src/parser/classes/ChannelSwitcherHeader.js
var _ChannelSwitcherHeader = class _ChannelSwitcherHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "button");
    this.title = new Text2(data.title).toString();
    if (Reflect.has(data, "button")) {
      this.button = parser_exports.parseItem(data.button, Button);
    }
  }
};
__name(_ChannelSwitcherHeader, "ChannelSwitcherHeader");
__publicField(_ChannelSwitcherHeader, "type", "ChannelSwitcherHeader");
var ChannelSwitcherHeader = _ChannelSwitcherHeader;

// dist/src/parser/classes/ChannelThumbnailWithLink.js
var _ChannelThumbnailWithLink = class _ChannelThumbnailWithLink extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnails");
    __publicField(this, "endpoint");
    __publicField(this, "accessibility");
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    if ("accessibility" in data && "accessibilityData" in data.accessibility) {
      this.accessibility = {
        accessibility_data: new AccessibilityData(data.accessibility.accessibilityData)
      };
    }
  }
  get label() {
    return this.accessibility?.accessibility_data?.label;
  }
};
__name(_ChannelThumbnailWithLink, "ChannelThumbnailWithLink");
__publicField(_ChannelThumbnailWithLink, "type", "ChannelThumbnailWithLink");
var ChannelThumbnailWithLink = _ChannelThumbnailWithLink;

// dist/src/parser/classes/ChannelVideoPlayer.js
var _ChannelVideoPlayer = class _ChannelVideoPlayer extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "description");
    __publicField(this, "view_count");
    __publicField(this, "published_time");
    this.id = data.videoId;
    this.title = new Text2(data.title);
    this.description = new Text2(data.description);
    this.view_count = new Text2(data.viewCountText);
    this.published_time = new Text2(data.publishedTimeText);
  }
};
__name(_ChannelVideoPlayer, "ChannelVideoPlayer");
__publicField(_ChannelVideoPlayer, "type", "ChannelVideoPlayer");
var ChannelVideoPlayer = _ChannelVideoPlayer;

// dist/src/parser/classes/Chapter.js
var _Chapter = class _Chapter extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "time_range_start_millis");
    __publicField(this, "thumbnail");
    this.title = new Text2(data.title);
    this.time_range_start_millis = data.timeRangeStartMillis;
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
  }
};
__name(_Chapter, "Chapter");
__publicField(_Chapter, "type", "Chapter");
var Chapter = _Chapter;

// dist/src/parser/classes/ChildVideo.js
var _ChildVideo = class _ChildVideo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "duration");
    __publicField(this, "endpoint");
    this.id = data.videoId;
    this.title = new Text2(data.title);
    this.duration = {
      text: data.lengthText.simpleText,
      seconds: timeToSeconds(data.lengthText.simpleText)
    };
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
  }
};
__name(_ChildVideo, "ChildVideo");
__publicField(_ChildVideo, "type", "ChildVideo");
var ChildVideo = _ChildVideo;

// dist/src/parser/classes/ChipView.js
var _ChipView = class _ChipView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "display_type");
    __publicField(this, "endpoint");
    __publicField(this, "chip_entity_key");
    this.text = data.text;
    this.display_type = data.displayType;
    this.endpoint = new NavigationEndpoint(data.tapCommand);
    this.chip_entity_key = data.chipEntityKey;
  }
};
__name(_ChipView, "ChipView");
__publicField(_ChipView, "type", "ChipView");
var ChipView = _ChipView;

// dist/src/parser/classes/ChipBarView.js
var _ChipBarView = class _ChipBarView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "chips");
    this.chips = parser_exports.parseArray(data.chips, ChipView);
  }
};
__name(_ChipBarView, "ChipBarView");
__publicField(_ChipBarView, "type", "ChipBarView");
var ChipBarView = _ChipBarView;

// dist/src/parser/classes/ChipCloudChip.js
var _ChipCloudChip = class _ChipCloudChip extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "is_selected");
    __publicField(this, "endpoint");
    __publicField(this, "text");
    this.is_selected = data.isSelected;
    if (Reflect.has(data, "navigationEndpoint")) {
      this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    }
    this.text = new Text2(data.text).toString();
  }
};
__name(_ChipCloudChip, "ChipCloudChip");
__publicField(_ChipCloudChip, "type", "ChipCloudChip");
var ChipCloudChip = _ChipCloudChip;

// dist/src/parser/classes/ChipCloud.js
var _ChipCloud = class _ChipCloud extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "chips");
    __publicField(this, "next_button");
    __publicField(this, "previous_button");
    __publicField(this, "horizontal_scrollable");
    this.chips = parser_exports.parseArray(data.chips, ChipCloudChip);
    this.next_button = parser_exports.parseItem(data.nextButton, Button);
    this.previous_button = parser_exports.parseItem(data.previousButton, Button);
    this.horizontal_scrollable = data.horizontalScrollable;
  }
};
__name(_ChipCloud, "ChipCloud");
__publicField(_ChipCloud, "type", "ChipCloud");
var ChipCloud = _ChipCloud;

// dist/src/parser/classes/ClientSideToggleMenuItem.js
var _ClientSideToggleMenuItem = class _ClientSideToggleMenuItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "icon_type");
    __publicField(this, "toggled_text");
    __publicField(this, "toggled_icon_type");
    __publicField(this, "is_toggled");
    __publicField(this, "menu_item_identifier");
    __publicField(this, "endpoint");
    __publicField(this, "logging_directives");
    this.text = new Text2(data.defaultText);
    this.icon_type = data.defaultIcon.iconType;
    this.toggled_text = new Text2(data.toggledText);
    this.toggled_icon_type = data.toggledIcon.iconType;
    if (Reflect.has(data, "isToggled")) {
      this.is_toggled = data.isToggled;
    }
    this.menu_item_identifier = data.menuItemIdentifier;
    this.endpoint = new NavigationEndpoint(data.command);
    if (Reflect.has(data, "loggingDirectives")) {
      this.logging_directives = {
        visibility: {
          types: data.loggingDirectives.visibility.types
        },
        enable_displaylogger_experiment: data.loggingDirectives.enableDisplayloggerExperiment
      };
    }
  }
};
__name(_ClientSideToggleMenuItem, "ClientSideToggleMenuItem");
__publicField(_ClientSideToggleMenuItem, "type", "ClientSideToggleMenuItem");
var ClientSideToggleMenuItem = _ClientSideToggleMenuItem;

// dist/src/parser/classes/CollaboratorInfoCardContent.js
var _CollaboratorInfoCardContent = class _CollaboratorInfoCardContent extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "channel_avatar");
    __publicField(this, "custom_text");
    __publicField(this, "channel_name");
    __publicField(this, "subscriber_count");
    __publicField(this, "endpoint");
    this.channel_avatar = Thumbnail.fromResponse(data.channelAvatar);
    this.custom_text = new Text2(data.customText);
    this.channel_name = new Text2(data.channelName);
    this.subscriber_count = new Text2(data.subscriberCountText);
    this.endpoint = new NavigationEndpoint(data.endpoint);
  }
};
__name(_CollaboratorInfoCardContent, "CollaboratorInfoCardContent");
__publicField(_CollaboratorInfoCardContent, "type", "CollaboratorInfoCardContent");
var CollaboratorInfoCardContent = _CollaboratorInfoCardContent;

// dist/src/parser/classes/CollageHeroImage.js
var _CollageHeroImage = class _CollageHeroImage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "left");
    __publicField(this, "top_right");
    __publicField(this, "bottom_right");
    __publicField(this, "endpoint");
    this.left = Thumbnail.fromResponse(data.leftThumbnail);
    this.top_right = Thumbnail.fromResponse(data.topRightThumbnail);
    this.bottom_right = Thumbnail.fromResponse(data.bottomRightThumbnail);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
  }
};
__name(_CollageHeroImage, "CollageHeroImage");
__publicField(_CollageHeroImage, "type", "CollageHeroImage");
var CollageHeroImage = _CollageHeroImage;

// dist/src/parser/classes/ThumbnailHoverOverlayView.js
var _ThumbnailHoverOverlayView = class _ThumbnailHoverOverlayView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "icon_name");
    __publicField(this, "text");
    __publicField(this, "style");
    this.icon_name = data.icon.sources[0].clientResource.imageName;
    this.text = Text2.fromAttributed(data.text);
    this.style = data.style;
  }
};
__name(_ThumbnailHoverOverlayView, "ThumbnailHoverOverlayView");
__publicField(_ThumbnailHoverOverlayView, "type", "ThumbnailHoverOverlayView");
var ThumbnailHoverOverlayView = _ThumbnailHoverOverlayView;

// dist/src/parser/classes/ThumbnailBadgeView.js
var _ThumbnailBadgeView = class _ThumbnailBadgeView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "icon_name");
    __publicField(this, "text");
    __publicField(this, "badge_style");
    __publicField(this, "background_color");
    this.text = data.text;
    this.badge_style = data.badgeStyle;
    if (data.backgroundColor) {
      this.background_color = {
        light_theme: data.backgroundColor.lightTheme,
        dark_theme: data.backgroundColor.darkTheme
      };
    }
    if (data.iconName) {
      this.icon_name = data.icon.sources[0].clientResource.imageName;
    }
  }
};
__name(_ThumbnailBadgeView, "ThumbnailBadgeView");
__publicField(_ThumbnailBadgeView, "type", "ThumbnailBadgeView");
var ThumbnailBadgeView = _ThumbnailBadgeView;

// dist/src/parser/classes/ThumbnailOverlayBadgeView.js
var _ThumbnailOverlayBadgeView = class _ThumbnailOverlayBadgeView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "badges");
    __publicField(this, "position");
    this.badges = parser_exports.parseArray(data.thumbnailBadges, ThumbnailBadgeView);
    this.position = data.position;
  }
};
__name(_ThumbnailOverlayBadgeView, "ThumbnailOverlayBadgeView");
__publicField(_ThumbnailOverlayBadgeView, "type", "ThumbnailOverlayBadgeView");
var ThumbnailOverlayBadgeView = _ThumbnailOverlayBadgeView;

// dist/src/parser/classes/ThumbnailHoverOverlayToggleActionsView.js
var _ThumbnailHoverOverlayToggleActionsView = class _ThumbnailHoverOverlayToggleActionsView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "buttons");
    this.buttons = parser_exports.parseArray(data.buttons, ToggleButtonView);
  }
};
__name(_ThumbnailHoverOverlayToggleActionsView, "ThumbnailHoverOverlayToggleActionsView");
__publicField(_ThumbnailHoverOverlayToggleActionsView, "type", "ThumbnailHoverOverlayToggleActionsView");
var ThumbnailHoverOverlayToggleActionsView = _ThumbnailHoverOverlayToggleActionsView;

// dist/src/parser/classes/ThumbnailOverlayProgressBarView.js
var _ThumbnailOverlayProgressBarView = class _ThumbnailOverlayProgressBarView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "start_percent");
    this.start_percent = data.startPercent;
  }
};
__name(_ThumbnailOverlayProgressBarView, "ThumbnailOverlayProgressBarView");
__publicField(_ThumbnailOverlayProgressBarView, "type", "ThumbnailOverlayProgressBarView");
var ThumbnailOverlayProgressBarView = _ThumbnailOverlayProgressBarView;

// dist/src/parser/classes/ThumbnailBottomOverlayView.js
var _ThumbnailBottomOverlayView = class _ThumbnailBottomOverlayView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "progress_bar");
    __publicField(this, "badges");
    this.progress_bar = parser_exports.parseItem(data.progressBar, ThumbnailOverlayProgressBarView);
    this.badges = parser_exports.parseArray(data.badges, ThumbnailBadgeView);
  }
};
__name(_ThumbnailBottomOverlayView, "ThumbnailBottomOverlayView");
__publicField(_ThumbnailBottomOverlayView, "type", "ThumbnailBottomOverlayView");
var ThumbnailBottomOverlayView = _ThumbnailBottomOverlayView;

// dist/src/parser/classes/ThumbnailView.js
var _ThumbnailView = class _ThumbnailView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "image");
    __publicField(this, "overlays");
    __publicField(this, "background_color");
    this.image = Thumbnail.fromResponse(data.image);
    this.overlays = parser_exports.parseArray(data.overlays, [
      ThumbnailHoverOverlayToggleActionsView,
      ThumbnailBottomOverlayView,
      ThumbnailOverlayBadgeView,
      ThumbnailHoverOverlayView,
      AnimatedThumbnailOverlayView
    ]);
    if ("backgroundColor" in data) {
      this.background_color = {
        light_theme: data.backgroundColor.lightTheme,
        dark_theme: data.backgroundColor.darkTheme
      };
    }
  }
};
__name(_ThumbnailView, "ThumbnailView");
__publicField(_ThumbnailView, "type", "ThumbnailView");
var ThumbnailView = _ThumbnailView;

// dist/src/parser/classes/CollectionThumbnailView.js
var _CollectionThumbnailView = class _CollectionThumbnailView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "primary_thumbnail");
    __publicField(this, "stack_color");
    this.primary_thumbnail = parser_exports.parseItem(data.primaryThumbnail, ThumbnailView);
    if ("stackColor" in data) {
      this.stack_color = {
        light_theme: data.stackColor?.lightTheme,
        dark_theme: data.stackColor?.darkTheme
      };
    }
  }
};
__name(_CollectionThumbnailView, "CollectionThumbnailView");
__publicField(_CollectionThumbnailView, "type", "CollectionThumbnailView");
var CollectionThumbnailView = _CollectionThumbnailView;

// dist/src/parser/classes/commands/AddToPlaylistCommand.js
var _AddToPlaylistCommand = class _AddToPlaylistCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "open_miniplayer");
    __publicField(this, "video_id");
    __publicField(this, "list_type");
    __publicField(this, "endpoint");
    __publicField(this, "video_ids");
    this.open_miniplayer = data.openMiniplayer;
    this.video_id = data.videoId;
    this.list_type = data.listType;
    this.endpoint = new NavigationEndpoint(data.onCreateListCommand);
    this.video_ids = data.videoIds;
  }
};
__name(_AddToPlaylistCommand, "AddToPlaylistCommand");
__publicField(_AddToPlaylistCommand, "type", "AddToPlaylistCommand");
var AddToPlaylistCommand = _AddToPlaylistCommand;

// dist/src/parser/classes/commands/ContinuationCommand.js
var _data;
var _ContinuationCommand = class _ContinuationCommand extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data);
    __privateSet(this, _data, data);
  }
  getApiPath() {
    switch (__privateGet(this, _data).request) {
      case "CONTINUATION_REQUEST_TYPE_WATCH_NEXT":
        return "next";
      case "CONTINUATION_REQUEST_TYPE_BROWSE":
        return "browse";
      case "CONTINUATION_REQUEST_TYPE_SEARCH":
        return "search";
      case "CONTINUATION_REQUEST_TYPE_ACCOUNTS_LIST":
        return "account/accounts_list";
      case "CONTINUATION_REQUEST_TYPE_COMMENTS_NOTIFICATION_MENU":
        return "notification/get_notification_menu";
      case "CONTINUATION_REQUEST_TYPE_COMMENT_REPLIES":
        return "comment/get_comment_replies";
      case "CONTINUATION_REQUEST_TYPE_REEL_WATCH_SEQUENCE":
        return "reel/reel_watch_sequence";
      case "CONTINUATION_REQUEST_TYPE_GET_PANEL":
        return "get_panel";
      default:
        return "";
    }
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data).formData)
      request.formData = __privateGet(this, _data).formData;
    if (__privateGet(this, _data).token)
      request.continuation = __privateGet(this, _data).token;
    if (__privateGet(this, _data).request === "CONTINUATION_REQUEST_TYPE_COMMENTS_NOTIFICATION_MENU") {
      request.notificationsMenuRequestType = "NOTIFICATIONS_MENU_REQUEST_TYPE_COMMENTS";
      if (__privateGet(this, _data).token) {
        request.fetchCommentsParams = {
          continuation: __privateGet(this, _data).token
        };
        delete request.continuation;
      }
    }
    return request;
  }
};
_data = new WeakMap();
__name(_ContinuationCommand, "ContinuationCommand");
__publicField(_ContinuationCommand, "type", "ContinuationCommand");
var ContinuationCommand = _ContinuationCommand;

// dist/src/parser/classes/commands/GetKidsBlocklistPickerCommand.js
var API_PATH = "kids/get_kids_blocklist_picker";
var _data2;
var _GetKidsBlocklistPickerCommand = class _GetKidsBlocklistPickerCommand extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data2);
    __privateSet(this, _data2, data);
  }
  getApiPath() {
    return API_PATH;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data2).blockedForKidsContent)
      request.blockedForKidsContent = __privateGet(this, _data2).blockedForKidsContent;
    return request;
  }
};
_data2 = new WeakMap();
__name(_GetKidsBlocklistPickerCommand, "GetKidsBlocklistPickerCommand");
__publicField(_GetKidsBlocklistPickerCommand, "type", "GetKidsBlocklistPickerCommand");
var GetKidsBlocklistPickerCommand = _GetKidsBlocklistPickerCommand;

// dist/src/parser/classes/commands/RunAttestationCommand.js
var _RunAttestationCommand = class _RunAttestationCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "engagement_type");
    __publicField(this, "ids");
    this.engagement_type = data.engagementType;
    if (Reflect.has(data, "ids")) {
      this.ids = data.ids.map((id) => ({
        encrypted_video_id: id.encryptedVideoId,
        external_channel_id: id.externalChannelId,
        comment_id: id.commentId,
        external_owner_id: id.externalOwnerId,
        artist_id: id.artistId,
        playlist_id: id.playlistId,
        external_post_id: id.externalPostId,
        share_id: id.shareId
      }));
    }
  }
};
__name(_RunAttestationCommand, "RunAttestationCommand");
__publicField(_RunAttestationCommand, "type", "RunAttestationCommand");
var RunAttestationCommand = _RunAttestationCommand;

// dist/src/parser/classes/commands/ShowDialogCommand.js
var _ShowDialogCommand = class _ShowDialogCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "inline_content");
    __publicField(this, "remove_default_padding");
    this.inline_content = parser_exports.parseItem(data.panelLoadingStrategy?.inlineContent);
    this.remove_default_padding = !!data.removeDefaultPadding;
  }
};
__name(_ShowDialogCommand, "ShowDialogCommand");
__publicField(_ShowDialogCommand, "type", "ShowDialogCommand");
var ShowDialogCommand = _ShowDialogCommand;

// dist/src/parser/classes/commands/UpdateEngagementPanelContentCommand.js
var _UpdateEngagementPanelContentCommand = class _UpdateEngagementPanelContentCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content_source_panel_identifier");
    __publicField(this, "target_panel_identifier");
    this.content_source_panel_identifier = data.contentSourcePanelIdentifier;
    this.target_panel_identifier = data.targetPanelIdentifier;
  }
};
__name(_UpdateEngagementPanelContentCommand, "UpdateEngagementPanelContentCommand");
__publicField(_UpdateEngagementPanelContentCommand, "type", "UpdateEngagementPanelContentCommand");
var UpdateEngagementPanelContentCommand = _UpdateEngagementPanelContentCommand;

// dist/src/parser/classes/comments/AuthorCommentBadge.js
var _data3;
var _AuthorCommentBadge = class _AuthorCommentBadge extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data3);
    __publicField(this, "icon_type");
    __publicField(this, "tooltip");
    __publicField(this, "style");
    if (Reflect.has(data, "icon") && Reflect.has(data.icon, "iconType")) {
      this.icon_type = data.icon.iconType;
    }
    this.tooltip = data.iconTooltip;
    if (this.tooltip === "Verified") {
      this.style = "BADGE_STYLE_TYPE_VERIFIED";
      data.style = "BADGE_STYLE_TYPE_VERIFIED";
    }
    __privateSet(this, _data3, data);
  }
  get orig_badge() {
    return __privateGet(this, _data3);
  }
};
_data3 = new WeakMap();
__name(_AuthorCommentBadge, "AuthorCommentBadge");
__publicField(_AuthorCommentBadge, "type", "AuthorCommentBadge");
var AuthorCommentBadge = _AuthorCommentBadge;

// dist/src/parser/classes/comments/EmojiPicker.js
var _EmojiPicker = class _EmojiPicker extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "categories");
    __publicField(this, "category_buttons");
    __publicField(this, "search_placeholder");
    __publicField(this, "search_no_results");
    __publicField(this, "pick_skin_tone");
    __publicField(this, "clear_search_label");
    __publicField(this, "skin_tone_generic_label");
    __publicField(this, "skin_tone_light_label");
    __publicField(this, "skin_tone_medium_light_label");
    __publicField(this, "skin_tone_medium_label");
    __publicField(this, "skin_tone_medium_dark_label");
    __publicField(this, "skin_tone_dark_label");
    this.id = data.id;
    this.categories = parser_exports.parseArray(data.categories);
    this.category_buttons = parser_exports.parseArray(data.categoryButtons);
    this.search_placeholder = new Text2(data.searchPlaceholderText);
    this.search_no_results = new Text2(data.searchNoResultsText);
    this.pick_skin_tone = new Text2(data.pickSkinToneText);
    this.clear_search_label = data.clearSearchLabel;
    this.skin_tone_generic_label = data.skinToneGenericLabel;
    this.skin_tone_light_label = data.skinToneLightLabel;
    this.skin_tone_medium_light_label = data.skinToneMediumLightLabel;
    this.skin_tone_medium_label = data.skinToneMediumLabel;
    this.skin_tone_medium_dark_label = data.skinToneMediumDarkLabel;
    this.skin_tone_dark_label = data.skinToneDarkLabel;
  }
};
__name(_EmojiPicker, "EmojiPicker");
__publicField(_EmojiPicker, "type", "EmojiPicker");
var EmojiPicker = _EmojiPicker;

// dist/src/parser/classes/comments/CommentDialog.js
var _CommentDialog = class _CommentDialog extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "editable_text");
    __publicField(this, "author_thumbnail");
    __publicField(this, "submit_button");
    __publicField(this, "cancel_button");
    __publicField(this, "placeholder");
    __publicField(this, "emoji_button");
    __publicField(this, "emoji_picker");
    this.editable_text = new Text2(data.editableText);
    this.author_thumbnail = Thumbnail.fromResponse(data.authorThumbnail);
    this.submit_button = parser_exports.parseItem(data.submitButton, Button);
    this.cancel_button = parser_exports.parseItem(data.cancelButton, Button);
    this.placeholder = new Text2(data.placeholderText);
    this.emoji_button = parser_exports.parseItem(data.emojiButton, Button);
    this.emoji_picker = parser_exports.parseItem(data.emojiPicker, EmojiPicker);
  }
};
__name(_CommentDialog, "CommentDialog");
__publicField(_CommentDialog, "type", "CommentDialog");
var CommentDialog = _CommentDialog;

// dist/src/parser/classes/comments/CommentReplies.js
var _CommentReplies = class _CommentReplies extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    __publicField(this, "view_replies");
    __publicField(this, "hide_replies");
    __publicField(this, "view_replies_creator_thumbnail");
    __publicField(this, "has_channel_owner_replied");
    this.contents = parser_exports.parseArray(data.contents);
    this.view_replies = parser_exports.parseItem(data.viewReplies, Button);
    this.hide_replies = parser_exports.parseItem(data.hideReplies, Button);
    this.view_replies_creator_thumbnail = Thumbnail.fromResponse(data.viewRepliesCreatorThumbnail);
    this.has_channel_owner_replied = !!data.viewRepliesCreatorThumbnail;
  }
};
__name(_CommentReplies, "CommentReplies");
__publicField(_CommentReplies, "type", "CommentReplies");
var CommentReplies = _CommentReplies;

// dist/src/parser/classes/comments/CommentReplyDialog.js
var _CommentReplyDialog = class _CommentReplyDialog extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "reply_button");
    __publicField(this, "cancel_button");
    __publicField(this, "author_thumbnail");
    __publicField(this, "placeholder");
    __publicField(this, "error_message");
    this.reply_button = parser_exports.parseItem(data.replyButton, Button);
    this.cancel_button = parser_exports.parseItem(data.cancelButton, Button);
    this.author_thumbnail = Thumbnail.fromResponse(data.authorThumbnail);
    this.placeholder = new Text2(data.placeholderText);
    this.error_message = new Text2(data.errorMessage);
  }
};
__name(_CommentReplyDialog, "CommentReplyDialog");
__publicField(_CommentReplyDialog, "type", "CommentReplyDialog");
var CommentReplyDialog = _CommentReplyDialog;

// dist/src/parser/classes/comments/CommentsSimplebox.js
var _CommentsSimplebox = class _CommentsSimplebox extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "simplebox_avatar");
    __publicField(this, "simplebox_placeholder");
    this.simplebox_avatar = Thumbnail.fromResponse(data.simpleboxAvatar);
    this.simplebox_placeholder = new Text2(data.simpleboxPlaceholder);
  }
};
__name(_CommentsSimplebox, "CommentsSimplebox");
__publicField(_CommentsSimplebox, "type", "CommentsSimplebox");
var CommentsSimplebox = _CommentsSimplebox;

// dist/src/parser/classes/comments/CommentsEntryPointTeaser.js
var _CommentsEntryPointTeaser = class _CommentsEntryPointTeaser extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "teaser_avatar");
    __publicField(this, "teaser_content");
    if (Reflect.has(data, "teaserAvatar")) {
      this.teaser_avatar = Thumbnail.fromResponse(data.teaserAvatar);
    }
    if (Reflect.has(data, "teaserContent")) {
      this.teaser_content = new Text2(data.teaserContent);
    }
  }
};
__name(_CommentsEntryPointTeaser, "CommentsEntryPointTeaser");
__publicField(_CommentsEntryPointTeaser, "type", "CommentsEntryPointTeaser");
var CommentsEntryPointTeaser = _CommentsEntryPointTeaser;

// dist/src/parser/classes/comments/CommentsEntryPointHeader.js
var _CommentsEntryPointHeader = class _CommentsEntryPointHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "comment_count");
    __publicField(this, "teaser_avatar");
    __publicField(this, "teaser_content");
    __publicField(this, "content_renderer");
    __publicField(this, "simplebox_placeholder");
    if (Reflect.has(data, "headerText")) {
      this.header = new Text2(data.headerText);
    }
    if (Reflect.has(data, "commentCount")) {
      this.comment_count = new Text2(data.commentCount);
    }
    if (Reflect.has(data, "teaserAvatar") || Reflect.has(data, "simpleboxAvatar")) {
      this.teaser_avatar = Thumbnail.fromResponse(data.teaserAvatar || data.simpleboxAvatar);
    }
    if (Reflect.has(data, "teaserContent")) {
      this.teaser_content = new Text2(data.teaserContent);
    }
    if (Reflect.has(data, "contentRenderer")) {
      this.content_renderer = parser_exports.parseItem(data.contentRenderer, [CommentsEntryPointTeaser, CommentsSimplebox]);
    }
    if (Reflect.has(data, "simpleboxPlaceholder")) {
      this.simplebox_placeholder = new Text2(data.simpleboxPlaceholder);
    }
  }
};
__name(_CommentsEntryPointHeader, "CommentsEntryPointHeader");
__publicField(_CommentsEntryPointHeader, "type", "CommentsEntryPointHeader");
var CommentsEntryPointHeader = _CommentsEntryPointHeader;

// dist/src/parser/classes/comments/CommentsHeader.js
var _CommentsHeader = class _CommentsHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "count");
    __publicField(this, "comments_count");
    __publicField(this, "create_renderer");
    __publicField(this, "sort_menu");
    __publicField(this, "custom_emojis");
    this.title = new Text2(data.titleText);
    this.count = new Text2(data.countText);
    this.comments_count = new Text2(data.commentsCount);
    this.create_renderer = parser_exports.parseItem(data.createRenderer);
    this.sort_menu = parser_exports.parseItem(data.sortMenu, SortFilterSubMenu);
    if (Reflect.has(data, "customEmojis")) {
      this.custom_emojis = data.customEmojis.map((emoji) => ({
        emoji_id: emoji.emojiId,
        shortcuts: emoji.shortcuts,
        search_terms: emoji.searchTerms,
        image: Thumbnail.fromResponse(emoji.image),
        is_custom_emoji: emoji.isCustomEmoji
      }));
    }
  }
};
__name(_CommentsHeader, "CommentsHeader");
__publicField(_CommentsHeader, "type", "CommentsHeader");
var CommentsHeader = _CommentsHeader;

// dist/src/parser/classes/comments/CommentSimplebox.js
var _CommentSimplebox = class _CommentSimplebox extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "submit_button");
    __publicField(this, "cancel_button");
    __publicField(this, "author_thumbnail");
    __publicField(this, "placeholder");
    __publicField(this, "avatar_size");
    this.submit_button = parser_exports.parseItem(data.submitButton, Button);
    this.cancel_button = parser_exports.parseItem(data.cancelButton, Button);
    this.author_thumbnail = Thumbnail.fromResponse(data.authorThumbnail);
    this.placeholder = new Text2(data.placeholderText);
    this.avatar_size = data.avatarSize;
  }
};
__name(_CommentSimplebox, "CommentSimplebox");
__publicField(_CommentSimplebox, "type", "CommentSimplebox");
var CommentSimplebox = _CommentSimplebox;

// dist/src/parser/classes/comments/VoiceReplyContainerView.js
var _VoiceReplyContainerView = class _VoiceReplyContainerView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "voice_reply_unavailable_text");
    __publicField(this, "transcript_text");
    this.voice_reply_unavailable_text = Text2.fromAttributed(data.voiceReplyUnavailableText);
    this.transcript_text = Text2.fromAttributed(data.transcriptText);
  }
};
__name(_VoiceReplyContainerView, "VoiceReplyContainerView");
__publicField(_VoiceReplyContainerView, "type", "VoiceReplyContainerView");
var VoiceReplyContainerView = _VoiceReplyContainerView;

// dist/src/parser/classes/comments/CommentView.js
var _actions;
var _CommentView = class _CommentView extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _actions);
    __publicField(this, "like_command");
    __publicField(this, "dislike_command");
    __publicField(this, "unlike_command");
    __publicField(this, "undislike_command");
    __publicField(this, "reply_command");
    __publicField(this, "prepare_account_command");
    __publicField(this, "comment_id");
    __publicField(this, "is_pinned");
    __publicField(this, "keys");
    __publicField(this, "content");
    __publicField(this, "published_time");
    __publicField(this, "author_is_channel_owner");
    __publicField(this, "creator_thumbnail_url");
    __publicField(this, "like_button_a11y");
    __publicField(this, "like_count");
    __publicField(this, "like_count_liked");
    __publicField(this, "like_count_a11y");
    __publicField(this, "like_active_tooltip");
    __publicField(this, "like_inactive_tooltip");
    __publicField(this, "dislike_active_tooltip");
    __publicField(this, "dislike_inactive_tooltip");
    __publicField(this, "heart_active_tooltip");
    __publicField(this, "reply_count");
    __publicField(this, "reply_count_a11y");
    __publicField(this, "is_member");
    __publicField(this, "member_badge");
    __publicField(this, "author");
    __publicField(this, "is_liked");
    __publicField(this, "is_disliked");
    __publicField(this, "is_hearted");
    __publicField(this, "voice_reply_container");
    this.comment_id = data.commentId;
    this.is_pinned = !!data.pinnedText;
    this.keys = {
      comment: data.commentKey,
      comment_surface: data.commentSurfaceKey,
      toolbar_state: data.toolbarStateKey,
      toolbar_surface: data.toolbarSurfaceKey,
      shared: data.sharedKey
    };
  }
  applyMutations(comment, toolbar_state, toolbar_surface, comment_surface) {
    if (comment) {
      this.content = Text2.fromAttributed(comment.properties.content);
      this.published_time = comment.properties.publishedTime;
      this.author_is_channel_owner = !!comment.author.isCreator;
      this.creator_thumbnail_url = comment.toolbar.creatorThumbnailUrl;
      this.like_count = comment.toolbar.likeCountNotliked ? comment.toolbar.likeCountNotliked : "0";
      this.like_count_liked = comment.toolbar.likeCountLiked ? comment.toolbar.likeCountLiked : "0";
      this.like_count_a11y = comment.toolbar.likeCountA11y;
      this.like_active_tooltip = comment.toolbar.likeActiveTooltip;
      this.like_inactive_tooltip = comment.toolbar.likeInactiveTooltip;
      this.dislike_active_tooltip = comment.toolbar.dislikeActiveTooltip;
      this.dislike_inactive_tooltip = comment.toolbar.dislikeInactiveTooltip;
      this.like_button_a11y = comment.toolbar.likeButtonA11y;
      this.heart_active_tooltip = comment.toolbar.heartActiveTooltip;
      this.reply_count_a11y = comment.toolbar.replyCountA11y;
      this.reply_count = comment.toolbar.replyCount ? comment.toolbar.replyCount : "0";
      this.is_member = !!comment.author.sponsorBadgeUrl;
      if (Reflect.has(comment.author, "sponsorBadgeUrl")) {
        this.member_badge = {
          url: comment.author.sponsorBadgeUrl,
          a11y: comment.author.A11y
        };
      }
      this.author = new Author({
        simpleText: comment.author.displayName,
        navigationEndpoint: comment.avatar.endpoint
      }, comment.author, comment.avatar.image, comment.author.channelId);
    }
    if (toolbar_state) {
      this.is_hearted = toolbar_state.heartState === "TOOLBAR_HEART_STATE_HEARTED";
      this.is_liked = toolbar_state.likeState === "TOOLBAR_LIKE_STATE_LIKED";
      this.is_disliked = toolbar_state.likeState === "TOOLBAR_LIKE_STATE_DISLIKED";
    }
    if (toolbar_surface) {
      if ("prepareAccountCommand" in toolbar_surface) {
        this.prepare_account_command = new NavigationEndpoint(toolbar_surface.prepareAccountCommand);
      } else {
        this.like_command = new NavigationEndpoint(toolbar_surface.likeCommand);
        this.dislike_command = new NavigationEndpoint(toolbar_surface.dislikeCommand);
        this.unlike_command = new NavigationEndpoint(toolbar_surface.unlikeCommand);
        this.undislike_command = new NavigationEndpoint(toolbar_surface.undislikeCommand);
        this.reply_command = new NavigationEndpoint(toolbar_surface.replyCommand);
      }
    }
    if (comment_surface) {
      if ("voiceReplyContainerViewModel" in comment_surface) {
        this.voice_reply_container = parser_exports.parseItem(comment_surface.voiceReplyContainerViewModel, VoiceReplyContainerView);
      }
    }
  }
  /**
   * Likes the comment.
   * @returns A promise that resolves to the API response.
   * @throws If the Actions instance is not set for this comment or if the like command is not found.
   */
  async like() {
    if (!__privateGet(this, _actions))
      throw new InnertubeError("Actions instance not set for this comment.");
    if (!this.like_command)
      throw new InnertubeError("Like command not found.");
    if (this.is_liked)
      throw new InnertubeError("This comment is already liked.", { comment_id: this.comment_id });
    return this.like_command.call(__privateGet(this, _actions));
  }
  /**
   * Dislikes the comment.
   * @returns A promise that resolves to the API response.
   * @throws If the Actions instance is not set for this comment or if the dislike command is not found.
   */
  async dislike() {
    if (!__privateGet(this, _actions))
      throw new InnertubeError("Actions instance not set for this comment.");
    if (!this.dislike_command)
      throw new InnertubeError("Dislike command not found.");
    if (this.is_disliked)
      throw new InnertubeError("This comment is already disliked.", { comment_id: this.comment_id });
    return this.dislike_command.call(__privateGet(this, _actions));
  }
  /**
   * Unlikes the comment.
   * @returns A promise that resolves to the API response.
   * @throws If the Actions instance is not set for this comment or if the unlike command is not found.
   */
  async unlike() {
    if (!__privateGet(this, _actions))
      throw new InnertubeError("Actions instance not set for this comment.");
    if (!this.unlike_command)
      throw new InnertubeError("Unlike command not found.");
    if (!this.is_liked)
      throw new InnertubeError("This comment is not liked.", { comment_id: this.comment_id });
    return this.unlike_command.call(__privateGet(this, _actions));
  }
  /**
   * Undislikes the comment.
   * @returns A promise that resolves to the API response.
   * @throws If the Actions instance is not set for this comment or if the undislike command is not found.
   */
  async undislike() {
    if (!__privateGet(this, _actions))
      throw new InnertubeError("Actions instance not set for this comment.");
    if (!this.undislike_command)
      throw new InnertubeError("Undislike command not found.");
    if (!this.is_disliked)
      throw new InnertubeError("This comment is not disliked.", { comment_id: this.comment_id });
    return this.undislike_command.call(__privateGet(this, _actions));
  }
  /**
   * Replies to the comment.
   * @param comment_text - The text of the reply.
   * @returns A promise that resolves to the API response.
   * @throws If the Actions instance is not set for this comment or if the reply command is not found.
   */
  async reply(comment_text) {
    if (!__privateGet(this, _actions))
      throw new InnertubeError("Actions instance not set for this comment.");
    if (!this.reply_command)
      throw new InnertubeError("Reply command not found.");
    const dialog = this.reply_command.dialog?.as(CommentReplyDialog);
    if (!dialog)
      throw new InnertubeError("Reply dialog not found.");
    const reply_button = dialog.reply_button;
    if (!reply_button)
      throw new InnertubeError("Reply button not found in the dialog.");
    if (!reply_button.endpoint)
      throw new InnertubeError("Reply button endpoint not found.");
    return reply_button.endpoint.call(__privateGet(this, _actions), { commentText: comment_text });
  }
  /**
   * Translates the comment to the specified target language.
   * @param target_language - The target language to translate the comment to, e.g. 'en', 'ja'.
   * @returns Resolves to an ApiResponse object with the translated content, if available.
   * @throws if the Actions instance is not set for this comment or if the comment content is not found.
   */
  async translate(target_language) {
    if (!__privateGet(this, _actions))
      throw new InnertubeError("Actions instance not set for this comment.");
    if (!this.content)
      throw new InnertubeError("Comment content not found.", { comment_id: this.comment_id });
    const text = this.content.toString().replace(/[^\p{L}\p{N}\p{P}\p{Z}]/gu, "");
    const payload = { text, target_language };
    const action = encodeCommentActionParams(22, payload);
    const response = await __privateGet(this, _actions).execute("comment/perform_comment_action", { action });
    const mutations = response.data.frameworkUpdates?.entityBatchUpdate?.mutations;
    const content = mutations?.[0]?.payload?.commentEntityPayload?.translatedContent?.content;
    return { ...response, content };
  }
  setActions(actions) {
    __privateSet(this, _actions, actions);
  }
};
_actions = new WeakMap();
__name(_CommentView, "CommentView");
__publicField(_CommentView, "type", "CommentView");
var CommentView = _CommentView;

// dist/src/parser/classes/comments/CommentThread.js
var _actions2, _continuation, _CommentThread_instances, getPatchedReplies_fn;
var _CommentThread = class _CommentThread extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _CommentThread_instances);
    __publicField(this, "comment");
    __publicField(this, "replies");
    __publicField(this, "comment_replies_data");
    __publicField(this, "is_moderated_elq_comment");
    __publicField(this, "has_replies");
    __privateAdd(this, _actions2);
    __privateAdd(this, _continuation);
    this.comment = parser_exports.parseItem(data.commentViewModel, CommentView);
    this.comment_replies_data = parser_exports.parseItem(data.replies, CommentReplies);
    this.is_moderated_elq_comment = data.isModeratedElqComment;
    this.has_replies = !!this.comment_replies_data;
  }
  get has_continuation() {
    if (!this.replies)
      throw new InnertubeError("Cannot determine if there is a continuation because this thread's replies have not been loaded.");
    return !!__privateGet(this, _continuation);
  }
  /**
   * Retrieves replies to this comment thread.
   */
  async getReplies() {
    if (!__privateGet(this, _actions2))
      throw new InnertubeError("Actions instance not set for this thread.");
    if (!this.comment_replies_data)
      throw new InnertubeError("This comment has no replies.", this);
    const continuation = this.comment_replies_data.contents?.firstOfType(ContinuationItem);
    if (!continuation)
      throw new InnertubeError("Replies continuation not found.");
    const response = await continuation.endpoint.call(__privateGet(this, _actions2), { parse: true });
    if (!response.on_response_received_endpoints_memo)
      throw new InnertubeError("Unexpected response.", response);
    this.replies = __privateMethod(this, _CommentThread_instances, getPatchedReplies_fn).call(this, response.on_response_received_endpoints_memo);
    __privateSet(this, _continuation, response.on_response_received_endpoints_memo.getType(ContinuationItem)[0]);
    return this;
  }
  /**
   * Retrieves next batch of replies.
   */
  async getContinuation() {
    if (!this.replies)
      throw new InnertubeError("Cannot retrieve continuation because this thread's replies have not been loaded.");
    if (!__privateGet(this, _continuation))
      throw new InnertubeError("Continuation not found.");
    if (!__privateGet(this, _actions2))
      throw new InnertubeError("Actions instance not set for this thread.");
    const load_more_button = __privateGet(this, _continuation).button?.as(Button);
    if (!load_more_button)
      throw new InnertubeError('"Load more" button not found.');
    const response = await load_more_button.endpoint.call(__privateGet(this, _actions2), { parse: true });
    if (!response.on_response_received_endpoints_memo)
      throw new InnertubeError("Unexpected response.", response);
    this.replies = __privateMethod(this, _CommentThread_instances, getPatchedReplies_fn).call(this, response.on_response_received_endpoints_memo);
    __privateSet(this, _continuation, response.on_response_received_endpoints_memo.getType(ContinuationItem)[0]);
    return this;
  }
  setActions(actions) {
    __privateSet(this, _actions2, actions);
  }
};
_actions2 = new WeakMap();
_continuation = new WeakMap();
_CommentThread_instances = new WeakSet();
getPatchedReplies_fn = /* @__PURE__ */ __name(function(data) {
  return observe(data.getType(CommentView).map((comment) => {
    comment.setActions(__privateGet(this, _actions2));
    return comment;
  }));
}, "#getPatchedReplies");
__name(_CommentThread, "CommentThread");
__publicField(_CommentThread, "type", "CommentThread");
var CommentThread = _CommentThread;

// dist/src/parser/classes/comments/PdgCommentChip.js
var _PdgCommentChip = class _PdgCommentChip extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "color_pallette");
    __publicField(this, "icon_type");
    this.text = new Text2(data.chipText);
    this.color_pallette = {
      background_color: data.chipColorPalette?.backgroundColor,
      foreground_title_color: data.chipColorPalette?.foregroundTitleColor
    };
    if (Reflect.has(data, "chipIcon") && Reflect.has(data.chipIcon, "iconType")) {
      this.icon_type = data.chipIcon.iconType;
    }
  }
};
__name(_PdgCommentChip, "PdgCommentChip");
__publicField(_PdgCommentChip, "type", "PdgCommentChip");
var PdgCommentChip = _PdgCommentChip;

// dist/src/parser/classes/comments/SponsorCommentBadge.js
var _SponsorCommentBadge = class _SponsorCommentBadge extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "custom_badge");
    __publicField(this, "tooltip");
    this.custom_badge = Thumbnail.fromResponse(data.customBadge);
    this.tooltip = data.tooltip;
  }
};
__name(_SponsorCommentBadge, "SponsorCommentBadge");
__publicField(_SponsorCommentBadge, "type", "SponsorCommentBadge");
var SponsorCommentBadge = _SponsorCommentBadge;

// dist/src/parser/classes/CompactChannel.js
var _CompactChannel = class _CompactChannel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "channel_id");
    __publicField(this, "thumbnail");
    __publicField(this, "display_name");
    __publicField(this, "video_count");
    __publicField(this, "subscriber_count");
    __publicField(this, "endpoint");
    __publicField(this, "tv_banner");
    __publicField(this, "menu");
    this.title = new Text2(data.title);
    this.channel_id = data.channelId;
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.display_name = new Text2(data.displayName);
    this.video_count = new Text2(data.videoCountText);
    this.subscriber_count = new Text2(data.subscriberCountText);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.tv_banner = Thumbnail.fromResponse(data.tvBanner);
    this.menu = parser_exports.parseItem(data.menu, Menu);
  }
};
__name(_CompactChannel, "CompactChannel");
__publicField(_CompactChannel, "type", "CompactChannel");
var CompactChannel = _CompactChannel;

// dist/src/parser/classes/PlaylistCustomThumbnail.js
var _PlaylistCustomThumbnail = class _PlaylistCustomThumbnail extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
  }
};
__name(_PlaylistCustomThumbnail, "PlaylistCustomThumbnail");
__publicField(_PlaylistCustomThumbnail, "type", "PlaylistCustomThumbnail");
var PlaylistCustomThumbnail = _PlaylistCustomThumbnail;

// dist/src/parser/classes/PlaylistVideoThumbnail.js
var _PlaylistVideoThumbnail = class _PlaylistVideoThumbnail extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
  }
};
__name(_PlaylistVideoThumbnail, "PlaylistVideoThumbnail");
__publicField(_PlaylistVideoThumbnail, "type", "PlaylistVideoThumbnail");
var PlaylistVideoThumbnail = _PlaylistVideoThumbnail;

// dist/src/parser/classes/Playlist.js
var _Playlist = class _Playlist extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "author");
    __publicField(this, "thumbnails");
    __publicField(this, "thumbnail_renderer");
    __publicField(this, "video_count");
    __publicField(this, "video_count_short");
    __publicField(this, "first_videos");
    __publicField(this, "share_url");
    __publicField(this, "menu");
    __publicField(this, "badges");
    __publicField(this, "endpoint");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "view_playlist");
    this.id = data.playlistId;
    this.title = new Text2(data.title);
    this.author = data.shortBylineText?.simpleText ? new Text2(data.shortBylineText) : new Author(data.longBylineText, data.ownerBadges, null);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail || { thumbnails: data.thumbnails.map((th) => th.thumbnails).flat(1) });
    this.video_count = new Text2(data.thumbnailText);
    this.video_count_short = new Text2(data.videoCountShortText);
    this.first_videos = parser_exports.parseArray(data.videos);
    this.share_url = data.shareUrl || null;
    this.menu = parser_exports.parseItem(data.menu);
    this.badges = parser_exports.parseArray(data.ownerBadges);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
    if (Reflect.has(data, "thumbnailRenderer")) {
      this.thumbnail_renderer = parser_exports.parseItem(data.thumbnailRenderer, [PlaylistVideoThumbnail, PlaylistCustomThumbnail]) || void 0;
    }
    if (Reflect.has(data, "viewPlaylistText")) {
      this.view_playlist = new Text2(data.viewPlaylistText);
    }
  }
};
__name(_Playlist, "Playlist");
__publicField(_Playlist, "type", "Playlist");
var Playlist = _Playlist;

// dist/src/parser/classes/CompactMix.js
var _CompactMix = class _CompactMix extends Playlist {
  constructor(data) {
    super(data);
  }
};
__name(_CompactMix, "CompactMix");
__publicField(_CompactMix, "type", "CompactMix");
var CompactMix = _CompactMix;

// dist/src/parser/classes/CompactMovie.js
var _CompactMovie = class _CompactMovie extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "top_metadata_items");
    __publicField(this, "thumbnails");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "author");
    __publicField(this, "duration");
    __publicField(this, "endpoint");
    __publicField(this, "badges");
    __publicField(this, "use_vertical_poster");
    __publicField(this, "menu");
    const overlay_time_status = data.thumbnailOverlays.find((overlay) => overlay.thumbnailOverlayTimeStatusRenderer)?.thumbnailOverlayTimeStatusRenderer.text || "N/A";
    this.id = data.videoId;
    this.title = new Text2(data.title);
    this.top_metadata_items = new Text2(data.topMetadataItems);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
    this.author = new Author(data.shortBylineText);
    const durationText = data.lengthText ? new Text2(data.lengthText).toString() : new Text2(overlay_time_status).toString();
    this.duration = {
      text: durationText,
      seconds: timeToSeconds(durationText)
    };
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.badges = parser_exports.parseArray(data.badges);
    this.use_vertical_poster = data.useVerticalPoster;
    this.menu = parser_exports.parseItem(data.menu, Menu);
  }
};
__name(_CompactMovie, "CompactMovie");
__publicField(_CompactMovie, "type", "CompactMovie");
var CompactMovie = _CompactMovie;

// dist/src/parser/classes/CompactPlaylist.js
var _CompactPlaylist = class _CompactPlaylist extends Playlist {
  constructor(data) {
    super(data);
  }
};
__name(_CompactPlaylist, "CompactPlaylist");
__publicField(_CompactPlaylist, "type", "CompactPlaylist");
var CompactPlaylist = _CompactPlaylist;
var CompactPlaylist_default = CompactPlaylist;

// dist/src/parser/classes/CompactStation.js
var _CompactStation = class _CompactStation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "description");
    __publicField(this, "video_count");
    __publicField(this, "endpoint");
    __publicField(this, "thumbnail");
    this.title = new Text2(data.title);
    this.description = new Text2(data.description);
    this.video_count = new Text2(data.videoCountText);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
  }
};
__name(_CompactStation, "CompactStation");
__publicField(_CompactStation, "type", "CompactStation");
var CompactStation = _CompactStation;

// dist/src/parser/classes/CompositeVideoPrimaryInfo.js
var _CompositeVideoPrimaryInfo = class _CompositeVideoPrimaryInfo extends YTNode {
  constructor(_data23) {
    super();
  }
};
__name(_CompositeVideoPrimaryInfo, "CompositeVideoPrimaryInfo");
__publicField(_CompositeVideoPrimaryInfo, "type", "CompositeVideoPrimaryInfo");
var CompositeVideoPrimaryInfo = _CompositeVideoPrimaryInfo;

// dist/src/parser/classes/ConfirmDialog.js
var _ConfirmDialog = class _ConfirmDialog extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "confirm_button");
    __publicField(this, "cancel_button");
    __publicField(this, "dialog_messages");
    this.title = new Text2(data.title);
    this.confirm_button = parser_exports.parseItem(data.confirmButton, Button);
    this.cancel_button = parser_exports.parseItem(data.cancelButton, Button);
    this.dialog_messages = data.dialogMessages.map((txt) => new Text2(txt));
  }
};
__name(_ConfirmDialog, "ConfirmDialog");
__publicField(_ConfirmDialog, "type", "ConfirmDialog");
var ConfirmDialog = _ConfirmDialog;

// dist/src/parser/classes/ContentMetadataView.js
var _ContentMetadataView = class _ContentMetadataView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "metadata_rows");
    __publicField(this, "delimiter");
    this.metadata_rows = data.metadataRows?.map((row) => ({
      metadata_parts: row.metadataParts?.map((part) => ({
        text: part.text ? Text2.fromAttributed(part.text) : null,
        avatar_stack: parser_exports.parseItem(part.avatarStack, AvatarStackView),
        enable_truncation: data.enableTruncation
      })),
      badges: parser_exports.parseArray(row.badges, BadgeView)
    })) || [];
    this.delimiter = data.delimiter;
  }
};
__name(_ContentMetadataView, "ContentMetadataView");
__publicField(_ContentMetadataView, "type", "ContentMetadataView");
var ContentMetadataView = _ContentMetadataView;

// dist/src/parser/classes/Message.js
var _Message = class _Message extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    this.text = new Text2(data.text);
  }
};
__name(_Message, "Message");
__publicField(_Message, "type", "Message");
var Message = _Message;

// dist/src/parser/classes/ConversationBar.js
var _ConversationBar = class _ConversationBar extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "availability_message");
    this.availability_message = parser_exports.parseItem(data.availabilityMessage, Message);
  }
};
__name(_ConversationBar, "ConversationBar");
__publicField(_ConversationBar, "type", "ConversationBar");
var ConversationBar = _ConversationBar;

// dist/src/parser/classes/CopyLink.js
var _CopyLink = class _CopyLink extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "copy_button");
    __publicField(this, "short_url");
    __publicField(this, "style");
    this.copy_button = parser_exports.parseItem(data.copyButton, Button);
    this.short_url = data.shortUrl;
    this.style = data.style;
  }
};
__name(_CopyLink, "CopyLink");
__publicField(_CopyLink, "type", "CopyLink");
var CopyLink = _CopyLink;

// dist/src/parser/classes/DropdownView.js
var _DropdownView = class _DropdownView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "label");
    __publicField(this, "placeholder_text");
    __publicField(this, "disabled");
    __publicField(this, "options");
    __publicField(this, "dropdown_type");
    __publicField(this, "id");
    this.label = new Text2(data.label);
    this.placeholder_text = new Text2(data.placeholderText);
    this.disabled = !!data.disabled;
    this.dropdown_type = data.type;
    this.id = data.id;
    if (Reflect.has(data, "options")) {
      this.options = data.options.map((option) => ({
        title: new Text2(option.title),
        subtitle: new Text2(option.subtitle),
        leading_image: Thumbnail.fromResponse(option.leadingImage),
        value: { privacy_status_value: option.value?.privacyStatusValue },
        on_tap: new NavigationEndpoint(option.onTap),
        is_selected: !!option.isSelected
      }));
    }
  }
};
__name(_DropdownView, "DropdownView");
__publicField(_DropdownView, "type", "DropdownView");
var DropdownView = _DropdownView;

// dist/src/parser/classes/TextFieldView.js
var _TextFieldView = class _TextFieldView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "display_properties");
    __publicField(this, "content_properties");
    __publicField(this, "initial_state");
    __publicField(this, "form_field_metadata");
    if (Reflect.has(data, "displayProperties")) {
      this.display_properties = {
        isMultiline: !!data.displayProperties.isMultiline,
        disableNewLines: !!data.displayProperties.disableNewLines
      };
    }
    if (Reflect.has(data, "contentProperties")) {
      this.content_properties = {
        labelText: data.contentProperties.labelText,
        placeholderText: data.contentProperties.placeholderText,
        maxCharacterCount: data.contentProperties.maxCharacterCount
      };
    }
    if (Reflect.has(data, "initialState")) {
      this.initial_state = {
        isFocused: !!data.initialState.isFocused
      };
    }
    if (Reflect.has(data, "formFieldMetadata")) {
      this.form_field_metadata = {
        formId: data.formFieldMetadata.formId,
        fieldId: data.formFieldMetadata.fieldId
      };
    }
  }
};
__name(_TextFieldView, "TextFieldView");
__publicField(_TextFieldView, "type", "TextFieldView");
var TextFieldView = _TextFieldView;

// dist/src/parser/classes/CreatePlaylistDialogFormView.js
var _CreatePlaylistDialogFormView = class _CreatePlaylistDialogFormView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "playlist_title");
    __publicField(this, "playlist_visibility");
    __publicField(this, "disable_playlist_collaborate");
    __publicField(this, "create_playlist_params_collaboration_enabled");
    __publicField(this, "create_playlist_params_collaboration_disabled");
    __publicField(this, "video_ids");
    this.playlist_title = parser_exports.parseItem(data.playlistTitle, TextFieldView);
    this.playlist_visibility = parser_exports.parseItem(data.playlistVisibility, DropdownView);
    this.disable_playlist_collaborate = !!data.disablePlaylistCollaborate;
    this.create_playlist_params_collaboration_enabled = data.createPlaylistParamsCollaborationEnabled;
    this.create_playlist_params_collaboration_disabled = data.createPlaylistParamsCollaborationDisabled;
    this.video_ids = data.videoIds;
  }
};
__name(_CreatePlaylistDialogFormView, "CreatePlaylistDialogFormView");
__publicField(_CreatePlaylistDialogFormView, "type", "CreatePlaylistDialogFormView");
var CreatePlaylistDialogFormView = _CreatePlaylistDialogFormView;

// dist/src/parser/classes/DecoratedAvatarView.js
var _DecoratedAvatarView = class _DecoratedAvatarView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "avatar");
    __publicField(this, "a11y_label");
    __publicField(this, "renderer_context");
    this.avatar = parser_exports.parseItem(data.avatar, AvatarView);
    this.a11y_label = data.a11yLabel;
    this.renderer_context = new RendererContext(data.rendererContext);
  }
};
__name(_DecoratedAvatarView, "DecoratedAvatarView");
__publicField(_DecoratedAvatarView, "type", "DecoratedAvatarView");
var DecoratedAvatarView = _DecoratedAvatarView;

// dist/src/parser/classes/HeatMarker.js
var _HeatMarker = class _HeatMarker extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "time_range_start_millis");
    __publicField(this, "marker_duration_millis");
    __publicField(this, "heat_marker_intensity_score_normalized");
    this.time_range_start_millis = Number.parseInt(data.startMillis, 10);
    this.marker_duration_millis = Number.parseInt(data.durationMillis, 10);
    this.heat_marker_intensity_score_normalized = data.intensityScoreNormalized;
  }
};
__name(_HeatMarker, "HeatMarker");
__publicField(_HeatMarker, "type", "HeatMarker");
var HeatMarker = _HeatMarker;

// dist/src/parser/classes/TimedMarkerDecoration.js
var _TimedMarkerDecoration = class _TimedMarkerDecoration extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "visible_time_range_start_millis");
    __publicField(this, "visible_time_range_end_millis");
    __publicField(this, "decoration_time_millis");
    __publicField(this, "label");
    __publicField(this, "icon");
    this.visible_time_range_start_millis = data.visibleTimeRangeStartMillis;
    this.visible_time_range_end_millis = data.visibleTimeRangeEndMillis;
    this.decoration_time_millis = data.decorationTimeMillis;
    this.label = new Text2(data.label);
    this.icon = data.icon;
  }
};
__name(_TimedMarkerDecoration, "TimedMarkerDecoration");
__publicField(_TimedMarkerDecoration, "type", "TimedMarkerDecoration");
var TimedMarkerDecoration = _TimedMarkerDecoration;

// dist/src/parser/classes/Heatmap.js
var _Heatmap = class _Heatmap extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "max_height_dp");
    __publicField(this, "min_height_dp");
    __publicField(this, "show_hide_animation_duration_millis");
    __publicField(this, "heat_markers");
    __publicField(this, "heat_markers_decorations");
    this.max_height_dp = data.maxHeightDp;
    this.min_height_dp = data.minHeightDp;
    this.show_hide_animation_duration_millis = data.showHideAnimationDurationMillis;
    this.heat_markers = parser_exports.parseArray(data.heatMarkers, HeatMarker);
    this.heat_markers_decorations = parser_exports.parseArray(data.heatMarkersDecorations, TimedMarkerDecoration);
  }
};
__name(_Heatmap, "Heatmap");
__publicField(_Heatmap, "type", "Heatmap");
var Heatmap = _Heatmap;

// dist/src/parser/classes/MultiMarkersPlayerBar.js
var _Marker = class _Marker extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "marker_key");
    __publicField(this, "value");
    this.marker_key = data.key;
    this.value = {};
    if (Reflect.has(data, "value")) {
      if (Reflect.has(data.value, "heatmap")) {
        this.value.heatmap = parser_exports.parseItem(data.value.heatmap, Heatmap);
      }
      if (Reflect.has(data.value, "chapters")) {
        this.value.chapters = parser_exports.parseArray(data.value.chapters, Chapter);
      }
    }
  }
};
__name(_Marker, "Marker");
__publicField(_Marker, "type", "Marker");
var Marker = _Marker;
var _MultiMarkersPlayerBar = class _MultiMarkersPlayerBar extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "markers_map");
    this.markers_map = observe(data.markersMap?.map((marker) => new Marker(marker)) || []);
  }
};
__name(_MultiMarkersPlayerBar, "MultiMarkersPlayerBar");
__publicField(_MultiMarkersPlayerBar, "type", "MultiMarkersPlayerBar");
var MultiMarkersPlayerBar = _MultiMarkersPlayerBar;

// dist/src/parser/classes/DecoratedPlayerBar.js
var _DecoratedPlayerBar = class _DecoratedPlayerBar extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "player_bar");
    __publicField(this, "player_bar_action_button");
    this.player_bar = parser_exports.parseItem(data.playerBar, MultiMarkersPlayerBar);
    this.player_bar_action_button = parser_exports.parseItem(data.playerBarActionButton, Button);
  }
};
__name(_DecoratedPlayerBar, "DecoratedPlayerBar");
__publicField(_DecoratedPlayerBar, "type", "DecoratedPlayerBar");
var DecoratedPlayerBar = _DecoratedPlayerBar;

// dist/src/parser/classes/DefaultPromoPanel.js
var _DefaultPromoPanel = class _DefaultPromoPanel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "description");
    __publicField(this, "endpoint");
    __publicField(this, "large_form_factor_background_thumbnail");
    __publicField(this, "small_form_factor_background_thumbnail");
    __publicField(this, "scrim_color_values");
    __publicField(this, "min_panel_display_duration_ms");
    __publicField(this, "min_video_play_duration_ms");
    __publicField(this, "scrim_duration");
    __publicField(this, "metadata_order");
    __publicField(this, "panel_layout");
    this.title = new Text2(data.title);
    this.description = new Text2(data.description);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.large_form_factor_background_thumbnail = parser_exports.parseItem(data.largeFormFactorBackgroundThumbnail);
    this.small_form_factor_background_thumbnail = parser_exports.parseItem(data.smallFormFactorBackgroundThumbnail);
    this.scrim_color_values = data.scrimColorValues;
    this.min_panel_display_duration_ms = data.minPanelDisplayDurationMs;
    this.min_video_play_duration_ms = data.minVideoPlayDurationMs;
    this.scrim_duration = data.scrimDuration;
    this.metadata_order = data.metadataOrder;
    this.panel_layout = data.panelLayout;
  }
};
__name(_DefaultPromoPanel, "DefaultPromoPanel");
__publicField(_DefaultPromoPanel, "type", "DefaultPromoPanel");
var DefaultPromoPanel = _DefaultPromoPanel;

// dist/src/parser/classes/DescriptionPreviewView.js
var _DescriptionPreviewView = class _DescriptionPreviewView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "description");
    __publicField(this, "max_lines");
    __publicField(this, "truncation_text");
    __publicField(this, "always_show_truncation_text");
    __publicField(this, "more_endpoint");
    __publicField(this, "renderer_context");
    if ("description" in data)
      this.description = Text2.fromAttributed(data.description);
    if ("maxLines" in data)
      this.max_lines = parseInt(data.maxLines);
    if ("truncationText" in data)
      this.truncation_text = Text2.fromAttributed(data.truncationText);
    this.always_show_truncation_text = !!data.alwaysShowTruncationText;
    if (data.rendererContext.commandContext?.onTap?.innertubeCommand?.showEngagementPanelEndpoint) {
      const endpoint = data.rendererContext.commandContext?.onTap?.innertubeCommand?.showEngagementPanelEndpoint;
      this.more_endpoint = {
        show_engagement_panel_endpoint: {
          engagement_panel: parser_exports.parseItem(endpoint.engagementPanel, EngagementPanelSectionList),
          engagement_panel_popup_type: endpoint.engagementPanelPresentationConfigs.engagementPanelPopupPresentationConfig.popupType,
          identifier: {
            surface: endpoint.identifier.surface,
            tag: endpoint.identifier.tag
          }
        }
      };
    }
    this.renderer_context = new RendererContext(data.rendererContext);
  }
};
__name(_DescriptionPreviewView, "DescriptionPreviewView");
__publicField(_DescriptionPreviewView, "type", "DescriptionPreviewView");
var DescriptionPreviewView = _DescriptionPreviewView;

// dist/src/parser/classes/DialogHeaderView.js
var _DialogHeaderView = class _DialogHeaderView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "headline");
    this.headline = Text2.fromAttributed(data.headline);
  }
};
__name(_DialogHeaderView, "DialogHeaderView");
__publicField(_DialogHeaderView, "type", "DialogHeaderView");
var DialogHeaderView = _DialogHeaderView;

// dist/src/parser/classes/PanelFooterView.js
var _PanelFooterView = class _PanelFooterView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "primary_button");
    __publicField(this, "secondary_button");
    __publicField(this, "should_hide_divider");
    this.primary_button = parser_exports.parseItem(data.primaryButton, ButtonView);
    this.secondary_button = parser_exports.parseItem(data.secondaryButton, ButtonView);
    this.should_hide_divider = !!data.shouldHideDivider;
  }
};
__name(_PanelFooterView, "PanelFooterView");
__publicField(_PanelFooterView, "type", "PanelFooterView");
var PanelFooterView = _PanelFooterView;

// dist/src/parser/classes/FormFooterView.js
var _FormFooterView = class _FormFooterView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "panel_footer");
    __publicField(this, "form_id");
    __publicField(this, "container_type");
    this.panel_footer = parser_exports.parseItem(data.panelFooter, PanelFooterView);
    this.form_id = data.formId;
    this.container_type = data.containerType;
  }
};
__name(_FormFooterView, "FormFooterView");
__publicField(_FormFooterView, "type", "FormFooterView");
var FormFooterView = _FormFooterView;

// dist/src/parser/classes/ListView.js
var _ListView = class _ListView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    this.items = parser_exports.parseArray(data.listItems, ListItemView);
  }
};
__name(_ListView, "ListView");
__publicField(_ListView, "type", "ListView");
var ListView = _ListView;

// dist/src/parser/classes/DialogView.js
var _DialogView = class _DialogView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "footer");
    __publicField(this, "custom_content");
    this.header = parser_exports.parseItem(data.header, DialogHeaderView);
    this.footer = parser_exports.parseItem(data.footer, [FormFooterView, PanelFooterView]);
    this.custom_content = parser_exports.parseItem(data.customContent, [CreatePlaylistDialogFormView, ListView]);
  }
};
__name(_DialogView, "DialogView");
__publicField(_DialogView, "type", "DialogView");
var DialogView = _DialogView;

// dist/src/parser/classes/DidYouMean.js
var _DidYouMean = class _DidYouMean extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "corrected_query");
    __publicField(this, "endpoint");
    this.text = new Text2(data.didYouMean).toString();
    this.corrected_query = new Text2(data.correctedQuery);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint || data.correctedQueryEndpoint);
  }
};
__name(_DidYouMean, "DidYouMean");
__publicField(_DidYouMean, "type", "DidYouMean");
var DidYouMean = _DidYouMean;

// dist/src/parser/classes/DismissableDialogContentSection.js
var _DismissableDialogContentSection = class _DismissableDialogContentSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "subtitle");
    this.title = new Text2(data.title);
    this.subtitle = new Text2(data.subtitle);
  }
};
__name(_DismissableDialogContentSection, "DismissableDialogContentSection");
__publicField(_DismissableDialogContentSection, "type", "DismissableDialogContentSection");
var DismissableDialogContentSection = _DismissableDialogContentSection;

// dist/src/parser/classes/DismissableDialog.js
var _DismissableDialog = class _DismissableDialog extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "sections");
    __publicField(this, "metadata");
    __publicField(this, "display_style");
    this.title = data.title;
    this.sections = parser_exports.parseArray(data.sections, DismissableDialogContentSection);
    this.metadata = parser_exports.parseItem(data.metadata);
    this.display_style = data.displayStyle;
  }
};
__name(_DismissableDialog, "DismissableDialog");
__publicField(_DismissableDialog, "type", "DismissableDialog");
var DismissableDialog = _DismissableDialog;

// dist/src/parser/classes/DynamicTextView.js
var _DynamicTextView = class _DynamicTextView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "max_lines");
    this.text = Text2.fromAttributed(data.text);
    this.max_lines = parseInt(data.maxLines);
  }
};
__name(_DynamicTextView, "DynamicTextView");
__publicField(_DynamicTextView, "type", "DynamicTextView");
var DynamicTextView = _DynamicTextView;

// dist/src/parser/classes/misc/ChildElement.js
var _ChildElement = class _ChildElement extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "properties");
    __publicField(this, "child_elements");
    if (Reflect.has(data, "type") && Reflect.has(data.type, "textType")) {
      this.text = data.type.textType.text?.content;
    }
    this.properties = data.properties;
    if (Reflect.has(data, "childElements")) {
      this.child_elements = data.childElements.map((el) => new _ChildElement(el));
    }
  }
};
__name(_ChildElement, "ChildElement");
__publicField(_ChildElement, "type", "ChildElement");
var ChildElement = _ChildElement;

// dist/src/parser/classes/Element.js
var _Element = class _Element extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "model");
    __publicField(this, "child_elements");
    if (Reflect.has(data, "elementRenderer")) {
      return parser_exports.parseItem(data, _Element);
    }
    const type = data.newElement.type.componentType;
    this.model = parser_exports.parseItem(type?.model);
    if (Reflect.has(data, "newElement") && Reflect.has(data.newElement, "childElements")) {
      this.child_elements = observe(data.newElement.childElements?.map((el) => new ChildElement(el)) || []);
    }
  }
};
__name(_Element, "Element");
__publicField(_Element, "type", "Element");
var Element = _Element;

// dist/src/parser/classes/EmergencyOnebox.js
var _EmergencyOnebox = class _EmergencyOnebox extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "first_option");
    __publicField(this, "menu");
    this.title = new Text2(data.title);
    this.first_option = parser_exports.parseItem(data.firstOption);
    this.menu = parser_exports.parseItem(data.menu, Menu);
  }
};
__name(_EmergencyOnebox, "EmergencyOnebox");
__publicField(_EmergencyOnebox, "type", "EmergencyOnebox");
var EmergencyOnebox = _EmergencyOnebox;

// dist/src/parser/classes/EmojiPickerCategory.js
var _EmojiPickerCategory = class _EmojiPickerCategory extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "category_id");
    __publicField(this, "title");
    __publicField(this, "emoji_ids");
    __publicField(this, "image_loading_lazy");
    __publicField(this, "category_type");
    this.category_id = data.categoryId;
    this.title = new Text2(data.title);
    this.emoji_ids = data.emojiIds;
    this.image_loading_lazy = !!data.imageLoadingLazy;
    this.category_type = data.categoryType;
  }
};
__name(_EmojiPickerCategory, "EmojiPickerCategory");
__publicField(_EmojiPickerCategory, "type", "EmojiPickerCategory");
var EmojiPickerCategory = _EmojiPickerCategory;

// dist/src/parser/classes/EmojiPickerCategoryButton.js
var _EmojiPickerCategoryButton = class _EmojiPickerCategoryButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "category_id");
    __publicField(this, "icon_type");
    __publicField(this, "tooltip");
    this.category_id = data.categoryId;
    if (Reflect.has(data, "icon")) {
      this.icon_type = data.icon?.iconType;
    }
    this.tooltip = data.tooltip;
  }
};
__name(_EmojiPickerCategoryButton, "EmojiPickerCategoryButton");
__publicField(_EmojiPickerCategoryButton, "type", "EmojiPickerCategoryButton");
var EmojiPickerCategoryButton = _EmojiPickerCategoryButton;

// dist/src/parser/classes/EmojiPickerUpsellCategory.js
var _EmojiPickerUpsellCategory = class _EmojiPickerUpsellCategory extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "category_id");
    __publicField(this, "title");
    __publicField(this, "upsell");
    __publicField(this, "emoji_tooltip");
    __publicField(this, "endpoint");
    __publicField(this, "emoji_ids");
    this.category_id = data.categoryId;
    this.title = new Text2(data.title);
    this.upsell = new Text2(data.upsell);
    this.emoji_tooltip = data.emojiTooltip;
    this.endpoint = new NavigationEndpoint(data.command);
    this.emoji_ids = data.emojiIds;
  }
};
__name(_EmojiPickerUpsellCategory, "EmojiPickerUpsellCategory");
__publicField(_EmojiPickerUpsellCategory, "type", "EmojiPickerUpsellCategory");
var EmojiPickerUpsellCategory = _EmojiPickerUpsellCategory;

// dist/src/parser/classes/endpoints/AddToPlaylistServiceEndpoint.js
var API_PATH2 = "playlist/get_add_to_playlist";
var _data4;
var _AddToPlaylistServiceEndpoint = class _AddToPlaylistServiceEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data4);
    __privateSet(this, _data4, data);
  }
  getApiPath() {
    return API_PATH2;
  }
  buildRequest() {
    const request = {};
    request.videoIds = __privateGet(this, _data4).videoIds ? __privateGet(this, _data4).videoIds : [__privateGet(this, _data4).videoId];
    if (__privateGet(this, _data4).playlistId)
      request.playlistId = __privateGet(this, _data4).playlistId;
    if (__privateGet(this, _data4).params)
      request.params = __privateGet(this, _data4).params;
    request.excludeWatchLater = !!__privateGet(this, _data4).excludeWatchLater;
    return request;
  }
};
_data4 = new WeakMap();
__name(_AddToPlaylistServiceEndpoint, "AddToPlaylistServiceEndpoint");
__publicField(_AddToPlaylistServiceEndpoint, "type", "AddToPlaylistServiceEndpoint");
var AddToPlaylistServiceEndpoint = _AddToPlaylistServiceEndpoint;

// dist/src/parser/classes/endpoints/AddToPlaylistEndpoint.js
var _AddToPlaylistEndpoint = class _AddToPlaylistEndpoint extends AddToPlaylistServiceEndpoint {
  constructor(data) {
    super(data);
  }
};
__name(_AddToPlaylistEndpoint, "AddToPlaylistEndpoint");
__publicField(_AddToPlaylistEndpoint, "type", "AddToPlaylistEndpoint");
var AddToPlaylistEndpoint = _AddToPlaylistEndpoint;

// dist/src/parser/classes/endpoints/BrowseEndpoint.js
var API_PATH3 = "browse";
var _data5;
var _BrowseEndpoint = class _BrowseEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data5);
    __privateSet(this, _data5, data);
  }
  getApiPath() {
    return API_PATH3;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data5).browseId)
      request.browseId = __privateGet(this, _data5).browseId;
    if (__privateGet(this, _data5).params)
      request.params = __privateGet(this, _data5).params;
    if (__privateGet(this, _data5).query)
      request.query = __privateGet(this, _data5).query;
    if (__privateGet(this, _data5).browseId === "FEsubscriptions") {
      request.subscriptionSettingsState = __privateGet(this, _data5).subscriptionSettingsState || "MY_SUBS_SETTINGS_STATE_LAYOUT_FORMAT_LIST";
    }
    if (__privateGet(this, _data5).browseId === "SPaccount_playback") {
      request.formData = __privateGet(this, _data5).formData || {
        accountSettingsFormData: {
          flagCaptionsDefaultOff: false,
          flagAutoCaptionsDefaultOn: false,
          flagDisableInlinePreview: false,
          flagAudioDescriptionDefaultOn: false
        }
      };
    }
    if (__privateGet(this, _data5).browseId === "FEwhat_to_watch") {
      if (__privateGet(this, _data5).browseRequestSupportedMetadata)
        request.browseRequestSupportedMetadata = __privateGet(this, _data5).browseRequestSupportedMetadata;
      if (__privateGet(this, _data5).inlineSettingStatus)
        request.inlineSettingStatus = __privateGet(this, _data5).inlineSettingStatus;
    }
    return request;
  }
};
_data5 = new WeakMap();
__name(_BrowseEndpoint, "BrowseEndpoint");
__publicField(_BrowseEndpoint, "type", "BrowseEndpoint");
var BrowseEndpoint = _BrowseEndpoint;

// dist/src/parser/classes/endpoints/CreateCommentEndpoint.js
var API_PATH4 = "comment/create_comment";
var _data6;
var _CreateCommentEndpoint = class _CreateCommentEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data6);
    __privateSet(this, _data6, data);
  }
  getApiPath() {
    return API_PATH4;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data6).createCommentParams)
      request.createCommentParams = __privateGet(this, _data6).createCommentParams;
    if (__privateGet(this, _data6).commentText)
      request.commentText = __privateGet(this, _data6).commentText;
    if (__privateGet(this, _data6).attachedVideoId)
      request.videoAttachment = { videoId: __privateGet(this, _data6).attachedVideoId };
    else if (__privateGet(this, _data6).pollOptions)
      request.pollAttachment = { choices: __privateGet(this, _data6).pollOptions };
    else if (__privateGet(this, _data6).imageBlobId)
      request.imageAttachment = { encryptedBlobId: __privateGet(this, _data6).imageBlobId };
    else if (__privateGet(this, _data6).sharedPostId)
      request.sharedPostAttachment = { postId: __privateGet(this, _data6).sharedPostId };
    if (__privateGet(this, _data6).accessRestrictions && typeof __privateGet(this, _data6).accessRestrictions === "number") {
      const restriction = __privateGet(this, _data6).accessRestrictions === 1 ? "RESTRICTION_TYPE_EVERYONE" : "RESTRICTION_TYPE_SPONSORS_ONLY";
      request.accessRestrictions = { restriction };
    }
    if (__privateGet(this, _data6).botguardResponse)
      request.botguardResponse = __privateGet(this, _data6).botguardResponse;
    return request;
  }
};
_data6 = new WeakMap();
__name(_CreateCommentEndpoint, "CreateCommentEndpoint");
__publicField(_CreateCommentEndpoint, "type", "CreateCommentEndpoint");
var CreateCommentEndpoint = _CreateCommentEndpoint;

// dist/src/parser/classes/endpoints/CreatePlaylistServiceEndpoint.js
var API_PATH5 = "playlist/create";
var _data7;
var _CreatePlaylistServiceEndpoint = class _CreatePlaylistServiceEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data7);
    __privateSet(this, _data7, data);
  }
  getApiPath() {
    return API_PATH5;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data7).title)
      request.title = __privateGet(this, _data7).title;
    if (__privateGet(this, _data7).privacyStatus)
      request.privacyStatus = __privateGet(this, _data7).privacyStatus;
    if (__privateGet(this, _data7).description)
      request.description = __privateGet(this, _data7).description;
    if (__privateGet(this, _data7).videoIds)
      request.videoIds = __privateGet(this, _data7).videoIds;
    if (__privateGet(this, _data7).params)
      request.params = __privateGet(this, _data7).params;
    if (__privateGet(this, _data7).sourcePlaylistId)
      request.sourcePlaylistId = __privateGet(this, _data7).sourcePlaylistId;
    return request;
  }
};
_data7 = new WeakMap();
__name(_CreatePlaylistServiceEndpoint, "CreatePlaylistServiceEndpoint");
__publicField(_CreatePlaylistServiceEndpoint, "type", "CreatePlaylistServiceEndpoint");
var CreatePlaylistServiceEndpoint = _CreatePlaylistServiceEndpoint;

// dist/src/parser/classes/endpoints/DeletePlaylistEndpoint.js
var API_PATH6 = "playlist/delete";
var _data8;
var _DeletePlaylistEndpoint = class _DeletePlaylistEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data8);
    __privateSet(this, _data8, data);
  }
  getApiPath() {
    return API_PATH6;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data8).playlistId)
      request.playlistId = __privateGet(this, _data8).sourcePlaylistId;
    return request;
  }
};
_data8 = new WeakMap();
__name(_DeletePlaylistEndpoint, "DeletePlaylistEndpoint");
__publicField(_DeletePlaylistEndpoint, "type", "DeletePlaylistEndpoint");
var DeletePlaylistEndpoint = _DeletePlaylistEndpoint;

// dist/src/parser/classes/endpoints/FeedbackEndpoint.js
var API_PATH7 = "feedback";
var _data9;
var _FeedbackEndpoint = class _FeedbackEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data9);
    __privateSet(this, _data9, data);
  }
  getApiPath() {
    return API_PATH7;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data9).feedbackToken)
      request.feedbackTokens = [__privateGet(this, _data9).feedbackToken];
    if (__privateGet(this, _data9).cpn)
      request.feedbackContext = { cpn: __privateGet(this, _data9).cpn };
    request.isFeedbackTokenUnencrypted = !!__privateGet(this, _data9).isFeedbackTokenUnencrypted;
    request.shouldMerge = !!__privateGet(this, _data9).shouldMerge;
    return request;
  }
};
_data9 = new WeakMap();
__name(_FeedbackEndpoint, "FeedbackEndpoint");
__publicField(_FeedbackEndpoint, "type", "FeedbackEndpoint");
var FeedbackEndpoint = _FeedbackEndpoint;

// dist/src/parser/classes/endpoints/GetAccountsListInnertubeEndpoint.js
var API_PATH8 = "account/accounts_list";
var _data10;
var _GetAccountsListInnertubeEndpoint = class _GetAccountsListInnertubeEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data10);
    __privateSet(this, _data10, data);
  }
  getApiPath() {
    return API_PATH8;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data10).requestType) {
      request.requestType = __privateGet(this, _data10).requestType;
      if (__privateGet(this, _data10).requestType === "ACCOUNTS_LIST_REQUEST_TYPE_CHANNEL_SWITCHER" || __privateGet(this, _data10).requestType === "ACCOUNTS_LIST_REQUEST_TYPE_IDENTITY_PROMPT") {
        if (__privateGet(this, _data10).nextUrl)
          request.nextNavendpoint = {
            urlEndpoint: {
              url: __privateGet(this, _data10).nextUrl
            }
          };
      }
    }
    if (__privateGet(this, _data10).channelSwitcherQuery)
      request.channelSwitcherQuery = __privateGet(this, _data10).channelSwitcherQuery;
    if (__privateGet(this, _data10).triggerChannelCreation)
      request.triggerChannelCreation = __privateGet(this, _data10).triggerChannelCreation;
    if (__privateGet(this, _data10).contentOwnerConfig && __privateGet(this, _data10).contentOwnerConfig.externalContentOwnerId)
      request.contentOwnerConfig = __privateGet(this, _data10).contentOwnerConfig;
    if (__privateGet(this, _data10).obfuscatedSelectedGaiaId)
      request.obfuscatedSelectedGaiaId = __privateGet(this, _data10).obfuscatedSelectedGaiaId;
    if (__privateGet(this, _data10).selectedSerializedDelegationContext)
      request.selectedSerializedDelegationContext = __privateGet(this, _data10).selectedSerializedDelegationContext;
    if (__privateGet(this, _data10).callCircumstance)
      request.callCircumstance = __privateGet(this, _data10).callCircumstance;
    return request;
  }
};
_data10 = new WeakMap();
__name(_GetAccountsListInnertubeEndpoint, "GetAccountsListInnertubeEndpoint");
__publicField(_GetAccountsListInnertubeEndpoint, "type", "GetAccountsListInnertubeEndpoint");
var GetAccountsListInnertubeEndpoint = _GetAccountsListInnertubeEndpoint;

// dist/src/parser/classes/endpoints/HideEngagementPanelEndpoint.js
var _HideEngagementPanelEndpoint = class _HideEngagementPanelEndpoint extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "panel_identifier");
    this.panel_identifier = data.panelIdentifier;
  }
};
__name(_HideEngagementPanelEndpoint, "HideEngagementPanelEndpoint");
__publicField(_HideEngagementPanelEndpoint, "type", "HideEngagementPanelEndpoint");
var HideEngagementPanelEndpoint = _HideEngagementPanelEndpoint;

// dist/src/parser/classes/endpoints/LikeEndpoint.js
var LIKE_API_PATH = "like/like";
var DISLIKE_API_PATH = "like/dislike";
var REMOVE_LIKE_API_PATH = "like/removelike";
var _data11;
var _LikeEndpoint = class _LikeEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data11);
    __privateSet(this, _data11, data);
  }
  getApiPath() {
    return __privateGet(this, _data11).status === "DISLIKE" ? DISLIKE_API_PATH : __privateGet(this, _data11).status === "INDIFFERENT" ? REMOVE_LIKE_API_PATH : LIKE_API_PATH;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data11).target)
      request.target = __privateGet(this, _data11).target;
    const params = this.getParams();
    if (params)
      request.params = params;
    return request;
  }
  getParams() {
    switch (__privateGet(this, _data11).status) {
      case "LIKE":
        return __privateGet(this, _data11).likeParams;
      case "DISLIKE":
        return __privateGet(this, _data11).dislikeParams;
      case "INDIFFERENT":
        return __privateGet(this, _data11).removeLikeParams;
      default:
        return void 0;
    }
  }
};
_data11 = new WeakMap();
__name(_LikeEndpoint, "LikeEndpoint");
__publicField(_LikeEndpoint, "type", "LikeEndpoint");
var LikeEndpoint = _LikeEndpoint;

// dist/src/parser/classes/endpoints/LiveChatItemContextMenuEndpoint.js
var API_PATH9 = "live_chat/get_item_context_menu";
var _data12;
var _LiveChatItemContextMenuEndpoint = class _LiveChatItemContextMenuEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data12);
    __privateSet(this, _data12, data);
  }
  getApiPath() {
    return API_PATH9;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data12).params)
      request.params = __privateGet(this, _data12).params;
    return request;
  }
};
_data12 = new WeakMap();
__name(_LiveChatItemContextMenuEndpoint, "LiveChatItemContextMenuEndpoint");
__publicField(_LiveChatItemContextMenuEndpoint, "type", "LiveChatItemContextMenuEndpoint");
var LiveChatItemContextMenuEndpoint = _LiveChatItemContextMenuEndpoint;

// dist/src/parser/classes/endpoints/ModifyChannelNotificationPreferenceEndpoint.js
var API_PATH10 = "notification/modify_channel_preference";
var _data13;
var _ModifyChannelNotificationPreferenceEndpoint = class _ModifyChannelNotificationPreferenceEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data13);
    __privateSet(this, _data13, data);
  }
  getApiPath() {
    return API_PATH10;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data13).params)
      request.params = __privateGet(this, _data13).params;
    if (__privateGet(this, _data13).secondaryParams)
      request.secondaryParams = __privateGet(this, _data13).secondaryParams;
    return request;
  }
};
_data13 = new WeakMap();
__name(_ModifyChannelNotificationPreferenceEndpoint, "ModifyChannelNotificationPreferenceEndpoint");
__publicField(_ModifyChannelNotificationPreferenceEndpoint, "type", "ModifyChannelNotificationPreferenceEndpoint");
var ModifyChannelNotificationPreferenceEndpoint = _ModifyChannelNotificationPreferenceEndpoint;

// dist/src/parser/classes/endpoints/PerformCommentActionEndpoint.js
var API_PATH11 = "comment/perform_comment_action";
var _data14;
var _PerformCommentActionEndpoint = class _PerformCommentActionEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data14);
    __privateSet(this, _data14, data);
  }
  getApiPath() {
    return API_PATH11;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data14).actions)
      request.actions = __privateGet(this, _data14).actions;
    if (__privateGet(this, _data14).action)
      request.actions = [__privateGet(this, _data14).action];
    return request;
  }
};
_data14 = new WeakMap();
__name(_PerformCommentActionEndpoint, "PerformCommentActionEndpoint");
__publicField(_PerformCommentActionEndpoint, "type", "PerformCommentActionEndpoint");
var PerformCommentActionEndpoint = _PerformCommentActionEndpoint;

// dist/src/parser/classes/endpoints/PlaylistEditEndpoint.js
var API_PATH12 = "browse/edit_playlist";
var _data15;
var _PlaylistEditEndpoint = class _PlaylistEditEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data15);
    __privateSet(this, _data15, data);
  }
  getApiPath() {
    return API_PATH12;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data15).actions)
      request.actions = __privateGet(this, _data15).actions;
    if (__privateGet(this, _data15).playlistId)
      request.playlistId = __privateGet(this, _data15).playlistId;
    if (__privateGet(this, _data15).params)
      request.params = __privateGet(this, _data15).params;
    return request;
  }
};
_data15 = new WeakMap();
__name(_PlaylistEditEndpoint, "PlaylistEditEndpoint");
__publicField(_PlaylistEditEndpoint, "type", "PlaylistEditEndpoint");
var PlaylistEditEndpoint = _PlaylistEditEndpoint;

// dist/src/parser/classes/endpoints/WatchEndpoint.js
var API_PATH13 = "player";
var _data16;
var _WatchEndpoint = class _WatchEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data16);
    __privateSet(this, _data16, data);
  }
  getApiPath() {
    return API_PATH13;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data16).videoId)
      request.videoId = __privateGet(this, _data16).videoId;
    if (__privateGet(this, _data16).playlistId)
      request.playlistId = __privateGet(this, _data16).playlistId;
    if (__privateGet(this, _data16).index !== void 0 || __privateGet(this, _data16).playlistIndex !== void 0)
      request.playlistIndex = __privateGet(this, _data16).index || __privateGet(this, _data16).playlistIndex;
    if (__privateGet(this, _data16).playerParams || __privateGet(this, _data16).params)
      request.params = __privateGet(this, _data16).playerParams || __privateGet(this, _data16).params;
    if (__privateGet(this, _data16).startTimeSeconds)
      request.startTimeSecs = __privateGet(this, _data16).startTimeSeconds;
    if (__privateGet(this, _data16).overrideMutedAtStart)
      request.overrideMutedAtStart = __privateGet(this, _data16).overrideMutedAtStart;
    request.racyCheckOk = !!__privateGet(this, _data16).racyCheckOk;
    request.contentCheckOk = !!__privateGet(this, _data16).contentCheckOk;
    return request;
  }
};
_data16 = new WeakMap();
__name(_WatchEndpoint, "WatchEndpoint");
__publicField(_WatchEndpoint, "type", "WatchEndpoint");
var WatchEndpoint = _WatchEndpoint;

// dist/src/parser/classes/endpoints/PrefetchWatchCommand.js
var _PrefetchWatchCommand = class _PrefetchWatchCommand extends WatchEndpoint {
  constructor(data) {
    super(data);
  }
};
__name(_PrefetchWatchCommand, "PrefetchWatchCommand");
__publicField(_PrefetchWatchCommand, "type", "PrefetchWatchCommand");
var PrefetchWatchCommand = _PrefetchWatchCommand;

// dist/src/parser/classes/endpoints/ReelWatchEndpoint.js
var API_PATH14 = "reel/reel_item_watch";
var _data17;
var _ReelWatchEndpoint = class _ReelWatchEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data17);
    __privateSet(this, _data17, data);
  }
  getApiPath() {
    return API_PATH14;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data17).videoId) {
      request.playerRequest = {
        videoId: __privateGet(this, _data17).videoId
      };
    }
    if (request.playerRequest) {
      if (__privateGet(this, _data17).playerParams)
        request.playerRequest.params = __privateGet(this, _data17).playerParams;
      if (__privateGet(this, _data17).racyCheckOk)
        request.playerRequest.racyCheckOk = !!__privateGet(this, _data17).racyCheckOk;
      if (__privateGet(this, _data17).contentCheckOk)
        request.playerRequest.contentCheckOk = !!__privateGet(this, _data17).contentCheckOk;
    }
    if (__privateGet(this, _data17).params)
      request.params = __privateGet(this, _data17).params;
    if (__privateGet(this, _data17).inputType)
      request.inputType = __privateGet(this, _data17).inputType;
    request.disablePlayerResponse = !!__privateGet(this, _data17).disablePlayerResponse;
    return request;
  }
};
_data17 = new WeakMap();
__name(_ReelWatchEndpoint, "ReelWatchEndpoint");
__publicField(_ReelWatchEndpoint, "type", "ReelWatchEndpoint");
var ReelWatchEndpoint = _ReelWatchEndpoint;

// dist/src/parser/classes/endpoints/SearchEndpoint.js
var API_PATH15 = "search";
var _data18;
var _SearchEndpoint = class _SearchEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data18);
    __privateSet(this, _data18, data);
  }
  getApiPath() {
    return API_PATH15;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data18).query)
      request.query = __privateGet(this, _data18).query;
    if (__privateGet(this, _data18).params)
      request.params = __privateGet(this, _data18).params;
    if (__privateGet(this, _data18).webSearchboxStatsUrl)
      request.webSearchboxStatsUrl = __privateGet(this, _data18).webSearchboxStatsUrl;
    if (__privateGet(this, _data18).suggestStats)
      request.suggestStats = __privateGet(this, _data18).suggestStats;
    return request;
  }
};
_data18 = new WeakMap();
__name(_SearchEndpoint, "SearchEndpoint");
__publicField(_SearchEndpoint, "type", "SearchEndpoint");
var SearchEndpoint = _SearchEndpoint;

// dist/src/parser/classes/endpoints/ShareEntityServiceEndpoint.js
var API_PATH16 = "share/get_share_panel";
var _data19;
var _ShareEntityServiceEndpoint = class _ShareEntityServiceEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data19);
    __privateSet(this, _data19, data);
  }
  getApiPath() {
    return API_PATH16;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data19).serializedShareEntity)
      request.serializedSharedEntity = __privateGet(this, _data19).serializedShareEntity;
    if (__privateGet(this, _data19).clientParams)
      request.clientParams = __privateGet(this, _data19).clientParams;
    return request;
  }
};
_data19 = new WeakMap();
__name(_ShareEntityServiceEndpoint, "ShareEntityServiceEndpoint");
__publicField(_ShareEntityServiceEndpoint, "type", "ShareEntityServiceEndpoint");
var ShareEntityServiceEndpoint = _ShareEntityServiceEndpoint;

// dist/src/parser/classes/endpoints/ShareEndpoint.js
var _ShareEndpoint = class _ShareEndpoint extends ShareEntityServiceEndpoint {
  constructor(data) {
    super(data);
  }
};
__name(_ShareEndpoint, "ShareEndpoint");
__publicField(_ShareEndpoint, "type", "ShareEndpoint");
var ShareEndpoint = _ShareEndpoint;

// dist/src/parser/classes/endpoints/ShareEntityEndpoint.js
var _ShareEntityEndpoint = class _ShareEntityEndpoint extends ShareEntityServiceEndpoint {
  constructor(data) {
    super(data);
  }
};
__name(_ShareEntityEndpoint, "ShareEntityEndpoint");
__publicField(_ShareEntityEndpoint, "type", "ShareEntityEndpoint");
var ShareEntityEndpoint = _ShareEntityEndpoint;

// dist/src/parser/classes/endpoints/ShowEngagementPanelEndpoint.js
var _ShowEngagementPanelEndpoint = class _ShowEngagementPanelEndpoint extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "panel_identifier");
    __publicField(this, "source_panel_identifier");
    this.panel_identifier = data.panelIdentifier;
    this.source_panel_identifier = data.sourcePanelIdentifier;
  }
};
__name(_ShowEngagementPanelEndpoint, "ShowEngagementPanelEndpoint");
__publicField(_ShowEngagementPanelEndpoint, "type", "ShowEngagementPanelEndpoint");
var ShowEngagementPanelEndpoint = _ShowEngagementPanelEndpoint;

// dist/src/parser/classes/endpoints/SignalServiceEndpoint.js
var _SignalServiceEndpoint = class _SignalServiceEndpoint extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "actions");
    __publicField(this, "signal");
    if (Array.isArray(data.actions)) {
      this.actions = parser_exports.parseArray(data.actions.map((action) => {
        delete action.clickTrackingParams;
        return action;
      }));
    }
    this.signal = data.signal;
  }
};
__name(_SignalServiceEndpoint, "SignalServiceEndpoint");
__publicField(_SignalServiceEndpoint, "type", "SignalServiceEndpoint");
var SignalServiceEndpoint = _SignalServiceEndpoint;

// dist/src/parser/classes/endpoints/SubscribeEndpoint.js
var API_PATH17 = "subscription/subscribe";
var _data20;
var _SubscribeEndpoint = class _SubscribeEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data20);
    __privateSet(this, _data20, data);
  }
  getApiPath() {
    return API_PATH17;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data20).channelIds)
      request.channelIds = __privateGet(this, _data20).channelIds;
    if (__privateGet(this, _data20).siloName)
      request.siloName = __privateGet(this, _data20).siloName;
    if (__privateGet(this, _data20).params)
      request.params = __privateGet(this, _data20).params;
    if (__privateGet(this, _data20).botguardResponse)
      request.botguardResponse = __privateGet(this, _data20).botguardResponse;
    if (__privateGet(this, _data20).feature)
      request.clientFeature = __privateGet(this, _data20).feature;
    return request;
  }
};
_data20 = new WeakMap();
__name(_SubscribeEndpoint, "SubscribeEndpoint");
__publicField(_SubscribeEndpoint, "type", "SubscribeEndpoint");
var SubscribeEndpoint = _SubscribeEndpoint;

// dist/src/parser/classes/endpoints/UnsubscribeEndpoint.js
var API_PATH18 = "subscription/unsubscribe";
var _data21;
var _UnsubscribeEndpoint = class _UnsubscribeEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data21);
    __privateSet(this, _data21, data);
  }
  getApiPath() {
    return API_PATH18;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data21).channelIds)
      request.channelIds = __privateGet(this, _data21).channelIds;
    if (__privateGet(this, _data21).siloName)
      request.siloName = __privateGet(this, _data21).siloName;
    if (__privateGet(this, _data21).params)
      request.params = __privateGet(this, _data21).params;
    return request;
  }
};
_data21 = new WeakMap();
__name(_UnsubscribeEndpoint, "UnsubscribeEndpoint");
__publicField(_UnsubscribeEndpoint, "type", "UnsubscribeEndpoint");
var UnsubscribeEndpoint = _UnsubscribeEndpoint;

// dist/src/parser/classes/endpoints/WatchNextEndpoint.js
var API_PATH19 = "next";
var _data22;
var _WatchNextEndpoint = class _WatchNextEndpoint extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _data22);
    __privateSet(this, _data22, data);
  }
  getApiPath() {
    return API_PATH19;
  }
  buildRequest() {
    const request = {};
    if (__privateGet(this, _data22).videoId)
      request.videoId = __privateGet(this, _data22).videoId;
    if (__privateGet(this, _data22).playlistId)
      request.playlistId = __privateGet(this, _data22).playlistId;
    if (__privateGet(this, _data22).index !== void 0 || __privateGet(this, _data22).playlistIndex !== void 0)
      request.playlistIndex = __privateGet(this, _data22).index || __privateGet(this, _data22).playlistIndex;
    if (__privateGet(this, _data22).playerParams || __privateGet(this, _data22).params)
      request.params = __privateGet(this, _data22).playerParams || __privateGet(this, _data22).params;
    request.racyCheckOk = !!__privateGet(this, _data22).racyCheckOk;
    request.contentCheckOk = !!__privateGet(this, _data22).contentCheckOk;
    return request;
  }
};
_data22 = new WeakMap();
__name(_WatchNextEndpoint, "WatchNextEndpoint");
__publicField(_WatchNextEndpoint, "type", "WatchNextEndpoint");
var WatchNextEndpoint = _WatchNextEndpoint;

// dist/src/parser/classes/Endscreen.js
var _Endscreen = class _Endscreen extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "elements");
    __publicField(this, "start_ms");
    this.elements = parser_exports.parseArray(data.elements);
    this.start_ms = data.startMs;
  }
};
__name(_Endscreen, "Endscreen");
__publicField(_Endscreen, "type", "Endscreen");
var Endscreen = _Endscreen;

// dist/src/parser/classes/EndscreenElement.js
var _EndscreenElement = class _EndscreenElement extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "style");
    __publicField(this, "title");
    __publicField(this, "endpoint");
    __publicField(this, "image");
    __publicField(this, "icon");
    __publicField(this, "metadata");
    __publicField(this, "call_to_action");
    __publicField(this, "hovercard_button");
    __publicField(this, "is_subscribe");
    __publicField(this, "playlist_length");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "left");
    __publicField(this, "top");
    __publicField(this, "width");
    __publicField(this, "aspect_ratio");
    __publicField(this, "start_ms");
    __publicField(this, "end_ms");
    __publicField(this, "id");
    this.style = data.style;
    this.title = new Text2(data.title);
    this.endpoint = new NavigationEndpoint(data.endpoint);
    if (Reflect.has(data, "image")) {
      this.image = Thumbnail.fromResponse(data.image);
    }
    if (Reflect.has(data, "icon")) {
      this.icon = Thumbnail.fromResponse(data.icon);
    }
    if (Reflect.has(data, "metadata")) {
      this.metadata = new Text2(data.metadata);
    }
    if (Reflect.has(data, "callToAction")) {
      this.call_to_action = new Text2(data.callToAction);
    }
    if (Reflect.has(data, "hovercardButton")) {
      this.hovercard_button = parser_exports.parseItem(data.hovercardButton);
    }
    if (Reflect.has(data, "isSubscribe")) {
      this.is_subscribe = !!data.isSubscribe;
    }
    if (Reflect.has(data, "playlistLength")) {
      this.playlist_length = new Text2(data.playlistLength);
    }
    if (Reflect.has(data, "thumbnailOverlays")) {
      this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
    }
    this.left = parseFloat(data.left);
    this.width = parseFloat(data.width);
    this.top = parseFloat(data.top);
    this.aspect_ratio = parseFloat(data.aspectRatio);
    this.start_ms = parseFloat(data.startMs);
    this.end_ms = parseFloat(data.endMs);
    this.id = data.id;
  }
};
__name(_EndscreenElement, "EndscreenElement");
__publicField(_EndscreenElement, "type", "EndscreenElement");
var EndscreenElement = _EndscreenElement;

// dist/src/parser/classes/EndScreenPlaylist.js
var _EndScreenPlaylist = class _EndScreenPlaylist extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "author");
    __publicField(this, "endpoint");
    __publicField(this, "thumbnails");
    __publicField(this, "video_count");
    this.id = data.playlistId;
    this.title = new Text2(data.title);
    this.author = new Text2(data.longBylineText);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.video_count = new Text2(data.videoCountText);
  }
};
__name(_EndScreenPlaylist, "EndScreenPlaylist");
__publicField(_EndScreenPlaylist, "type", "EndScreenPlaylist");
var EndScreenPlaylist = _EndScreenPlaylist;

// dist/src/parser/classes/EndScreenVideo.js
var _EndScreenVideo = class _EndScreenVideo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "thumbnails");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "author");
    __publicField(this, "endpoint");
    __publicField(this, "short_view_count");
    __publicField(this, "badges");
    __publicField(this, "duration");
    this.id = data.videoId;
    this.title = new Text2(data.title);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
    this.author = new Author(data.shortBylineText, data.ownerBadges);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.short_view_count = new Text2(data.shortViewCountText);
    this.badges = parser_exports.parseArray(data.badges);
    this.duration = {
      text: new Text2(data.lengthText).toString(),
      seconds: data.lengthInSeconds
    };
  }
};
__name(_EndScreenVideo, "EndScreenVideo");
__publicField(_EndScreenVideo, "type", "EndScreenVideo");
var EndScreenVideo = _EndScreenVideo;

// dist/src/parser/classes/ExpandableTab.js
var _ExpandableTab = class _ExpandableTab extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "endpoint");
    __publicField(this, "selected");
    __publicField(this, "content");
    this.title = data.title;
    this.endpoint = new NavigationEndpoint(data.endpoint);
    this.selected = data.selected;
    this.content = parser_exports.parseItem(data.content);
  }
};
__name(_ExpandableTab, "ExpandableTab");
__publicField(_ExpandableTab, "type", "ExpandableTab");
var ExpandableTab = _ExpandableTab;

// dist/src/parser/classes/ExpandedShelfContents.js
var _ExpandedShelfContents = class _ExpandedShelfContents extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    this.items = parser_exports.parseArray(data.items);
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_ExpandedShelfContents, "ExpandedShelfContents");
__publicField(_ExpandedShelfContents, "type", "ExpandedShelfContents");
var ExpandedShelfContents = _ExpandedShelfContents;

// dist/src/parser/classes/FancyDismissibleDialog.js
var _FancyDismissibleDialog = class _FancyDismissibleDialog extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "dialog_message");
    __publicField(this, "confirm_label");
    this.dialog_message = new Text2(data.dialogMessage);
    this.confirm_label = new Text2(data.confirmLabel);
  }
};
__name(_FancyDismissibleDialog, "FancyDismissibleDialog");
__publicField(_FancyDismissibleDialog, "type", "FancyDismissibleDialog");
var FancyDismissibleDialog = _FancyDismissibleDialog;

// dist/src/parser/classes/FeedFilterChipBar.js
var _FeedFilterChipBar = class _FeedFilterChipBar extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    this.contents = parser_exports.parseArray(data.contents, ChipCloudChip);
  }
};
__name(_FeedFilterChipBar, "FeedFilterChipBar");
__publicField(_FeedFilterChipBar, "type", "FeedFilterChipBar");
var FeedFilterChipBar = _FeedFilterChipBar;

// dist/src/parser/classes/FeedNudge.js
var _FeedNudge = class _FeedNudge extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "endpoint");
    __publicField(this, "apply_modernized_style");
    __publicField(this, "trim_style");
    __publicField(this, "background_style");
    this.title = new Text2(data.title);
    this.subtitle = new Text2(data.subtitle);
    this.endpoint = new NavigationEndpoint(data.impressionEndpoint);
    this.apply_modernized_style = data.applyModernizedStyle;
    this.trim_style = data.trimStyle;
    this.background_style = data.backgroundStyle;
  }
};
__name(_FeedNudge, "FeedNudge");
__publicField(_FeedNudge, "type", "FeedNudge");
var FeedNudge = _FeedNudge;

// dist/src/parser/classes/FeedTabbedHeader.js
var _FeedTabbedHeader = class _FeedTabbedHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = new Text2(data.title);
  }
};
__name(_FeedTabbedHeader, "FeedTabbedHeader");
__publicField(_FeedTabbedHeader, "type", "FeedTabbedHeader");
var FeedTabbedHeader = _FeedTabbedHeader;

// dist/src/parser/classes/ToggleFormField.js
var _ToggleFormField = class _ToggleFormField extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "label");
    __publicField(this, "toggled");
    __publicField(this, "toggle_on_action");
    __publicField(this, "toggle_off_action");
    this.label = new Text(data.label);
    this.toggled = data.toggled;
    if ("toggleOnAction" in data)
      this.toggle_on_action = new NavigationEndpoint(data.toggleOnAction);
    if ("toggleOffAction" in data)
      this.toggle_off_action = new NavigationEndpoint(data.toggleOffAction);
  }
};
__name(_ToggleFormField, "ToggleFormField");
__publicField(_ToggleFormField, "type", "ToggleFormField");
var ToggleFormField = _ToggleFormField;

// dist/src/parser/classes/Form.js
var _Form = class _Form extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "fields");
    this.fields = parser_exports.parseArray(data.fields, ToggleFormField);
  }
};
__name(_Form, "Form");
__publicField(_Form, "type", "Form");
var Form = _Form;

// dist/src/parser/classes/FormPopup.js
var _FormPopup = class _FormPopup extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "form");
    __publicField(this, "buttons");
    this.title = new Text2(data.title);
    this.form = parser_exports.parseItem(data.form, Form);
    this.buttons = parser_exports.parseArray(data.buttons, Button);
  }
};
__name(_FormPopup, "FormPopup");
__publicField(_FormPopup, "type", "FormPopup");
var FormPopup = _FormPopup;

// dist/src/parser/classes/GameDetails.js
var _GameDetails = class _GameDetails extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "box_art");
    __publicField(this, "box_art_overlay_text");
    __publicField(this, "endpoint");
    __publicField(this, "is_official_box_art");
    this.title = new Text2(data.title);
    this.box_art = Thumbnail.fromResponse(data.boxArt);
    this.box_art_overlay_text = new Text2(data.boxArtOverlayText);
    this.endpoint = new NavigationEndpoint(data.endpoint);
    this.is_official_box_art = !!data.isOfficialBoxArt;
  }
};
__name(_GameDetails, "GameDetails");
__publicField(_GameDetails, "type", "GameDetails");
var GameDetails = _GameDetails;

// dist/src/parser/classes/Grid.js
var _Grid = class _Grid extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    __publicField(this, "is_collapsible");
    __publicField(this, "visible_row_count");
    __publicField(this, "target_id");
    __publicField(this, "continuation");
    __publicField(this, "header");
    this.items = parser_exports.parseArray(data.items);
    if (Reflect.has(data, "header")) {
      this.header = parser_exports.parseItem(data.header);
    }
    if (Reflect.has(data, "isCollapsible")) {
      this.is_collapsible = data.isCollapsible;
    }
    if (Reflect.has(data, "visibleRowCount")) {
      this.visible_row_count = data.visibleRowCount;
    }
    if (Reflect.has(data, "targetId")) {
      this.target_id = data.targetId;
    }
    this.continuation = data.continuations?.[0]?.nextContinuationData?.continuation || null;
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_Grid, "Grid");
__publicField(_Grid, "type", "Grid");
var Grid = _Grid;

// dist/src/parser/classes/GridChannel.js
var _GridChannel = class _GridChannel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "author");
    __publicField(this, "subscribers");
    __publicField(this, "video_count");
    __publicField(this, "endpoint");
    __publicField(this, "subscribe_button");
    this.id = data.channelId;
    this.author = new Author({
      ...data.title,
      navigationEndpoint: data.navigationEndpoint
    }, data.ownerBadges, data.thumbnail);
    this.subscribers = new Text2(data.subscriberCountText);
    this.video_count = new Text2(data.videoCountText);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.subscribe_button = parser_exports.parseItem(data.subscribeButton);
  }
};
__name(_GridChannel, "GridChannel");
__publicField(_GridChannel, "type", "GridChannel");
var GridChannel = _GridChannel;

// dist/src/parser/classes/GridHeader.js
var _GridHeader = class _GridHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = new Text2(data.title);
  }
};
__name(_GridHeader, "GridHeader");
__publicField(_GridHeader, "type", "GridHeader");
var GridHeader = _GridHeader;

// dist/src/parser/classes/GridMix.js
var _GridMix = class _GridMix extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "author");
    __publicField(this, "thumbnails");
    __publicField(this, "video_count");
    __publicField(this, "video_count_short");
    __publicField(this, "endpoint");
    __publicField(this, "secondary_endpoint");
    __publicField(this, "thumbnail_overlays");
    this.id = data.playlistId;
    this.title = new Text2(data.title);
    this.author = data.shortBylineText?.simpleText ? new Text2(data.shortBylineText) : data.longBylineText?.simpleText ? new Text2(data.longBylineText) : null;
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.video_count = new Text2(data.videoCountText);
    this.video_count_short = new Text2(data.videoCountShortText);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.secondary_endpoint = new NavigationEndpoint(data.secondaryNavigationEndpoint);
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
  }
};
__name(_GridMix, "GridMix");
__publicField(_GridMix, "type", "GridMix");
var GridMix = _GridMix;

// dist/src/parser/classes/GridMovie.js
var _GridMovie = class _GridMovie extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "thumbnails");
    __publicField(this, "duration");
    __publicField(this, "endpoint");
    __publicField(this, "badges");
    __publicField(this, "metadata");
    __publicField(this, "thumbnail_overlays");
    const length_alt = data.thumbnailOverlays.find((overlay) => overlay.hasOwnProperty("thumbnailOverlayTimeStatusRenderer"))?.thumbnailOverlayTimeStatusRenderer;
    this.id = data.videoId;
    this.title = new Text2(data.title);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.duration = data.lengthText ? new Text2(data.lengthText) : length_alt?.text ? new Text2(length_alt.text) : null;
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.badges = parser_exports.parseArray(data.badges, MetadataBadge);
    this.metadata = new Text2(data.metadata);
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
  }
};
__name(_GridMovie, "GridMovie");
__publicField(_GridMovie, "type", "GridMovie");
var GridMovie = _GridMovie;

// dist/src/parser/classes/GridPlaylist.js
var _GridPlaylist = class _GridPlaylist extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "author");
    __publicField(this, "badges");
    __publicField(this, "endpoint");
    __publicField(this, "view_playlist");
    __publicField(this, "thumbnails");
    __publicField(this, "thumbnail_renderer");
    __publicField(this, "sidebar_thumbnails");
    __publicField(this, "video_count");
    __publicField(this, "video_count_short");
    this.id = data.playlistId;
    this.title = new Text2(data.title);
    if (Reflect.has(data, "shortBylineText")) {
      this.author = new Author(data.shortBylineText, data.ownerBadges);
    }
    this.badges = parser_exports.parseArray(data.ownerBadges);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.view_playlist = new Text2(data.viewPlaylistText);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.thumbnail_renderer = parser_exports.parseItem(data.thumbnailRenderer);
    this.sidebar_thumbnails = [].concat(...data.sidebarThumbnails?.map((thumbnail) => Thumbnail.fromResponse(thumbnail)) || []) || null;
    this.video_count = new Text2(data.thumbnailText);
    this.video_count_short = new Text2(data.videoCountShortText);
  }
};
__name(_GridPlaylist, "GridPlaylist");
__publicField(_GridPlaylist, "type", "GridPlaylist");
var GridPlaylist = _GridPlaylist;

// dist/src/parser/classes/GridShelfView.js
var _GridShelfView = class _GridShelfView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    __publicField(this, "header");
    __publicField(this, "content_aspect_ratio");
    __publicField(this, "enable_vertical_expansion");
    __publicField(this, "show_more_button");
    __publicField(this, "show_less_button");
    __publicField(this, "min_collapsed_item_count");
    this.contents = parser_exports.parseArray(data.contents);
    this.header = parser_exports.parseItem(data.header);
    this.content_aspect_ratio = data.contentAspectRatio;
    this.enable_vertical_expansion = data.enableVerticalExpansion;
    this.show_more_button = parser_exports.parseItem(data.showMoreButton, ButtonView);
    this.show_less_button = parser_exports.parseItem(data.showLessButton, ButtonView);
    this.min_collapsed_item_count = data.minCollapsedItemCount;
  }
};
__name(_GridShelfView, "GridShelfView");
__publicField(_GridShelfView, "type", "GridShelfView");
var GridShelfView = _GridShelfView;

// dist/src/parser/classes/ShowCustomThumbnail.js
var _ShowCustomThumbnail = class _ShowCustomThumbnail extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
  }
};
__name(_ShowCustomThumbnail, "ShowCustomThumbnail");
__publicField(_ShowCustomThumbnail, "type", "ShowCustomThumbnail");
var ShowCustomThumbnail = _ShowCustomThumbnail;

// dist/src/parser/classes/ThumbnailOverlayBottomPanel.js
var _ThumbnailOverlayBottomPanel = class _ThumbnailOverlayBottomPanel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "icon_type");
    if (Reflect.has(data, "text")) {
      this.text = new Text2(data.text);
    }
    if (Reflect.has(data, "icon") && Reflect.has(data.icon, "iconType")) {
      this.icon_type = data.icon.iconType;
    }
  }
};
__name(_ThumbnailOverlayBottomPanel, "ThumbnailOverlayBottomPanel");
__publicField(_ThumbnailOverlayBottomPanel, "type", "ThumbnailOverlayBottomPanel");
var ThumbnailOverlayBottomPanel = _ThumbnailOverlayBottomPanel;

// dist/src/parser/classes/GridShow.js
var _GridShow = class _GridShow extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "thumbnail_renderer");
    __publicField(this, "endpoint");
    __publicField(this, "long_byline_text");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "author");
    this.title = new Text2(data.title);
    this.thumbnail_renderer = parseItem(data.thumbnailRenderer, ShowCustomThumbnail);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.long_byline_text = new Text2(data.longBylineText);
    this.thumbnail_overlays = parseArray(data.thumbnailOverlays, ThumbnailOverlayBottomPanel);
    this.author = new Author(data.shortBylineText, void 0);
  }
};
__name(_GridShow, "GridShow");
__publicField(_GridShow, "type", "GridShow");
var GridShow = _GridShow;

// dist/src/parser/classes/GridVideo.js
var _GridVideo = class _GridVideo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "video_id");
    __publicField(this, "title");
    __publicField(this, "thumbnails");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "rich_thumbnail");
    __publicField(this, "published");
    __publicField(this, "duration");
    __publicField(this, "author");
    __publicField(this, "views");
    __publicField(this, "short_view_count");
    __publicField(this, "endpoint");
    __publicField(this, "menu");
    __publicField(this, "buttons");
    __publicField(this, "upcoming");
    __publicField(this, "upcoming_text");
    __publicField(this, "is_reminder_set");
    const length_alt = data.thumbnailOverlays.find((overlay) => overlay.hasOwnProperty("thumbnailOverlayTimeStatusRenderer"))?.thumbnailOverlayTimeStatusRenderer;
    this.video_id = data.videoId;
    this.title = new Text2(data.title);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
    this.rich_thumbnail = parser_exports.parseItem(data.richThumbnail);
    this.published = new Text2(data.publishedTimeText);
    this.duration = data.lengthText ? new Text2(data.lengthText) : length_alt?.text ? new Text2(length_alt.text) : null;
    this.author = data.shortBylineText && new Author(data.shortBylineText, data.ownerBadges);
    this.views = new Text2(data.viewCountText);
    this.short_view_count = new Text2(data.shortViewCountText);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.menu = parser_exports.parseItem(data.menu, Menu);
    if (Reflect.has(data, "buttons")) {
      this.buttons = parser_exports.parseArray(data.buttons);
    }
    if (Reflect.has(data, "upcomingEventData")) {
      this.upcoming = new Date(Number(`${data.upcomingEventData.startTime}000`));
      this.upcoming_text = new Text2(data.upcomingEventData.upcomingEventText);
      this.is_reminder_set = !!data.upcomingEventData?.isReminderSet;
    }
  }
  /**
   * @deprecated Use {@linkcode video_id} instead.
   */
  get id() {
    return this.video_id;
  }
  get is_upcoming() {
    return Boolean(this.upcoming && this.upcoming > /* @__PURE__ */ new Date());
  }
};
__name(_GridVideo, "GridVideo");
__publicField(_GridVideo, "type", "GridVideo");
var GridVideo = _GridVideo;

// dist/src/parser/classes/GuideEntry.js
var _GuideEntry = class _GuideEntry extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "endpoint");
    __publicField(this, "icon_type");
    __publicField(this, "thumbnails");
    __publicField(this, "badges");
    __publicField(this, "is_primary");
    this.title = new Text2(data.formattedTitle);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint || data.serviceEndpoint);
    if (Reflect.has(data, "icon") && Reflect.has(data.icon, "iconType")) {
      this.icon_type = data.icon.iconType;
    }
    if (Reflect.has(data, "thumbnail")) {
      this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    }
    if (Reflect.has(data, "badges")) {
      this.badges = data.badges;
    }
    this.is_primary = !!data.isPrimary;
  }
};
__name(_GuideEntry, "GuideEntry");
__publicField(_GuideEntry, "type", "GuideEntry");
var GuideEntry = _GuideEntry;

// dist/src/parser/classes/GuideCollapsibleEntry.js
var _GuideCollapsibleEntry = class _GuideCollapsibleEntry extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "expander_item");
    __publicField(this, "collapser_item");
    __publicField(this, "expandable_items");
    this.expander_item = parseItem(data.expanderItem, GuideEntry);
    this.collapser_item = parseItem(data.collapserItem, GuideEntry);
    this.expandable_items = parseArray(data.expandableItems);
  }
};
__name(_GuideCollapsibleEntry, "GuideCollapsibleEntry");
__publicField(_GuideCollapsibleEntry, "type", "GuideCollapsibleEntry");
var GuideCollapsibleEntry = _GuideCollapsibleEntry;

// dist/src/parser/classes/GuideCollapsibleSectionEntry.js
var _GuideCollapsibleSectionEntry = class _GuideCollapsibleSectionEntry extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header_entry");
    __publicField(this, "expander_icon");
    __publicField(this, "collapser_icon");
    __publicField(this, "section_items");
    this.header_entry = parseItem(data.headerEntry);
    this.expander_icon = data.expanderIcon.iconType;
    this.collapser_icon = data.collapserIcon.iconType;
    this.section_items = parseArray(data.sectionItems);
  }
};
__name(_GuideCollapsibleSectionEntry, "GuideCollapsibleSectionEntry");
__publicField(_GuideCollapsibleSectionEntry, "type", "GuideCollapsibleSectionEntry");
var GuideCollapsibleSectionEntry = _GuideCollapsibleSectionEntry;

// dist/src/parser/classes/GuideDownloadsEntry.js
var _GuideDownloadsEntry = class _GuideDownloadsEntry extends GuideEntry {
  constructor(data) {
    super(data.entryRenderer.guideEntryRenderer);
    __publicField(this, "always_show");
    this.always_show = !!data.alwaysShow;
  }
};
__name(_GuideDownloadsEntry, "GuideDownloadsEntry");
__publicField(_GuideDownloadsEntry, "type", "GuideDownloadsEntry");
var GuideDownloadsEntry = _GuideDownloadsEntry;

// dist/src/parser/classes/GuideSection.js
var _GuideSection = class _GuideSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "items");
    if (Reflect.has(data, "formattedTitle")) {
      this.title = new Text2(data.formattedTitle);
    }
    this.items = parseArray(data.items);
  }
};
__name(_GuideSection, "GuideSection");
__publicField(_GuideSection, "type", "GuideSection");
var GuideSection = _GuideSection;

// dist/src/parser/classes/GuideSubscriptionsSection.js
var _GuideSubscriptionsSection = class _GuideSubscriptionsSection extends GuideSection {
};
__name(_GuideSubscriptionsSection, "GuideSubscriptionsSection");
__publicField(_GuideSubscriptionsSection, "type", "GuideSubscriptionsSection");
var GuideSubscriptionsSection = _GuideSubscriptionsSection;

// dist/src/parser/classes/HashtagHeader.js
var _HashtagHeader = class _HashtagHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "hashtag");
    __publicField(this, "hashtag_info");
    this.hashtag = new Text2(data.hashtag);
    this.hashtag_info = new Text2(data.hashtagInfoText);
  }
};
__name(_HashtagHeader, "HashtagHeader");
__publicField(_HashtagHeader, "type", "HashtagHeader");
var HashtagHeader = _HashtagHeader;

// dist/src/parser/classes/HashtagTile.js
var _HashtagTile = class _HashtagTile extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "hashtag");
    __publicField(this, "hashtag_info_text");
    __publicField(this, "hashtag_thumbnail");
    __publicField(this, "endpoint");
    __publicField(this, "hashtag_background_color");
    __publicField(this, "hashtag_video_count");
    __publicField(this, "hashtag_channel_count");
    this.hashtag = new Text2(data.hashtag);
    this.hashtag_info_text = new Text2(data.hashtagInfoText);
    this.hashtag_thumbnail = Thumbnail.fromResponse(data.hashtagThumbnail);
    this.endpoint = new NavigationEndpoint(data.onTapCommand);
    this.hashtag_background_color = data.hashtagBackgroundColor;
    this.hashtag_video_count = new Text2(data.hashtagVideoCount);
    this.hashtag_channel_count = new Text2(data.hashtagChannelCount);
  }
};
__name(_HashtagTile, "HashtagTile");
__publicField(_HashtagTile, "type", "HashtagTile");
var HashtagTile = _HashtagTile;

// dist/src/parser/classes/HeroPlaylistThumbnail.js
var _HeroPlaylistThumbnail = class _HeroPlaylistThumbnail extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnails");
    __publicField(this, "on_tap_endpoint");
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.on_tap_endpoint = new NavigationEndpoint(data.onTap);
  }
};
__name(_HeroPlaylistThumbnail, "HeroPlaylistThumbnail");
__publicField(_HeroPlaylistThumbnail, "type", "HeroPlaylistThumbnail");
var HeroPlaylistThumbnail = _HeroPlaylistThumbnail;

// dist/src/parser/classes/HighlightsCarousel.js
var _Panel = class _Panel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    __publicField(this, "background_image");
    __publicField(this, "strapline");
    __publicField(this, "title");
    __publicField(this, "description");
    __publicField(this, "text_on_tap_endpoint");
    __publicField(this, "cta");
    if (data.thumbnail) {
      this.thumbnail = {
        image: Thumbnail.fromResponse(data.thumbnail.image),
        endpoint: new NavigationEndpoint(data.thumbnail.onTap),
        on_long_press_endpoint: new NavigationEndpoint(data.thumbnail.onLongPress),
        content_mode: data.thumbnail.contentMode,
        crop_options: data.thumbnail.cropOptions
      };
    }
    this.background_image = {
      image: Thumbnail.fromResponse(data.backgroundImage.image),
      gradient_image: Thumbnail.fromResponse(data.backgroundImage.gradientImage)
    };
    this.strapline = data.strapline;
    this.title = data.title;
    this.description = data.description;
    this.cta = {
      icon_name: data.cta.iconName,
      title: data.cta.title,
      endpoint: new NavigationEndpoint(data.cta.onTap),
      accessibility_text: data.cta.accessibilityText,
      state: data.cta.state
    };
    this.text_on_tap_endpoint = new NavigationEndpoint(data.textOnTap);
  }
};
__name(_Panel, "Panel");
__publicField(_Panel, "type", "Panel");
var Panel = _Panel;
var _HighlightsCarousel = class _HighlightsCarousel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "panels");
    this.panels = observe(data.highlightsCarousel.panels.map((el) => new Panel(el)));
  }
};
__name(_HighlightsCarousel, "HighlightsCarousel");
__publicField(_HighlightsCarousel, "type", "HighlightsCarousel");
var HighlightsCarousel = _HighlightsCarousel;

// dist/src/parser/classes/SearchSuggestion.js
var _SearchSuggestion = class _SearchSuggestion extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "suggestion");
    __publicField(this, "endpoint");
    __publicField(this, "icon_type");
    __publicField(this, "service_endpoint");
    this.suggestion = new Text2(data.suggestion);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    if (Reflect.has(data, "icon")) {
      this.icon_type = data.icon.iconType;
    }
    if (Reflect.has(data, "serviceEndpoint")) {
      this.service_endpoint = new NavigationEndpoint(data.serviceEndpoint);
    }
  }
};
__name(_SearchSuggestion, "SearchSuggestion");
__publicField(_SearchSuggestion, "type", "SearchSuggestion");
var SearchSuggestion = _SearchSuggestion;

// dist/src/parser/classes/HistorySuggestion.js
var _HistorySuggestion = class _HistorySuggestion extends SearchSuggestion {
  constructor(data) {
    super(data);
  }
};
__name(_HistorySuggestion, "HistorySuggestion");
__publicField(_HistorySuggestion, "type", "HistorySuggestion");
var HistorySuggestion = _HistorySuggestion;

// dist/src/parser/classes/HorizontalMovieList.js
var _HorizontalMovieList = class _HorizontalMovieList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    __publicField(this, "previous_button");
    __publicField(this, "next_button");
    this.items = parser_exports.parseArray(data.items);
    this.previous_button = parser_exports.parseItem(data.previousButton, Button);
    this.next_button = parser_exports.parseItem(data.nextButton, Button);
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_HorizontalMovieList, "HorizontalMovieList");
__publicField(_HorizontalMovieList, "type", "HorizontalMovieList");
var HorizontalMovieList = _HorizontalMovieList;

// dist/src/parser/classes/IconLink.js
var _IconLink = class _IconLink extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "icon_type");
    __publicField(this, "tooltip");
    __publicField(this, "endpoint");
    this.icon_type = data.icon?.iconType;
    if (Reflect.has(data, "tooltip")) {
      this.tooltip = new Text2(data.tooltip).toString();
    }
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
  }
};
__name(_IconLink, "IconLink");
__publicField(_IconLink, "type", "IconLink");
var IconLink = _IconLink;

// dist/src/parser/classes/ImageBannerView.js
var _ImageBannerView = class _ImageBannerView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "image");
    __publicField(this, "style");
    this.image = Thumbnail.fromResponse(data.image);
    this.style = data.style;
  }
};
__name(_ImageBannerView, "ImageBannerView");
__publicField(_ImageBannerView, "type", "ImageBannerView");
var ImageBannerView = _ImageBannerView;

// dist/src/parser/classes/IncludingResultsFor.js
var _IncludingResultsFor = class _IncludingResultsFor extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "including_results_for");
    __publicField(this, "corrected_query");
    __publicField(this, "corrected_query_endpoint");
    __publicField(this, "search_only_for");
    __publicField(this, "original_query");
    __publicField(this, "original_query_endpoint");
    this.including_results_for = new Text2(data.includingResultsFor);
    this.corrected_query = new Text2(data.correctedQuery);
    this.corrected_query_endpoint = new NavigationEndpoint(data.correctedQueryEndpoint);
    this.search_only_for = Reflect.has(data, "searchOnlyFor") ? new Text2(data.searchOnlyFor) : void 0;
    this.original_query = Reflect.has(data, "originalQuery") ? new Text2(data.originalQuery) : void 0;
    this.original_query_endpoint = Reflect.has(data, "originalQueryEndpoint") ? new NavigationEndpoint(data.originalQueryEndpoint) : void 0;
  }
};
__name(_IncludingResultsFor, "IncludingResultsFor");
__publicField(_IncludingResultsFor, "type", "IncludingResultsFor");
var IncludingResultsFor = _IncludingResultsFor;

// dist/src/parser/classes/InfoPanelContent.js
var _InfoPanelContent = class _InfoPanelContent extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "source");
    __publicField(this, "paragraphs");
    __publicField(this, "attributed_paragraphs");
    __publicField(this, "thumbnail");
    __publicField(this, "source_endpoint");
    __publicField(this, "truncate_paragraphs");
    __publicField(this, "background");
    __publicField(this, "inline_link_icon_type");
    this.title = new Text2(data.title);
    this.source = new Text2(data.source);
    if (Reflect.has(data, "paragraphs"))
      this.paragraphs = data.paragraphs.map((p) => new Text2(p));
    if (Reflect.has(data, "attributedParagraphs"))
      this.attributed_paragraphs = data.attributedParagraphs.map((p) => Text2.fromAttributed(p));
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.source_endpoint = new NavigationEndpoint(data.sourceEndpoint);
    this.truncate_paragraphs = !!data.truncateParagraphs;
    this.background = data.background;
    if (Reflect.has(data, "inlineLinkIcon") && Reflect.has(data.inlineLinkIcon, "iconType")) {
      this.inline_link_icon_type = data.inlineLinkIcon.iconType;
    }
  }
};
__name(_InfoPanelContent, "InfoPanelContent");
__publicField(_InfoPanelContent, "type", "InfoPanelContent");
var InfoPanelContent = _InfoPanelContent;

// dist/src/parser/classes/InfoPanelContainer.js
var _InfoPanelContainer = class _InfoPanelContainer extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "menu");
    __publicField(this, "content");
    __publicField(this, "header_endpoint");
    __publicField(this, "background");
    __publicField(this, "title_style");
    __publicField(this, "icon_type");
    this.title = new Text2(data.title);
    this.menu = parser_exports.parseItem(data.menu, Menu);
    this.content = parser_exports.parseItem(data.content, InfoPanelContent);
    if (data.headerEndpoint)
      this.header_endpoint = new NavigationEndpoint(data.headerEndpoint);
    this.background = data.background;
    this.title_style = data.titleStyle;
    if (Reflect.has(data, "icon")) {
      this.icon_type = data.icon?.iconType;
    }
  }
};
__name(_InfoPanelContainer, "InfoPanelContainer");
__publicField(_InfoPanelContainer, "type", "InfoPanelContainer");
var InfoPanelContainer = _InfoPanelContainer;

// dist/src/parser/classes/InteractiveTabbedHeader.js
var _InteractiveTabbedHeader = class _InteractiveTabbedHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header_type");
    __publicField(this, "title");
    __publicField(this, "description");
    __publicField(this, "metadata");
    __publicField(this, "badges");
    __publicField(this, "box_art");
    __publicField(this, "banner");
    __publicField(this, "buttons");
    __publicField(this, "auto_generated");
    this.header_type = data.type;
    this.title = new Text2(data.title);
    this.description = new Text2(data.description);
    this.metadata = new Text2(data.metadata);
    this.badges = parser_exports.parseArray(data.badges, MetadataBadge);
    this.box_art = Thumbnail.fromResponse(data.boxArt);
    this.banner = Thumbnail.fromResponse(data.banner);
    this.buttons = parser_exports.parseArray(data.buttons, [SubscribeButton, Button]);
    this.auto_generated = new Text2(data.autoGenerated);
  }
};
__name(_InteractiveTabbedHeader, "InteractiveTabbedHeader");
__publicField(_InteractiveTabbedHeader, "type", "InteractiveTabbedHeader");
var InteractiveTabbedHeader = _InteractiveTabbedHeader;

// dist/src/parser/classes/ItemSectionHeader.js
var _ItemSectionHeader = class _ItemSectionHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = new Text2(data.title);
  }
};
__name(_ItemSectionHeader, "ItemSectionHeader");
__publicField(_ItemSectionHeader, "type", "ItemSectionHeader");
var ItemSectionHeader = _ItemSectionHeader;

// dist/src/parser/classes/ItemSectionTab.js
var _ItemSectionTab = class _ItemSectionTab extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "selected");
    __publicField(this, "endpoint");
    this.title = new Text2(data.title);
    this.selected = !!data.selected;
    this.endpoint = new NavigationEndpoint(data.endpoint);
  }
};
__name(_ItemSectionTab, "ItemSectionTab");
__publicField(_ItemSectionTab, "type", "Tab");
var ItemSectionTab = _ItemSectionTab;

// dist/src/parser/classes/ItemSectionTabbedHeader.js
var _ItemSectionTabbedHeader = class _ItemSectionTabbedHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "tabs");
    __publicField(this, "end_items");
    this.title = new Text2(data.title);
    this.tabs = parser_exports.parseArray(data.tabs, ItemSectionTab);
    if (Reflect.has(data, "endItems")) {
      this.end_items = parser_exports.parseArray(data.endItems);
    }
  }
};
__name(_ItemSectionTabbedHeader, "ItemSectionTabbedHeader");
__publicField(_ItemSectionTabbedHeader, "type", "ItemSectionTabbedHeader");
var ItemSectionTabbedHeader = _ItemSectionTabbedHeader;

// dist/src/parser/classes/SortFilterHeader.js
var _SortFilterHeader = class _SortFilterHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "filter_menu");
    this.filter_menu = parser_exports.parseItem(data.filterMenu, nodes_exports.SortFilterSubMenu);
  }
};
__name(_SortFilterHeader, "SortFilterHeader");
__publicField(_SortFilterHeader, "type", "SortFilterHeader");
var SortFilterHeader = _SortFilterHeader;

// dist/src/parser/classes/ItemSection.js
var _ItemSection = class _ItemSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "contents");
    __publicField(this, "target_id");
    __publicField(this, "continuation");
    this.header = parser_exports.parseItem(data.header, [CommentsHeader, ItemSectionHeader, ItemSectionTabbedHeader, SortFilterHeader, FeedFilterChipBar]);
    this.contents = parser_exports.parseArray(data.contents);
    if (data.targetId || data.sectionIdentifier) {
      this.target_id = data.targetId || data.sectionIdentifier;
    }
    if (data.continuations) {
      this.continuation = data.continuations?.at(0)?.nextContinuationData?.continuation;
    }
  }
};
__name(_ItemSection, "ItemSection");
__publicField(_ItemSection, "type", "ItemSection");
var ItemSection = _ItemSection;

// dist/src/parser/classes/LiveChat.js
var _LiveChat = class _LiveChat extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "initial_display_state");
    __publicField(this, "continuation");
    __publicField(this, "client_messages");
    __publicField(this, "is_replay");
    this.header = parser_exports.parseItem(data.header);
    this.initial_display_state = data.initialDisplayState;
    this.continuation = data.continuations[0]?.reloadContinuationData?.continuation;
    this.client_messages = {
      reconnect_message: new Text2(data.clientMessages.reconnectMessage),
      unable_to_reconnect_message: new Text2(data.clientMessages.unableToReconnectMessage),
      fatal_error: new Text2(data.clientMessages.fatalError),
      reconnected_message: new Text2(data.clientMessages.reconnectedMessage),
      generic_error: new Text2(data.clientMessages.genericError)
    };
    this.is_replay = !!data.isReplay;
  }
};
__name(_LiveChat, "LiveChat");
__publicField(_LiveChat, "type", "LiveChat");
var LiveChat = _LiveChat;

// dist/src/parser/classes/livechat/items/LiveChatBannerHeader.js
var _LiveChatBannerHeader = class _LiveChatBannerHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "icon_type");
    __publicField(this, "context_menu_button");
    this.text = new Text2(data.text);
    if (Reflect.has(data, "icon") && Reflect.has(data.icon, "iconType")) {
      this.icon_type = data.icon.iconType;
    }
    this.context_menu_button = parser_exports.parseItem(data.contextMenuButton, Button);
  }
};
__name(_LiveChatBannerHeader, "LiveChatBannerHeader");
__publicField(_LiveChatBannerHeader, "type", "LiveChatBannerHeader");
var LiveChatBannerHeader = _LiveChatBannerHeader;

// dist/src/parser/classes/livechat/items/LiveChatBanner.js
var _LiveChatBanner = class _LiveChatBanner extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "contents");
    __publicField(this, "action_id");
    __publicField(this, "viewer_is_creator");
    __publicField(this, "target_id");
    __publicField(this, "is_stackable");
    __publicField(this, "background_type");
    __publicField(this, "banner_type");
    __publicField(this, "banner_properties_is_ephemeral");
    __publicField(this, "banner_properties_auto_collapse_delay_seconds");
    this.header = parser_exports.parseItem(data.header, LiveChatBannerHeader);
    this.contents = parser_exports.parseItem(data.contents);
    this.action_id = data.actionId;
    if (Reflect.has(data, "viewerIsCreator")) {
      this.viewer_is_creator = data.viewerIsCreator;
    }
    this.target_id = data.targetId;
    this.is_stackable = data.isStackable;
    if (Reflect.has(data, "backgroundType")) {
      this.background_type = data.backgroundType;
    }
    this.banner_type = data.bannerType;
    if (Reflect.has(data, "bannerProperties") && Reflect.has(data.bannerProperties, "isEphemeral")) {
      this.banner_properties_is_ephemeral = Boolean(data.bannerProperties.isEphemeral);
    }
    if (Reflect.has(data, "bannerProperties") && Reflect.has(data.bannerProperties, "autoCollapseDelay") && Reflect.has(data.bannerProperties.autoCollapseDelay, "seconds")) {
      this.banner_properties_auto_collapse_delay_seconds = data.bannerProperties.autoCollapseDelay.seconds;
    }
  }
};
__name(_LiveChatBanner, "LiveChatBanner");
__publicField(_LiveChatBanner, "type", "LiveChatBanner");
var LiveChatBanner = _LiveChatBanner;

// dist/src/parser/classes/livechat/AddBannerToLiveChatCommand.js
var _AddBannerToLiveChatCommand = class _AddBannerToLiveChatCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "banner");
    this.banner = parser_exports.parseItem(data.bannerRenderer, LiveChatBanner);
  }
};
__name(_AddBannerToLiveChatCommand, "AddBannerToLiveChatCommand");
__publicField(_AddBannerToLiveChatCommand, "type", "AddBannerToLiveChatCommand");
var AddBannerToLiveChatCommand = _AddBannerToLiveChatCommand;

// dist/src/parser/classes/livechat/AddChatItemAction.js
var _AddChatItemAction = class _AddChatItemAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "item");
    __publicField(this, "client_id");
    this.item = parser_exports.parseItem(data.item);
    if (Reflect.has(data, "clientId")) {
      this.client_id = data.clientId;
    }
  }
};
__name(_AddChatItemAction, "AddChatItemAction");
__publicField(_AddChatItemAction, "type", "AddChatItemAction");
var AddChatItemAction = _AddChatItemAction;

// dist/src/parser/classes/livechat/AddLiveChatTickerItemAction.js
var _AddLiveChatTickerItemAction = class _AddLiveChatTickerItemAction extends YTNode {
  // TODO: check this assumption.
  constructor(data) {
    super();
    __publicField(this, "item");
    __publicField(this, "duration_sec");
    this.item = parser_exports.parseItem(data.item);
    this.duration_sec = data.durationSec;
  }
};
__name(_AddLiveChatTickerItemAction, "AddLiveChatTickerItemAction");
__publicField(_AddLiveChatTickerItemAction, "type", "AddLiveChatTickerItemAction");
var AddLiveChatTickerItemAction = _AddLiveChatTickerItemAction;

// dist/src/parser/classes/livechat/DimChatItemAction.js
var _DimChatItemAction = class _DimChatItemAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "client_assigned_id");
    this.client_assigned_id = data.clientAssignedId;
  }
};
__name(_DimChatItemAction, "DimChatItemAction");
__publicField(_DimChatItemAction, "type", "DimChatItemAction");
var DimChatItemAction = _DimChatItemAction;

// dist/src/parser/classes/livechat/items/BumperUserEduContentView.js
var _BumperUserEduContentView = class _BumperUserEduContentView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "image_name");
    __publicField(this, "image_color");
    this.text = Text2.fromAttributed(data.text);
    this.image_name = data.image.sources[0].clientResource.imageName;
    this.image_color = data.image.sources[0].clientResource.imageColor;
  }
};
__name(_BumperUserEduContentView, "BumperUserEduContentView");
__publicField(_BumperUserEduContentView, "type", "BumperUserEduContentView");
var BumperUserEduContentView = _BumperUserEduContentView;

// dist/src/parser/classes/livechat/items/CreatorHeartView.js
var _CreatorHeartView = class _CreatorHeartView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "creator_thumbnail");
    __publicField(this, "hearted_icon_name");
    __publicField(this, "unhearted_icon_name");
    __publicField(this, "unhearted_icon_processor");
    __publicField(this, "hearted_hover_text");
    __publicField(this, "hearted_accessibility_label");
    __publicField(this, "unhearted_accessibility_label");
    __publicField(this, "engagement_state_key");
    this.creator_thumbnail = Thumbnail.fromResponse(data.creatorThumbnail);
    this.hearted_icon_name = data.heartedIcon.sources[0].clientResource.imageName;
    this.unhearted_icon_name = data.unheartedIcon.sources[0].clientResource.imageName;
    this.unhearted_icon_processor = {
      border_image_processor: {
        image_tint: {
          color: data.unheartedIcon.processor.borderImageProcessor.imageTint.color
        }
      }
    };
    this.hearted_hover_text = data.heartedHoverText;
    this.hearted_accessibility_label = data.heartedAccessibilityLabel;
    this.unhearted_accessibility_label = data.unheartedAccessibilityLabel;
    this.engagement_state_key = data.engagementStateKey;
  }
};
__name(_CreatorHeartView, "CreatorHeartView");
__publicField(_CreatorHeartView, "type", "CreatorHeartView");
var CreatorHeartView = _CreatorHeartView;

// dist/src/parser/classes/livechat/items/LiveChatAutoModMessage.js
var _LiveChatAutoModMessage = class _LiveChatAutoModMessage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "menu_endpoint");
    __publicField(this, "moderation_buttons");
    __publicField(this, "auto_moderated_item");
    __publicField(this, "header_text");
    __publicField(this, "timestamp");
    __publicField(this, "id");
    this.menu_endpoint = new NavigationEndpoint(data.contextMenuEndpoint);
    this.moderation_buttons = parser_exports.parseArray(data.moderationButtons, Button);
    this.auto_moderated_item = parser_exports.parseItem(data.autoModeratedItem);
    this.header_text = new Text2(data.headerText);
    this.timestamp = Math.floor(parseInt(data.timestampUsec) / 1e3);
    this.id = data.id;
  }
};
__name(_LiveChatAutoModMessage, "LiveChatAutoModMessage");
__publicField(_LiveChatAutoModMessage, "type", "LiveChatAutoModMessage");
var LiveChatAutoModMessage = _LiveChatAutoModMessage;

// dist/src/parser/classes/livechat/items/LiveChatBannerChatSummary.js
var _LiveChatBannerChatSummary = class _LiveChatBannerChatSummary extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "chat_summary");
    __publicField(this, "icon_type");
    __publicField(this, "like_feedback_button");
    __publicField(this, "dislike_feedback_button");
    this.id = data.liveChatSummaryId;
    this.chat_summary = new Text2(data.chatSummary);
    this.icon_type = data.icon.iconType;
    this.like_feedback_button = parser_exports.parseItem(data.likeFeedbackButton, ToggleButtonView);
    this.dislike_feedback_button = parser_exports.parseItem(data.dislikeFeedbackButton, ToggleButtonView);
  }
};
__name(_LiveChatBannerChatSummary, "LiveChatBannerChatSummary");
__publicField(_LiveChatBannerChatSummary, "type", "LiveChatBannerChatSummary");
var LiveChatBannerChatSummary = _LiveChatBannerChatSummary;

// dist/src/parser/classes/livechat/items/LiveChatBannerPoll.js
var _LiveChatBannerPoll = class _LiveChatBannerPoll extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "poll_question");
    __publicField(this, "author_photo");
    __publicField(this, "choices");
    __publicField(this, "collapsed_state_entity_key");
    __publicField(this, "live_chat_poll_state_entity_key");
    __publicField(this, "context_menu_button");
    this.poll_question = new Text2(data.pollQuestion);
    this.author_photo = Thumbnail.fromResponse(data.authorPhoto);
    this.choices = data.pollChoices.map((choice) => ({
      option_id: choice.pollOptionId,
      text: new Text2(choice.text).toString()
      // XXX: This toString should probably not be used here.
    }));
    this.collapsed_state_entity_key = data.collapsedStateEntityKey;
    this.live_chat_poll_state_entity_key = data.liveChatPollStateEntityKey;
    this.context_menu_button = parser_exports.parseItem(data.contextMenuButton, Button);
  }
};
__name(_LiveChatBannerPoll, "LiveChatBannerPoll");
__publicField(_LiveChatBannerPoll, "type", "LiveChatBannerPoll");
var LiveChatBannerPoll = _LiveChatBannerPoll;

// dist/src/parser/classes/livechat/items/LiveChatBannerRedirect.js
var _LiveChatBannerRedirect = class _LiveChatBannerRedirect extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "banner_message");
    __publicField(this, "author_photo");
    __publicField(this, "inline_action_button");
    __publicField(this, "context_menu_button");
    this.banner_message = new Text2(data.bannerMessage);
    this.author_photo = Thumbnail.fromResponse(data.authorPhoto);
    this.inline_action_button = parser_exports.parseItem(data.inlineActionButton, Button);
    this.context_menu_button = parser_exports.parseItem(data.contextMenuButton, Button);
  }
};
__name(_LiveChatBannerRedirect, "LiveChatBannerRedirect");
__publicField(_LiveChatBannerRedirect, "type", "LiveChatBannerRedirect");
var LiveChatBannerRedirect = _LiveChatBannerRedirect;

// dist/src/parser/classes/livechat/items/LiveChatItemBumperView.js
var _LiveChatItemBumperView = class _LiveChatItemBumperView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content");
    this.content = parser_exports.parseItem(data.content, BumperUserEduContentView);
  }
};
__name(_LiveChatItemBumperView, "LiveChatItemBumperView");
__publicField(_LiveChatItemBumperView, "type", "LiveChatItemBumperView");
var LiveChatItemBumperView = _LiveChatItemBumperView;

// dist/src/parser/classes/livechat/items/LiveChatMembershipItem.js
var _LiveChatMembershipItem = class _LiveChatMembershipItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "timestamp");
    __publicField(this, "timestamp_usec");
    __publicField(this, "timestamp_text");
    __publicField(this, "header_primary_text");
    __publicField(this, "header_subtext");
    __publicField(this, "message");
    __publicField(this, "author");
    __publicField(this, "menu_endpoint");
    __publicField(this, "context_menu_accessibility_label");
    this.id = data.id;
    this.timestamp = Math.floor(parseInt(data.timestampUsec) / 1e3);
    this.timestamp_usec = data.timestampUsec;
    if (Reflect.has(data, "timestampText")) {
      this.timestamp_text = new Text2(data.timestampText);
    }
    if (Reflect.has(data, "headerPrimaryText")) {
      this.header_primary_text = new Text2(data.headerPrimaryText);
    }
    this.header_subtext = new Text2(data.headerSubtext);
    if (Reflect.has(data, "message")) {
      this.message = new Text2(data.message);
    }
    this.author = new Author(data.authorName, data.authorBadges, data.authorPhoto, data.authorExternalChannelId);
    this.menu_endpoint = new NavigationEndpoint(data.contextMenuEndpoint);
    this.context_menu_accessibility_label = data.contextMenuAccessibility.accessibilityData.label;
  }
};
__name(_LiveChatMembershipItem, "LiveChatMembershipItem");
__publicField(_LiveChatMembershipItem, "type", "LiveChatMembershipItem");
var LiveChatMembershipItem = _LiveChatMembershipItem;

// dist/src/parser/classes/livechat/items/LiveChatModeChangeMessage.js
var _LiveChatModeChangeMessage = class _LiveChatModeChangeMessage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "icon_type");
    __publicField(this, "text");
    __publicField(this, "subtext");
    __publicField(this, "timestamp");
    __publicField(this, "timestamp_usec");
    __publicField(this, "timestamp_text");
    this.id = data.id;
    this.icon_type = data.icon.iconType;
    this.text = new Text2(data.text);
    this.subtext = new Text2(data.subtext);
    this.timestamp = Math.floor(parseInt(data.timestampUsec) / 1e3);
    this.timestamp_usec = data.timestampUsec;
    this.timestamp_text = new Text2(data.timestampText);
  }
};
__name(_LiveChatModeChangeMessage, "LiveChatModeChangeMessage");
__publicField(_LiveChatModeChangeMessage, "type", "LiveChatModeChangeMessage");
var LiveChatModeChangeMessage = _LiveChatModeChangeMessage;

// dist/src/parser/classes/livechat/items/PdgReplyButtonView.js
var _PdgReplyButtonView = class _PdgReplyButtonView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "reply_button");
    __publicField(this, "reply_count_entity_key");
    __publicField(this, "reply_count_placeholder");
    this.reply_button = parser_exports.parseItem(data.replyButton, ButtonView);
    this.reply_count_entity_key = data.replyCountEntityKey;
    this.reply_count_placeholder = Text2.fromAttributed(data.replyCountPlaceholder);
  }
};
__name(_PdgReplyButtonView, "PdgReplyButtonView");
__publicField(_PdgReplyButtonView, "type", "PdgReplyButtonView");
var PdgReplyButtonView = _PdgReplyButtonView;

// dist/src/parser/classes/livechat/items/LiveChatPaidMessage.js
var _LiveChatPaidMessage = class _LiveChatPaidMessage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "message");
    __publicField(this, "author");
    __publicField(this, "author_name_text_color");
    __publicField(this, "header_background_color");
    __publicField(this, "header_text_color");
    __publicField(this, "body_background_color");
    __publicField(this, "body_text_color");
    __publicField(this, "purchase_amount");
    __publicField(this, "menu_endpoint");
    __publicField(this, "context_menu_accessibility_label");
    __publicField(this, "timestamp");
    __publicField(this, "timestamp_usec");
    __publicField(this, "timestamp_text");
    __publicField(this, "timestamp_color");
    __publicField(this, "header_overlay_image");
    __publicField(this, "text_input_background_color");
    __publicField(this, "lower_bumper");
    __publicField(this, "creator_heart_button");
    __publicField(this, "is_v2_style");
    __publicField(this, "reply_button");
    this.id = data.id;
    this.message = new Text2(data.message);
    this.author = new Author(data.authorName, data.authorBadges, data.authorPhoto, data.authorExternalChannelId);
    this.author_name_text_color = data.authorNameTextColor;
    this.header_background_color = data.headerBackgroundColor;
    this.header_text_color = data.headerTextColor;
    this.body_background_color = data.bodyBackgroundColor;
    this.body_text_color = data.bodyTextColor;
    this.purchase_amount = new Text2(data.purchaseAmountText).toString();
    this.menu_endpoint = new NavigationEndpoint(data.contextMenuEndpoint);
    this.context_menu_accessibility_label = data.contextMenuAccessibility.accessibilityData.label;
    this.timestamp = Math.floor(parseInt(data.timestampUsec) / 1e3);
    this.timestamp_usec = data.timestampUsec;
    if (Reflect.has(data, "timestampText")) {
      this.timestamp_text = new Text2(data.timestampText).toString();
    }
    this.timestamp_color = data.timestampColor;
    if (Reflect.has(data, "headerOverlayImage")) {
      this.header_overlay_image = Thumbnail.fromResponse(data.headerOverlayImage);
    }
    this.text_input_background_color = data.textInputBackgroundColor;
    this.lower_bumper = parser_exports.parseItem(data.lowerBumper, LiveChatItemBumperView);
    this.creator_heart_button = parser_exports.parseItem(data.creatorHeartButton, CreatorHeartView);
    this.is_v2_style = data.isV2Style;
    this.reply_button = parser_exports.parseItem(data.replyButton, PdgReplyButtonView);
  }
};
__name(_LiveChatPaidMessage, "LiveChatPaidMessage");
__publicField(_LiveChatPaidMessage, "type", "LiveChatPaidMessage");
var LiveChatPaidMessage = _LiveChatPaidMessage;

// dist/src/parser/classes/livechat/items/LiveChatPaidSticker.js
var _LiveChatPaidSticker = class _LiveChatPaidSticker extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "author");
    __publicField(this, "money_chip_background_color");
    __publicField(this, "money_chip_text_color");
    __publicField(this, "background_color");
    __publicField(this, "author_name_text_color");
    __publicField(this, "sticker");
    __publicField(this, "sticker_accessibility_label");
    __publicField(this, "sticker_display_width");
    __publicField(this, "sticker_display_height");
    __publicField(this, "purchase_amount");
    __publicField(this, "menu_endpoint");
    __publicField(this, "context_menu");
    __publicField(this, "context_menu_accessibility_label");
    __publicField(this, "timestamp");
    __publicField(this, "timestamp_usec");
    __publicField(this, "is_v2_style");
    this.id = data.id;
    this.author = new Author(data.authorName, data.authorBadges, data.authorPhoto, data.authorExternalChannelId);
    this.money_chip_background_color = data.moneyChipBackgroundColor;
    this.money_chip_text_color = data.moneyChipTextColor;
    this.background_color = data.backgroundColor;
    this.author_name_text_color = data.authorNameTextColor;
    this.sticker = Thumbnail.fromResponse(data.sticker);
    this.sticker_accessibility_label = data.sticker.accessibility.accessibilityData.label;
    this.sticker_display_width = data.stickerDisplayWidth;
    this.sticker_display_height = data.stickerDisplayHeight;
    this.purchase_amount = new Text2(data.purchaseAmountText).toString();
    this.menu_endpoint = new NavigationEndpoint(data.contextMenuEndpoint);
    this.context_menu = this.menu_endpoint;
    this.context_menu_accessibility_label = data.contextMenuAccessibility.accessibilityData.label;
    this.timestamp = Math.floor(parseInt(data.timestampUsec) / 1e3);
    this.timestamp_usec = data.timestampUsec;
    this.is_v2_style = data.isV2Style;
  }
};
__name(_LiveChatPaidSticker, "LiveChatPaidSticker");
__publicField(_LiveChatPaidSticker, "type", "LiveChatPaidSticker");
var LiveChatPaidSticker = _LiveChatPaidSticker;

// dist/src/parser/classes/livechat/items/LiveChatPlaceholderItem.js
var _LiveChatPlaceholderItem = class _LiveChatPlaceholderItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "timestamp");
    this.id = data.id;
    this.timestamp = Math.floor(parseInt(data.timestampUsec) / 1e3);
  }
};
__name(_LiveChatPlaceholderItem, "LiveChatPlaceholderItem");
__publicField(_LiveChatPlaceholderItem, "type", "LiveChatPlaceholderItem");
var LiveChatPlaceholderItem = _LiveChatPlaceholderItem;

// dist/src/parser/classes/livechat/items/LiveChatProductItem.js
var _LiveChatProductItem = class _LiveChatProductItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "accessibility_title");
    __publicField(this, "thumbnail");
    __publicField(this, "price");
    __publicField(this, "vendor_name");
    __publicField(this, "from_vendor_text");
    __publicField(this, "information_button");
    __publicField(this, "endpoint");
    __publicField(this, "creator_message");
    __publicField(this, "creator_name");
    __publicField(this, "author_photo");
    __publicField(this, "information_dialog");
    __publicField(this, "is_verified");
    __publicField(this, "creator_custom_message");
    this.title = data.title;
    this.accessibility_title = data.accessibilityTitle;
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.price = data.price;
    this.vendor_name = data.vendorName;
    this.from_vendor_text = data.fromVendorText;
    this.information_button = parser_exports.parseItem(data.informationButton);
    this.endpoint = new NavigationEndpoint(data.onClickCommand);
    this.creator_message = data.creatorMessage;
    this.creator_name = data.creatorName;
    this.author_photo = Thumbnail.fromResponse(data.authorPhoto);
    this.information_dialog = parser_exports.parseItem(data.informationDialog);
    this.is_verified = data.isVerified;
    this.creator_custom_message = new Text2(data.creatorCustomMessage);
  }
};
__name(_LiveChatProductItem, "LiveChatProductItem");
__publicField(_LiveChatProductItem, "type", "LiveChatProductItem");
var LiveChatProductItem = _LiveChatProductItem;

// dist/src/parser/classes/livechat/items/LiveChatRestrictedParticipation.js
var _LiveChatRestrictedParticipation = class _LiveChatRestrictedParticipation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "message");
    __publicField(this, "icon_type");
    this.message = new Text2(data.message);
    if (Reflect.has(data, "icon") && Reflect.has(data.icon, "iconType")) {
      this.icon_type = data.icon.iconType;
    }
  }
};
__name(_LiveChatRestrictedParticipation, "LiveChatRestrictedParticipation");
__publicField(_LiveChatRestrictedParticipation, "type", "LiveChatRestrictedParticipation");
var LiveChatRestrictedParticipation = _LiveChatRestrictedParticipation;

// dist/src/parser/classes/LiveChatAuthorBadge.js
var _LiveChatAuthorBadge = class _LiveChatAuthorBadge extends MetadataBadge {
  constructor(data) {
    super(data);
    __publicField(this, "custom_thumbnail");
    this.custom_thumbnail = Thumbnail.fromResponse(data.customThumbnail);
  }
};
__name(_LiveChatAuthorBadge, "LiveChatAuthorBadge");
__publicField(_LiveChatAuthorBadge, "type", "LiveChatAuthorBadge");
var LiveChatAuthorBadge = _LiveChatAuthorBadge;

// dist/src/parser/classes/livechat/items/LiveChatSponsorshipsHeader.js
var _LiveChatSponsorshipsHeader = class _LiveChatSponsorshipsHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "author_name");
    __publicField(this, "author_photo");
    __publicField(this, "author_badges");
    __publicField(this, "primary_text");
    __publicField(this, "menu_endpoint");
    __publicField(this, "context_menu_accessibility_label");
    __publicField(this, "image");
    this.author_name = new Text2(data.authorName);
    this.author_photo = Thumbnail.fromResponse(data.authorPhoto);
    this.author_badges = parser_exports.parseArray(data.authorBadges, LiveChatAuthorBadge);
    this.primary_text = new Text2(data.primaryText);
    this.menu_endpoint = new NavigationEndpoint(data.contextMenuEndpoint);
    this.context_menu_accessibility_label = data.contextMenuAccessibility.accessibilityData.label;
    this.image = Thumbnail.fromResponse(data.image);
  }
};
__name(_LiveChatSponsorshipsHeader, "LiveChatSponsorshipsHeader");
__publicField(_LiveChatSponsorshipsHeader, "type", "LiveChatSponsorshipsHeader");
var LiveChatSponsorshipsHeader = _LiveChatSponsorshipsHeader;

// dist/src/parser/classes/livechat/items/LiveChatSponsorshipsGiftPurchaseAnnouncement.js
var _LiveChatSponsorshipsGiftPurchaseAnnouncement = class _LiveChatSponsorshipsGiftPurchaseAnnouncement extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "timestamp_usec");
    __publicField(this, "author_external_channel_id");
    __publicField(this, "header");
    this.id = data.id;
    this.timestamp_usec = data.timestampUsec;
    this.author_external_channel_id = data.authorExternalChannelId;
    this.header = parser_exports.parseItem(data.header, LiveChatSponsorshipsHeader);
  }
};
__name(_LiveChatSponsorshipsGiftPurchaseAnnouncement, "LiveChatSponsorshipsGiftPurchaseAnnouncement");
__publicField(_LiveChatSponsorshipsGiftPurchaseAnnouncement, "type", "LiveChatSponsorshipsGiftPurchaseAnnouncement");
var LiveChatSponsorshipsGiftPurchaseAnnouncement = _LiveChatSponsorshipsGiftPurchaseAnnouncement;

// dist/src/parser/classes/livechat/items/LiveChatSponsorshipsGiftRedemptionAnnouncement.js
var _LiveChatSponsorshipsGiftRedemptionAnnouncement = class _LiveChatSponsorshipsGiftRedemptionAnnouncement extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "timestamp_usec");
    __publicField(this, "timestamp_text");
    __publicField(this, "author");
    __publicField(this, "message");
    __publicField(this, "menu_endpoint");
    __publicField(this, "context_menu_accessibility_label");
    this.id = data.id;
    this.timestamp_usec = data.timestampUsec;
    this.timestamp_text = new Text2(data.timestampText);
    this.author = new Author(data.authorName, data.authorBadges, data.authorPhoto, data.authorExternalChannelId);
    this.message = new Text2(data.message);
    this.menu_endpoint = new NavigationEndpoint(data.contextMenuEndpoint);
    this.context_menu_accessibility_label = data.contextMenuAccessibility.accessibilityData.label;
  }
};
__name(_LiveChatSponsorshipsGiftRedemptionAnnouncement, "LiveChatSponsorshipsGiftRedemptionAnnouncement");
__publicField(_LiveChatSponsorshipsGiftRedemptionAnnouncement, "type", "LiveChatSponsorshipsGiftRedemptionAnnouncement");
var LiveChatSponsorshipsGiftRedemptionAnnouncement = _LiveChatSponsorshipsGiftRedemptionAnnouncement;

// dist/src/parser/classes/livechat/items/LiveChatTextMessage.js
var _LiveChatTextMessage = class _LiveChatTextMessage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "message");
    __publicField(this, "inline_action_buttons");
    __publicField(this, "timestamp");
    __publicField(this, "timestamp_usec");
    __publicField(this, "timestamp_text");
    __publicField(this, "author");
    __publicField(this, "menu_endpoint");
    __publicField(this, "context_menu_accessibility_label");
    __publicField(this, "before_content_buttons");
    this.id = data.id;
    this.message = new Text2(data.message);
    this.inline_action_buttons = parser_exports.parseArray(data.inlineActionButtons, Button);
    this.timestamp = Math.floor(parseInt(data.timestampUsec) / 1e3);
    this.timestamp_usec = data.timestampUsec;
    if (Reflect.has(data, "timestampText")) {
      this.timestamp_text = new Text2(data.timestampText).toString();
    }
    this.author = new Author(data.authorName, data.authorBadges, data.authorPhoto, data.authorExternalChannelId);
    if (Reflect.has(data, "contextMenuEndpoint")) {
      this.menu_endpoint = new NavigationEndpoint(data.contextMenuEndpoint);
    }
    if (Reflect.has(data, "contextMenuAccessibility") && Reflect.has(data.contextMenuAccessibility, "accessibilityData") && Reflect.has(data.contextMenuAccessibility.accessibilityData, "label")) {
      this.context_menu_accessibility_label = data.contextMenuAccessibility.accessibilityData.label;
    }
    this.before_content_buttons = parser_exports.parseArray(data.beforeContentButtons, ButtonView);
  }
};
__name(_LiveChatTextMessage, "LiveChatTextMessage");
__publicField(_LiveChatTextMessage, "type", "LiveChatTextMessage");
var LiveChatTextMessage = _LiveChatTextMessage;

// dist/src/parser/classes/livechat/items/LiveChatTickerPaidMessageItem.js
var _LiveChatTickerPaidMessageItem = class _LiveChatTickerPaidMessageItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "author");
    __publicField(this, "amount");
    __publicField(this, "amount_text_color");
    __publicField(this, "start_background_color");
    __publicField(this, "end_background_color");
    __publicField(this, "duration_sec");
    __publicField(this, "full_duration_sec");
    __publicField(this, "show_item");
    __publicField(this, "show_item_endpoint");
    __publicField(this, "animation_origin");
    __publicField(this, "open_engagement_panel_command");
    this.id = data.id;
    this.author = new Author(data.authorName || data.authorUsername, data.authorBadges, data.authorPhoto, data.authorExternalChannelId);
    if (Reflect.has(data, "amount")) {
      this.amount = new Text2(data.amount);
    }
    this.amount_text_color = data.amountTextColor;
    this.start_background_color = data.startBackgroundColor;
    this.end_background_color = data.endBackgroundColor;
    this.duration_sec = data.durationSec;
    this.full_duration_sec = data.fullDurationSec;
    this.show_item = parser_exports.parseItem(data.showItemEndpoint?.showLiveChatItemEndpoint?.renderer);
    this.show_item_endpoint = new NavigationEndpoint(data.showItemEndpoint);
    this.animation_origin = data.animationOrigin;
    this.open_engagement_panel_command = new NavigationEndpoint(data.openEngagementPanelCommand);
  }
};
__name(_LiveChatTickerPaidMessageItem, "LiveChatTickerPaidMessageItem");
__publicField(_LiveChatTickerPaidMessageItem, "type", "LiveChatTickerPaidMessageItem");
var LiveChatTickerPaidMessageItem = _LiveChatTickerPaidMessageItem;

// dist/src/parser/classes/livechat/items/LiveChatTickerPaidStickerItem.js
var _LiveChatTickerPaidStickerItem = class _LiveChatTickerPaidStickerItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "author_external_channel_id");
    __publicField(this, "author_photo");
    __publicField(this, "start_background_color");
    __publicField(this, "end_background_color");
    __publicField(this, "duration_sec");
    __publicField(this, "full_duration_sec");
    __publicField(this, "show_item");
    __publicField(this, "show_item_endpoint");
    __publicField(this, "ticker_thumbnails");
    this.id = data.id;
    this.author_external_channel_id = data.authorExternalChannelId;
    this.author_photo = Thumbnail.fromResponse(data.authorPhoto);
    this.start_background_color = data.startBackgroundColor;
    this.end_background_color = data.endBackgroundColor;
    this.duration_sec = data.durationSec;
    this.full_duration_sec = data.fullDurationSec;
    this.show_item = parser_exports.parseItem(data.showItemEndpoint?.showLiveChatItemEndpoint?.renderer);
    this.show_item_endpoint = new NavigationEndpoint(data.showItemEndpoint);
    this.ticker_thumbnails = data.tickerThumbnails.map((item) => ({
      thumbnails: Thumbnail.fromResponse(item),
      label: item?.accessibility?.accessibilityData?.label
    }));
  }
};
__name(_LiveChatTickerPaidStickerItem, "LiveChatTickerPaidStickerItem");
__publicField(_LiveChatTickerPaidStickerItem, "type", "LiveChatTickerPaidStickerItem");
var LiveChatTickerPaidStickerItem = _LiveChatTickerPaidStickerItem;

// dist/src/parser/classes/livechat/items/LiveChatTickerSponsorItem.js
var _LiveChatTickerSponsorItem = class _LiveChatTickerSponsorItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "detail");
    __publicField(this, "author");
    __publicField(this, "duration_sec");
    this.id = data.id;
    this.detail = new Text2(data.detailText);
    this.author = new Author(data.authorName, data.authorBadges, data.sponsorPhoto, data.authorExternalChannelId);
    this.duration_sec = data.durationSec;
  }
};
__name(_LiveChatTickerSponsorItem, "LiveChatTickerSponsorItem");
__publicField(_LiveChatTickerSponsorItem, "type", "LiveChatTickerSponsorItem");
var LiveChatTickerSponsorItem = _LiveChatTickerSponsorItem;

// dist/src/parser/classes/livechat/items/LiveChatViewerEngagementMessage.js
var _LiveChatViewerEngagementMessage = class _LiveChatViewerEngagementMessage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "timestamp");
    __publicField(this, "timestamp_usec");
    __publicField(this, "icon_type");
    __publicField(this, "message");
    __publicField(this, "action_button");
    __publicField(this, "menu_endpoint");
    __publicField(this, "context_menu_accessibility_label");
    this.id = data.id;
    if (Reflect.has(data, "timestampUsec")) {
      this.timestamp = Math.floor(parseInt(data.timestampUsec) / 1e3);
      this.timestamp_usec = data.timestampUsec;
    }
    if (Reflect.has(data, "icon") && Reflect.has(data.icon, "iconType")) {
      this.icon_type = data.icon.iconType;
    }
    this.message = new Text2(data.message);
    this.action_button = parser_exports.parseItem(data.actionButton);
    if (Reflect.has(data, "contextMenuEndpoint")) {
      this.menu_endpoint = new NavigationEndpoint(data.contextMenuEndpoint);
    }
    if (Reflect.has(data, "contextMenuAccessibility") && Reflect.has(data.contextMenuAccessibility, "accessibilityData") && Reflect.has(data.contextMenuAccessibility.accessibilityData, "label")) {
      this.context_menu_accessibility_label = data.contextMenuAccessibility.accessibilityData.label;
    }
  }
};
__name(_LiveChatViewerEngagementMessage, "LiveChatViewerEngagementMessage");
__publicField(_LiveChatViewerEngagementMessage, "type", "LiveChatViewerEngagementMessage");
var LiveChatViewerEngagementMessage = _LiveChatViewerEngagementMessage;

// dist/src/parser/classes/livechat/items/PollHeader.js
var _PollHeader = class _PollHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "poll_question");
    __publicField(this, "thumbnails");
    __publicField(this, "metadata");
    __publicField(this, "live_chat_poll_type");
    __publicField(this, "context_menu_button");
    this.poll_question = new Text2(data.pollQuestion);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.metadata = new Text2(data.metadataText);
    this.live_chat_poll_type = data.liveChatPollType;
    this.context_menu_button = parser_exports.parseItem(data.contextMenuButton, Button);
  }
};
__name(_PollHeader, "PollHeader");
__publicField(_PollHeader, "type", "PollHeader");
var PollHeader = _PollHeader;

// dist/src/parser/classes/livechat/LiveChatActionPanel.js
var _LiveChatActionPanel = class _LiveChatActionPanel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "contents");
    __publicField(this, "target_id");
    this.id = data.id;
    this.contents = parser_exports.parse(data.contents);
    this.target_id = data.targetId;
  }
};
__name(_LiveChatActionPanel, "LiveChatActionPanel");
__publicField(_LiveChatActionPanel, "type", "LiveChatActionPanel");
var LiveChatActionPanel = _LiveChatActionPanel;

// dist/src/parser/classes/livechat/MarkChatItemAsDeletedAction.js
var _MarkChatItemAsDeletedAction = class _MarkChatItemAsDeletedAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "deleted_state_message");
    __publicField(this, "target_item_id");
    this.deleted_state_message = new Text2(data.deletedStateMessage);
    this.target_item_id = data.targetItemId;
  }
};
__name(_MarkChatItemAsDeletedAction, "MarkChatItemAsDeletedAction");
__publicField(_MarkChatItemAsDeletedAction, "type", "MarkChatItemAsDeletedAction");
var MarkChatItemAsDeletedAction = _MarkChatItemAsDeletedAction;

// dist/src/parser/classes/livechat/MarkChatItemsByAuthorAsDeletedAction.js
var _MarkChatItemsByAuthorAsDeletedAction = class _MarkChatItemsByAuthorAsDeletedAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "deleted_state_message");
    __publicField(this, "external_channel_id");
    this.deleted_state_message = new Text2(data.deletedStateMessage);
    this.external_channel_id = data.externalChannelId;
  }
};
__name(_MarkChatItemsByAuthorAsDeletedAction, "MarkChatItemsByAuthorAsDeletedAction");
__publicField(_MarkChatItemsByAuthorAsDeletedAction, "type", "MarkChatItemsByAuthorAsDeletedAction");
var MarkChatItemsByAuthorAsDeletedAction = _MarkChatItemsByAuthorAsDeletedAction;

// dist/src/parser/classes/livechat/RemoveBannerForLiveChatCommand.js
var _RemoveBannerForLiveChatCommand = class _RemoveBannerForLiveChatCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "target_action_id");
    this.target_action_id = data.targetActionId;
  }
};
__name(_RemoveBannerForLiveChatCommand, "RemoveBannerForLiveChatCommand");
__publicField(_RemoveBannerForLiveChatCommand, "type", "RemoveBannerForLiveChatCommand");
var RemoveBannerForLiveChatCommand = _RemoveBannerForLiveChatCommand;

// dist/src/parser/classes/livechat/RemoveChatItemAction.js
var _RemoveChatItemAction = class _RemoveChatItemAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "target_item_id");
    this.target_item_id = data.targetItemId;
  }
};
__name(_RemoveChatItemAction, "RemoveChatItemAction");
__publicField(_RemoveChatItemAction, "type", "RemoveChatItemAction");
var RemoveChatItemAction = _RemoveChatItemAction;

// dist/src/parser/classes/livechat/RemoveChatItemByAuthorAction.js
var _RemoveChatItemByAuthorAction = class _RemoveChatItemByAuthorAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "external_channel_id");
    this.external_channel_id = data.externalChannelId;
  }
};
__name(_RemoveChatItemByAuthorAction, "RemoveChatItemByAuthorAction");
__publicField(_RemoveChatItemByAuthorAction, "type", "RemoveChatItemByAuthorAction");
var RemoveChatItemByAuthorAction = _RemoveChatItemByAuthorAction;

// dist/src/parser/classes/livechat/ReplaceChatItemAction.js
var _ReplaceChatItemAction = class _ReplaceChatItemAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "target_item_id");
    __publicField(this, "replacement_item");
    this.target_item_id = data.targetItemId;
    this.replacement_item = parser_exports.parseItem(data.replacementItem);
  }
};
__name(_ReplaceChatItemAction, "ReplaceChatItemAction");
__publicField(_ReplaceChatItemAction, "type", "ReplaceChatItemAction");
var ReplaceChatItemAction = _ReplaceChatItemAction;

// dist/src/parser/classes/livechat/ReplaceLiveChatAction.js
var _ReplaceLiveChatAction = class _ReplaceLiveChatAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "to_replace");
    __publicField(this, "replacement");
    this.to_replace = data.toReplace;
    this.replacement = parser_exports.parseItem(data.replacement);
  }
};
__name(_ReplaceLiveChatAction, "ReplaceLiveChatAction");
__publicField(_ReplaceLiveChatAction, "type", "ReplaceLiveChatAction");
var ReplaceLiveChatAction = _ReplaceLiveChatAction;

// dist/src/parser/classes/livechat/ReplayChatItemAction.js
var _ReplayChatItemAction = class _ReplayChatItemAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "actions");
    __publicField(this, "video_offset_time_msec");
    this.actions = parser_exports.parseArray(data.actions?.map((action) => {
      delete action.clickTrackingParams;
      return action;
    }));
    this.video_offset_time_msec = data.videoOffsetTimeMsec;
  }
};
__name(_ReplayChatItemAction, "ReplayChatItemAction");
__publicField(_ReplayChatItemAction, "type", "ReplayChatItemAction");
var ReplayChatItemAction = _ReplayChatItemAction;

// dist/src/parser/classes/livechat/ShowLiveChatActionPanelAction.js
var _ShowLiveChatActionPanelAction = class _ShowLiveChatActionPanelAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "panel_to_show");
    this.panel_to_show = parser_exports.parseItem(data.panelToShow, LiveChatActionPanel);
  }
};
__name(_ShowLiveChatActionPanelAction, "ShowLiveChatActionPanelAction");
__publicField(_ShowLiveChatActionPanelAction, "type", "ShowLiveChatActionPanelAction");
var ShowLiveChatActionPanelAction = _ShowLiveChatActionPanelAction;

// dist/src/parser/classes/livechat/ShowLiveChatDialogAction.js
var _ShowLiveChatDialogAction = class _ShowLiveChatDialogAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "dialog");
    this.dialog = parser_exports.parseItem(data.dialog);
  }
};
__name(_ShowLiveChatDialogAction, "ShowLiveChatDialogAction");
__publicField(_ShowLiveChatDialogAction, "type", "ShowLiveChatDialogAction");
var ShowLiveChatDialogAction = _ShowLiveChatDialogAction;

// dist/src/parser/classes/livechat/ShowLiveChatTooltipCommand.js
var _ShowLiveChatTooltipCommand = class _ShowLiveChatTooltipCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "tooltip");
    this.tooltip = parser_exports.parseItem(data.tooltip);
  }
};
__name(_ShowLiveChatTooltipCommand, "ShowLiveChatTooltipCommand");
__publicField(_ShowLiveChatTooltipCommand, "type", "ShowLiveChatTooltipCommand");
var ShowLiveChatTooltipCommand = _ShowLiveChatTooltipCommand;

// dist/src/parser/classes/livechat/UpdateDateTextAction.js
var _UpdateDateTextAction = class _UpdateDateTextAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "date_text");
    this.date_text = new Text2(data.dateText).toString();
  }
};
__name(_UpdateDateTextAction, "UpdateDateTextAction");
__publicField(_UpdateDateTextAction, "type", "UpdateDateTextAction");
var UpdateDateTextAction = _UpdateDateTextAction;

// dist/src/parser/classes/livechat/UpdateDescriptionAction.js
var _UpdateDescriptionAction = class _UpdateDescriptionAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "description");
    this.description = new Text2(data.description);
  }
};
__name(_UpdateDescriptionAction, "UpdateDescriptionAction");
__publicField(_UpdateDescriptionAction, "type", "UpdateDescriptionAction");
var UpdateDescriptionAction = _UpdateDescriptionAction;

// dist/src/parser/classes/livechat/UpdateLiveChatPollAction.js
var _UpdateLiveChatPollAction = class _UpdateLiveChatPollAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "poll_to_update");
    this.poll_to_update = parser_exports.parseItem(data.pollToUpdate);
  }
};
__name(_UpdateLiveChatPollAction, "UpdateLiveChatPollAction");
__publicField(_UpdateLiveChatPollAction, "type", "UpdateLiveChatPollAction");
var UpdateLiveChatPollAction = _UpdateLiveChatPollAction;

// dist/src/parser/classes/livechat/UpdateTitleAction.js
var _UpdateTitleAction = class _UpdateTitleAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = new Text2(data.title);
  }
};
__name(_UpdateTitleAction, "UpdateTitleAction");
__publicField(_UpdateTitleAction, "type", "UpdateTitleAction");
var UpdateTitleAction = _UpdateTitleAction;

// dist/src/parser/classes/livechat/UpdateToggleButtonTextAction.js
var _UpdateToggleButtonTextAction = class _UpdateToggleButtonTextAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "default_text");
    __publicField(this, "toggled_text");
    __publicField(this, "button_id");
    this.default_text = new Text2(data.defaultText).toString();
    this.toggled_text = new Text2(data.toggledText).toString();
    this.button_id = data.buttonId;
  }
};
__name(_UpdateToggleButtonTextAction, "UpdateToggleButtonTextAction");
__publicField(_UpdateToggleButtonTextAction, "type", "UpdateToggleButtonTextAction");
var UpdateToggleButtonTextAction = _UpdateToggleButtonTextAction;

// dist/src/parser/classes/VideoViewCount.js
var _VideoViewCount = class _VideoViewCount extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "original_view_count");
    __publicField(this, "unlabeled_view_count_value");
    __publicField(this, "short_view_count");
    __publicField(this, "extra_short_view_count");
    __publicField(this, "view_count");
    __publicField(this, "is_live");
    if ("originalViewCount" in data) {
      this.original_view_count = parseInt(data.originalViewCount);
    }
    if ("unlabeledViewCountValue" in data) {
      this.unlabeled_view_count_value = new Text2(data.unlabeledViewCountValue);
    }
    if ("shortViewCount" in data) {
      this.short_view_count = new Text2(data.shortViewCount);
    }
    if ("extraShortViewCount" in data) {
      this.extra_short_view_count = new Text2(data.extraShortViewCount);
    }
    if ("viewCount" in data) {
      this.view_count = new Text2(data.viewCount);
    }
    this.is_live = !!data.isLive;
  }
};
__name(_VideoViewCount, "VideoViewCount");
__publicField(_VideoViewCount, "type", "VideoViewCount");
var VideoViewCount = _VideoViewCount;

// dist/src/parser/classes/livechat/UpdateViewershipAction.js
var _UpdateViewershipAction = class _UpdateViewershipAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "view_count_node");
    this.view_count_node = parser_exports.parseItem(data.viewCount, VideoViewCount);
  }
  /**
   * @deprecated Use `view_count_node.view_count` instead.
   */
  get view_count() {
    return this.view_count_node?.view_count;
  }
  /**
   * @deprecated Use `view_count_node.extra_short_view_count` instead.
   */
  get extra_short_view_count() {
    return this.view_count_node?.extra_short_view_count;
  }
  /**
   * @deprecated Use `view_count_node.short_view_count` instead.
   */
  get short_view_count() {
    return this.view_count_node?.short_view_count;
  }
  /**
   * @deprecated Use `view_count_node.original_view_count` instead.
   */
  get original_view_count() {
    return this.view_count_node?.original_view_count;
  }
  /**
   * @deprecated Use `view_count_node.unlabeled_view_count_value` instead.
   */
  get unlabeled_view_count_value() {
    return this.view_count_node?.unlabeled_view_count_value;
  }
  /**
   * @deprecated Use `view_count_node.is_live` instead.
   */
  get is_live() {
    return this.view_count_node?.is_live;
  }
};
__name(_UpdateViewershipAction, "UpdateViewershipAction");
__publicField(_UpdateViewershipAction, "type", "UpdateViewershipAction");
var UpdateViewershipAction = _UpdateViewershipAction;

// dist/src/parser/classes/LiveChatDialog.js
var _LiveChatDialog = class _LiveChatDialog extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "confirm_button");
    __publicField(this, "dialog_messages");
    this.confirm_button = parser_exports.parseItem(data.confirmButton, Button);
    this.dialog_messages = data.dialogMessages.map((el) => new Text2(el));
  }
};
__name(_LiveChatDialog, "LiveChatDialog");
__publicField(_LiveChatDialog, "type", "LiveChatDialog");
var LiveChatDialog = _LiveChatDialog;

// dist/src/parser/classes/LiveChatHeader.js
var _LiveChatHeader = class _LiveChatHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "overflow_menu");
    __publicField(this, "collapse_button");
    __publicField(this, "view_selector");
    this.overflow_menu = parser_exports.parseItem(data.overflowMenu, Menu);
    this.collapse_button = parser_exports.parseItem(data.collapseButton, Button);
    this.view_selector = parser_exports.parseItem(data.viewSelector, SortFilterSubMenu);
  }
};
__name(_LiveChatHeader, "LiveChatHeader");
__publicField(_LiveChatHeader, "type", "LiveChatHeader");
var LiveChatHeader = _LiveChatHeader;

// dist/src/parser/classes/LiveChatItemList.js
var _LiveChatItemList = class _LiveChatItemList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "max_items_to_display");
    __publicField(this, "more_comments_below_button");
    this.max_items_to_display = data.maxItemsToDisplay;
    this.more_comments_below_button = parser_exports.parseItem(data.moreCommentsBelowButton, Button);
  }
};
__name(_LiveChatItemList, "LiveChatItemList");
__publicField(_LiveChatItemList, "type", "LiveChatItemList");
var LiveChatItemList = _LiveChatItemList;

// dist/src/parser/classes/LiveChatMessageInput.js
var _LiveChatMessageInput = class _LiveChatMessageInput extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "author_name");
    __publicField(this, "author_photo");
    __publicField(this, "send_button");
    __publicField(this, "target_id");
    this.author_name = new Text2(data.authorName);
    this.author_photo = Thumbnail.fromResponse(data.authorPhoto);
    this.send_button = parser_exports.parseItem(data.sendButton, Button);
    this.target_id = data.targetId;
  }
};
__name(_LiveChatMessageInput, "LiveChatMessageInput");
__publicField(_LiveChatMessageInput, "type", "LiveChatMessageInput");
var LiveChatMessageInput = _LiveChatMessageInput;

// dist/src/parser/classes/LiveChatParticipant.js
var _LiveChatParticipant = class _LiveChatParticipant extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "name");
    __publicField(this, "photo");
    __publicField(this, "badges");
    this.name = new Text2(data.authorName);
    this.photo = Thumbnail.fromResponse(data.authorPhoto);
    this.badges = parser_exports.parseArray(data.authorBadges);
  }
};
__name(_LiveChatParticipant, "LiveChatParticipant");
__publicField(_LiveChatParticipant, "type", "LiveChatParticipant");
var LiveChatParticipant = _LiveChatParticipant;

// dist/src/parser/classes/LiveChatParticipantsList.js
var _LiveChatParticipantsList = class _LiveChatParticipantsList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "participants");
    this.title = new Text2(data.title);
    this.participants = parser_exports.parseArray(data.participants, LiveChatParticipant);
  }
};
__name(_LiveChatParticipantsList, "LiveChatParticipantsList");
__publicField(_LiveChatParticipantsList, "type", "LiveChatParticipantsList");
var LiveChatParticipantsList = _LiveChatParticipantsList;

// dist/src/parser/classes/LockupMetadataView.js
var _LockupMetadataView = class _LockupMetadataView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "metadata");
    __publicField(this, "image");
    __publicField(this, "menu_button");
    this.title = Text2.fromAttributed(data.title);
    this.metadata = parser_exports.parseItem(data.metadata, ContentMetadataView);
    this.image = parser_exports.parseItem(data.image, [DecoratedAvatarView, AvatarStackView]);
    this.menu_button = parser_exports.parseItem(data.menuButton, ButtonView);
  }
};
__name(_LockupMetadataView, "LockupMetadataView");
__publicField(_LockupMetadataView, "type", "LockupMetadataView");
var LockupMetadataView = _LockupMetadataView;

// dist/src/parser/classes/LockupView.js
var _LockupView = class _LockupView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content_image");
    __publicField(this, "metadata");
    __publicField(this, "content_id");
    __publicField(this, "content_type");
    __publicField(this, "renderer_context");
    this.content_image = parser_exports.parseItem(data.contentImage, [CollectionThumbnailView, ThumbnailView]);
    this.metadata = parser_exports.parseItem(data.metadata, LockupMetadataView);
    this.content_id = data.contentId;
    this.content_type = data.contentType.replace("LOCKUP_CONTENT_TYPE_", "");
    this.renderer_context = new RendererContext(data.rendererContext);
  }
};
__name(_LockupView, "LockupView");
__publicField(_LockupView, "type", "LockupView");
var LockupView = _LockupView;

// dist/src/parser/classes/MacroMarkersListEntity.js
var _MacroMarkersListEntity = class _MacroMarkersListEntity extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "marker_entity_key");
    __publicField(this, "external_video_id");
    /** The type of markers in this entity (e.g., 'MARKER_TYPE_HEATMAP') */
    __publicField(this, "marker_type");
    __publicField(this, "markers");
    __publicField(this, "max_height_dp");
    __publicField(this, "min_height_dp");
    __publicField(this, "show_hide_animation_duration_millis");
    __publicField(this, "timed_marker_decorations");
    // Store raw API data for use in toHeatmap
    __publicField(this, "raw_api_markers");
    __publicField(this, "raw_api_decorations");
    this.marker_entity_key = data.key;
    this.external_video_id = data.externalVideoId;
    this.marker_type = data.markersList?.markerType || "";
    this.raw_api_markers = data.markersList?.markers || [];
    this.raw_api_decorations = data.markersList?.markersDecoration?.timedMarkerDecorations || [];
    this.markers = observe(this.raw_api_markers.map((marker) => new HeatMarker(marker)));
    const heatmapMetadata = data.markersList?.markersMetadata?.heatmapMetadata;
    this.max_height_dp = heatmapMetadata?.maxHeightDp || 40;
    this.min_height_dp = heatmapMetadata?.minHeightDp || 4;
    this.show_hide_animation_duration_millis = heatmapMetadata?.showHideAnimationDurationMillis || 200;
    this.timed_marker_decorations = observe(this.raw_api_decorations.map((decoration) => new TimedMarkerDecoration(decoration)));
  }
  /**
  * Checks if this MacroMarkersListEntity represents heatmap data.
  * Only heatmap markers can be converted to Heatmap objects.
  */
  isHeatmap() {
    return this.marker_type === "MARKER_TYPE_HEATMAP";
  }
  /**
  * Converts this MacroMarkersListEntity to a Heatmap object
  * for compatibility with existing code. Only works for heatmap markers.
  * @returns Heatmap object if this entity contains heatmap data, null otherwise
  */
  toHeatmap() {
    if (!this.isHeatmap()) {
      return null;
    }
    const wrappedHeatMarkers = this.raw_api_markers.map((marker) => ({ HeatMarker: marker }));
    const wrappedDecorations = this.raw_api_decorations.map((decoration) => ({ TimedMarkerDecoration: decoration }));
    const heatmapRawPayload = {
      maxHeightDp: this.max_height_dp,
      minHeightDp: this.min_height_dp,
      showHideAnimationDurationMillis: this.show_hide_animation_duration_millis,
      heatMarkers: wrappedHeatMarkers,
      heatMarkersDecorations: wrappedDecorations
    };
    return parseItem({ Heatmap: heatmapRawPayload }, Heatmap);
  }
};
__name(_MacroMarkersListEntity, "MacroMarkersListEntity");
__publicField(_MacroMarkersListEntity, "type", "MacroMarkersListEntity");
var MacroMarkersListEntity = _MacroMarkersListEntity;

// dist/src/parser/classes/menus/MenuNavigationItem.js
var _MenuNavigationItem = class _MenuNavigationItem extends Button {
  constructor(data) {
    super(data);
  }
};
__name(_MenuNavigationItem, "MenuNavigationItem");
__publicField(_MenuNavigationItem, "type", "MenuNavigationItem");
var MenuNavigationItem = _MenuNavigationItem;

// dist/src/parser/classes/menus/MenuPopup.js
var _MenuPopup = class _MenuPopup extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    this.items = parser_exports.parseArray(data.items, [MenuNavigationItem, MenuServiceItem]);
  }
};
__name(_MenuPopup, "MenuPopup");
__publicField(_MenuPopup, "type", "MenuPopup");
var MenuPopup = _MenuPopup;

// dist/src/parser/classes/Notification.js
var _Notification = class _Notification extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnails");
    __publicField(this, "video_thumbnails");
    __publicField(this, "short_message");
    __publicField(this, "sent_time");
    __publicField(this, "notification_id");
    __publicField(this, "endpoint");
    __publicField(this, "record_click_endpoint");
    __publicField(this, "menu");
    __publicField(this, "read");
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.video_thumbnails = Thumbnail.fromResponse(data.videoThumbnail);
    this.short_message = new Text2(data.shortMessage);
    this.sent_time = new Text2(data.sentTimeText);
    this.notification_id = data.notificationId;
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.record_click_endpoint = new NavigationEndpoint(data.recordClickEndpoint);
    this.menu = parser_exports.parseItem(data.contextualMenu);
    this.read = data.read;
  }
};
__name(_Notification, "Notification");
__publicField(_Notification, "type", "Notification");
var Notification = _Notification;

// dist/src/parser/classes/menus/MultiPageMenuNotificationSection.js
var _MultiPageMenuNotificationSection = class _MultiPageMenuNotificationSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "notification_section_title");
    __publicField(this, "items");
    if ("notificationSectionTitle" in data) {
      this.notification_section_title = new Text2(data.notificationSectionTitle);
    }
    this.items = parser_exports.parseArray(data.items, [Notification, Message, ContinuationItem]);
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_MultiPageMenuNotificationSection, "MultiPageMenuNotificationSection");
__publicField(_MultiPageMenuNotificationSection, "type", "MultiPageMenuNotificationSection");
var MultiPageMenuNotificationSection = _MultiPageMenuNotificationSection;

// dist/src/parser/classes/menus/MusicMenuItemDivider.js
var _MusicMenuItemDivider = class _MusicMenuItemDivider extends YTNode {
  constructor(_data23) {
    super();
  }
};
__name(_MusicMenuItemDivider, "MusicMenuItemDivider");
__publicField(_MusicMenuItemDivider, "type", "MusicMenuItemDivider");
var MusicMenuItemDivider = _MusicMenuItemDivider;

// dist/src/parser/classes/menus/MusicMultiSelectMenuItem.js
var _MusicMultiSelectMenuItem = class _MusicMultiSelectMenuItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "form_item_entity_key");
    __publicField(this, "selected_icon_type");
    __publicField(this, "endpoint");
    __publicField(this, "selected");
    this.title = new Text2(data.title).toString();
    this.form_item_entity_key = data.formItemEntityKey;
    if (Reflect.has(data, "selectedIcon")) {
      this.selected_icon_type = data.selectedIcon.iconType;
    }
    if (Reflect.has(data, "selectedCommand")) {
      this.endpoint = new NavigationEndpoint(data.selectedCommand);
    }
    this.selected = !!this.endpoint;
  }
};
__name(_MusicMultiSelectMenuItem, "MusicMultiSelectMenuItem");
__publicField(_MusicMultiSelectMenuItem, "type", "MusicMultiSelectMenuItem");
var MusicMultiSelectMenuItem = _MusicMultiSelectMenuItem;

// dist/src/parser/classes/menus/MusicMultiSelectMenu.js
var _MusicMultiSelectMenu = class _MusicMultiSelectMenu extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "options");
    if (Reflect.has(data, "title") && Reflect.has(data.title, "musicMenuTitleRenderer")) {
      this.title = new Text2(data.title.musicMenuTitleRenderer?.primaryText);
    }
    this.options = parser_exports.parseArray(data.options, [MusicMultiSelectMenuItem, MusicMenuItemDivider]);
  }
};
__name(_MusicMultiSelectMenu, "MusicMultiSelectMenu");
__publicField(_MusicMultiSelectMenu, "type", "MusicMultiSelectMenu");
var MusicMultiSelectMenu = _MusicMultiSelectMenu;

// dist/src/parser/classes/menus/SimpleMenuHeader.js
var _SimpleMenuHeader = class _SimpleMenuHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "buttons");
    this.title = new Text2(data.title);
    this.buttons = parser_exports.parseArray(data.buttons, Button);
  }
};
__name(_SimpleMenuHeader, "SimpleMenuHeader");
__publicField(_SimpleMenuHeader, "type", "SimpleMenuHeader");
var SimpleMenuHeader = _SimpleMenuHeader;

// dist/src/parser/classes/MerchandiseItem.js
var _MerchandiseItem = class _MerchandiseItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "description");
    __publicField(this, "thumbnails");
    __publicField(this, "price");
    __publicField(this, "vendor_name");
    __publicField(this, "button_text");
    __publicField(this, "button_accessibility_text");
    __publicField(this, "from_vendor_text");
    __publicField(this, "additional_fees_text");
    __publicField(this, "region_format");
    __publicField(this, "endpoint");
    this.title = data.title;
    this.description = data.description;
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.price = data.price;
    this.vendor_name = data.vendorName;
    this.button_text = data.buttonText;
    this.button_accessibility_text = data.buttonAccessibilityText;
    this.from_vendor_text = data.fromVendorText;
    this.additional_fees_text = data.additionalFeesText;
    this.region_format = data.regionFormat;
    this.endpoint = new NavigationEndpoint(data.buttonCommand);
  }
};
__name(_MerchandiseItem, "MerchandiseItem");
__publicField(_MerchandiseItem, "type", "MerchandiseItem");
var MerchandiseItem = _MerchandiseItem;

// dist/src/parser/classes/MetadataRow.js
var _MetadataRow = class _MetadataRow extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "contents");
    this.title = new Text2(data.title);
    this.contents = data.contents.map((content) => new Text2(content));
  }
};
__name(_MetadataRow, "MetadataRow");
__publicField(_MetadataRow, "type", "MetadataRow");
var MetadataRow = _MetadataRow;

// dist/src/parser/classes/MetadataRowContainer.js
var _MetadataRowContainer = class _MetadataRowContainer extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "rows");
    __publicField(this, "collapsed_item_count");
    this.rows = parser_exports.parseArray(data.rows);
    this.collapsed_item_count = data.collapsedItemCount;
  }
};
__name(_MetadataRowContainer, "MetadataRowContainer");
__publicField(_MetadataRowContainer, "type", "MetadataRowContainer");
var MetadataRowContainer = _MetadataRowContainer;

// dist/src/parser/classes/MetadataRowHeader.js
var _MetadataRowHeader = class _MetadataRowHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content");
    __publicField(this, "has_divider_line");
    this.content = new Text2(data.content);
    this.has_divider_line = data.hasDividerLine;
  }
};
__name(_MetadataRowHeader, "MetadataRowHeader");
__publicField(_MetadataRowHeader, "type", "MetadataRowHeader");
var MetadataRowHeader = _MetadataRowHeader;

// dist/src/parser/classes/MetadataScreen.js
var _MetadataScreen = class _MetadataScreen extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "section_list");
    this.section_list = parser_exports.parseItem(data);
  }
};
__name(_MetadataScreen, "MetadataScreen");
__publicField(_MetadataScreen, "type", "MetadataScreen");
var MetadataScreen = _MetadataScreen;

// dist/src/parser/classes/MicroformatData.js
var _MicroformatData = class _MicroformatData extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "url_canonical");
    __publicField(this, "title");
    __publicField(this, "description");
    __publicField(this, "thumbnail");
    __publicField(this, "site_name");
    __publicField(this, "app_name");
    __publicField(this, "android_package");
    __publicField(this, "ios_app_store_id");
    __publicField(this, "ios_app_arguments");
    __publicField(this, "og_type");
    __publicField(this, "url_applinks_web");
    __publicField(this, "url_applinks_ios");
    __publicField(this, "url_applinks_android");
    __publicField(this, "url_twitter_ios");
    __publicField(this, "url_twitter_android");
    __publicField(this, "twitter_card_type");
    __publicField(this, "twitter_site_handle");
    __publicField(this, "schema_dot_org_type");
    __publicField(this, "noindex");
    __publicField(this, "is_unlisted");
    __publicField(this, "is_family_safe");
    __publicField(this, "tags");
    __publicField(this, "available_countries");
    this.url_canonical = data.urlCanonical;
    this.title = data.title;
    this.description = data.description;
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.site_name = data.siteName;
    this.app_name = data.appName;
    this.android_package = data.androidPackage;
    this.ios_app_store_id = data.iosAppStoreId;
    this.ios_app_arguments = data.iosAppArguments;
    this.og_type = data.ogType;
    this.url_applinks_web = data.urlApplinksWeb;
    this.url_applinks_ios = data.urlApplinksIos;
    this.url_applinks_android = data.urlApplinksAndroid;
    this.url_twitter_ios = data.urlTwitterIos;
    this.url_twitter_android = data.urlTwitterAndroid;
    this.twitter_card_type = data.twitterCardType;
    this.twitter_site_handle = data.twitterSiteHandle;
    this.schema_dot_org_type = data.schemaDotOrgType;
    this.noindex = data.noindex;
    this.is_unlisted = data.unlisted;
    this.is_family_safe = data.familySafe;
    this.tags = data.tags;
    this.available_countries = data.availableCountries;
  }
};
__name(_MicroformatData, "MicroformatData");
__publicField(_MicroformatData, "type", "MicroformatData");
var MicroformatData = _MicroformatData;

// dist/src/parser/classes/Mix.js
var _Mix = class _Mix extends Playlist {
  constructor(data) {
    super(data);
  }
};
__name(_Mix, "Mix");
__publicField(_Mix, "type", "Mix");
var Mix = _Mix;

// dist/src/parser/classes/ModalWithTitleAndButton.js
var _ModalWithTitleAndButton = class _ModalWithTitleAndButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "content");
    __publicField(this, "button");
    this.title = new Text2(data.title);
    this.content = new Text2(data.content);
    this.button = parser_exports.parseItem(data.button, Button);
  }
};
__name(_ModalWithTitleAndButton, "ModalWithTitleAndButton");
__publicField(_ModalWithTitleAndButton, "type", "ModalWithTitleAndButton");
var ModalWithTitleAndButton = _ModalWithTitleAndButton;

// dist/src/parser/classes/Movie.js
var _Movie = class _Movie extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "description_snippet");
    __publicField(this, "top_metadata_items");
    __publicField(this, "thumbnails");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "author");
    __publicField(this, "duration");
    __publicField(this, "endpoint");
    __publicField(this, "badges");
    __publicField(this, "use_vertical_poster");
    __publicField(this, "show_action_menu");
    __publicField(this, "menu");
    const overlay_time_status = data.thumbnailOverlays.find((overlay) => overlay.thumbnailOverlayTimeStatusRenderer)?.thumbnailOverlayTimeStatusRenderer.text || "N/A";
    this.id = data.videoId;
    this.title = new Text2(data.title);
    if (Reflect.has(data, "descriptionSnippet")) {
      this.description_snippet = new Text2(data.descriptionSnippet);
    }
    this.top_metadata_items = new Text2(data.topMetadataItems);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
    this.author = new Author(data.longBylineText, data.ownerBadges, data.channelThumbnailSupportedRenderers?.channelThumbnailWithLinkRenderer?.thumbnail);
    this.duration = {
      text: data.lengthText ? new Text2(data.lengthText).toString() : new Text2(overlay_time_status).toString(),
      seconds: timeToSeconds(data.lengthText ? new Text2(data.lengthText).toString() : new Text2(overlay_time_status).toString())
    };
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.badges = parser_exports.parseArray(data.badges);
    this.use_vertical_poster = data.useVerticalPoster;
    this.show_action_menu = data.showActionMenu;
    this.menu = parser_exports.parseItem(data.menu, Menu);
  }
};
__name(_Movie, "Movie");
__publicField(_Movie, "type", "Movie");
var Movie = _Movie;

// dist/src/parser/classes/MovingThumbnail.js
var _MovingThumbnail = class _MovingThumbnail extends YTNode {
  constructor(data) {
    super();
    return data.movingThumbnailDetails?.thumbnails.map((thumbnail) => new Thumbnail(thumbnail)).sort((a, b) => b.width - a.width);
  }
};
__name(_MovingThumbnail, "MovingThumbnail");
__publicField(_MovingThumbnail, "type", "MovingThumbnail");
var MovingThumbnail = _MovingThumbnail;

// dist/src/parser/classes/MusicCardShelfHeaderBasic.js
var _MusicCardShelfHeaderBasic = class _MusicCardShelfHeaderBasic extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = new Text2(data.title);
  }
};
__name(_MusicCardShelfHeaderBasic, "MusicCardShelfHeaderBasic");
__publicField(_MusicCardShelfHeaderBasic, "type", "MusicCardShelfHeaderBasic");
var MusicCardShelfHeaderBasic = _MusicCardShelfHeaderBasic;

// dist/src/parser/classes/MusicInlineBadge.js
var _MusicInlineBadge = class _MusicInlineBadge extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "icon_type");
    __publicField(this, "accessibility");
    this.icon_type = data.icon.iconType;
    if ("accessibilityData" in data && "accessibilityData" in data.accessibilityData) {
      this.accessibility = {
        accessibility_data: new AccessibilityData(data.accessibilityData.accessibilityData)
      };
    }
  }
  get label() {
    return this.accessibility?.accessibility_data?.label;
  }
};
__name(_MusicInlineBadge, "MusicInlineBadge");
__publicField(_MusicInlineBadge, "type", "MusicInlineBadge");
var MusicInlineBadge = _MusicInlineBadge;

// dist/src/parser/classes/MusicPlayButton.js
var _MusicPlayButton = class _MusicPlayButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "endpoint");
    __publicField(this, "play_icon_type");
    __publicField(this, "pause_icon_type");
    __publicField(this, "icon_color");
    __publicField(this, "accessibility_play_data");
    __publicField(this, "accessibility_pause_data");
    this.endpoint = new NavigationEndpoint(data.playNavigationEndpoint);
    this.play_icon_type = data.playIcon.iconType;
    this.pause_icon_type = data.pauseIcon.iconType;
    if ("accessibilityPlayData" in data && "accessibilityData" in data.accessibilityPlayData) {
      this.accessibility_play_data = {
        accessibility_data: new AccessibilityData(data.accessibilityPlayData.accessibilityData)
      };
    }
    if ("accessibilityPauseData" in data && "accessibilityData" in data.accessibilityPauseData) {
      this.accessibility_pause_data = {
        accessibility_data: new AccessibilityData(data.accessibilityPauseData.accessibilityData)
      };
    }
    this.icon_color = data.iconColor;
  }
  get play_label() {
    return this.accessibility_play_data?.accessibility_data?.label;
  }
  get pause_label() {
    return this.accessibility_pause_data?.accessibility_data?.label;
  }
};
__name(_MusicPlayButton, "MusicPlayButton");
__publicField(_MusicPlayButton, "type", "MusicPlayButton");
var MusicPlayButton = _MusicPlayButton;

// dist/src/parser/classes/MusicItemThumbnailOverlay.js
var _MusicItemThumbnailOverlay = class _MusicItemThumbnailOverlay extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content");
    __publicField(this, "content_position");
    __publicField(this, "display_style");
    this.content = parser_exports.parseItem(data.content, MusicPlayButton);
    this.content_position = data.contentPosition;
    this.display_style = data.displayStyle;
  }
};
__name(_MusicItemThumbnailOverlay, "MusicItemThumbnailOverlay");
__publicField(_MusicItemThumbnailOverlay, "type", "MusicItemThumbnailOverlay");
var MusicItemThumbnailOverlay = _MusicItemThumbnailOverlay;

// dist/src/parser/classes/MusicThumbnail.js
var _MusicThumbnail = class _MusicThumbnail extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    this.contents = Thumbnail.fromResponse(data.thumbnail);
  }
};
__name(_MusicThumbnail, "MusicThumbnail");
__publicField(_MusicThumbnail, "type", "MusicThumbnail");
var MusicThumbnail = _MusicThumbnail;

// dist/src/parser/classes/MusicCardShelf.js
var _MusicCardShelf = class _MusicCardShelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "buttons");
    __publicField(this, "menu");
    __publicField(this, "on_tap");
    __publicField(this, "header");
    __publicField(this, "end_icon_type");
    __publicField(this, "subtitle_badges");
    __publicField(this, "thumbnail_overlay");
    __publicField(this, "contents");
    this.thumbnail = parser_exports.parseItem(data.thumbnail, MusicThumbnail);
    this.title = new Text2(data.title);
    this.subtitle = new Text2(data.subtitle);
    this.buttons = parser_exports.parseArray(data.buttons, Button);
    this.menu = parser_exports.parseItem(data.menu, Menu);
    this.on_tap = new NavigationEndpoint(data.onTap);
    this.header = parser_exports.parseItem(data.header, MusicCardShelfHeaderBasic);
    if (Reflect.has(data, "endIcon") && Reflect.has(data.endIcon, "iconType")) {
      this.end_icon_type = data.endIcon.iconType;
    }
    this.subtitle_badges = parser_exports.parseArray(data.subtitleBadges, MusicInlineBadge);
    this.thumbnail_overlay = parser_exports.parseItem(data.thumbnailOverlay, MusicItemThumbnailOverlay);
    if (Reflect.has(data, "contents")) {
      this.contents = parser_exports.parseArray(data.contents);
    }
  }
};
__name(_MusicCardShelf, "MusicCardShelf");
__publicField(_MusicCardShelf, "type", "MusicCardShelf");
var MusicCardShelf = _MusicCardShelf;

// dist/src/parser/classes/MusicCarouselShelfBasicHeader.js
var _MusicCarouselShelfBasicHeader = class _MusicCarouselShelfBasicHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "strapline");
    __publicField(this, "thumbnail");
    __publicField(this, "more_content");
    __publicField(this, "end_icons");
    this.title = new Text2(data.title);
    if (Reflect.has(data, "strapline")) {
      this.strapline = new Text2(data.strapline);
    }
    if (Reflect.has(data, "thumbnail")) {
      this.thumbnail = parser_exports.parseItem(data.thumbnail, MusicThumbnail);
    }
    if (Reflect.has(data, "moreContentButton")) {
      this.more_content = parser_exports.parseItem(data.moreContentButton, Button);
    }
    if (Reflect.has(data, "endIcons")) {
      this.end_icons = parser_exports.parseArray(data.endIcons, IconLink);
    }
  }
};
__name(_MusicCarouselShelfBasicHeader, "MusicCarouselShelfBasicHeader");
__publicField(_MusicCarouselShelfBasicHeader, "type", "MusicCarouselShelfBasicHeader");
var MusicCarouselShelfBasicHeader = _MusicCarouselShelfBasicHeader;

// dist/src/parser/classes/MusicMultiRowListItem.js
var _MusicMultiRowListItem = class _MusicMultiRowListItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    __publicField(this, "overlay");
    __publicField(this, "on_tap");
    __publicField(this, "menu");
    __publicField(this, "subtitle");
    __publicField(this, "title");
    __publicField(this, "second_title");
    __publicField(this, "description");
    __publicField(this, "display_style");
    this.thumbnail = parser_exports.parseItem(data.thumbnail, MusicThumbnail);
    this.overlay = parser_exports.parseItem(data.overlay, MusicItemThumbnailOverlay);
    this.on_tap = new NavigationEndpoint(data.onTap);
    this.menu = parser_exports.parseItem(data.menu, Menu);
    this.subtitle = new Text2(data.subtitle);
    this.title = new Text2(data.title);
    if (Reflect.has(data, "secondTitle")) {
      this.second_title = new Text2(data.secondTitle);
    }
    if (Reflect.has(data, "description")) {
      this.description = new Text2(data.description);
    }
    if (Reflect.has(data, "displayStyle")) {
      this.display_style = data.displayStyle;
    }
  }
};
__name(_MusicMultiRowListItem, "MusicMultiRowListItem");
__publicField(_MusicMultiRowListItem, "type", "MusicMultiRowListItem");
var MusicMultiRowListItem = _MusicMultiRowListItem;

// dist/src/parser/classes/MusicNavigationButton.js
var _MusicNavigationButton = class _MusicNavigationButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "button_text");
    __publicField(this, "endpoint");
    this.button_text = new Text2(data.buttonText).toString();
    this.endpoint = new NavigationEndpoint(data.clickCommand);
  }
};
__name(_MusicNavigationButton, "MusicNavigationButton");
__publicField(_MusicNavigationButton, "type", "MusicNavigationButton");
var MusicNavigationButton = _MusicNavigationButton;

// dist/src/parser/classes/MusicResponsiveListItemFixedColumn.js
var _MusicResponsiveListItemFixedColumn = class _MusicResponsiveListItemFixedColumn extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "display_priority");
    this.title = new Text2(data.text);
    this.display_priority = data.displayPriority;
  }
};
__name(_MusicResponsiveListItemFixedColumn, "MusicResponsiveListItemFixedColumn");
__publicField(_MusicResponsiveListItemFixedColumn, "type", "musicResponsiveListItemFlexColumnRenderer");
var MusicResponsiveListItemFixedColumn = _MusicResponsiveListItemFixedColumn;

// dist/src/parser/classes/MusicResponsiveListItemFlexColumn.js
var _MusicResponsiveListItemFlexColumn = class _MusicResponsiveListItemFlexColumn extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "display_priority");
    this.title = new Text2(data.text);
    this.display_priority = data.displayPriority;
  }
};
__name(_MusicResponsiveListItemFlexColumn, "MusicResponsiveListItemFlexColumn");
__publicField(_MusicResponsiveListItemFlexColumn, "type", "MusicResponsiveListItemFlexColumn");
var MusicResponsiveListItemFlexColumn = _MusicResponsiveListItemFlexColumn;

// dist/src/parser/classes/MusicResponsiveListItem.js
var _MusicResponsiveListItem_instances, parseOther_fn, parseVideoOrSong_fn, parseSong_fn, parseVideo_fn, parseArtist_fn, parseLibraryArtist_fn, parseNonMusicTrack_fn, parsePodcastShow_fn, parseAlbum_fn, parsePlaylist_fn;
var _MusicResponsiveListItem = class _MusicResponsiveListItem extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _MusicResponsiveListItem_instances);
    __publicField(this, "flex_columns");
    __publicField(this, "fixed_columns");
    __publicField(this, "endpoint");
    __publicField(this, "item_type");
    __publicField(this, "index");
    __publicField(this, "thumbnail");
    __publicField(this, "badges");
    __publicField(this, "menu");
    __publicField(this, "overlay");
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "duration");
    __publicField(this, "album");
    __publicField(this, "artists");
    __publicField(this, "views");
    __publicField(this, "authors");
    __publicField(this, "name");
    __publicField(this, "subtitle");
    __publicField(this, "subscribers");
    __publicField(this, "song_count");
    // TODO: these might be replaceable with Author class
    __publicField(this, "author");
    __publicField(this, "item_count");
    __publicField(this, "year");
    this.flex_columns = parser_exports.parseArray(data.flexColumns, MusicResponsiveListItemFlexColumn);
    this.fixed_columns = parser_exports.parseArray(data.fixedColumns, MusicResponsiveListItemFixedColumn);
    const playlist_item_data = {
      video_id: data?.playlistItemData?.videoId || null,
      playlist_set_video_id: data?.playlistItemData?.playlistSetVideoId || null
    };
    if (Reflect.has(data, "navigationEndpoint")) {
      this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    }
    let page_type = this.endpoint?.payload?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType;
    if (!page_type) {
      const is_non_music_track = this.flex_columns.find((col) => col.title.endpoint?.payload?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType === "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE");
      if (is_non_music_track) {
        page_type = "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE";
      }
    }
    switch (page_type) {
      case "MUSIC_PAGE_TYPE_ALBUM":
        this.item_type = "album";
        __privateMethod(this, _MusicResponsiveListItem_instances, parseAlbum_fn).call(this);
        break;
      case "MUSIC_PAGE_TYPE_PLAYLIST":
        this.item_type = "playlist";
        __privateMethod(this, _MusicResponsiveListItem_instances, parsePlaylist_fn).call(this);
        break;
      case "MUSIC_PAGE_TYPE_ARTIST":
      case "MUSIC_PAGE_TYPE_USER_CHANNEL":
        this.item_type = "artist";
        __privateMethod(this, _MusicResponsiveListItem_instances, parseArtist_fn).call(this);
        break;
      case "MUSIC_PAGE_TYPE_LIBRARY_ARTIST":
        this.item_type = "library_artist";
        __privateMethod(this, _MusicResponsiveListItem_instances, parseLibraryArtist_fn).call(this);
        break;
      case "MUSIC_PAGE_TYPE_NON_MUSIC_AUDIO_TRACK_PAGE":
        this.item_type = "non_music_track";
        __privateMethod(this, _MusicResponsiveListItem_instances, parseNonMusicTrack_fn).call(this, playlist_item_data);
        break;
      case "MUSIC_PAGE_TYPE_PODCAST_SHOW_DETAIL_PAGE":
        this.item_type = "podcast_show";
        __privateMethod(this, _MusicResponsiveListItem_instances, parsePodcastShow_fn).call(this);
        break;
      default:
        if (this.flex_columns[1]) {
          __privateMethod(this, _MusicResponsiveListItem_instances, parseVideoOrSong_fn).call(this, playlist_item_data);
        } else {
          __privateMethod(this, _MusicResponsiveListItem_instances, parseOther_fn).call(this);
        }
    }
    if (Reflect.has(data, "index")) {
      this.index = new Text2(data.index);
    }
    if (Reflect.has(data, "thumbnail")) {
      this.thumbnail = parser_exports.parseItem(data.thumbnail, MusicThumbnail);
    }
    if (Reflect.has(data, "badges")) {
      this.badges = parser_exports.parseArray(data.badges);
    }
    if (Reflect.has(data, "menu")) {
      this.menu = parser_exports.parseItem(data.menu, Menu);
    }
    if (Reflect.has(data, "overlay")) {
      this.overlay = parser_exports.parseItem(data.overlay, MusicItemThumbnailOverlay);
    }
  }
  get thumbnails() {
    return this.thumbnail?.contents || [];
  }
};
_MusicResponsiveListItem_instances = new WeakSet();
parseOther_fn = /* @__PURE__ */ __name(function() {
  this.title = this.flex_columns[0].title.toString();
  if (this.endpoint) {
    this.item_type = "endpoint";
  } else {
    this.item_type = "unknown";
  }
}, "#parseOther");
parseVideoOrSong_fn = /* @__PURE__ */ __name(function(playlist_item_data) {
  const music_video_type = this.flex_columns.at(0)?.title.runs?.at(0)?.endpoint?.payload?.watchEndpointMusicSupportedConfigs?.watchEndpointMusicConfig?.musicVideoType;
  switch (music_video_type) {
    case "MUSIC_VIDEO_TYPE_UGC":
    case "MUSIC_VIDEO_TYPE_OMV":
      this.item_type = "video";
      __privateMethod(this, _MusicResponsiveListItem_instances, parseVideo_fn).call(this, playlist_item_data);
      break;
    case "MUSIC_VIDEO_TYPE_ATV":
      this.item_type = "song";
      __privateMethod(this, _MusicResponsiveListItem_instances, parseSong_fn).call(this, playlist_item_data);
      break;
    default:
      __privateMethod(this, _MusicResponsiveListItem_instances, parseOther_fn).call(this);
  }
}, "#parseVideoOrSong");
parseSong_fn = /* @__PURE__ */ __name(function(playlist_item_data) {
  this.id = playlist_item_data.video_id || this.endpoint?.payload?.videoId;
  this.title = this.flex_columns[0].title.toString();
  const duration_text = this.flex_columns.at(1)?.title.runs?.find((run) => /^\d+$/.test(run.text.replace(/:/g, "")))?.text || this.fixed_columns[0]?.title?.toString();
  if (duration_text) {
    this.duration = {
      text: duration_text,
      seconds: timeToSeconds(duration_text)
    };
  }
  const album_run = this.flex_columns.at(1)?.title.runs?.find((run) => isTextRun(run) && run.endpoint && run.endpoint.payload.browseId.startsWith("MPR")) || this.flex_columns.at(2)?.title.runs?.find((run) => isTextRun(run) && run.endpoint && run.endpoint.payload.browseId.startsWith("MPR"));
  if (album_run && isTextRun(album_run)) {
    this.album = {
      id: album_run.endpoint?.payload?.browseId,
      name: album_run.text,
      endpoint: album_run.endpoint
    };
  }
  const artist_runs = this.flex_columns.at(1)?.title.runs?.filter((run) => isTextRun(run) && run.endpoint && run.endpoint.payload.browseId.startsWith("UC"));
  if (artist_runs) {
    this.artists = artist_runs.map((run) => ({
      name: run.text,
      channel_id: isTextRun(run) ? run.endpoint?.payload?.browseId : void 0,
      endpoint: isTextRun(run) ? run.endpoint : void 0
    }));
  }
}, "#parseSong");
parseVideo_fn = /* @__PURE__ */ __name(function(playlist_item_data) {
  this.id = playlist_item_data.video_id;
  this.title = this.flex_columns[0].title.toString();
  this.views = this.flex_columns.at(1)?.title.runs?.find((run) => run.text.match(/(.*?) views/))?.toString();
  const author_runs = this.flex_columns.at(1)?.title.runs?.filter((run) => isTextRun(run) && run.endpoint && run.endpoint.payload.browseId.startsWith("UC"));
  if (author_runs) {
    this.authors = author_runs.map((run) => {
      return {
        name: run.text,
        channel_id: isTextRun(run) ? run.endpoint?.payload?.browseId : void 0,
        endpoint: isTextRun(run) ? run.endpoint : void 0
      };
    });
  }
  const duration_text = this.flex_columns[1].title.runs?.find((run) => /^\d+$/.test(run.text.replace(/:/g, "")))?.text || this.fixed_columns[0]?.title.runs?.find((run) => /^\d+$/.test(run.text.replace(/:/g, "")))?.text;
  if (duration_text) {
    this.duration = {
      text: duration_text,
      seconds: timeToSeconds(duration_text)
    };
  }
}, "#parseVideo");
parseArtist_fn = /* @__PURE__ */ __name(function() {
  this.id = this.endpoint?.payload?.browseId;
  this.name = this.flex_columns[0].title.toString();
  this.subtitle = this.flex_columns.at(1)?.title;
  this.subscribers = this.subtitle?.runs?.find((run) => /^(\d*\.)?\d+[M|K]? subscribers?$/i.test(run.text))?.text || "";
}, "#parseArtist");
parseLibraryArtist_fn = /* @__PURE__ */ __name(function() {
  this.name = this.flex_columns[0].title.toString();
  this.subtitle = this.flex_columns.at(1)?.title;
  this.song_count = this.subtitle?.runs?.find((run) => /^\d+(,\d+)? songs?$/i.test(run.text))?.text || "";
}, "#parseLibraryArtist");
parseNonMusicTrack_fn = /* @__PURE__ */ __name(function(playlist_item_data) {
  this.id = playlist_item_data.video_id || this.endpoint?.payload?.videoId;
  this.title = this.flex_columns[0].title.toString();
}, "#parseNonMusicTrack");
parsePodcastShow_fn = /* @__PURE__ */ __name(function() {
  this.id = this.endpoint?.payload?.browseId;
  this.title = this.flex_columns[0].title.toString();
}, "#parsePodcastShow");
parseAlbum_fn = /* @__PURE__ */ __name(function() {
  this.id = this.endpoint?.payload?.browseId;
  this.title = this.flex_columns[0].title.toString();
  const author_run = this.flex_columns.at(1)?.title.runs?.find((run) => isTextRun(run) && run.endpoint && run.endpoint.payload.browseId.startsWith("UC"));
  if (author_run && isTextRun(author_run)) {
    this.author = {
      name: author_run.text,
      channel_id: author_run.endpoint?.payload?.browseId,
      endpoint: author_run.endpoint
    };
  }
  this.year = this.flex_columns.at(1)?.title.runs?.find((run) => /^[12][0-9]{3}$/.test(run.text))?.text;
}, "#parseAlbum");
parsePlaylist_fn = /* @__PURE__ */ __name(function() {
  this.id = this.endpoint?.payload?.browseId;
  this.title = this.flex_columns[0].title.toString();
  const item_count_run = this.flex_columns.at(1)?.title.runs?.find((run) => run.text.match(/\d+ (song|songs)/));
  this.item_count = item_count_run ? item_count_run.text : void 0;
  const author_run = this.flex_columns.at(1)?.title.runs?.find((run) => isTextRun(run) && run.endpoint && run.endpoint.payload.browseId.startsWith("UC"));
  if (author_run && isTextRun(author_run)) {
    this.author = {
      name: author_run.text,
      channel_id: author_run.endpoint?.payload?.browseId,
      endpoint: author_run.endpoint
    };
  }
}, "#parsePlaylist");
__name(_MusicResponsiveListItem, "MusicResponsiveListItem");
__publicField(_MusicResponsiveListItem, "type", "MusicResponsiveListItem");
var MusicResponsiveListItem = _MusicResponsiveListItem;

// dist/src/parser/classes/MusicTwoRowItem.js
var _MusicTwoRowItem = class _MusicTwoRowItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "endpoint");
    __publicField(this, "id");
    __publicField(this, "subtitle");
    __publicField(this, "badges");
    __publicField(this, "item_type");
    __publicField(this, "subscribers");
    __publicField(this, "item_count");
    __publicField(this, "year");
    __publicField(this, "views");
    __publicField(this, "artists");
    __publicField(this, "author");
    __publicField(this, "thumbnail");
    __publicField(this, "thumbnail_overlay");
    __publicField(this, "menu");
    this.title = new Text2(data.title);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.id = this.endpoint?.payload?.browseId || this.endpoint?.payload?.videoId;
    this.subtitle = new Text2(data.subtitle);
    this.badges = parser_exports.parse(data.subtitleBadges);
    const page_type = this.endpoint?.payload?.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType;
    switch (page_type) {
      case "MUSIC_PAGE_TYPE_ARTIST":
        this.item_type = "artist";
        break;
      case "MUSIC_PAGE_TYPE_PLAYLIST":
        this.item_type = "playlist";
        break;
      case "MUSIC_PAGE_TYPE_ALBUM":
        this.item_type = "album";
        break;
      default:
        if (this.endpoint?.metadata?.api_url === "/next") {
          this.item_type = "endpoint";
        } else if (this.subtitle.runs?.[0]) {
          if (this.subtitle.runs[0].text !== "Song") {
            this.item_type = "video";
          } else {
            this.item_type = "song";
          }
        } else if (this.endpoint) {
          this.item_type = "endpoint";
        } else {
          this.item_type = "unknown";
        }
        break;
    }
    if (this.item_type == "artist") {
      this.subscribers = this.subtitle.runs?.find((run) => /^(\d*\.)?\d+[M|K]? subscribers?$/i.test(run.text))?.text || "";
    } else if (this.item_type == "playlist") {
      const item_count_run = this.subtitle.runs?.find((run) => run.text.match(/\d+ songs|song/));
      this.item_count = item_count_run ? item_count_run.text : null;
    } else if (this.item_type == "album") {
      const artists = this.subtitle.runs?.filter((run) => run.endpoint?.payload?.browseId.startsWith("UC"));
      if (artists) {
        this.artists = artists.map((artist) => ({
          name: artist.text,
          channel_id: artist.endpoint?.payload?.browseId,
          endpoint: artist.endpoint
        }));
      }
      this.year = this.subtitle.runs?.slice(-1)[0].text;
      if (isNaN(Number(this.year)))
        delete this.year;
    } else if (this.item_type == "video") {
      this.views = this?.subtitle.runs?.find((run) => run?.text.match(/(.*?) views/))?.text || "N/A";
      const author = this.subtitle.runs?.find((run) => run.endpoint?.payload?.browseId?.startsWith("UC"));
      if (author) {
        this.author = {
          name: author?.text,
          channel_id: author?.endpoint?.payload?.browseId,
          endpoint: author?.endpoint
        };
      }
    } else if (this.item_type == "song") {
      const artists = this.subtitle.runs?.filter((run) => run.endpoint?.payload?.browseId.startsWith("UC"));
      if (artists) {
        this.artists = artists.map((artist) => ({
          name: artist?.text,
          channel_id: artist?.endpoint?.payload?.browseId,
          endpoint: artist?.endpoint
        }));
      }
    }
    this.thumbnail = Thumbnail.fromResponse(data.thumbnailRenderer.musicThumbnailRenderer.thumbnail);
    this.thumbnail_overlay = parser_exports.parseItem(data.thumbnailOverlay, MusicItemThumbnailOverlay);
    this.menu = parser_exports.parseItem(data.menu, Menu);
  }
};
__name(_MusicTwoRowItem, "MusicTwoRowItem");
__publicField(_MusicTwoRowItem, "type", "MusicTwoRowItem");
var MusicTwoRowItem = _MusicTwoRowItem;

// dist/src/parser/classes/MusicCarouselShelf.js
var _MusicCarouselShelf = class _MusicCarouselShelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "contents");
    __publicField(this, "num_items_per_column");
    this.header = parser_exports.parseItem(data.header, MusicCarouselShelfBasicHeader);
    this.contents = parser_exports.parseArray(data.contents, [MusicTwoRowItem, MusicResponsiveListItem, MusicMultiRowListItem, MusicNavigationButton]);
    if (Reflect.has(data, "numItemsPerColumn")) {
      this.num_items_per_column = parseInt(data.numItemsPerColumn);
    }
  }
};
__name(_MusicCarouselShelf, "MusicCarouselShelf");
__publicField(_MusicCarouselShelf, "type", "MusicCarouselShelf");
var MusicCarouselShelf = _MusicCarouselShelf;

// dist/src/parser/classes/MusicDescriptionShelf.js
var _MusicDescriptionShelf = class _MusicDescriptionShelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "description");
    __publicField(this, "max_collapsed_lines");
    __publicField(this, "max_expanded_lines");
    __publicField(this, "footer");
    this.description = new Text2(data.description);
    if (Reflect.has(data, "maxCollapsedLines")) {
      this.max_collapsed_lines = data.maxCollapsedLines;
    }
    if (Reflect.has(data, "maxExpandedLines")) {
      this.max_expanded_lines = data.maxExpandedLines;
    }
    this.footer = new Text2(data.footer);
  }
};
__name(_MusicDescriptionShelf, "MusicDescriptionShelf");
__publicField(_MusicDescriptionShelf, "type", "MusicDescriptionShelf");
var MusicDescriptionShelf = _MusicDescriptionShelf;

// dist/src/parser/classes/MusicDetailHeader.js
var _MusicDetailHeader = class _MusicDetailHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "description");
    __publicField(this, "subtitle");
    __publicField(this, "second_subtitle");
    __publicField(this, "year");
    __publicField(this, "song_count");
    __publicField(this, "total_duration");
    __publicField(this, "thumbnails");
    __publicField(this, "badges");
    __publicField(this, "author");
    __publicField(this, "menu");
    this.title = new Text2(data.title);
    this.description = new Text2(data.description);
    this.subtitle = new Text2(data.subtitle);
    this.second_subtitle = new Text2(data.secondSubtitle);
    this.year = this.subtitle.runs?.find((run) => /^[12][0-9]{3}$/.test(run.text))?.text || "";
    this.song_count = this.second_subtitle.runs?.[0]?.text || "";
    this.total_duration = this.second_subtitle.runs?.[2]?.text || "";
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail.croppedSquareThumbnailRenderer.thumbnail);
    this.badges = parser_exports.parseArray(data.subtitleBadges);
    const author = this.subtitle.runs?.find((run) => run?.endpoint?.payload?.browseId.startsWith("UC"));
    if (author) {
      this.author = {
        name: author.text,
        channel_id: author.endpoint?.payload?.browseId,
        endpoint: author.endpoint
      };
    }
    this.menu = parser_exports.parseItem(data.menu);
  }
};
__name(_MusicDetailHeader, "MusicDetailHeader");
__publicField(_MusicDetailHeader, "type", "MusicDetailHeader");
var MusicDetailHeader = _MusicDetailHeader;

// dist/src/parser/classes/MusicDownloadStateBadge.js
var _MusicDownloadStateBadge = class _MusicDownloadStateBadge extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "playlist_id");
    __publicField(this, "supported_download_states");
    this.playlist_id = data.playlistId;
    this.supported_download_states = data.supportedDownloadStates;
  }
};
__name(_MusicDownloadStateBadge, "MusicDownloadStateBadge");
__publicField(_MusicDownloadStateBadge, "type", "MusicDownloadStateBadge");
var MusicDownloadStateBadge = _MusicDownloadStateBadge;

// dist/src/parser/classes/MusicEditablePlaylistDetailHeader.js
var _MusicEditablePlaylistDetailHeader = class _MusicEditablePlaylistDetailHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "edit_header");
    __publicField(this, "playlist_id");
    this.header = parser_exports.parseItem(data.header);
    this.edit_header = parser_exports.parseItem(data.editHeader);
    this.playlist_id = data.playlistId;
  }
};
__name(_MusicEditablePlaylistDetailHeader, "MusicEditablePlaylistDetailHeader");
__publicField(_MusicEditablePlaylistDetailHeader, "type", "MusicEditablePlaylistDetailHeader");
var MusicEditablePlaylistDetailHeader = _MusicEditablePlaylistDetailHeader;

// dist/src/parser/classes/MusicElementHeader.js
var _MusicElementHeader = class _MusicElementHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "element");
    this.element = Reflect.has(data, "elementRenderer") ? parser_exports.parseItem(data, Element) : null;
  }
};
__name(_MusicElementHeader, "MusicElementHeader");
__publicField(_MusicElementHeader, "type", "MusicElementHeader");
var MusicElementHeader = _MusicElementHeader;

// dist/src/parser/classes/MusicHeader.js
var _MusicHeader = class _MusicHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "title");
    if (Reflect.has(data, "header")) {
      this.header = parser_exports.parseItem(data.header);
    }
    if (Reflect.has(data, "title")) {
      this.title = new Text2(data.title);
    }
  }
};
__name(_MusicHeader, "MusicHeader");
__publicField(_MusicHeader, "type", "MusicHeader");
var MusicHeader = _MusicHeader;

// dist/src/parser/classes/MusicImmersiveHeader.js
var _MusicImmersiveHeader = class _MusicImmersiveHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "menu");
    __publicField(this, "more_button");
    __publicField(this, "play_button");
    __publicField(this, "share_endpoint");
    __publicField(this, "start_radio_button");
    __publicField(this, "subscription_button");
    __publicField(this, "description");
    __publicField(this, "thumbnail");
    this.title = new Text2(data.title);
    this.menu = parser_exports.parseItem(data.menu, Menu);
    this.more_button = parser_exports.parseItem(data.moreButton, ToggleButton);
    this.play_button = parser_exports.parseItem(data.playButton, Button);
    if ("shareEndpoint" in data)
      this.share_endpoint = new NavigationEndpoint(data.shareEndpoint);
    this.start_radio_button = parser_exports.parseItem(data.startRadioButton, Button);
    this.subscription_button = parser_exports.parseItem(data.subscriptionButton, SubscribeButton);
    this.description = new Text2(data.description);
    this.thumbnail = parser_exports.parseItem(data.thumbnail, MusicThumbnail);
  }
};
__name(_MusicImmersiveHeader, "MusicImmersiveHeader");
__publicField(_MusicImmersiveHeader, "type", "MusicImmersiveHeader");
var MusicImmersiveHeader = _MusicImmersiveHeader;

// dist/src/parser/classes/MusicLargeCardItemCarousel.js
var _ActionButton = class _ActionButton {
  constructor(data) {
    __publicField(this, "icon_name");
    __publicField(this, "endpoint");
    __publicField(this, "a11y_text");
    __publicField(this, "style");
    this.icon_name = data.iconName;
    this.endpoint = new NavigationEndpoint(data.onTap);
    this.a11y_text = data.a11yText;
    this.style = data.style;
  }
};
__name(_ActionButton, "ActionButton");
__publicField(_ActionButton, "type", "ActionButton");
var ActionButton = _ActionButton;
var _Panel2 = class _Panel2 {
  constructor(data) {
    __publicField(this, "image");
    __publicField(this, "content_mode");
    __publicField(this, "crop_options");
    __publicField(this, "image_aspect_ratio");
    __publicField(this, "caption");
    __publicField(this, "action_buttons");
    this.image = Thumbnail.fromResponse(data.image.image);
    this.content_mode = data.image.contentMode;
    this.crop_options = data.image.cropOptions;
    this.image_aspect_ratio = data.imageAspectRatio;
    this.caption = data.caption;
    this.action_buttons = data.actionButtons.map((el) => new ActionButton(el));
  }
};
__name(_Panel2, "Panel");
__publicField(_Panel2, "type", "Panel");
var Panel2 = _Panel2;
var _MusicLargeCardItemCarousel = class _MusicLargeCardItemCarousel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "panels");
    __publicField(this, "header");
    this.header = data.shelf.header;
    this.panels = data.shelf.panels.map((el) => new Panel2(el));
  }
};
__name(_MusicLargeCardItemCarousel, "MusicLargeCardItemCarousel");
__publicField(_MusicLargeCardItemCarousel, "type", "MusicLargeCardItemCarousel");
var MusicLargeCardItemCarousel = _MusicLargeCardItemCarousel;

// dist/src/parser/classes/MusicPlaylistEditHeader.js
var _MusicPlaylistEditHeader = class _MusicPlaylistEditHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "edit_title");
    __publicField(this, "edit_description");
    __publicField(this, "privacy");
    __publicField(this, "playlist_id");
    __publicField(this, "endpoint");
    __publicField(this, "privacy_dropdown");
    this.title = new Text2(data.title);
    this.edit_title = new Text2(data.editTitle);
    this.edit_description = new Text2(data.editDescription);
    this.privacy = data.privacy;
    this.playlist_id = data.playlistId;
    this.endpoint = new NavigationEndpoint(data.collaborationSettingsCommand);
    this.privacy_dropdown = parser_exports.parseItem(data.privacyDropdown, Dropdown);
  }
};
__name(_MusicPlaylistEditHeader, "MusicPlaylistEditHeader");
__publicField(_MusicPlaylistEditHeader, "type", "MusicPlaylistEditHeader");
var MusicPlaylistEditHeader = _MusicPlaylistEditHeader;

// dist/src/parser/classes/MusicPlaylistShelf.js
var _MusicPlaylistShelf = class _MusicPlaylistShelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "playlist_id");
    __publicField(this, "contents");
    __publicField(this, "collapsed_item_count");
    __publicField(this, "continuation");
    this.playlist_id = data.playlistId;
    this.contents = parser_exports.parseArray(data.contents, [MusicResponsiveListItem, ContinuationItem]);
    this.collapsed_item_count = data.collapsedItemCount;
    this.continuation = data.continuations?.[0]?.nextContinuationData?.continuation || null;
  }
};
__name(_MusicPlaylistShelf, "MusicPlaylistShelf");
__publicField(_MusicPlaylistShelf, "type", "MusicPlaylistShelf");
var MusicPlaylistShelf = _MusicPlaylistShelf;

// dist/src/parser/classes/PlaylistPanelVideo.js
var _PlaylistPanelVideo = class _PlaylistPanelVideo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "thumbnail");
    __publicField(this, "endpoint");
    __publicField(this, "selected");
    __publicField(this, "video_id");
    __publicField(this, "duration");
    __publicField(this, "author");
    __publicField(this, "album");
    __publicField(this, "artists");
    __publicField(this, "badges");
    __publicField(this, "menu");
    __publicField(this, "set_video_id");
    this.title = new Text2(data.title);
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.selected = data.selected;
    this.video_id = data.videoId;
    this.duration = {
      text: new Text2(data.lengthText).toString(),
      seconds: timeToSeconds(new Text2(data.lengthText).toString())
    };
    const album = new Text2(data.longBylineText).runs?.find((run) => run.endpoint?.payload?.browseId?.startsWith("MPR"));
    const artists = new Text2(data.longBylineText).runs?.filter((run) => run.endpoint?.payload?.browseId?.startsWith("UC"));
    this.author = new Text2(data.shortBylineText).toString();
    if (album) {
      this.album = {
        id: album.endpoint?.payload?.browseId,
        name: album.text,
        year: new Text2(data.longBylineText).runs?.slice(-1)[0].text,
        endpoint: album.endpoint
      };
    }
    if (artists) {
      this.artists = artists.map((artist) => ({
        name: artist.text,
        channel_id: artist.endpoint?.payload?.browseId,
        endpoint: artist.endpoint
      }));
    }
    this.badges = parser_exports.parseArray(data.badges);
    this.menu = parser_exports.parseItem(data.menu);
    this.set_video_id = data.playlistSetVideoId;
  }
};
__name(_PlaylistPanelVideo, "PlaylistPanelVideo");
__publicField(_PlaylistPanelVideo, "type", "PlaylistPanelVideo");
var PlaylistPanelVideo = _PlaylistPanelVideo;

// dist/src/parser/classes/PlaylistPanelVideoWrapper.js
var _PlaylistPanelVideoWrapper = class _PlaylistPanelVideoWrapper extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "primary");
    __publicField(this, "counterpart");
    this.primary = parser_exports.parseItem(data.primaryRenderer, PlaylistPanelVideo);
    if (Reflect.has(data, "counterpart")) {
      this.counterpart = observe(data.counterpart.map((item) => parser_exports.parseItem(item.counterpartRenderer, PlaylistPanelVideo)) || []);
    }
  }
};
__name(_PlaylistPanelVideoWrapper, "PlaylistPanelVideoWrapper");
__publicField(_PlaylistPanelVideoWrapper, "type", "PlaylistPanelVideoWrapper");
var PlaylistPanelVideoWrapper = _PlaylistPanelVideoWrapper;

// dist/src/parser/classes/PlaylistPanel.js
var _PlaylistPanel = class _PlaylistPanel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "title_text");
    __publicField(this, "contents");
    __publicField(this, "playlist_id");
    __publicField(this, "is_infinite");
    __publicField(this, "continuation");
    __publicField(this, "is_editable");
    __publicField(this, "preview_description");
    __publicField(this, "num_items_to_show");
    this.title = data.title;
    this.title_text = new Text2(data.titleText);
    this.contents = parser_exports.parseArray(data.contents, [PlaylistPanelVideoWrapper, PlaylistPanelVideo, AutomixPreviewVideo]);
    this.playlist_id = data.playlistId;
    this.is_infinite = data.isInfinite;
    this.continuation = data.continuations?.[0]?.nextRadioContinuationData?.continuation || data.continuations?.[0]?.nextContinuationData?.continuation;
    this.is_editable = data.isEditable;
    this.preview_description = data.previewDescription;
    this.num_items_to_show = data.numItemsToShow;
  }
};
__name(_PlaylistPanel, "PlaylistPanel");
__publicField(_PlaylistPanel, "type", "PlaylistPanel");
var PlaylistPanel = _PlaylistPanel;

// dist/src/parser/classes/MusicQueue.js
var _MusicQueue = class _MusicQueue extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content");
    this.content = parser_exports.parseItem(data.content, PlaylistPanel);
  }
};
__name(_MusicQueue, "MusicQueue");
__publicField(_MusicQueue, "type", "MusicQueue");
var MusicQueue = _MusicQueue;

// dist/src/parser/classes/MusicResponsiveHeader.js
var _MusicResponsiveHeader = class _MusicResponsiveHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    __publicField(this, "buttons");
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "strapline_text_one");
    __publicField(this, "strapline_thumbnail");
    __publicField(this, "second_subtitle");
    __publicField(this, "subtitle_badge");
    __publicField(this, "description");
    this.thumbnail = parser_exports.parseItem(data.thumbnail, MusicThumbnail);
    this.buttons = parser_exports.parseArray(data.buttons, [DownloadButton, ToggleButton, MusicPlayButton, Button, Menu]);
    this.title = new Text2(data.title);
    this.subtitle = new Text2(data.subtitle);
    this.strapline_text_one = new Text2(data.straplineTextOne);
    this.strapline_thumbnail = parser_exports.parseItem(data.straplineThumbnail, MusicThumbnail);
    this.second_subtitle = new Text2(data.secondSubtitle);
    if (Reflect.has(data, "subtitleBadge")) {
      this.subtitle_badge = parser_exports.parseArray(data.subtitleBadge, MusicInlineBadge);
    }
    if (Reflect.has(data, "description")) {
      this.description = parser_exports.parseItem(data.description, MusicDescriptionShelf);
    }
  }
};
__name(_MusicResponsiveHeader, "MusicResponsiveHeader");
__publicField(_MusicResponsiveHeader, "type", "MusicResponsiveHeader");
var MusicResponsiveHeader = _MusicResponsiveHeader;

// dist/src/parser/classes/MusicShelf.js
var _MusicShelf = class _MusicShelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "contents");
    __publicField(this, "endpoint");
    __publicField(this, "continuation");
    __publicField(this, "bottom_text");
    __publicField(this, "bottom_button");
    __publicField(this, "subheaders");
    this.title = new Text2(data.title);
    this.contents = parser_exports.parseArray(data.contents, MusicResponsiveListItem);
    if (Reflect.has(data, "bottomEndpoint")) {
      this.endpoint = new NavigationEndpoint(data.bottomEndpoint);
    }
    if (Reflect.has(data, "continuations")) {
      this.continuation = data.continuations?.[0].nextContinuationData?.continuation || data.continuations?.[0].reloadContinuationData?.continuation;
    }
    if (Reflect.has(data, "bottomText")) {
      this.bottom_text = new Text2(data.bottomText);
    }
    if (Reflect.has(data, "bottomButton")) {
      this.bottom_button = parser_exports.parseItem(data.bottomButton, Button);
    }
    if (Reflect.has(data, "subheaders")) {
      this.subheaders = parser_exports.parseArray(data.subheaders);
    }
  }
};
__name(_MusicShelf, "MusicShelf");
__publicField(_MusicShelf, "type", "MusicShelf");
var MusicShelf = _MusicShelf;

// dist/src/parser/classes/MusicSideAlignedItem.js
var _MusicSideAlignedItem = class _MusicSideAlignedItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "start_items");
    __publicField(this, "end_items");
    if (Reflect.has(data, "startItems")) {
      this.start_items = parser_exports.parseArray(data.startItems);
    }
    if (Reflect.has(data, "endItems")) {
      this.end_items = parser_exports.parseArray(data.endItems);
    }
  }
};
__name(_MusicSideAlignedItem, "MusicSideAlignedItem");
__publicField(_MusicSideAlignedItem, "type", "MusicSideAlignedItem");
var MusicSideAlignedItem = _MusicSideAlignedItem;

// dist/src/parser/classes/MusicSortFilterButton.js
var _MusicSortFilterButton = class _MusicSortFilterButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "icon_type");
    __publicField(this, "menu");
    this.title = new Text2(data.title).toString();
    if (Reflect.has(data, "icon")) {
      this.icon_type = data.icon.iconType;
    }
    this.menu = parser_exports.parseItem(data.menu, MusicMultiSelectMenu);
  }
};
__name(_MusicSortFilterButton, "MusicSortFilterButton");
__publicField(_MusicSortFilterButton, "type", "MusicSortFilterButton");
var MusicSortFilterButton = _MusicSortFilterButton;

// dist/src/parser/classes/MusicTastebuilderShelfThumbnail.js
var _MusicTastebuilderShelfThumbnail = class _MusicTastebuilderShelfThumbnail extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
  }
};
__name(_MusicTastebuilderShelfThumbnail, "MusicTastebuilderShelfThumbnail");
__publicField(_MusicTastebuilderShelfThumbnail, "type", "MusicTastebuilderShelfThumbnail");
var MusicTastebuilderShelfThumbnail = _MusicTastebuilderShelfThumbnail;

// dist/src/parser/classes/MusicTastebuilderShelf.js
var _MusicTasteBuilderShelf = class _MusicTasteBuilderShelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    __publicField(this, "primary_text");
    __publicField(this, "secondary_text");
    __publicField(this, "action_button");
    __publicField(this, "is_visible");
    this.thumbnail = parser_exports.parseItem(data.thumbnail, MusicTastebuilderShelfThumbnail);
    this.primary_text = new Text2(data.primaryText);
    this.secondary_text = new Text2(data.secondaryText);
    this.action_button = parser_exports.parseItem(data.actionButton, Button);
    this.is_visible = data.isVisible;
  }
};
__name(_MusicTasteBuilderShelf, "MusicTasteBuilderShelf");
__publicField(_MusicTasteBuilderShelf, "type", "MusicTasteBuilderShelf");
var MusicTasteBuilderShelf = _MusicTasteBuilderShelf;

// dist/src/parser/classes/MusicVisualHeader.js
var _MusicVisualHeader = class _MusicVisualHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "thumbnail");
    __publicField(this, "menu");
    __publicField(this, "foreground_thumbnail");
    this.title = new Text2(data.title);
    this.thumbnail = data.thumbnail ? Thumbnail.fromResponse(data.thumbnail.musicThumbnailRenderer?.thumbnail) : [];
    this.menu = parser_exports.parseItem(data.menu, Menu);
    this.foreground_thumbnail = data.foregroundThumbnail ? Thumbnail.fromResponse(data.foregroundThumbnail.musicThumbnailRenderer?.thumbnail) : [];
  }
};
__name(_MusicVisualHeader, "MusicVisualHeader");
__publicField(_MusicVisualHeader, "type", "MusicVisualHeader");
var MusicVisualHeader = _MusicVisualHeader;

// dist/src/parser/classes/mweb/MobileTopbar.js
var _MobileTopbar = class _MobileTopbar extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "placeholder_text");
    __publicField(this, "buttons");
    __publicField(this, "logo_type");
    this.placeholder_text = new Text2(data.placeholderText);
    this.buttons = parser_exports.parseArray(data.buttons);
    if (Reflect.has(data, "logo") && Reflect.has(data.logo, "iconType"))
      this.logo_type = data.logo.iconType;
  }
};
__name(_MobileTopbar, "MobileTopbar");
__publicField(_MobileTopbar, "type", "MobileTopbar");
var MobileTopbar = _MobileTopbar;

// dist/src/parser/classes/mweb/MultiPageMenuSection.js
var _MultiPageMenuSection = class _MultiPageMenuSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    this.items = parser_exports.parseArray(data.items);
  }
};
__name(_MultiPageMenuSection, "MultiPageMenuSection");
__publicField(_MultiPageMenuSection, "type", "MultiPageMenuSection");
var MultiPageMenuSection = _MultiPageMenuSection;

// dist/src/parser/classes/mweb/PivotBar.js
var _PivotBar = class _PivotBar extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    this.items = parser_exports.parseArray(data.items);
  }
};
__name(_PivotBar, "PivotBar");
__publicField(_PivotBar, "type", "PivotBar");
var PivotBar = _PivotBar;

// dist/src/parser/classes/mweb/PivotBarItem.js
var _PivotBarItem = class _PivotBarItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "pivot_identifier");
    __publicField(this, "endpoint");
    __publicField(this, "title");
    __publicField(this, "accessibility_label");
    __publicField(this, "icon_type");
    __publicField(this, "accessibility");
    this.pivot_identifier = data.pivotIdentifier;
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.title = new Text(data.title);
    if ("accessibility" in data && "accessibilityData" in data.accessibility) {
      this.accessibility = {
        accessibility_data: new AccessibilityData(data.accessibility.accessibilityData)
      };
    }
    if (Reflect.has(data, "icon") && Reflect.has(data.icon, "iconType"))
      this.icon_type = data.icon.iconType;
  }
  get label() {
    return this.accessibility?.accessibility_data?.label;
  }
};
__name(_PivotBarItem, "PivotBarItem");
__publicField(_PivotBarItem, "type", "PivotBarItem");
var PivotBarItem = _PivotBarItem;

// dist/src/parser/classes/mweb/TopbarMenuButton.js
var _TopbarMenuButton = class _TopbarMenuButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "icon_type");
    __publicField(this, "menu_renderer");
    __publicField(this, "target_id");
    if (Reflect.has(data, "icon") && Reflect.has(data.icon, "iconType"))
      this.icon_type = data.icon.iconType;
    this.menu_renderer = parser_exports.parseItem(data.menuRenderer);
    this.target_id = data.targetId;
  }
};
__name(_TopbarMenuButton, "TopbarMenuButton");
__publicField(_TopbarMenuButton, "type", "TopbarMenuButton");
var TopbarMenuButton = _TopbarMenuButton;

// dist/src/parser/classes/NotificationAction.js
var _NotificationAction = class _NotificationAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "response_text");
    this.response_text = new Text2(data.responseText);
  }
};
__name(_NotificationAction, "NotificationAction");
__publicField(_NotificationAction, "type", "NotificationAction");
var NotificationAction = _NotificationAction;

// dist/src/parser/classes/OpenOnePickAddVideoModalCommand.js
var _OpenOnePickAddVideoModalCommand = class _OpenOnePickAddVideoModalCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "list_id");
    __publicField(this, "modal_title");
    __publicField(this, "select_button_label");
    this.list_id = data.listId;
    this.modal_title = data.modalTitle;
    this.select_button_label = data.selectButtonLabel;
  }
};
__name(_OpenOnePickAddVideoModalCommand, "OpenOnePickAddVideoModalCommand");
__publicField(_OpenOnePickAddVideoModalCommand, "type", "OpenOnePickAddVideoModalCommand");
var OpenOnePickAddVideoModalCommand = _OpenOnePickAddVideoModalCommand;

// dist/src/parser/classes/PageHeaderView.js
var _PageHeaderView = class _PageHeaderView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "image");
    __publicField(this, "animated_image");
    __publicField(this, "hero_image");
    __publicField(this, "metadata");
    __publicField(this, "actions");
    __publicField(this, "description");
    __publicField(this, "attributation");
    __publicField(this, "banner");
    this.title = parser_exports.parseItem(data.title, DynamicTextView);
    this.image = parser_exports.parseItem(data.image, [ContentPreviewImageView, DecoratedAvatarView]);
    this.animated_image = parser_exports.parseItem(data.animatedImage, ContentPreviewImageView);
    this.hero_image = parser_exports.parseItem(data.heroImage, ContentPreviewImageView);
    this.metadata = parser_exports.parseItem(data.metadata, ContentMetadataView);
    this.actions = parser_exports.parseItem(data.actions, FlexibleActionsView);
    this.description = parser_exports.parseItem(data.description, DescriptionPreviewView);
    this.attributation = parser_exports.parseItem(data.attributation, AttributionView);
    this.banner = parser_exports.parseItem(data.banner, ImageBannerView);
  }
};
__name(_PageHeaderView, "PageHeaderView");
__publicField(_PageHeaderView, "type", "PageHeaderView");
var PageHeaderView = _PageHeaderView;

// dist/src/parser/classes/PageHeader.js
var _PageHeader = class _PageHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "page_title");
    __publicField(this, "content");
    this.page_title = data.pageTitle;
    this.content = parser_exports.parseItem(data.content, PageHeaderView);
  }
};
__name(_PageHeader, "PageHeader");
__publicField(_PageHeader, "type", "PageHeader");
var PageHeader = _PageHeader;

// dist/src/parser/classes/PageIntroduction.js
var _PageIntroduction = class _PageIntroduction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header_text");
    __publicField(this, "body_text");
    __publicField(this, "page_title");
    __publicField(this, "header_icon_type");
    this.header_text = new Text2(data.headerText).toString();
    this.body_text = new Text2(data.bodyText).toString();
    this.page_title = new Text2(data.pageTitle).toString();
    this.header_icon_type = data.headerIcon.iconType;
  }
};
__name(_PageIntroduction, "PageIntroduction");
__publicField(_PageIntroduction, "type", "PageIntroduction");
var PageIntroduction = _PageIntroduction;

// dist/src/parser/classes/PivotButton.js
var _PivotButton = class _PivotButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    __publicField(this, "endpoint");
    __publicField(this, "content_description");
    __publicField(this, "target_id");
    __publicField(this, "sound_attribution_title");
    __publicField(this, "waveform_animation_style");
    __publicField(this, "background_animation_style");
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.endpoint = new NavigationEndpoint(data.onClickCommand);
    this.content_description = new Text2(data.contentDescription);
    this.target_id = data.targetId;
    this.sound_attribution_title = new Text2(data.soundAttributionTitle);
    this.waveform_animation_style = data.waveformAnimationStyle;
    this.background_animation_style = data.backgroundAnimationStyle;
  }
};
__name(_PivotButton, "PivotButton");
__publicField(_PivotButton, "type", "PivotButton");
var PivotButton = _PivotButton;

// dist/src/parser/classes/PlayerAnnotationsExpanded.js
var _PlayerAnnotationsExpanded = class _PlayerAnnotationsExpanded extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "featured_channel");
    __publicField(this, "allow_swipe_dismiss");
    __publicField(this, "annotation_id");
    if (Reflect.has(data, "featuredChannel")) {
      this.featured_channel = {
        start_time_ms: data.featuredChannel.startTimeMs,
        end_time_ms: data.featuredChannel.endTimeMs,
        watermark: Thumbnail.fromResponse(data.featuredChannel.watermark),
        channel_name: data.featuredChannel.channelName,
        endpoint: new NavigationEndpoint(data.featuredChannel.navigationEndpoint),
        subscribe_button: parser_exports.parseItem(data.featuredChannel.subscribeButton)
      };
    }
    this.allow_swipe_dismiss = data.allowSwipeDismiss;
    this.annotation_id = data.annotationId;
  }
};
__name(_PlayerAnnotationsExpanded, "PlayerAnnotationsExpanded");
__publicField(_PlayerAnnotationsExpanded, "type", "PlayerAnnotationsExpanded");
var PlayerAnnotationsExpanded = _PlayerAnnotationsExpanded;

// dist/src/parser/classes/PlayerCaptchaView.js
var _PlayerCaptchaView = class _PlayerCaptchaView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "captcha_loading_message");
    __publicField(this, "challenge_reason");
    __publicField(this, "captcha_successful_message");
    __publicField(this, "captcha_cookie_set_failure_message");
    __publicField(this, "captcha_failed_message");
    if ("captchaLoadingMessage" in data) {
      this.captcha_loading_message = Text2.fromAttributed(data.captchaLoadingMessage);
    }
    if ("challengeReason" in data) {
      this.challenge_reason = Text2.fromAttributed(data.challengeReason);
    }
    if ("captchaSuccessfulMessage" in data) {
      this.captcha_successful_message = Text2.fromAttributed(data.captchaSuccessfulMessage);
    }
    if ("captchaCookieSetFailureMessage" in data) {
      this.captcha_cookie_set_failure_message = Text2.fromAttributed(data.captchaCookieSetFailureMessage);
    }
    if ("captchaFailedMessage" in data) {
      this.captcha_failed_message = Text2.fromAttributed(data.captchaFailedMessage);
    }
  }
};
__name(_PlayerCaptchaView, "PlayerCaptchaView");
__publicField(_PlayerCaptchaView, "type", "PlayerCaptchaView");
var PlayerCaptchaView = _PlayerCaptchaView;

// dist/src/parser/classes/PlayerCaptionsTracklist.js
var _PlayerCaptionsTracklist = class _PlayerCaptionsTracklist extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "caption_tracks");
    __publicField(this, "audio_tracks");
    __publicField(this, "default_audio_track_index");
    __publicField(this, "translation_languages");
    if (Reflect.has(data, "captionTracks")) {
      this.caption_tracks = data.captionTracks.map((ct) => ({
        base_url: ct.baseUrl,
        name: new Text2(ct.name),
        vss_id: ct.vssId,
        language_code: ct.languageCode,
        kind: ct.kind,
        is_translatable: ct.isTranslatable
      }));
    }
    if (Reflect.has(data, "audioTracks")) {
      this.audio_tracks = data.audioTracks.map((at) => ({
        audio_track_id: at.audioTrackId,
        captions_initial_state: at.captionsInitialState,
        default_caption_track_index: at.defaultCaptionTrackIndex,
        has_default_track: at.hasDefaultTrack,
        visibility: at.visibility,
        caption_track_indices: at.captionTrackIndices
      }));
    }
    if (Reflect.has(data, "defaultAudioTrackIndex")) {
      this.default_audio_track_index = data.defaultAudioTrackIndex;
    }
    if (Reflect.has(data, "translationLanguages")) {
      this.translation_languages = data.translationLanguages.map((tl) => ({
        language_code: tl.languageCode,
        language_name: new Text2(tl.languageName)
      }));
    }
  }
};
__name(_PlayerCaptionsTracklist, "PlayerCaptionsTracklist");
__publicField(_PlayerCaptionsTracklist, "type", "PlayerCaptionsTracklist");
var PlayerCaptionsTracklist = _PlayerCaptionsTracklist;

// dist/src/parser/classes/PlayerOverflow.js
var _PlayerOverflow = class _PlayerOverflow extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "endpoint");
    __publicField(this, "enable_listen_first");
    this.endpoint = new NavigationEndpoint(data.endpoint);
    this.enable_listen_first = data.enableListenFirst;
  }
};
__name(_PlayerOverflow, "PlayerOverflow");
__publicField(_PlayerOverflow, "type", "PlayerOverflow");
var PlayerOverflow = _PlayerOverflow;

// dist/src/parser/classes/PlayerControlsOverlay.js
var _PlayerControlsOverlay = class _PlayerControlsOverlay extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "overflow");
    this.overflow = parser_exports.parseItem(data.overflow, PlayerOverflow);
  }
};
__name(_PlayerControlsOverlay, "PlayerControlsOverlay");
__publicField(_PlayerControlsOverlay, "type", "PlayerControlsOverlay");
var PlayerControlsOverlay = _PlayerControlsOverlay;

// dist/src/parser/classes/PlayerErrorMessage.js
var _PlayerErrorMessage = class _PlayerErrorMessage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "subreason");
    __publicField(this, "reason");
    __publicField(this, "proceed_button");
    __publicField(this, "thumbnails");
    __publicField(this, "icon_type");
    this.subreason = new Text2(data.subreason);
    this.reason = new Text2(data.reason);
    this.proceed_button = parser_exports.parseItem(data.proceedButton, Button);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    if (Reflect.has(data, "icon")) {
      this.icon_type = data.icon.iconType;
    }
  }
};
__name(_PlayerErrorMessage, "PlayerErrorMessage");
__publicField(_PlayerErrorMessage, "type", "PlayerErrorMessage");
var PlayerErrorMessage = _PlayerErrorMessage;

// dist/src/parser/classes/PlayerLegacyDesktopYpcOffer.js
var _PlayerLegacyDesktopYpcOffer = class _PlayerLegacyDesktopYpcOffer extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "thumbnail");
    __publicField(this, "offer_description");
    __publicField(this, "offer_id");
    this.title = data.itemTitle;
    this.thumbnail = data.itemThumbnail;
    this.offer_description = data.offerDescription;
    this.offer_id = data.offerId;
  }
};
__name(_PlayerLegacyDesktopYpcOffer, "PlayerLegacyDesktopYpcOffer");
__publicField(_PlayerLegacyDesktopYpcOffer, "type", "PlayerLegacyDesktopYpcOffer");
var PlayerLegacyDesktopYpcOffer = _PlayerLegacyDesktopYpcOffer;

// dist/src/parser/classes/YpcTrailer.js
var _YpcTrailer = class _YpcTrailer extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "video_message");
    __publicField(this, "player_response");
    this.video_message = data.fullVideoMessage;
    this.player_response = data.unserializedPlayerResponse;
  }
};
__name(_YpcTrailer, "YpcTrailer");
__publicField(_YpcTrailer, "type", "YpcTrailer");
var YpcTrailer = _YpcTrailer;

// dist/src/parser/classes/PlayerLegacyDesktopYpcTrailer.js
var _PlayerLegacyDesktopYpcTrailer = class _PlayerLegacyDesktopYpcTrailer extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "video_id");
    __publicField(this, "title");
    __publicField(this, "thumbnail");
    __publicField(this, "offer_headline");
    __publicField(this, "offer_description");
    __publicField(this, "offer_id");
    __publicField(this, "offer_button_text");
    __publicField(this, "video_message");
    __publicField(this, "trailer");
    this.video_id = data.trailerVideoId;
    this.title = data.itemTitle;
    this.thumbnail = data.itemThumbnail;
    this.offer_headline = data.offerHeadline;
    this.offer_description = data.offerDescription;
    this.offer_id = data.offerId;
    this.offer_button_text = data.offerButtonText;
    this.video_message = data.fullVideoMessage;
    this.trailer = parser_exports.parseItem(data.ypcTrailer, YpcTrailer);
  }
};
__name(_PlayerLegacyDesktopYpcTrailer, "PlayerLegacyDesktopYpcTrailer");
__publicField(_PlayerLegacyDesktopYpcTrailer, "type", "PlayerLegacyDesktopYpcTrailer");
var PlayerLegacyDesktopYpcTrailer = _PlayerLegacyDesktopYpcTrailer;

// dist/src/parser/classes/PlayerLiveStoryboardSpec.js
var _PlayerLiveStoryboardSpec = class _PlayerLiveStoryboardSpec extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "board");
    const [template_url, thumbnail_width, thumbnail_height, columns, rows] = data.spec.split("#");
    this.board = {
      type: "live",
      template_url,
      thumbnail_width: parseInt(thumbnail_width, 10),
      thumbnail_height: parseInt(thumbnail_height, 10),
      columns: parseInt(columns, 10),
      rows: parseInt(rows, 10)
    };
  }
};
__name(_PlayerLiveStoryboardSpec, "PlayerLiveStoryboardSpec");
__publicField(_PlayerLiveStoryboardSpec, "type", "PlayerLiveStoryboardSpec");
var PlayerLiveStoryboardSpec = _PlayerLiveStoryboardSpec;

// dist/src/parser/classes/PlayerMicroformat.js
var _PlayerMicroformat = class _PlayerMicroformat extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "description");
    __publicField(this, "thumbnails");
    __publicField(this, "embed");
    __publicField(this, "length_seconds");
    __publicField(this, "channel");
    __publicField(this, "is_family_safe");
    __publicField(this, "is_unlisted");
    __publicField(this, "has_ypc_metadata");
    __publicField(this, "view_count");
    __publicField(this, "category");
    __publicField(this, "publish_date");
    __publicField(this, "upload_date");
    __publicField(this, "available_countries");
    __publicField(this, "start_timestamp");
    __publicField(this, "end_timestamp");
    this.title = new Text2(data.title);
    this.description = new Text2(data.description);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    if (Reflect.has(data, "embed")) {
      this.embed = {
        iframe_url: data.embed.iframeUrl,
        flash_url: data.embed.flashUrl,
        flash_secure_url: data.embed.flashSecureUrl,
        width: data.embed.width,
        height: data.embed.height
      };
    }
    this.length_seconds = parseInt(data.lengthSeconds);
    this.channel = {
      id: data.externalChannelId,
      name: data.ownerChannelName,
      url: data.ownerProfileUrl
    };
    this.is_family_safe = !!data.isFamilySafe;
    this.is_unlisted = !!data.isUnlisted;
    this.has_ypc_metadata = !!data.hasYpcMetadata;
    this.view_count = parseInt(data.viewCount);
    this.category = data.category;
    this.publish_date = data.publishDate;
    this.upload_date = data.uploadDate;
    this.available_countries = data.availableCountries;
    this.start_timestamp = data.liveBroadcastDetails?.startTimestamp ? new Date(data.liveBroadcastDetails.startTimestamp) : null;
    this.end_timestamp = data.liveBroadcastDetails?.endTimestamp ? new Date(data.liveBroadcastDetails.endTimestamp) : null;
  }
};
__name(_PlayerMicroformat, "PlayerMicroformat");
__publicField(_PlayerMicroformat, "type", "PlayerMicroformat");
var PlayerMicroformat = _PlayerMicroformat;

// dist/src/parser/classes/PlayerOverlayAutoplay.js
var _PlayerOverlayAutoplay = class _PlayerOverlayAutoplay extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "video_id");
    __publicField(this, "video_title");
    __publicField(this, "short_view_count");
    // @TODO: Find out what these are.
    __publicField(this, "prefer_immediate_redirect");
    __publicField(this, "count_down_secs_for_fullscreen");
    __publicField(this, "published");
    __publicField(this, "background");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "author");
    __publicField(this, "cancel_button");
    __publicField(this, "next_button");
    __publicField(this, "close_button");
    this.title = new Text2(data.title);
    this.video_id = data.videoId;
    this.video_title = new Text2(data.videoTitle);
    this.short_view_count = new Text2(data.shortViewCountText);
    this.prefer_immediate_redirect = data.preferImmediateRedirect;
    this.count_down_secs_for_fullscreen = data.countDownSecsForFullscreen;
    this.published = new Text2(data.publishedTimeText);
    this.background = Thumbnail.fromResponse(data.background);
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
    this.author = new Author(data.byline);
    this.cancel_button = parser_exports.parseItem(data.cancelButton, Button);
    this.next_button = parser_exports.parseItem(data.nextButton, Button);
    this.close_button = parser_exports.parseItem(data.closeButton, Button);
  }
};
__name(_PlayerOverlayAutoplay, "PlayerOverlayAutoplay");
__publicField(_PlayerOverlayAutoplay, "type", "PlayerOverlayAutoplay");
var PlayerOverlayAutoplay = _PlayerOverlayAutoplay;

// dist/src/parser/classes/PlayerOverlayVideoDetails.js
var _PlayerOverlayVideoDetails = class _PlayerOverlayVideoDetails extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "subtitle");
    this.title = new Text2(data.title);
    this.subtitle = new Text2(data.subtitle);
  }
};
__name(_PlayerOverlayVideoDetails, "PlayerOverlayVideoDetails");
__publicField(_PlayerOverlayVideoDetails, "type", "PlayerOverlayVideoDetails");
var PlayerOverlayVideoDetails = _PlayerOverlayVideoDetails;

// dist/src/parser/classes/WatchNextEndScreen.js
var _WatchNextEndScreen = class _WatchNextEndScreen extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "results");
    __publicField(this, "title");
    this.results = parser_exports.parseArray(data.results, [EndScreenVideo, EndScreenPlaylist]);
    this.title = new Text2(data.title).toString();
  }
};
__name(_WatchNextEndScreen, "WatchNextEndScreen");
__publicField(_WatchNextEndScreen, "type", "WatchNextEndScreen");
var WatchNextEndScreen = _WatchNextEndScreen;

// dist/src/parser/classes/PlayerOverlay.js
var _PlayerOverlay = class _PlayerOverlay extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "end_screen");
    __publicField(this, "autoplay");
    __publicField(this, "share_button");
    __publicField(this, "add_to_menu");
    __publicField(this, "fullscreen_engagement");
    __publicField(this, "actions");
    __publicField(this, "browser_media_session");
    __publicField(this, "decorated_player_bar");
    __publicField(this, "video_details");
    this.end_screen = parser_exports.parseItem(data.endScreen, WatchNextEndScreen);
    this.autoplay = parser_exports.parseItem(data.autoplay, PlayerOverlayAutoplay);
    this.share_button = parser_exports.parseItem(data.shareButton, Button);
    this.add_to_menu = parser_exports.parseItem(data.addToMenu, Menu);
    this.fullscreen_engagement = parser_exports.parseItem(data.fullscreenEngagement);
    this.actions = parser_exports.parseArray(data.actions);
    this.browser_media_session = parser_exports.parseItem(data.browserMediaSession);
    this.decorated_player_bar = parser_exports.parseItem(data.decoratedPlayerBarRenderer, DecoratedPlayerBar);
    this.video_details = parser_exports.parseItem(data.videoDetails, PlayerOverlayVideoDetails);
  }
};
__name(_PlayerOverlay, "PlayerOverlay");
__publicField(_PlayerOverlay, "type", "PlayerOverlay");
var PlayerOverlay = _PlayerOverlay;

// dist/src/parser/classes/PlaylistHeader.js
var _PlaylistHeader = class _PlaylistHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "stats");
    __publicField(this, "brief_stats");
    __publicField(this, "author");
    __publicField(this, "description");
    __publicField(this, "num_videos");
    __publicField(this, "view_count");
    __publicField(this, "can_share");
    __publicField(this, "can_delete");
    __publicField(this, "is_editable");
    __publicField(this, "privacy");
    __publicField(this, "save_button");
    __publicField(this, "shuffle_play_button");
    __publicField(this, "menu");
    __publicField(this, "banner");
    this.id = data.playlistId;
    this.title = new Text2(data.title);
    this.subtitle = data.subtitle ? new Text2(data.subtitle) : null;
    this.stats = data.stats.map((stat) => new Text2(stat));
    this.brief_stats = data.briefStats.map((stat) => new Text2(stat));
    this.author = data.ownerText || data.ownerEndpoint ? new Author({ ...data.ownerText, navigationEndpoint: data.ownerEndpoint }, data.ownerBadges, null) : null;
    this.description = new Text2(data.descriptionText);
    this.num_videos = new Text2(data.numVideosText);
    this.view_count = new Text2(data.viewCountText);
    this.can_share = data.shareData.canShare;
    this.can_delete = data.editableDetails.canDelete;
    this.is_editable = data.isEditable;
    this.privacy = data.privacy;
    this.save_button = parser_exports.parseItem(data.saveButton);
    this.shuffle_play_button = parser_exports.parseItem(data.shufflePlayButton);
    this.menu = parser_exports.parseItem(data.moreActionsMenu);
    this.banner = parser_exports.parseItem(data.playlistHeaderBanner);
  }
};
__name(_PlaylistHeader, "PlaylistHeader");
__publicField(_PlaylistHeader, "type", "PlaylistHeader");
var PlaylistHeader = _PlaylistHeader;

// dist/src/parser/classes/PlaylistInfoCardContent.js
var _PlaylistInfoCardContent = class _PlaylistInfoCardContent extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "thumbnails");
    __publicField(this, "video_count");
    __publicField(this, "channel_name");
    __publicField(this, "endpoint");
    this.title = new Text2(data.playlistTitle);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.video_count = new Text2(data.playlistVideoCount);
    this.channel_name = new Text2(data.channelName);
    this.endpoint = new NavigationEndpoint(data.action);
  }
};
__name(_PlaylistInfoCardContent, "PlaylistInfoCardContent");
__publicField(_PlaylistInfoCardContent, "type", "PlaylistInfoCardContent");
var PlaylistInfoCardContent = _PlaylistInfoCardContent;

// dist/src/parser/classes/PlaylistMetadata.js
var _PlaylistMetadata = class _PlaylistMetadata extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "description");
    this.title = data.title;
    this.description = data.description || null;
  }
};
__name(_PlaylistMetadata, "PlaylistMetadata");
__publicField(_PlaylistMetadata, "type", "PlaylistMetadata");
var PlaylistMetadata = _PlaylistMetadata;

// dist/src/parser/classes/PlaylistSidebar.js
var _PlaylistSidebar = class _PlaylistSidebar extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    this.items = parser_exports.parseArray(data.items);
  }
  // XXX: alias for consistency
  get contents() {
    return this.items;
  }
};
__name(_PlaylistSidebar, "PlaylistSidebar");
__publicField(_PlaylistSidebar, "type", "PlaylistSidebar");
var PlaylistSidebar = _PlaylistSidebar;

// dist/src/parser/classes/PlaylistSidebarPrimaryInfo.js
var _PlaylistSidebarPrimaryInfo = class _PlaylistSidebarPrimaryInfo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "stats");
    __publicField(this, "thumbnail_renderer");
    __publicField(this, "title");
    __publicField(this, "menu");
    __publicField(this, "endpoint");
    __publicField(this, "description");
    this.stats = data.stats.map((stat) => new Text2(stat));
    this.thumbnail_renderer = parser_exports.parseItem(data.thumbnailRenderer);
    this.title = new Text2(data.title);
    this.menu = parser_exports.parseItem(data.menu);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.description = new Text2(data.description);
  }
};
__name(_PlaylistSidebarPrimaryInfo, "PlaylistSidebarPrimaryInfo");
__publicField(_PlaylistSidebarPrimaryInfo, "type", "PlaylistSidebarPrimaryInfo");
var PlaylistSidebarPrimaryInfo = _PlaylistSidebarPrimaryInfo;

// dist/src/parser/classes/PlaylistSidebarSecondaryInfo.js
var _PlaylistSidebarSecondaryInfo = class _PlaylistSidebarSecondaryInfo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "owner");
    __publicField(this, "button");
    this.owner = parser_exports.parseItem(data.videoOwner);
    this.button = parser_exports.parseItem(data.button);
  }
};
__name(_PlaylistSidebarSecondaryInfo, "PlaylistSidebarSecondaryInfo");
__publicField(_PlaylistSidebarSecondaryInfo, "type", "PlaylistSidebarSecondaryInfo");
var PlaylistSidebarSecondaryInfo = _PlaylistSidebarSecondaryInfo;

// dist/src/parser/classes/PlaylistThumbnailOverlay.js
var _PlaylistThumbnailOverlay = class _PlaylistThumbnailOverlay extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "icon_type");
    __publicField(this, "text");
    if (Reflect.has(data, "icon"))
      this.icon_type = data.icon.iconType;
    this.text = new Text2(data.text);
  }
};
__name(_PlaylistThumbnailOverlay, "PlaylistThumbnailOverlay");
__publicField(_PlaylistThumbnailOverlay, "type", "PlaylistThumbnailOverlay");
var PlaylistThumbnailOverlay = _PlaylistThumbnailOverlay;

// dist/src/parser/classes/PlaylistVideo.js
var _PlaylistVideo = class _PlaylistVideo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "index");
    __publicField(this, "title");
    __publicField(this, "author");
    __publicField(this, "thumbnails");
    __publicField(this, "thumbnail_overlays");
    __publicField(this, "set_video_id");
    __publicField(this, "endpoint");
    __publicField(this, "is_playable");
    __publicField(this, "menu");
    __publicField(this, "upcoming");
    __publicField(this, "video_info");
    __publicField(this, "accessibility_label");
    __publicField(this, "style");
    __publicField(this, "duration");
    this.id = data.videoId;
    this.index = new Text2(data.index);
    this.title = new Text2(data.title);
    this.author = new Author(data.shortBylineText);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.thumbnail_overlays = parser_exports.parseArray(data.thumbnailOverlays);
    this.set_video_id = data?.setVideoId;
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.is_playable = data.isPlayable;
    this.menu = parser_exports.parseItem(data.menu, Menu);
    this.video_info = new Text2(data.videoInfo);
    this.accessibility_label = data.title.accessibility.accessibilityData.label;
    if (Reflect.has(data, "style")) {
      this.style = data.style;
    }
    const upcoming = data.upcomingEventData && Number(`${data.upcomingEventData.startTime}000`);
    if (upcoming) {
      this.upcoming = new Date(upcoming);
    }
    this.duration = {
      text: new Text2(data.lengthText).toString(),
      seconds: parseInt(data.lengthSeconds)
    };
  }
  get is_live() {
    return this.thumbnail_overlays.firstOfType(ThumbnailOverlayTimeStatus)?.style === "LIVE";
  }
  get is_upcoming() {
    return this.thumbnail_overlays.firstOfType(ThumbnailOverlayTimeStatus)?.style === "UPCOMING";
  }
};
__name(_PlaylistVideo, "PlaylistVideo");
__publicField(_PlaylistVideo, "type", "PlaylistVideo");
var PlaylistVideo = _PlaylistVideo;

// dist/src/parser/classes/PlaylistVideoList.js
var _PlaylistVideoList = class _PlaylistVideoList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "is_editable");
    __publicField(this, "can_reorder");
    __publicField(this, "videos");
    this.id = data.playlistId;
    this.is_editable = data.isEditable;
    this.can_reorder = data.canReorder;
    this.videos = parser_exports.parseArray(data.contents);
  }
};
__name(_PlaylistVideoList, "PlaylistVideoList");
__publicField(_PlaylistVideoList, "type", "PlaylistVideoList");
var PlaylistVideoList = _PlaylistVideoList;

// dist/src/parser/classes/Poll.js
var _Poll = class _Poll extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "choices");
    __publicField(this, "poll_type");
    __publicField(this, "total_votes");
    __publicField(this, "live_chat_poll_id");
    this.choices = data.choices.map((choice) => ({
      text: new Text2(choice.text),
      select_endpoint: choice.selectServiceEndpoint ? new NavigationEndpoint(choice.selectServiceEndpoint) : null,
      deselect_endpoint: choice.deselectServiceEndpoint ? new NavigationEndpoint(choice.deselectServiceEndpoint) : null,
      vote_ratio_if_selected: choice?.voteRatioIfSelected || null,
      vote_percentage_if_selected: new Text2(choice.votePercentageIfSelected),
      vote_ratio_if_not_selected: choice?.voteRatioIfSelected || null,
      vote_percentage_if_not_selected: new Text2(choice.votePercentageIfSelected),
      image: choice.image ? Thumbnail.fromResponse(choice.image) : null
    }));
    if (Reflect.has(data, "type"))
      this.poll_type = data.type;
    if (Reflect.has(data, "totalVotes"))
      this.total_votes = new Text2(data.totalVotes);
    if (Reflect.has(data, "liveChatPollId"))
      this.live_chat_poll_id = data.liveChatPollId;
  }
};
__name(_Poll, "Poll");
__publicField(_Poll, "type", "Poll");
var Poll = _Poll;

// dist/src/parser/classes/Post.js
var _Post = class _Post extends BackstagePost {
  constructor(data) {
    super(data);
  }
};
__name(_Post, "Post");
__publicField(_Post, "type", "Post");
var Post = _Post;

// dist/src/parser/classes/PostMultiImage.js
var _PostMultiImage = class _PostMultiImage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "images");
    this.images = parser_exports.parseArray(data.images, BackstageImage);
  }
};
__name(_PostMultiImage, "PostMultiImage");
__publicField(_PostMultiImage, "type", "PostMultiImage");
var PostMultiImage = _PostMultiImage;

// dist/src/parser/classes/PremiereTrailerBadge.js
var _PremiereTrailerBadge = class _PremiereTrailerBadge extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "label");
    this.label = new Text2(data.label);
  }
};
__name(_PremiereTrailerBadge, "PremiereTrailerBadge");
__publicField(_PremiereTrailerBadge, "type", "PremiereTrailerBadge");
var PremiereTrailerBadge = _PremiereTrailerBadge;

// dist/src/parser/classes/ProductListHeader.js
var _ProductListHeader = class _ProductListHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "suppress_padding_disclaimer");
    this.title = new Text2(data.title);
    this.suppress_padding_disclaimer = !!data.suppressPaddingDisclaimer;
  }
};
__name(_ProductListHeader, "ProductListHeader");
__publicField(_ProductListHeader, "type", "ProductListHeader");
var ProductListHeader = _ProductListHeader;

// dist/src/parser/classes/ProductListItem.js
var _ProductListItem = class _ProductListItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "accessibility_title");
    __publicField(this, "thumbnail");
    __publicField(this, "price");
    __publicField(this, "endpoint");
    __publicField(this, "merchant_name");
    __publicField(this, "stay_in_app");
    __publicField(this, "view_button");
    this.title = new Text2(data.title);
    this.accessibility_title = data.accessibilityTitle;
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.price = data.price;
    this.endpoint = new NavigationEndpoint(data.onClickCommand);
    this.merchant_name = data.merchantName;
    this.stay_in_app = !!data.stayInApp;
    this.view_button = parser_exports.parseItem(data.viewButton, Button);
  }
};
__name(_ProductListItem, "ProductListItem");
__publicField(_ProductListItem, "type", "ProductListItem");
var ProductListItem = _ProductListItem;

// dist/src/parser/classes/ProfileColumn.js
var _ProfileColumn = class _ProfileColumn extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    this.items = parser_exports.parseArray(data.items);
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_ProfileColumn, "ProfileColumn");
__publicField(_ProfileColumn, "type", "ProfileColumn");
var ProfileColumn = _ProfileColumn;

// dist/src/parser/classes/ProfileColumnStats.js
var _ProfileColumnStats = class _ProfileColumnStats extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    this.items = parser_exports.parseArray(data.items);
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_ProfileColumnStats, "ProfileColumnStats");
__publicField(_ProfileColumnStats, "type", "ProfileColumnStats");
var ProfileColumnStats = _ProfileColumnStats;

// dist/src/parser/classes/ProfileColumnStatsEntry.js
var _ProfileColumnStatsEntry = class _ProfileColumnStatsEntry extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "label");
    __publicField(this, "value");
    this.label = new Text2(data.label);
    this.value = new Text2(data.value);
  }
};
__name(_ProfileColumnStatsEntry, "ProfileColumnStatsEntry");
__publicField(_ProfileColumnStatsEntry, "type", "ProfileColumnStatsEntry");
var ProfileColumnStatsEntry = _ProfileColumnStatsEntry;

// dist/src/parser/classes/ProfileColumnUserInfo.js
var _ProfileColumnUserInfo = class _ProfileColumnUserInfo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "thumbnails");
    this.title = new Text2(data.title);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
  }
};
__name(_ProfileColumnUserInfo, "ProfileColumnUserInfo");
__publicField(_ProfileColumnUserInfo, "type", "ProfileColumnUserInfo");
var ProfileColumnUserInfo = _ProfileColumnUserInfo;

// dist/src/parser/classes/Quiz.js
var _Quiz = class _Quiz extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "choices");
    __publicField(this, "total_votes");
    this.choices = data.choices.map((choice) => ({
      text: new Text2(choice.text),
      is_correct: choice.isCorrect
    }));
    this.total_votes = new Text2(data.totalVotes);
  }
};
__name(_Quiz, "Quiz");
__publicField(_Quiz, "type", "Quiz");
var Quiz = _Quiz;

// dist/src/parser/classes/RecognitionShelf.js
var _RecognitionShelf = class _RecognitionShelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "avatars");
    __publicField(this, "button");
    __publicField(this, "surface");
    this.title = new Text2(data.title);
    this.subtitle = new Text2(data.subtitle);
    this.avatars = data.avatars.map((avatar) => new Thumbnail(avatar));
    this.button = parser_exports.parseItem(data.button, Button);
    this.surface = data.surface;
  }
};
__name(_RecognitionShelf, "RecognitionShelf");
__publicField(_RecognitionShelf, "type", "RecognitionShelf");
var RecognitionShelf = _RecognitionShelf;

// dist/src/parser/classes/ReelItem.js
var _ReelItem = class _ReelItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "id");
    __publicField(this, "title");
    __publicField(this, "thumbnails");
    __publicField(this, "views");
    __publicField(this, "endpoint");
    __publicField(this, "accessibility");
    this.id = data.videoId;
    this.title = new Text2(data.headline);
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.views = new Text2(data.viewCountText);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    if ("accessibility" in data && "accessibilityData" in data.accessibility) {
      this.accessibility = {
        accessibility_data: new AccessibilityData(data.accessibility.accessibilityData)
      };
    }
  }
  get label() {
    return this.accessibility?.accessibility_data?.label;
  }
};
__name(_ReelItem, "ReelItem");
__publicField(_ReelItem, "type", "ReelItem");
var ReelItem = _ReelItem;

// dist/src/parser/classes/ReelPlayerHeader.js
var _ReelPlayerHeader = class _ReelPlayerHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "reel_title_text");
    __publicField(this, "timestamp_text");
    __publicField(this, "channel_title_text");
    __publicField(this, "channel_thumbnail");
    __publicField(this, "author");
    this.reel_title_text = new Text2(data.reelTitleText);
    this.timestamp_text = new Text2(data.timestampText);
    this.channel_title_text = new Text2(data.channelTitleText);
    this.channel_thumbnail = Thumbnail.fromResponse(data.channelThumbnail);
    this.author = new Author(data.channelNavigationEndpoint, void 0);
  }
};
__name(_ReelPlayerHeader, "ReelPlayerHeader");
__publicField(_ReelPlayerHeader, "type", "ReelPlayerHeader");
var ReelPlayerHeader = _ReelPlayerHeader;

// dist/src/parser/classes/ReelPlayerOverlay.js
var _ReelPlayerOverlay = class _ReelPlayerOverlay extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "like_button");
    __publicField(this, "reel_player_header_supported_renderers");
    __publicField(this, "menu");
    __publicField(this, "next_item_button");
    __publicField(this, "prev_item_button");
    __publicField(this, "subscribe_button_renderer");
    __publicField(this, "style");
    __publicField(this, "view_comments_button");
    __publicField(this, "share_button");
    __publicField(this, "pivot_button");
    __publicField(this, "info_panel");
    this.like_button = parser_exports.parseItem(data.likeButton, LikeButton);
    this.reel_player_header_supported_renderers = parser_exports.parseItem(data.reelPlayerHeaderSupportedRenderers, ReelPlayerHeader);
    this.menu = parser_exports.parseItem(data.menu, Menu);
    this.next_item_button = parser_exports.parseItem(data.nextItemButton, Button);
    this.prev_item_button = parser_exports.parseItem(data.prevItemButton, Button);
    this.subscribe_button_renderer = parser_exports.parseItem(data.subscribeButtonRenderer, [Button, SubscribeButton]);
    this.style = data.style;
    this.view_comments_button = parser_exports.parseItem(data.viewCommentsButton, Button);
    this.share_button = parser_exports.parseItem(data.shareButton, Button);
    this.pivot_button = parser_exports.parseItem(data.pivotButton, PivotButton);
    this.info_panel = parser_exports.parseItem(data.infoPanel, InfoPanelContainer);
  }
};
__name(_ReelPlayerOverlay, "ReelPlayerOverlay");
__publicField(_ReelPlayerOverlay, "type", "ReelPlayerOverlay");
var ReelPlayerOverlay = _ReelPlayerOverlay;

// dist/src/parser/classes/RelatedChipCloud.js
var _RelatedChipCloud = class _RelatedChipCloud extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content");
    this.content = parser_exports.parseItem(data.content);
  }
};
__name(_RelatedChipCloud, "RelatedChipCloud");
__publicField(_RelatedChipCloud, "type", "RelatedChipCloud");
var RelatedChipCloud = _RelatedChipCloud;

// dist/src/parser/classes/RichGrid.js
var _RichGrid = class _RichGrid extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "contents");
    __publicField(this, "target_id");
    this.header = parser_exports.parseItem(data.header);
    this.contents = parser_exports.parseArray(data.contents);
    if (Reflect.has(data, "targetId"))
      this.target_id = data.targetId;
  }
};
__name(_RichGrid, "RichGrid");
__publicField(_RichGrid, "type", "RichGrid");
var RichGrid = _RichGrid;

// dist/src/parser/classes/RichItem.js
var _RichItem = class _RichItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content");
    this.content = parser_exports.parseItem(data.content);
  }
};
__name(_RichItem, "RichItem");
__publicField(_RichItem, "type", "RichItem");
var RichItem = _RichItem;

// dist/src/parser/classes/RichListHeader.js
var _RichListHeader = class _RichListHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "title_style");
    __publicField(this, "icon_type");
    this.title = new Text2(data.title);
    this.subtitle = new Text2(data.subtitle);
    if (Reflect.has(data, "titleStyle")) {
      this.title_style = data.titleStyle.style;
    }
    if (Reflect.has(data, "icon")) {
      this.icon_type = data.icon.iconType;
    }
  }
};
__name(_RichListHeader, "RichListHeader");
__publicField(_RichListHeader, "type", "RichListHeader");
var RichListHeader = _RichListHeader;

// dist/src/parser/classes/RichMetadata.js
var _RichMetadata = class _RichMetadata extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "call_to_action");
    __publicField(this, "icon_type");
    __publicField(this, "endpoint");
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.title = new Text2(data.title);
    this.subtitle = new Text2(data.subtitle);
    this.call_to_action = new Text2(data.callToAction);
    if (Reflect.has(data, "callToActionIcon")) {
      this.icon_type = data.callToActionIcon.iconType;
    }
    this.endpoint = new NavigationEndpoint(data.endpoint);
  }
};
__name(_RichMetadata, "RichMetadata");
__publicField(_RichMetadata, "type", "RichMetadata");
var RichMetadata = _RichMetadata;

// dist/src/parser/classes/RichMetadataRow.js
var _RichMetadataRow = class _RichMetadataRow extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    this.contents = parser_exports.parseArray(data.contents);
  }
};
__name(_RichMetadataRow, "RichMetadataRow");
__publicField(_RichMetadataRow, "type", "RichMetadataRow");
var RichMetadataRow = _RichMetadataRow;

// dist/src/parser/classes/RichSection.js
var _RichSection = class _RichSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "content");
    __publicField(this, "full_bleed");
    __publicField(this, "target_id");
    this.content = parser_exports.parseItem(data.content);
    this.full_bleed = !!data.fullBleed;
    if ("targetId" in data) {
      this.target_id = data.targetId;
    }
  }
};
__name(_RichSection, "RichSection");
__publicField(_RichSection, "type", "RichSection");
var RichSection = _RichSection;

// dist/src/parser/classes/RichShelf.js
var _RichShelf = class _RichShelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "contents");
    __publicField(this, "endpoint");
    __publicField(this, "subtitle");
    __publicField(this, "is_expanded");
    __publicField(this, "is_bottom_divider_hidden");
    __publicField(this, "is_top_divider_hidden");
    __publicField(this, "layout_sizing");
    __publicField(this, "icon_type");
    __publicField(this, "menu");
    __publicField(this, "next_button");
    __publicField(this, "previous_button");
    this.title = new Text2(data.title);
    this.contents = parser_exports.parseArray(data.contents);
    this.is_expanded = !!data.is_expanded;
    this.is_bottom_divider_hidden = !!data.isBottomDividerHidden;
    this.is_top_divider_hidden = !!data.isTopDividerHidden;
    if ("endpoint" in data) {
      this.endpoint = new NavigationEndpoint(data.endpoint);
    }
    if ("subtitle" in data) {
      this.subtitle = new Text2(data.subtitle);
    }
    if ("layoutSizing" in data) {
      this.layout_sizing = data.layoutSizing;
    }
    if ("icon" in data) {
      this.icon_type = data.icon.iconType;
    }
    this.menu = parser_exports.parseItem(data.menu);
    this.next_button = parser_exports.parseItem(data.nextButton);
    this.previous_button = parser_exports.parseItem(data.previousButton);
  }
};
__name(_RichShelf, "RichShelf");
__publicField(_RichShelf, "type", "RichShelf");
var RichShelf = _RichShelf;

// dist/src/parser/classes/SearchFilter.js
var _SearchFilter = class _SearchFilter extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "label");
    __publicField(this, "endpoint");
    __publicField(this, "tooltip");
    __publicField(this, "status");
    this.label = new Text2(data.label);
    this.endpoint = new NavigationEndpoint(data.endpoint || data.navigationEndpoint);
    this.tooltip = data.tooltip;
    if (Reflect.has(data, "status")) {
      this.status = data.status;
    }
  }
  get disabled() {
    return this.status === "FILTER_STATUS_DISABLED";
  }
  get selected() {
    return this.status === "FILTER_STATUS_SELECTED";
  }
};
__name(_SearchFilter, "SearchFilter");
__publicField(_SearchFilter, "type", "SearchFilter");
var SearchFilter2 = _SearchFilter;

// dist/src/parser/classes/SearchFilterGroup.js
var _SearchFilterGroup = class _SearchFilterGroup extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "filters");
    this.title = new Text2(data.title);
    this.filters = parser_exports.parseArray(data.filters, SearchFilter2);
  }
};
__name(_SearchFilterGroup, "SearchFilterGroup");
__publicField(_SearchFilterGroup, "type", "SearchFilterGroup");
var SearchFilterGroup = _SearchFilterGroup;

// dist/src/parser/classes/SearchFilterOptionsDialog.js
var _SearchFilterOptionsDialog = class _SearchFilterOptionsDialog extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "groups");
    this.title = new Text2(data.title);
    this.groups = parser_exports.parseArray(data.groups, SearchFilterGroup);
  }
};
__name(_SearchFilterOptionsDialog, "SearchFilterOptionsDialog");
__publicField(_SearchFilterOptionsDialog, "type", "SearchFilterOptionsDialog");
var SearchFilterOptionsDialog = _SearchFilterOptionsDialog;

// dist/src/parser/classes/SearchHeader.js
var _SearchHeader = class _SearchHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "chip_bar");
    __publicField(this, "search_filter_button");
    this.chip_bar = parser_exports.parseItem(data.chipBar, ChipCloud);
    this.search_filter_button = parser_exports.parseItem(data.searchFilterButton, Button);
  }
};
__name(_SearchHeader, "SearchHeader");
__publicField(_SearchHeader, "type", "SearchHeader");
var SearchHeader = _SearchHeader;

// dist/src/parser/classes/SearchSubMenu.js
var _SearchSubMenu = class _SearchSubMenu extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "groups");
    __publicField(this, "button");
    if (Reflect.has(data, "title"))
      this.title = new Text2(data.title);
    if (Reflect.has(data, "groups"))
      this.groups = parser_exports.parseArray(data.groups, SearchFilterGroup);
    if (Reflect.has(data, "button"))
      this.button = parser_exports.parseItem(data.button, ToggleButton);
  }
};
__name(_SearchSubMenu, "SearchSubMenu");
__publicField(_SearchSubMenu, "type", "SearchSubMenu");
var SearchSubMenu = _SearchSubMenu;

// dist/src/parser/classes/SearchSuggestionsSection.js
var _SearchSuggestionsSection = class _SearchSuggestionsSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    this.contents = parser_exports.parseArray(data.contents);
  }
};
__name(_SearchSuggestionsSection, "SearchSuggestionsSection");
__publicField(_SearchSuggestionsSection, "type", "SearchSuggestionsSection");
var SearchSuggestionsSection = _SearchSuggestionsSection;

// dist/src/parser/classes/UniversalWatchCard.js
var _UniversalWatchCard = class _UniversalWatchCard extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "call_to_action");
    __publicField(this, "sections");
    __publicField(this, "collapsed_label");
    this.header = parser_exports.parseItem(data.header);
    this.call_to_action = parser_exports.parseItem(data.callToAction);
    this.sections = parser_exports.parseArray(data.sections);
    if (Reflect.has(data, "collapsedLabel")) {
      this.collapsed_label = new Text2(data.collapsedLabel);
    }
  }
};
__name(_UniversalWatchCard, "UniversalWatchCard");
__publicField(_UniversalWatchCard, "type", "UniversalWatchCard");
var UniversalWatchCard = _UniversalWatchCard;

// dist/src/parser/classes/SecondarySearchContainer.js
var _SecondarySearchContainer = class _SecondarySearchContainer extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "target_id");
    __publicField(this, "contents");
    this.contents = parser_exports.parseArray(data.contents, [UniversalWatchCard]);
  }
};
__name(_SecondarySearchContainer, "SecondarySearchContainer");
__publicField(_SecondarySearchContainer, "type", "SecondarySearchContainer");
var SecondarySearchContainer = _SecondarySearchContainer;

// dist/src/parser/classes/SectionHeaderView.js
var _SectionHeaderView = class _SectionHeaderView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "headline");
    this.headline = Text2.fromAttributed(data.headline);
  }
};
__name(_SectionHeaderView, "SectionHeaderView");
__publicField(_SectionHeaderView, "type", "SectionHeaderView");
var SectionHeaderView = _SectionHeaderView;

// dist/src/parser/classes/SegmentedLikeDislikeButton.js
var _SegmentedLikeDislikeButton = class _SegmentedLikeDislikeButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "like_button");
    __publicField(this, "dislike_button");
    this.like_button = parser_exports.parseItem(data.likeButton, [ToggleButton, Button]);
    this.dislike_button = parser_exports.parseItem(data.dislikeButton, [ToggleButton, Button]);
  }
};
__name(_SegmentedLikeDislikeButton, "SegmentedLikeDislikeButton");
__publicField(_SegmentedLikeDislikeButton, "type", "SegmentedLikeDislikeButton");
var SegmentedLikeDislikeButton = _SegmentedLikeDislikeButton;

// dist/src/parser/classes/SettingBoolean.js
var _SettingBoolean = class _SettingBoolean extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "summary");
    __publicField(this, "enable_endpoint");
    __publicField(this, "disable_endpoint");
    __publicField(this, "item_id");
    if (Reflect.has(data, "title")) {
      this.title = new Text2(data.title);
    }
    if (Reflect.has(data, "summary")) {
      this.summary = new Text2(data.summary);
    }
    if (Reflect.has(data, "enableServiceEndpoint")) {
      this.enable_endpoint = new NavigationEndpoint(data.enableServiceEndpoint);
    }
    if (Reflect.has(data, "disableServiceEndpoint")) {
      this.disable_endpoint = new NavigationEndpoint(data.disableServiceEndpoint);
    }
    this.item_id = data.itemId;
  }
};
__name(_SettingBoolean, "SettingBoolean");
__publicField(_SettingBoolean, "type", "SettingBoolean");
var SettingBoolean = _SettingBoolean;

// dist/src/parser/classes/SettingsCheckbox.js
var _SettingsCheckbox = class _SettingsCheckbox extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "help_text");
    __publicField(this, "enabled");
    __publicField(this, "disabled");
    __publicField(this, "id");
    this.title = new Text2(data.title);
    this.help_text = new Text2(data.helpText);
    this.enabled = data.enabled;
    this.disabled = data.disabled;
    this.id = data.id;
  }
};
__name(_SettingsCheckbox, "SettingsCheckbox");
__publicField(_SettingsCheckbox, "type", "SettingsCheckbox");
var SettingsCheckbox = _SettingsCheckbox;

// dist/src/parser/classes/SettingsSwitch.js
var _SettingsSwitch = class _SettingsSwitch extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "enabled");
    __publicField(this, "enable_endpoint");
    __publicField(this, "disable_endpoint");
    this.title = new Text2(data.title);
    this.subtitle = new Text2(data.subtitle);
    this.enabled = data.enabled;
    this.enable_endpoint = new NavigationEndpoint(data.enableServiceEndpoint);
    this.disable_endpoint = new NavigationEndpoint(data.disableServiceEndpoint);
  }
};
__name(_SettingsSwitch, "SettingsSwitch");
__publicField(_SettingsSwitch, "type", "SettingsSwitch");
var SettingsSwitch = _SettingsSwitch;

// dist/src/parser/classes/SettingsOptions.js
var _SettingsOptions = class _SettingsOptions extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "text");
    __publicField(this, "options");
    this.title = new Text2(data.title);
    if (Reflect.has(data, "text")) {
      this.text = new Text2(data.text).toString();
    }
    if (Reflect.has(data, "options")) {
      this.options = parser_exports.parseArray(data.options, [
        SettingsSwitch,
        Dropdown,
        CopyLink,
        SettingsCheckbox,
        ChannelOptions
      ]);
    }
  }
};
__name(_SettingsOptions, "SettingsOptions");
__publicField(_SettingsOptions, "type", "SettingsOptions");
var SettingsOptions = _SettingsOptions;

// dist/src/parser/classes/SettingsSidebar.js
var _SettingsSidebar = class _SettingsSidebar extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "items");
    this.title = new Text2(data.title);
    this.items = parser_exports.parseArray(data.items, CompactLink);
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_SettingsSidebar, "SettingsSidebar");
__publicField(_SettingsSidebar, "type", "SettingsSidebar");
var SettingsSidebar = _SettingsSidebar;

// dist/src/parser/classes/SharedPost.js
var _SharedPost = class _SharedPost extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    __publicField(this, "content");
    __publicField(this, "published");
    __publicField(this, "menu");
    __publicField(this, "original_post");
    __publicField(this, "id");
    __publicField(this, "endpoint");
    __publicField(this, "expand_button");
    __publicField(this, "author");
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.content = new Text2(data.content);
    this.published = new Text2(data.publishedTimeText);
    this.menu = parser_exports.parseItem(data.actionMenu, Menu);
    this.original_post = parser_exports.parseItem(data.originalPost, [BackstagePost, Post]);
    this.id = data.postId;
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.expand_button = parser_exports.parseItem(data.expandButton, Button);
    this.author = new Author(data.displayName, void 0);
  }
};
__name(_SharedPost, "SharedPost");
__publicField(_SharedPost, "type", "SharedPost");
var SharedPost = _SharedPost;

// dist/src/parser/classes/SharePanelHeader.js
var _SharePanelHeader = class _SharePanelHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = parser_exports.parseItem(data.title);
  }
};
__name(_SharePanelHeader, "SharePanelHeader");
__publicField(_SharePanelHeader, "type", "SharePanelHeader");
var SharePanelHeader = _SharePanelHeader;

// dist/src/parser/classes/SharePanelTitleV15.js
var _SharePanelTitleV15 = class _SharePanelTitleV15 extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = new Text2(data.title);
  }
};
__name(_SharePanelTitleV15, "SharePanelTitleV15");
__publicField(_SharePanelTitleV15, "type", "SharePanelTitleV15");
var SharePanelTitleV15 = _SharePanelTitleV15;

// dist/src/parser/classes/ShareTarget.js
var _ShareTarget = class _ShareTarget extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "endpoint");
    __publicField(this, "service_name");
    __publicField(this, "target_id");
    __publicField(this, "title");
    if (Reflect.has(data, "serviceEndpoint"))
      this.endpoint = new NavigationEndpoint(data.serviceEndpoint);
    else if (Reflect.has(data, "navigationEndpoint"))
      this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.service_name = data.serviceName;
    this.target_id = data.targetId;
    this.title = new Text2(data.title);
  }
};
__name(_ShareTarget, "ShareTarget");
__publicField(_ShareTarget, "type", "ShareTarget");
var ShareTarget = _ShareTarget;

// dist/src/parser/classes/Shelf.js
var _Shelf = class _Shelf extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "endpoint");
    __publicField(this, "content");
    __publicField(this, "icon_type");
    __publicField(this, "menu");
    __publicField(this, "play_all_button");
    __publicField(this, "subtitle");
    this.title = new Text2(data.title);
    if (Reflect.has(data, "endpoint")) {
      this.endpoint = new NavigationEndpoint(data.endpoint);
    }
    this.content = parser_exports.parseItem(data.content);
    if (Reflect.has(data, "icon")) {
      this.icon_type = data.icon.iconType;
    }
    if (Reflect.has(data, "menu")) {
      this.menu = parser_exports.parseItem(data.menu);
    }
    if (Reflect.has(data, "playAllButton")) {
      this.play_all_button = parser_exports.parseItem(data.playAllButton, Button);
    }
    if (Reflect.has(data, "subtitle")) {
      this.subtitle = new Text2(data.subtitle);
    }
  }
};
__name(_Shelf, "Shelf");
__publicField(_Shelf, "type", "Shelf");
var Shelf = _Shelf;

// dist/src/parser/classes/ShortsLockupView.js
var _ShortsLockupView = class _ShortsLockupView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "entity_id");
    __publicField(this, "accessibility_text");
    __publicField(this, "thumbnail");
    __publicField(this, "on_tap_endpoint");
    __publicField(this, "menu_on_tap");
    __publicField(this, "index_in_collection");
    __publicField(this, "menu_on_tap_a11y_label");
    __publicField(this, "overlay_metadata");
    __publicField(this, "inline_player_data");
    __publicField(this, "badge");
    this.entity_id = data.entityId;
    this.accessibility_text = data.accessibilityText;
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.on_tap_endpoint = new NavigationEndpoint(data.onTap);
    this.menu_on_tap = new NavigationEndpoint(data.menuOnTap);
    this.index_in_collection = data.indexInCollection;
    this.menu_on_tap_a11y_label = data.menuOnTapA11yLabel;
    this.overlay_metadata = {
      primary_text: data.overlayMetadata.primaryText ? Text2.fromAttributed(data.overlayMetadata.primaryText) : void 0,
      secondary_text: data.overlayMetadata.secondaryText ? Text2.fromAttributed(data.overlayMetadata.secondaryText) : void 0
    };
    if (data.inlinePlayerData?.onVisible) {
      this.inline_player_data = new NavigationEndpoint(data.inlinePlayerData.onVisible);
    }
    if (data.badge) {
      this.badge = parser_exports.parseItem(data.badge, BadgeView);
    }
  }
};
__name(_ShortsLockupView, "ShortsLockupView");
__publicField(_ShortsLockupView, "type", "ShortsLockupView");
var ShortsLockupView = _ShortsLockupView;

// dist/src/parser/classes/ShowingResultsFor.js
var _ShowingResultsFor = class _ShowingResultsFor extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "corrected_query");
    __publicField(this, "original_query");
    __publicField(this, "corrected_query_endpoint");
    __publicField(this, "original_query_endpoint");
    __publicField(this, "search_instead_for");
    __publicField(this, "showing_results_for");
    this.corrected_query = new Text2(data.correctedQuery);
    this.original_query = new Text2(data.originalQuery);
    this.corrected_query_endpoint = new NavigationEndpoint(data.correctedQueryEndpoint);
    this.original_query_endpoint = new NavigationEndpoint(data.originalQueryEndpoint);
    this.search_instead_for = new Text2(data.searchInsteadFor);
    this.showing_results_for = new Text2(data.showingResultsFor);
  }
};
__name(_ShowingResultsFor, "ShowingResultsFor");
__publicField(_ShowingResultsFor, "type", "ShowingResultsFor");
var ShowingResultsFor = _ShowingResultsFor;

// dist/src/parser/classes/SimpleCardContent.js
var _SimpleCardContent = class _SimpleCardContent extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "image");
    __publicField(this, "title");
    __publicField(this, "display_domain");
    __publicField(this, "show_link_icon");
    __publicField(this, "call_to_action");
    __publicField(this, "endpoint");
    this.image = Thumbnail.fromResponse(data.image);
    this.title = new Text2(data.title);
    this.display_domain = new Text2(data.displayDomain);
    this.show_link_icon = data.showLinkIcon;
    this.call_to_action = new Text2(data.callToAction);
    this.endpoint = new NavigationEndpoint(data.command);
  }
};
__name(_SimpleCardContent, "SimpleCardContent");
__publicField(_SimpleCardContent, "type", "SimpleCardContent");
var SimpleCardContent = _SimpleCardContent;

// dist/src/parser/classes/SimpleCardTeaser.js
var _SimpleCardTeaser = class _SimpleCardTeaser extends YTNode {
  // @TODO: or string?
  constructor(data) {
    super();
    __publicField(this, "message");
    __publicField(this, "prominent");
    this.message = new Text2(data.message);
    this.prominent = data.prominent;
  }
};
__name(_SimpleCardTeaser, "SimpleCardTeaser");
__publicField(_SimpleCardTeaser, "type", "SimpleCardTeaser");
var SimpleCardTeaser = _SimpleCardTeaser;

// dist/src/parser/classes/SimpleTextSection.js
var _SimpleTextSection = class _SimpleTextSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "lines");
    __publicField(this, "style");
    this.lines = data.lines.map((line) => new Text2(line));
    this.style = data.layoutStyle;
  }
};
__name(_SimpleTextSection, "SimpleTextSection");
__publicField(_SimpleTextSection, "type", "SimpleTextSection");
var SimpleTextSection = _SimpleTextSection;

// dist/src/parser/classes/SingleActionEmergencySupport.js
var _SingleActionEmergencySupport = class _SingleActionEmergencySupport extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "action_text");
    __publicField(this, "nav_text");
    __publicField(this, "details");
    __publicField(this, "icon_type");
    __publicField(this, "endpoint");
    this.action_text = new Text2(data.actionText);
    this.nav_text = new Text2(data.navigationText);
    this.details = new Text2(data.detailsText);
    this.icon_type = data.icon.iconType;
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
  }
};
__name(_SingleActionEmergencySupport, "SingleActionEmergencySupport");
__publicField(_SingleActionEmergencySupport, "type", "SingleActionEmergencySupport");
var SingleActionEmergencySupport = _SingleActionEmergencySupport;

// dist/src/parser/classes/Tab.js
var _Tab = class _Tab extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "selected");
    __publicField(this, "endpoint");
    __publicField(this, "content");
    this.title = data.title || "N/A";
    this.selected = !!data.selected;
    this.endpoint = new NavigationEndpoint(data.endpoint);
    this.content = parser_exports.parseItem(data.content, [SectionList, MusicQueue, RichGrid]);
  }
};
__name(_Tab, "Tab");
__publicField(_Tab, "type", "Tab");
var Tab = _Tab;

// dist/src/parser/classes/SingleColumnBrowseResults.js
var _SingleColumnBrowseResults = class _SingleColumnBrowseResults extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "tabs");
    this.tabs = parser_exports.parseArray(data.tabs, Tab);
  }
};
__name(_SingleColumnBrowseResults, "SingleColumnBrowseResults");
__publicField(_SingleColumnBrowseResults, "type", "SingleColumnBrowseResults");
var SingleColumnBrowseResults = _SingleColumnBrowseResults;

// dist/src/parser/classes/SingleColumnMusicWatchNextResults.js
var _SingleColumnMusicWatchNextResults = class _SingleColumnMusicWatchNextResults extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    this.contents = parser_exports.parse(data);
  }
};
__name(_SingleColumnMusicWatchNextResults, "SingleColumnMusicWatchNextResults");
__publicField(_SingleColumnMusicWatchNextResults, "type", "SingleColumnMusicWatchNextResults");
var SingleColumnMusicWatchNextResults = _SingleColumnMusicWatchNextResults;

// dist/src/parser/classes/SingleHeroImage.js
var _SingleHeroImage = class _SingleHeroImage extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnails");
    __publicField(this, "style");
    this.thumbnails = Thumbnail.fromResponse(data.thumbnail);
    this.style = data.style;
  }
};
__name(_SingleHeroImage, "SingleHeroImage");
__publicField(_SingleHeroImage, "type", "SingleHeroImage");
var SingleHeroImage = _SingleHeroImage;

// dist/src/parser/classes/SlimOwner.js
var _SlimOwner = class _SlimOwner extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "thumbnail");
    __publicField(this, "title");
    __publicField(this, "endpoint");
    __publicField(this, "subscribe_button");
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.title = new Text2(data.title);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.subscribe_button = parser_exports.parseItem(data.subscribeButton, SubscribeButton);
  }
};
__name(_SlimOwner, "SlimOwner");
__publicField(_SlimOwner, "type", "SlimOwner");
var SlimOwner = _SlimOwner;

// dist/src/parser/classes/SlimVideoMetadata.js
var _SlimVideoMetadata = class _SlimVideoMetadata extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "collapsed_subtitle");
    __publicField(this, "expanded_subtitle");
    __publicField(this, "owner");
    __publicField(this, "description");
    __publicField(this, "video_id");
    __publicField(this, "date");
    this.title = new Text2(data.title);
    this.collapsed_subtitle = new Text2(data.collapsedSubtitle);
    this.expanded_subtitle = new Text2(data.expandedSubtitle);
    this.owner = parser_exports.parseItem(data.owner);
    this.description = new Text2(data.description);
    this.video_id = data.videoId;
    this.date = new Text2(data.dateText);
  }
};
__name(_SlimVideoMetadata, "SlimVideoMetadata");
__publicField(_SlimVideoMetadata, "type", "SlimVideoMetadata");
var SlimVideoMetadata = _SlimVideoMetadata;

// dist/src/parser/classes/StartAt.js
var _StartAt = class _StartAt extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "start_at_option_label");
    this.start_at_option_label = new Text2(data.startAtOptionLabel);
  }
};
__name(_StartAt, "StartAt");
__publicField(_StartAt, "type", "StartAt");
var StartAt = _StartAt;

// dist/src/parser/classes/Tabbed.js
var _Tabbed = class _Tabbed extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    this.contents = parser_exports.parse(data);
  }
};
__name(_Tabbed, "Tabbed");
__publicField(_Tabbed, "type", "Tabbed");
var Tabbed = _Tabbed;

// dist/src/parser/classes/TabbedSearchResults.js
var _TabbedSearchResults = class _TabbedSearchResults extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "tabs");
    this.tabs = parser_exports.parseArray(data.tabs, Tab);
  }
};
__name(_TabbedSearchResults, "TabbedSearchResults");
__publicField(_TabbedSearchResults, "type", "TabbedSearchResults");
var TabbedSearchResults = _TabbedSearchResults;

// dist/src/parser/classes/TextHeader.js
var _TextHeader = class _TextHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "style");
    this.title = new Text2(data.title);
    this.style = data.style;
  }
};
__name(_TextHeader, "TextHeader");
__publicField(_TextHeader, "type", "TextHeader");
var TextHeader = _TextHeader;

// dist/src/parser/classes/ThirdPartyShareTargetSection.js
var _ThirdPartyShareTargetSection = class _ThirdPartyShareTargetSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "share_targets");
    this.share_targets = parser_exports.parseArray(data.shareTargets, ShareTarget);
  }
};
__name(_ThirdPartyShareTargetSection, "ThirdPartyShareTargetSection");
__publicField(_ThirdPartyShareTargetSection, "type", "ThirdPartyShareTargetSection");
var ThirdPartyShareTargetSection = _ThirdPartyShareTargetSection;

// dist/src/parser/classes/ThumbnailLandscapePortrait.js
var _ThumbnailLandscapePortrait = class _ThumbnailLandscapePortrait extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "landscape");
    __publicField(this, "portrait");
    this.landscape = Thumbnail.fromResponse(data.landscape);
    this.portrait = Thumbnail.fromResponse(data.portrait);
  }
};
__name(_ThumbnailLandscapePortrait, "ThumbnailLandscapePortrait");
__publicField(_ThumbnailLandscapePortrait, "type", "ThumbnailLandscapePortrait");
var ThumbnailLandscapePortrait = _ThumbnailLandscapePortrait;

// dist/src/parser/classes/ThumbnailOverlayEndorsement.js
var _ThumbnailOverlayEndorsement = class _ThumbnailOverlayEndorsement extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    this.text = new Text2(data.text).toString();
  }
};
__name(_ThumbnailOverlayEndorsement, "ThumbnailOverlayEndorsement");
__publicField(_ThumbnailOverlayEndorsement, "type", "ThumbnailOverlayEndorsement");
var ThumbnailOverlayEndorsement = _ThumbnailOverlayEndorsement;

// dist/src/parser/classes/ThumbnailOverlayHoverText.js
var _ThumbnailOverlayHoverText = class _ThumbnailOverlayHoverText extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "icon_type");
    this.text = new Text2(data.text);
    this.icon_type = data.icon.iconType;
  }
};
__name(_ThumbnailOverlayHoverText, "ThumbnailOverlayHoverText");
__publicField(_ThumbnailOverlayHoverText, "type", "ThumbnailOverlayHoverText");
var ThumbnailOverlayHoverText = _ThumbnailOverlayHoverText;

// dist/src/parser/classes/ThumbnailOverlayInlineUnplayable.js
var _ThumbnailOverlayInlineUnplayable = class _ThumbnailOverlayInlineUnplayable extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "icon_type");
    this.text = new Text2(data.text).toString();
    this.icon_type = data.icon.iconType;
  }
};
__name(_ThumbnailOverlayInlineUnplayable, "ThumbnailOverlayInlineUnplayable");
__publicField(_ThumbnailOverlayInlineUnplayable, "type", "ThumbnailOverlayInlineUnplayable");
var ThumbnailOverlayInlineUnplayable = _ThumbnailOverlayInlineUnplayable;

// dist/src/parser/classes/ThumbnailOverlayLoadingPreview.js
var _ThumbnailOverlayLoadingPreview = class _ThumbnailOverlayLoadingPreview extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    this.text = new Text2(data.text);
  }
};
__name(_ThumbnailOverlayLoadingPreview, "ThumbnailOverlayLoadingPreview");
__publicField(_ThumbnailOverlayLoadingPreview, "type", "ThumbnailOverlayLoadingPreview");
var ThumbnailOverlayLoadingPreview = _ThumbnailOverlayLoadingPreview;

// dist/src/parser/classes/ThumbnailOverlayNowPlaying.js
var _ThumbnailOverlayNowPlaying = class _ThumbnailOverlayNowPlaying extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    this.text = new Text2(data.text).toString();
  }
};
__name(_ThumbnailOverlayNowPlaying, "ThumbnailOverlayNowPlaying");
__publicField(_ThumbnailOverlayNowPlaying, "type", "ThumbnailOverlayNowPlaying");
var ThumbnailOverlayNowPlaying = _ThumbnailOverlayNowPlaying;

// dist/src/parser/classes/ThumbnailOverlayPinking.js
var _ThumbnailOverlayPinking = class _ThumbnailOverlayPinking extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "hack");
    this.hack = data.hack;
  }
};
__name(_ThumbnailOverlayPinking, "ThumbnailOverlayPinking");
__publicField(_ThumbnailOverlayPinking, "type", "ThumbnailOverlayPinking");
var ThumbnailOverlayPinking = _ThumbnailOverlayPinking;

// dist/src/parser/classes/ThumbnailOverlayPlaybackStatus.js
var _ThumbnailOverlayPlaybackStatus = class _ThumbnailOverlayPlaybackStatus extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "texts");
    this.texts = data.texts.map((text) => new Text2(text));
  }
};
__name(_ThumbnailOverlayPlaybackStatus, "ThumbnailOverlayPlaybackStatus");
__publicField(_ThumbnailOverlayPlaybackStatus, "type", "ThumbnailOverlayPlaybackStatus");
var ThumbnailOverlayPlaybackStatus = _ThumbnailOverlayPlaybackStatus;

// dist/src/parser/classes/ThumbnailOverlayResumePlayback.js
var _ThumbnailOverlayResumePlayback = class _ThumbnailOverlayResumePlayback extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "percent_duration_watched");
    this.percent_duration_watched = data.percentDurationWatched;
  }
};
__name(_ThumbnailOverlayResumePlayback, "ThumbnailOverlayResumePlayback");
__publicField(_ThumbnailOverlayResumePlayback, "type", "ThumbnailOverlayResumePlayback");
var ThumbnailOverlayResumePlayback = _ThumbnailOverlayResumePlayback;

// dist/src/parser/classes/ThumbnailOverlaySidePanel.js
var _ThumbnailOverlaySidePanel = class _ThumbnailOverlaySidePanel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "icon_type");
    this.text = new Text2(data.text);
    this.icon_type = data.icon.iconType;
  }
};
__name(_ThumbnailOverlaySidePanel, "ThumbnailOverlaySidePanel");
__publicField(_ThumbnailOverlaySidePanel, "type", "ThumbnailOverlaySidePanel");
var ThumbnailOverlaySidePanel = _ThumbnailOverlaySidePanel;

// dist/src/parser/classes/ThumbnailOverlayToggleButton.js
var _ThumbnailOverlayToggleButton = class _ThumbnailOverlayToggleButton extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "is_toggled");
    __publicField(this, "icon_type");
    __publicField(this, "tooltip");
    __publicField(this, "toggled_endpoint");
    __publicField(this, "untoggled_endpoint");
    if (Reflect.has(data, "isToggled")) {
      this.is_toggled = data.isToggled;
    }
    this.icon_type = {
      toggled: data.toggledIcon.iconType,
      untoggled: data.untoggledIcon.iconType
    };
    this.tooltip = {
      toggled: data.toggledTooltip,
      untoggled: data.untoggledTooltip
    };
    if (data.toggledServiceEndpoint)
      this.toggled_endpoint = new NavigationEndpoint(data.toggledServiceEndpoint);
    if (data.untoggledServiceEndpoint)
      this.untoggled_endpoint = new NavigationEndpoint(data.untoggledServiceEndpoint);
  }
};
__name(_ThumbnailOverlayToggleButton, "ThumbnailOverlayToggleButton");
__publicField(_ThumbnailOverlayToggleButton, "type", "ThumbnailOverlayToggleButton");
var ThumbnailOverlayToggleButton = _ThumbnailOverlayToggleButton;

// dist/src/parser/classes/TitleAndButtonListHeader.js
var _TitleAndButtonListHeader = class _TitleAndButtonListHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    this.title = new Text2(data.title);
  }
};
__name(_TitleAndButtonListHeader, "TitleAndButtonListHeader");
__publicField(_TitleAndButtonListHeader, "type", "TitleAndButtonListHeader");
var TitleAndButtonListHeader = _TitleAndButtonListHeader;

// dist/src/parser/classes/ToggleMenuServiceItem.js
var _ToggleMenuServiceItem = class _ToggleMenuServiceItem extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "text");
    __publicField(this, "toggled_text");
    __publicField(this, "icon_type");
    __publicField(this, "toggled_icon_type");
    __publicField(this, "default_endpoint");
    __publicField(this, "toggled_endpoint");
    this.text = new Text2(data.defaultText);
    this.toggled_text = new Text2(data.toggledText);
    this.icon_type = data.defaultIcon.iconType;
    this.toggled_icon_type = data.toggledIcon.iconType;
    this.default_endpoint = new NavigationEndpoint(data.defaultServiceEndpoint);
    this.toggled_endpoint = new NavigationEndpoint(data.toggledServiceEndpoint);
  }
};
__name(_ToggleMenuServiceItem, "ToggleMenuServiceItem");
__publicField(_ToggleMenuServiceItem, "type", "ToggleMenuServiceItem");
var ToggleMenuServiceItem = _ToggleMenuServiceItem;

// dist/src/parser/classes/Tooltip.js
var _Tooltip = class _Tooltip extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "promo_config");
    __publicField(this, "target_id");
    __publicField(this, "details");
    __publicField(this, "suggested_position");
    __publicField(this, "dismiss_stratedy");
    __publicField(this, "dwell_time_ms");
    this.promo_config = {
      promo_id: data.promoConfig.promoId,
      impression_endpoints: data.promoConfig.impressionEndpoints.map((endpoint) => new NavigationEndpoint(endpoint)),
      accept: new NavigationEndpoint(data.promoConfig.acceptCommand),
      dismiss: new NavigationEndpoint(data.promoConfig.dismissCommand)
    };
    this.target_id = data.targetId;
    this.details = new Text2(data.detailsText);
    this.suggested_position = data.suggestedPosition.type;
    this.dismiss_stratedy = data.dismissStrategy.type;
    this.dwell_time_ms = parseInt(data.dwellTimeMs);
  }
};
__name(_Tooltip, "Tooltip");
__publicField(_Tooltip, "type", "Tooltip");
var Tooltip = _Tooltip;

// dist/src/parser/classes/TopicChannelDetails.js
var _TopicChannelDetails = class _TopicChannelDetails extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "avatar");
    __publicField(this, "subtitle");
    __publicField(this, "subscribe_button");
    __publicField(this, "endpoint");
    this.title = new Text2(data.title);
    this.avatar = Thumbnail.fromResponse(data.thumbnail ?? data.avatar);
    this.subtitle = new Text2(data.subtitle);
    this.subscribe_button = parser_exports.parseItem(data.subscribeButton, SubscribeButton);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
  }
};
__name(_TopicChannelDetails, "TopicChannelDetails");
__publicField(_TopicChannelDetails, "type", "TopicChannelDetails");
var TopicChannelDetails = _TopicChannelDetails;

// dist/src/parser/classes/TwoColumnBrowseResults.js
var _TwoColumnBrowseResults = class _TwoColumnBrowseResults extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "tabs");
    __publicField(this, "secondary_contents");
    this.tabs = parser_exports.parseArray(data.tabs, [Tab, ExpandableTab]);
    this.secondary_contents = parser_exports.parseItem(data.secondaryContents, [SectionList, BrowseFeedActions, ProfileColumn]);
  }
};
__name(_TwoColumnBrowseResults, "TwoColumnBrowseResults");
__publicField(_TwoColumnBrowseResults, "type", "TwoColumnBrowseResults");
var TwoColumnBrowseResults = _TwoColumnBrowseResults;

// dist/src/parser/classes/TwoColumnSearchResults.js
var _TwoColumnSearchResults = class _TwoColumnSearchResults extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "header");
    __publicField(this, "primary_contents");
    __publicField(this, "secondary_contents");
    __publicField(this, "target_id");
    this.header = parser_exports.parseItem(data.header);
    this.primary_contents = parser_exports.parseItem(data.primaryContents, [RichGrid, SectionList]);
    this.secondary_contents = parser_exports.parseItem(data.secondaryContents, [SecondarySearchContainer]);
    if ("targetId" in data) {
      this.target_id = data.targetId;
    }
  }
};
__name(_TwoColumnSearchResults, "TwoColumnSearchResults");
__publicField(_TwoColumnSearchResults, "type", "TwoColumnSearchResults");
var TwoColumnSearchResults = _TwoColumnSearchResults;

// dist/src/parser/classes/TwoColumnWatchNextResults.js
var _TwoColumnWatchNextResults_instances, parseAutoplaySet_fn;
var _TwoColumnWatchNextResults = class _TwoColumnWatchNextResults extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _TwoColumnWatchNextResults_instances);
    __publicField(this, "results");
    __publicField(this, "secondary_results");
    __publicField(this, "conversation_bar");
    __publicField(this, "playlist");
    __publicField(this, "autoplay");
    this.results = parser_exports.parseArray(data.results?.results.contents);
    this.secondary_results = parser_exports.parseArray(data.secondaryResults?.secondaryResults.results);
    this.conversation_bar = parser_exports.parseItem(data?.conversationBar);
    const playlistData = data.playlist?.playlist;
    if (playlistData) {
      this.playlist = {
        id: playlistData.playlistId,
        title: playlistData.title,
        author: playlistData.shortBylineText?.simpleText ? new Text2(playlistData.shortBylineText) : new Author(playlistData.longBylineText),
        contents: parser_exports.parseArray(playlistData.contents),
        current_index: playlistData.currentIndex,
        is_infinite: !!playlistData.isInfinite,
        menu: parser_exports.parseItem(playlistData.menu, Menu)
      };
    }
    const autoplayData = data.autoplay?.autoplay;
    if (autoplayData) {
      this.autoplay = {
        sets: autoplayData.sets.map((set) => __privateMethod(this, _TwoColumnWatchNextResults_instances, parseAutoplaySet_fn).call(this, set))
      };
      if (autoplayData.modifiedSets) {
        this.autoplay.modified_sets = autoplayData.modifiedSets.map((set) => __privateMethod(this, _TwoColumnWatchNextResults_instances, parseAutoplaySet_fn).call(this, set));
      }
      if (autoplayData.countDownSecs) {
        this.autoplay.count_down_secs = autoplayData.countDownSecs;
      }
    }
  }
};
_TwoColumnWatchNextResults_instances = new WeakSet();
parseAutoplaySet_fn = /* @__PURE__ */ __name(function(data) {
  const result = {
    autoplay_video: new NavigationEndpoint(data.autoplayVideo)
  };
  if (data.nextButtonVideo) {
    result.next_button_video = new NavigationEndpoint(data.nextButtonVideo);
  }
  return result;
}, "#parseAutoplaySet");
__name(_TwoColumnWatchNextResults, "TwoColumnWatchNextResults");
__publicField(_TwoColumnWatchNextResults, "type", "TwoColumnWatchNextResults");
var TwoColumnWatchNextResults = _TwoColumnWatchNextResults;

// dist/src/parser/classes/UnifiedSharePanel.js
var _UnifiedSharePanel = class _UnifiedSharePanel extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "third_party_network_section");
    __publicField(this, "header");
    __publicField(this, "share_panel_version");
    __publicField(this, "show_loading_spinner");
    if (data.contents) {
      const contents = data.contents.find((content) => content.thirdPartyNetworkSection);
      if (contents) {
        this.third_party_network_section = {
          share_target_container: parser_exports.parseItem(contents.thirdPartyNetworkSection.shareTargetContainer, ThirdPartyShareTargetSection),
          copy_link_container: parser_exports.parseItem(contents.thirdPartyNetworkSection.copyLinkContainer, CopyLink),
          start_at_container: parser_exports.parseItem(contents.thirdPartyNetworkSection.startAtContainer, StartAt)
        };
      }
    }
    this.header = parser_exports.parseItem(data.header, SharePanelHeader);
    this.share_panel_version = data.sharePanelVersion;
    if (Reflect.has(data, "showLoadingSpinner"))
      this.show_loading_spinner = data.showLoadingSpinner;
  }
};
__name(_UnifiedSharePanel, "UnifiedSharePanel");
__publicField(_UnifiedSharePanel, "type", "UnifiedSharePanel");
var UnifiedSharePanel = _UnifiedSharePanel;

// dist/src/parser/classes/UpsellDialog.js
var _UpsellDialog = class _UpsellDialog extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "message_title");
    __publicField(this, "message_text");
    __publicField(this, "action_button");
    __publicField(this, "dismiss_button");
    __publicField(this, "is_visible");
    this.message_title = new Text2(data.dialogMessageTitle);
    this.message_text = new Text2(data.dialogMessageText);
    this.action_button = parser_exports.parseItem(data.actionButton, Button);
    this.dismiss_button = parser_exports.parseItem(data.dismissButton, Button);
    this.is_visible = data.isVisible;
  }
};
__name(_UpsellDialog, "UpsellDialog");
__publicField(_UpsellDialog, "type", "UpsellDialog");
var UpsellDialog = _UpsellDialog;

// dist/src/parser/classes/VerticalList.js
var _VerticalList = class _VerticalList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    __publicField(this, "collapsed_item_count");
    // Number?
    __publicField(this, "collapsed_state_button_text");
    this.items = parser_exports.parseArray(data.items);
    this.collapsed_item_count = data.collapsedItemCount;
    this.collapsed_state_button_text = new Text2(data.collapsedStateButtonText);
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_VerticalList, "VerticalList");
__publicField(_VerticalList, "type", "VerticalList");
var VerticalList = _VerticalList;

// dist/src/parser/classes/VerticalWatchCardList.js
var _VerticalWatchCardList = class _VerticalWatchCardList extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "items");
    __publicField(this, "view_all_text");
    __publicField(this, "view_all_endpoint");
    this.items = parser_exports.parseArray(data.items);
    this.view_all_text = new Text2(data.viewAllText);
    this.view_all_endpoint = new NavigationEndpoint(data.viewAllEndpoint);
  }
  // XXX: Alias for consistency.
  get contents() {
    return this.items;
  }
};
__name(_VerticalWatchCardList, "VerticalWatchCardList");
__publicField(_VerticalWatchCardList, "type", "VerticalWatchCardList");
var VerticalWatchCardList = _VerticalWatchCardList;

// dist/src/parser/classes/VideoInfoCardContent.js
var _VideoInfoCardContent = class _VideoInfoCardContent extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "channel_name");
    __publicField(this, "view_count");
    __publicField(this, "video_thumbnails");
    __publicField(this, "duration");
    __publicField(this, "endpoint");
    this.title = new Text2(data.videoTitle);
    this.channel_name = new Text2(data.channelName);
    this.view_count = new Text2(data.viewCountText);
    this.video_thumbnails = Thumbnail.fromResponse(data.videoThumbnail);
    this.duration = new Text2(data.lengthString);
    this.endpoint = new NavigationEndpoint(data.action);
  }
};
__name(_VideoInfoCardContent, "VideoInfoCardContent");
__publicField(_VideoInfoCardContent, "type", "VideoInfoCardContent");
var VideoInfoCardContent = _VideoInfoCardContent;

// dist/src/parser/classes/VideoMetadataCarouselView.js
var _VideoMetadataCarouselView = class _VideoMetadataCarouselView extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "carousel_titles");
    __publicField(this, "carousel_items");
    this.carousel_titles = parser_exports.parse(data.carouselTitles, true, CarouselTitleView);
    this.carousel_items = parser_exports.parse(data.carouselItems, true, CarouselItemView);
  }
};
__name(_VideoMetadataCarouselView, "VideoMetadataCarouselView");
__publicField(_VideoMetadataCarouselView, "type", "VideoMetadataCarouselView");
var VideoMetadataCarouselView = _VideoMetadataCarouselView;

// dist/src/parser/classes/misc/SubscriptionButton.js
var _SubscriptionButton = class _SubscriptionButton {
  constructor(data) {
    __publicField(this, "text");
    __publicField(this, "subscribed");
    __publicField(this, "subscription_type");
    this.text = new Text2(data.text);
    this.subscribed = data.isSubscribed;
    if ("subscriptionType" in data)
      this.subscription_type = data.subscriptionType;
  }
};
__name(_SubscriptionButton, "SubscriptionButton");
__publicField(_SubscriptionButton, "type", "SubscriptionButton");
var SubscriptionButton = _SubscriptionButton;

// dist/src/parser/classes/VideoOwner.js
var _VideoOwner = class _VideoOwner extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "subscription_button");
    __publicField(this, "subscriber_count");
    __publicField(this, "author");
    if ("subscriptionButton" in data)
      this.subscription_button = new SubscriptionButton(data.subscriptionButton);
    this.subscriber_count = new Text2(data.subscriberCountText);
    this.author = new Author({
      ...data.title,
      navigationEndpoint: data.navigationEndpoint
    }, data.badges, data.thumbnail);
  }
};
__name(_VideoOwner, "VideoOwner");
__publicField(_VideoOwner, "type", "VideoOwner");
var VideoOwner = _VideoOwner;

// dist/src/parser/classes/VideoPrimaryInfo.js
var _VideoPrimaryInfo = class _VideoPrimaryInfo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "super_title_link");
    __publicField(this, "station_name");
    __publicField(this, "view_count");
    __publicField(this, "badges");
    __publicField(this, "published");
    __publicField(this, "relative_date");
    __publicField(this, "menu");
    this.title = new Text2(data.title);
    if ("superTitleLink" in data)
      this.super_title_link = new Text2(data.superTitleLink);
    if ("stationName" in data)
      this.station_name = new Text2(data.stationName);
    this.view_count = parser_exports.parseItem(data.viewCount, VideoViewCount);
    this.badges = parser_exports.parseArray(data.badges, MetadataBadge);
    this.published = new Text2(data.dateText);
    this.relative_date = new Text2(data.relativeDateText);
    this.menu = parser_exports.parseItem(data.videoActions, Menu);
  }
};
__name(_VideoPrimaryInfo, "VideoPrimaryInfo");
__publicField(_VideoPrimaryInfo, "type", "VideoPrimaryInfo");
var VideoPrimaryInfo = _VideoPrimaryInfo;

// dist/src/parser/classes/VideoSecondaryInfo.js
var _VideoSecondaryInfo = class _VideoSecondaryInfo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "owner");
    __publicField(this, "description");
    __publicField(this, "description_placeholder");
    __publicField(this, "subscribe_button");
    __publicField(this, "metadata");
    __publicField(this, "show_more_text");
    __publicField(this, "show_less_text");
    __publicField(this, "default_expanded");
    __publicField(this, "description_collapsed_lines");
    this.owner = parser_exports.parseItem(data.owner, VideoOwner);
    this.description = new Text2(data.description);
    if ("attributedDescription" in data)
      this.description = Text2.fromAttributed(data.attributedDescription);
    if ("descriptionPlaceholder" in data)
      this.description_placeholder = new Text2(data.descriptionPlaceholder);
    this.subscribe_button = parser_exports.parseItem(data.subscribeButton, [SubscribeButton, Button]);
    this.metadata = parser_exports.parseItem(data.metadataRowContainer, MetadataRowContainer);
    this.show_more_text = new Text2(data.showMoreText);
    this.show_less_text = new Text2(data.showLessText);
    this.default_expanded = data.defaultExpanded;
    this.description_collapsed_lines = data.descriptionCollapsedLines;
  }
};
__name(_VideoSecondaryInfo, "VideoSecondaryInfo");
__publicField(_VideoSecondaryInfo, "type", "VideoSecondaryInfo");
var VideoSecondaryInfo = _VideoSecondaryInfo;

// dist/src/parser/classes/WatchCardCompactVideo.js
var _WatchCardCompactVideo = class _WatchCardCompactVideo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "subtitle");
    __publicField(this, "duration");
    __publicField(this, "style");
    this.title = new Text2(data.title);
    this.subtitle = new Text2(data.subtitle);
    this.duration = {
      text: new Text2(data.lengthText).toString(),
      seconds: timeToSeconds(data.lengthText.simpleText)
    };
    this.style = data.style;
  }
};
__name(_WatchCardCompactVideo, "WatchCardCompactVideo");
__publicField(_WatchCardCompactVideo, "type", "WatchCardCompactVideo");
var WatchCardCompactVideo = _WatchCardCompactVideo;

// dist/src/parser/classes/WatchCardHeroVideo.js
var _WatchCardHeroVideo = class _WatchCardHeroVideo extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "endpoint");
    __publicField(this, "call_to_action_button");
    __publicField(this, "hero_image");
    __publicField(this, "label");
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.call_to_action_button = parser_exports.parseItem(data.callToActionButton);
    this.hero_image = parser_exports.parseItem(data.heroImage);
    this.label = data.lengthText?.accessibility.accessibilityData.label || "";
  }
};
__name(_WatchCardHeroVideo, "WatchCardHeroVideo");
__publicField(_WatchCardHeroVideo, "type", "WatchCardHeroVideo");
var WatchCardHeroVideo = _WatchCardHeroVideo;

// dist/src/parser/classes/WatchCardRichHeader.js
var _WatchCardRichHeader = class _WatchCardRichHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "title_endpoint");
    __publicField(this, "subtitle");
    __publicField(this, "author");
    __publicField(this, "style");
    this.title = new Text2(data.title);
    this.title_endpoint = new NavigationEndpoint(data.titleNavigationEndpoint);
    this.subtitle = new Text2(data.subtitle);
    this.author = new Author(data, data.titleBadge ? [data.titleBadge] : null, data.avatar);
    this.author.name = this.title.toString();
    this.style = data.style;
  }
};
__name(_WatchCardRichHeader, "WatchCardRichHeader");
__publicField(_WatchCardRichHeader, "type", "WatchCardRichHeader");
var WatchCardRichHeader = _WatchCardRichHeader;

// dist/src/parser/classes/WatchCardSectionSequence.js
var _WatchCardSectionSequence = class _WatchCardSectionSequence extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "lists");
    this.lists = parser_exports.parseArray(data.lists);
  }
};
__name(_WatchCardSectionSequence, "WatchCardSectionSequence");
__publicField(_WatchCardSectionSequence, "type", "WatchCardSectionSequence");
var WatchCardSectionSequence = _WatchCardSectionSequence;

// dist/src/parser/classes/WatchNextTabbedResults.js
var _WatchNextTabbedResults = class _WatchNextTabbedResults extends TwoColumnBrowseResults {
  constructor(data) {
    super(data);
  }
};
__name(_WatchNextTabbedResults, "WatchNextTabbedResults");
__publicField(_WatchNextTabbedResults, "type", "WatchNextTabbedResults");
var WatchNextTabbedResults = _WatchNextTabbedResults;

// dist/src/parser/classes/ytkids/AnchoredSection.js
var _AnchoredSection = class _AnchoredSection extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "content");
    __publicField(this, "endpoint");
    __publicField(this, "category_assets");
    __publicField(this, "category_type");
    this.title = data.title;
    this.content = parser_exports.parseItem(data.content, SectionList);
    this.endpoint = new NavigationEndpoint(data.navigationEndpoint);
    this.category_assets = {
      asset_key: data.categoryAssets?.assetKey,
      background_color: data.categoryAssets?.backgroundColor
    };
    this.category_type = data.categoryType;
  }
};
__name(_AnchoredSection, "AnchoredSection");
__publicField(_AnchoredSection, "type", "AnchoredSection");
var AnchoredSection = _AnchoredSection;

// dist/src/parser/classes/ytkids/KidsBlocklistPickerItem.js
var _actions3;
var _KidsBlocklistPickerItem = class _KidsBlocklistPickerItem extends YTNode {
  constructor(data) {
    super();
    __privateAdd(this, _actions3);
    __publicField(this, "child_display_name");
    __publicField(this, "child_account_description");
    __publicField(this, "avatar");
    __publicField(this, "block_button");
    __publicField(this, "blocked_entity_key");
    this.child_display_name = new Text2(data.childDisplayName);
    this.child_account_description = new Text2(data.childAccountDescription);
    this.avatar = Thumbnail.fromResponse(data.avatar);
    this.block_button = parser_exports.parseItem(data.blockButton, [ToggleButton]);
    this.blocked_entity_key = data.blockedEntityKey;
  }
  async blockChannel() {
    if (!__privateGet(this, _actions3))
      throw new InnertubeError("An active caller must be provide to perform this operation.");
    const button = this.block_button;
    if (!button)
      throw new InnertubeError("Block button was not found.", { child_display_name: this.child_display_name });
    if (button.is_toggled)
      throw new InnertubeError("This channel is already blocked.", { child_display_name: this.child_display_name });
    const response = await button.endpoint.call(__privateGet(this, _actions3), { parse: false });
    return response;
  }
  setActions(actions) {
    __privateSet(this, _actions3, actions);
  }
};
_actions3 = new WeakMap();
__name(_KidsBlocklistPickerItem, "KidsBlocklistPickerItem");
__publicField(_KidsBlocklistPickerItem, "type", "KidsBlocklistPickerItem");
var KidsBlocklistPickerItem = _KidsBlocklistPickerItem;

// dist/src/parser/classes/ytkids/KidsBlocklistPicker.js
var _KidsBlocklistPicker = class _KidsBlocklistPicker extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "child_rows");
    __publicField(this, "done_button");
    __publicField(this, "successful_toast_action_message");
    this.title = new Text2(data.title);
    this.child_rows = parser_exports.parse(data.childRows, true, [KidsBlocklistPickerItem]);
    this.done_button = parser_exports.parseItem(data.doneButton, [Button]);
    this.successful_toast_action_message = new Text2(data.successfulToastActionMessage);
  }
};
__name(_KidsBlocklistPicker, "KidsBlocklistPicker");
__publicField(_KidsBlocklistPicker, "type", "KidsBlocklistPicker");
var KidsBlocklistPicker = _KidsBlocklistPicker;

// dist/src/parser/classes/ytkids/KidsCategoryTab.js
var _KidsCategoryTab = class _KidsCategoryTab extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "title");
    __publicField(this, "category_assets");
    __publicField(this, "category_type");
    __publicField(this, "endpoint");
    this.title = new Text2(data.title);
    this.category_assets = {
      asset_key: data.categoryAssets?.assetKey,
      background_color: data.categoryAssets?.backgroundColor
    };
    this.category_type = data.categoryType;
    this.endpoint = new NavigationEndpoint(data.endpoint);
  }
};
__name(_KidsCategoryTab, "KidsCategoryTab");
__publicField(_KidsCategoryTab, "type", "KidsCategoryTab");
var KidsCategoryTab = _KidsCategoryTab;

// dist/src/parser/classes/ytkids/KidsCategoriesHeader.js
var _KidsCategoriesHeader = class _KidsCategoriesHeader extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "category_tabs");
    __publicField(this, "privacy_button");
    this.category_tabs = parser_exports.parseArray(data.categoryTabs, KidsCategoryTab);
    this.privacy_button = parser_exports.parseItem(data.privacyButtonRenderer, Button);
  }
};
__name(_KidsCategoriesHeader, "KidsCategoriesHeader");
__publicField(_KidsCategoriesHeader, "type", "kidsCategoriesHeader");
var KidsCategoriesHeader = _KidsCategoriesHeader;

// dist/src/parser/classes/ytkids/KidsHomeScreen.js
var _KidsHomeScreen = class _KidsHomeScreen extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "anchors");
    this.anchors = parser_exports.parseArray(data.anchors, AnchoredSection);
  }
};
__name(_KidsHomeScreen, "KidsHomeScreen");
__publicField(_KidsHomeScreen, "type", "kidsHomeScreen");
var KidsHomeScreen = _KidsHomeScreen;

// dist/src/parser/generator.js
var generator_exports = {};
__export(generator_exports, {
  camelToSnake: () => camelToSnake,
  createRuntimeClass: () => createRuntimeClass,
  generateRuntimeClass: () => generateRuntimeClass,
  generateTypescriptClass: () => generateTypescriptClass,
  inferType: () => inferType,
  introspect: () => introspect,
  isArrayType: () => isArrayType,
  isIgnoredKey: () => isIgnoredKey,
  isMiscType: () => isMiscType,
  isRenderer: () => isRenderer,
  isRendererList: () => isRendererList,
  mergeKeyInfo: () => mergeKeyInfo,
  parse: () => parse2,
  toParser: () => toParser,
  toTypeDeclaration: () => toTypeDeclaration
});
var IGNORED_KEYS = /* @__PURE__ */ new Set([
  "trackingParams",
  "accessibility",
  "accessibilityData"
]);
var RENDERER_EXAMPLES = {};
function camelToSnake(str) {
  return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
}
__name(camelToSnake, "camelToSnake");
function inferType(key, value) {
  let return_value = false;
  if (typeof value === "object" && value != null) {
    if (return_value = isRenderer(value)) {
      RENDERER_EXAMPLES[return_value] = Reflect.get(value, Reflect.ownKeys(value)[0]);
      return {
        type: "renderer",
        renderers: [return_value],
        optional: false
      };
    }
    if (return_value = isRendererList(value)) {
      for (const [key2, value2] of Object.entries(return_value)) {
        RENDERER_EXAMPLES[key2] = value2;
      }
      return {
        type: "array",
        array_type: "renderer",
        renderers: Object.keys(return_value),
        optional: false
      };
    }
    if (return_value = isMiscType(key, value)) {
      return return_value;
    }
    if (return_value = isArrayType(value)) {
      return return_value;
    }
  }
  const primitive_type = typeof value;
  if (primitive_type === "object")
    return {
      type: "object",
      keys: Object.entries(value).map(([key2, value2]) => [key2, inferType(key2, value2)]),
      optional: false
    };
  return {
    type: "primitive",
    typeof: [primitive_type],
    optional: false
  };
}
__name(inferType, "inferType");
function isRendererList(value) {
  const arr = Array.isArray(value);
  if (arr && value.length === 0)
    return false;
  const is_list = arr && value.every((item) => isRenderer(item));
  return is_list ? Object.fromEntries(value.map((item) => {
    const key = Reflect.ownKeys(item)[0].toString();
    return [sanitizeClassName(key), item[key]];
  })) : false;
}
__name(isRendererList, "isRendererList");
function isMiscType(key, value) {
  if (typeof value === "object" && value !== null) {
    if (key.endsWith("Endpoint") || key.endsWith("Command") || key === "endpoint") {
      return {
        type: "misc",
        endpoint: new NavigationEndpoint(value),
        optional: false,
        misc_type: "NavigationEndpoint"
      };
    }
    if (Reflect.has(value, "simpleText") || Reflect.has(value, "runs")) {
      const textNode = new Text2(value);
      return {
        type: "misc",
        misc_type: "Text",
        optional: false,
        endpoint: textNode.endpoint,
        text: textNode.toString()
      };
    }
    if (Reflect.has(value, "thumbnails") && Array.isArray(Reflect.get(value, "thumbnails"))) {
      return {
        type: "misc",
        misc_type: "Thumbnail",
        optional: false
      };
    }
  }
  return false;
}
__name(isMiscType, "isMiscType");
function isRenderer(value) {
  const is_object = typeof value === "object";
  if (!is_object)
    return false;
  const keys = Reflect.ownKeys(value);
  if (keys.length === 1) {
    const first_key = keys[0].toString();
    if (first_key.endsWith("Renderer") || first_key.endsWith("Model")) {
      return sanitizeClassName(first_key);
    }
  }
  return false;
}
__name(isRenderer, "isRenderer");
function isArrayType(value) {
  if (!Array.isArray(value))
    return false;
  if (value.length === 0)
    return {
      type: "array",
      array_type: "primitive",
      items: {
        type: "primitive",
        typeof: ["never"],
        optional: false
      },
      optional: false
    };
  const array_entry_types = value.map((item) => typeof item);
  const all_same_type = array_entry_types.every((type2) => type2 === array_entry_types[0]);
  if (!all_same_type)
    return {
      type: "array",
      array_type: "primitive",
      items: {
        type: "primitive",
        typeof: ["unknown"],
        optional: false
      },
      optional: false
    };
  const type = array_entry_types[0];
  if (type !== "object")
    return {
      type: "array",
      array_type: "primitive",
      items: {
        type: "primitive",
        typeof: [type],
        optional: false
      },
      optional: false
    };
  let key_type = [];
  for (let i = 0; i < value.length; i++) {
    const current_keys = Object.entries(value[i]).map(([key, value2]) => [key, inferType(key, value2)]);
    if (i === 0) {
      key_type = current_keys;
      continue;
    }
    key_type = mergeKeyInfo(key_type, current_keys).resolved_key_info;
  }
  return {
    type: "array",
    array_type: "object",
    items: {
      type: "object",
      keys: key_type,
      optional: false
    },
    optional: false
  };
}
__name(isArrayType, "isArrayType");
function introspectKeysFirstPass(classdata) {
  if (typeof classdata !== "object" || classdata === null) {
    throw new InnertubeError("Generator: Cannot introspect non-object", {
      classdata
    });
  }
  const keys = Reflect.ownKeys(classdata).filter((key) => !isIgnoredKey(key)).filter((key) => typeof key === "string");
  return keys.map((key) => {
    const value = Reflect.get(classdata, key);
    const inferred_type = inferType(key, value);
    return [key, inferred_type];
  });
}
__name(introspectKeysFirstPass, "introspectKeysFirstPass");
function introspectKeysSecondPass(key_info) {
  const channel_nav = key_info.filter(([, value]) => {
    if (value.type !== "misc")
      return false;
    if (!(value.misc_type === "NavigationEndpoint" || value.misc_type === "Text"))
      return false;
    return value.endpoint?.metadata.page_type === "WEB_PAGE_TYPE_CHANNEL";
  });
  const most_probable_match = channel_nav.sort(([, a], [, b]) => {
    if (a.type !== "misc" || b.type !== "misc")
      return 0;
    if (a.misc_type !== "Text" || b.misc_type !== "Text")
      return 0;
    return b.text.length - a.text.length;
  });
  const excluded_keys = /* @__PURE__ */ new Set();
  const canonical_channel_nave = most_probable_match[0];
  let author;
  if (canonical_channel_nave) {
    excluded_keys.add(canonical_channel_nave[0]);
    const keys = key_info.map(([key]) => key);
    const badges = keys.filter((key) => key.endsWith("Badges") || key === "badges");
    const likely_badges = badges.filter((key) => key.startsWith("owner") || key.startsWith("author"));
    const canonical_badges = likely_badges[0] ?? badges[0];
    const badge_key_info = key_info.find(([key]) => key === canonical_badges);
    const is_badges = badge_key_info ? badge_key_info[1].type === "array" && badge_key_info[1].array_type === "renderer" && Reflect.has(badge_key_info[1].renderers, "MetadataBadge") : false;
    if (is_badges && canonical_badges)
      excluded_keys.add(canonical_badges);
    author = {
      type: "misc",
      misc_type: "Author",
      optional: false,
      params: [
        canonical_channel_nave[0],
        is_badges ? canonical_badges : void 0
      ]
    };
  }
  if (author) {
    key_info.push(["author", author]);
  }
  return key_info.filter(([key]) => !excluded_keys.has(key));
}
__name(introspectKeysSecondPass, "introspectKeysSecondPass");
function introspect2(classdata) {
  const key_info = introspectKeysFirstPass(classdata);
  return introspectKeysSecondPass(key_info);
}
__name(introspect2, "introspect2");
function introspect(classdata) {
  const key_info = introspect2(classdata);
  const dependencies = /* @__PURE__ */ new Map();
  for (const [, value] of key_info) {
    if (value.type === "renderer" || value.type === "array" && value.array_type === "renderer")
      for (const renderer of value.renderers) {
        const example = RENDERER_EXAMPLES[renderer];
        if (example)
          dependencies.set(renderer, example);
      }
  }
  const unimplemented_dependencies = Array.from(dependencies).filter(([classname]) => !hasParser(classname));
  return {
    key_info,
    unimplemented_dependencies
  };
}
__name(introspect, "introspect");
function isIgnoredKey(key) {
  return typeof key === "string" && IGNORED_KEYS.has(key);
}
__name(isIgnoredKey, "isIgnoredKey");
function createRuntimeClass(classname, key_info, logger) {
  var _a, _key_info;
  logger({
    error_type: "class_not_found",
    classname,
    key_info
  });
  const node = (_a = class extends YTNode {
    static set key_info(key_info2) {
      __privateSet(this, _key_info, new Map(key_info2));
    }
    static get key_info() {
      return [...__privateGet(this, _key_info).entries()];
    }
    constructor(data) {
      super();
      const { key_info: key_info2, unimplemented_dependencies } = introspect(data);
      const { resolved_key_info, changed_keys } = mergeKeyInfo(node.key_info, key_info2);
      const did_change = changed_keys.length > 0;
      if (did_change) {
        node.key_info = resolved_key_info;
        logger({
          error_type: "class_changed",
          classname,
          key_info: node.key_info,
          changed_keys
        });
      }
      for (const [name, data2] of unimplemented_dependencies)
        generateRuntimeClass(name, data2, logger);
      for (const [key, value] of key_info2) {
        let snake_key = camelToSnake(key);
        if (value.type === "misc" && value.misc_type === "NavigationEndpoint")
          snake_key = "endpoint";
        Reflect.set(this, snake_key, parse2(key, value, data));
      }
    }
  }, _key_info = new WeakMap(), __name(_a, "node"), __publicField(_a, "type", classname), __privateAdd(_a, _key_info, /* @__PURE__ */ new Map()), _a);
  node.key_info = key_info;
  Object.defineProperty(node, "name", { value: classname, writable: false });
  return node;
}
__name(createRuntimeClass, "createRuntimeClass");
function generateRuntimeClass(classname, classdata, logger) {
  const { key_info, unimplemented_dependencies } = introspect(classdata);
  const JITNode = createRuntimeClass(classname, key_info, logger);
  addRuntimeParser(classname, JITNode);
  for (const [name, data] of unimplemented_dependencies)
    generateRuntimeClass(name, data, logger);
  return JITNode;
}
__name(generateRuntimeClass, "generateRuntimeClass");
function generateTypescriptClass(classname, key_info) {
  const props = [];
  const constructor_lines = [
    "super();"
  ];
  for (const [key, value] of key_info) {
    let snake_key = camelToSnake(key);
    if (value.type === "misc" && value.misc_type === "NavigationEndpoint")
      snake_key = "endpoint";
    props.push(`${snake_key}${value.optional ? "?" : ""}: ${toTypeDeclaration(value)};`);
    constructor_lines.push(`this.${snake_key} = ${toParser(key, value)};`);
  }
  return `class ${classname} extends YTNode {
  static type = '${classname}';

  ${props.join("\n  ")}

  constructor(data: RawNode) {
    ${constructor_lines.join("\n    ")}
  }
}
`;
}
__name(generateTypescriptClass, "generateTypescriptClass");
function toTypeDeclarationObject(indentation, keys) {
  return `{
${keys.map(([key, value]) => `${" ".repeat((indentation + 2) * 2)}${camelToSnake(key)}${value.optional ? "?" : ""}: ${toTypeDeclaration(value, indentation + 1)}`).join(",\n")}
${" ".repeat((indentation + 1) * 2)}}`;
}
__name(toTypeDeclarationObject, "toTypeDeclarationObject");
function toTypeDeclaration(inference_type, indentation = 0) {
  switch (inference_type.type) {
    case "renderer": {
      return `${inference_type.renderers.map((type) => `YTNodes.${type}`).join(" | ")} | null`;
    }
    case "array": {
      switch (inference_type.array_type) {
        case "renderer":
          return `ObservedArray<${inference_type.renderers.map((type) => `YTNodes.${type}`).join(" | ")}> | null`;
        case "primitive": {
          const items_list = inference_type.items.typeof;
          if (inference_type.items.optional && !items_list.includes("undefined"))
            items_list.push("undefined");
          const items = items_list.length === 1 ? `${items_list[0]}` : `(${items_list.join(" | ")})`;
          return `${items}[]`;
        }
        case "object":
          return `${toTypeDeclarationObject(indentation, inference_type.items.keys)}[]`;
        default:
          throw new Error("Unreachable code reached! Switch missing case!");
      }
    }
    case "object": {
      return toTypeDeclarationObject(indentation, inference_type.keys);
    }
    case "misc": {
      switch (inference_type.misc_type) {
        case "Thumbnail":
          return "Thumbnail[]";
        default:
          return inference_type.misc_type;
      }
    }
    case "primitive": {
      return inference_type.typeof.join(" | ");
    }
  }
}
__name(toTypeDeclaration, "toTypeDeclaration");
function toParserObject(indentation, keys, key_path, key) {
  const new_keypath = [...key_path, key];
  return `{
${keys.map(([key2, value]) => `${" ".repeat((indentation + 2) * 2)}${camelToSnake(key2)}: ${toParser(key2, value, new_keypath, indentation + 1)}`).join(",\n")}
${" ".repeat((indentation + 1) * 2)}}`;
}
__name(toParserObject, "toParserObject");
function toParser(key, inference_type, key_path = ["data"], indentation = 1) {
  let parser = "undefined";
  switch (inference_type.type) {
    case "renderer":
      {
        parser = `Parser.parseItem(${key_path.join(".")}.${key}, ${toParserValidTypes(inference_type.renderers)})`;
      }
      break;
    case "array":
      {
        switch (inference_type.array_type) {
          case "renderer":
            parser = `Parser.parse(${key_path.join(".")}.${key}, true, ${toParserValidTypes(inference_type.renderers)})`;
            break;
          case "object":
            parser = `${key_path.join(".")}.${key}.map((item: any) => (${toParserObject(indentation, inference_type.items.keys, [], "item")}))`;
            break;
          case "primitive":
            parser = `${key_path.join(".")}.${key}`;
            break;
          default:
            throw new Error("Unreachable code reached! Switch missing case!");
        }
      }
      break;
    case "object":
      {
        parser = toParserObject(indentation, inference_type.keys, key_path, key);
      }
      break;
    case "misc":
      switch (inference_type.misc_type) {
        case "Thumbnail":
          parser = `Thumbnail.fromResponse(${key_path.join(".")}.${key})`;
          break;
        case "Author": {
          const author_parser = `new Author(${key_path.join(".")}.${inference_type.params[0]}, ${inference_type.params[1] ? `${key_path.join(".")}.${inference_type.params[1]}` : "undefined"})`;
          if (inference_type.optional)
            return `Reflect.has(${key_path.join(".")}, '${inference_type.params[0]}') ? ${author_parser} : undefined`;
          return author_parser;
        }
        default:
          parser = `new ${inference_type.misc_type}(${key_path.join(".")}.${key})`;
          break;
      }
      if (parser === "undefined")
        throw new Error("Unreachable code reached! Switch missing case!");
      break;
    case "primitive":
      parser = `${key_path.join(".")}.${key}`;
      break;
  }
  if (inference_type.optional)
    return `Reflect.has(${key_path.join(".")}, '${key}') ? ${parser} : undefined`;
  return parser;
}
__name(toParser, "toParser");
function toParserValidTypes(types) {
  if (types.length === 1) {
    return `YTNodes.${types[0]}`;
  }
  return `[ ${types.map((type) => `YTNodes.${type}`).join(", ")} ]`;
}
__name(toParserValidTypes, "toParserValidTypes");
function accessDataFromKeyPath(root, key_path) {
  let data = root;
  for (const key of key_path)
    data = data[key];
  return data;
}
__name(accessDataFromKeyPath, "accessDataFromKeyPath");
function hasDataFromKeyPath(root, key_path) {
  let data = root;
  for (const key of key_path)
    if (!Reflect.has(data, key))
      return false;
    else
      data = data[key];
  return true;
}
__name(hasDataFromKeyPath, "hasDataFromKeyPath");
function parseObject(key, data, key_path, keys, should_optional) {
  const obj = {};
  const new_key_path = [...key_path, key];
  for (const [key2, value] of keys) {
    obj[key2] = should_optional ? parse2(key2, value, data, new_key_path) : void 0;
  }
  return obj;
}
__name(parseObject, "parseObject");
function parse2(key, inference_type, data, key_path = ["data"]) {
  const should_optional = !inference_type.optional || hasDataFromKeyPath({ data }, [...key_path, key]);
  switch (inference_type.type) {
    case "renderer": {
      return should_optional ? parseItem(accessDataFromKeyPath({ data }, [...key_path, key]), inference_type.renderers.map((type) => getParserByName(type))) : void 0;
    }
    case "array": {
      switch (inference_type.array_type) {
        case "renderer":
          return should_optional ? parse(accessDataFromKeyPath({ data }, [...key_path, key]), true, inference_type.renderers.map((type) => getParserByName(type))) : void 0;
        case "object":
          return should_optional ? accessDataFromKeyPath({ data }, [...key_path, key]).map((_, idx) => {
            return parseObject(`${idx}`, data, [...key_path, key], inference_type.items.keys, should_optional);
          }) : void 0;
        case "primitive":
          return should_optional ? accessDataFromKeyPath({ data }, [...key_path, key]) : void 0;
        default:
          throw new Error("Unreachable code reached! Switch missing case!");
      }
    }
    case "object": {
      return parseObject(key, data, key_path, inference_type.keys, should_optional);
    }
    case "misc":
      switch (inference_type.misc_type) {
        case "NavigationEndpoint":
          return should_optional ? new NavigationEndpoint(accessDataFromKeyPath({ data }, [...key_path, key])) : void 0;
        case "Text":
          return should_optional ? new Text2(accessDataFromKeyPath({ data }, [...key_path, key])) : void 0;
        case "Thumbnail":
          return should_optional ? Thumbnail.fromResponse(accessDataFromKeyPath({ data }, [...key_path, key])) : void 0;
        case "Author": {
          const author_should_optional = !inference_type.optional || hasDataFromKeyPath({ data }, [...key_path, inference_type.params[0]]);
          return author_should_optional ? new Author(accessDataFromKeyPath({ data }, [...key_path, inference_type.params[0]]), inference_type.params[1] ? accessDataFromKeyPath({ data }, [...key_path, inference_type.params[1]]) : void 0) : void 0;
        }
        default:
          throw new Error("Unreachable code reached! Switch missing case!");
      }
    case "primitive":
      return accessDataFromKeyPath({ data }, [...key_path, key]);
  }
}
__name(parse2, "parse");
function mergeKeyInfo(key_info, new_key_info) {
  const changed_keys = /* @__PURE__ */ new Map();
  const current_keys = new Set(key_info.map(([key]) => key));
  const new_keys = new Set(new_key_info.map(([key]) => key));
  const added_keys = new_key_info.filter(([key]) => !current_keys.has(key));
  const removed_keys = key_info.filter(([key]) => !new_keys.has(key));
  const common_keys = key_info.filter(([key]) => new_keys.has(key));
  const new_key_map = new Map(new_key_info);
  for (const [key, type] of common_keys) {
    const new_type = new_key_map.get(key);
    if (!new_type)
      continue;
    if (type.type !== new_type.type) {
      changed_keys.set(key, {
        type: "primitive",
        typeof: ["unknown"],
        optional: true
      });
      continue;
    }
    switch (type.type) {
      case "object":
        {
          if (new_type.type !== "object")
            continue;
          const { resolved_key_info: resolved_key_info2 } = mergeKeyInfo(type.keys, new_type.keys);
          const resolved_key = {
            type: "object",
            keys: resolved_key_info2,
            optional: type.optional || new_type.optional
          };
          const did_change = JSON.stringify(resolved_key) !== JSON.stringify(type);
          if (did_change)
            changed_keys.set(key, resolved_key);
        }
        break;
      case "renderer":
        {
          if (new_type.type !== "renderer")
            continue;
          const union_map = {
            ...type.renderers,
            ...new_type.renderers
          };
          const either_optional = type.optional || new_type.optional;
          const resolved_key = {
            type: "renderer",
            renderers: union_map,
            optional: either_optional
          };
          const did_change = JSON.stringify({
            ...resolved_key,
            renderers: Object.keys(resolved_key.renderers)
          }) !== JSON.stringify({
            ...type,
            renderers: Object.keys(type.renderers)
          });
          if (did_change)
            changed_keys.set(key, resolved_key);
        }
        break;
      case "array": {
        if (new_type.type !== "array")
          continue;
        switch (type.array_type) {
          case "renderer":
            {
              if (new_type.array_type !== "renderer") {
                changed_keys.set(key, {
                  type: "array",
                  array_type: "primitive",
                  items: {
                    type: "primitive",
                    typeof: ["unknown"],
                    optional: true
                  },
                  optional: true
                });
                continue;
              }
              const union_map = {
                ...type.renderers,
                ...new_type.renderers
              };
              const either_optional = type.optional || new_type.optional;
              const resolved_key = {
                type: "array",
                array_type: "renderer",
                renderers: union_map,
                optional: either_optional
              };
              const did_change = JSON.stringify({
                ...resolved_key,
                renderers: Object.keys(resolved_key.renderers)
              }) !== JSON.stringify({
                ...type,
                renderers: Object.keys(type.renderers)
              });
              if (did_change)
                changed_keys.set(key, resolved_key);
            }
            break;
          case "object":
            {
              if (new_type.array_type === "primitive" && new_type.items.typeof.length == 1 && new_type.items.typeof[0] === "never") {
                continue;
              }
              if (new_type.array_type !== "object") {
                changed_keys.set(key, {
                  type: "array",
                  array_type: "primitive",
                  items: {
                    type: "primitive",
                    typeof: ["unknown"],
                    optional: true
                  },
                  optional: true
                });
                continue;
              }
              const { resolved_key_info: resolved_key_info2 } = mergeKeyInfo(type.items.keys, new_type.items.keys);
              const resolved_key = {
                type: "array",
                array_type: "object",
                items: {
                  type: "object",
                  keys: resolved_key_info2,
                  optional: type.items.optional || new_type.items.optional
                },
                optional: type.optional || new_type.optional
              };
              const did_change = JSON.stringify(resolved_key) !== JSON.stringify(type);
              if (did_change)
                changed_keys.set(key, resolved_key);
            }
            break;
          case "primitive":
            {
              if (type.items.typeof.includes("never") && new_type.array_type === "object") {
                changed_keys.set(key, new_type);
                continue;
              }
              if (new_type.array_type !== "primitive") {
                changed_keys.set(key, {
                  type: "array",
                  array_type: "primitive",
                  items: {
                    type: "primitive",
                    typeof: ["unknown"],
                    optional: true
                  },
                  optional: true
                });
                continue;
              }
              const key_types = /* @__PURE__ */ new Set([...new_type.items.typeof, ...type.items.typeof]);
              if (key_types.size > 1 && key_types.has("never"))
                key_types.delete("never");
              const resolved_key = {
                type: "array",
                array_type: "primitive",
                items: {
                  type: "primitive",
                  typeof: Array.from(key_types),
                  optional: type.items.optional || new_type.items.optional
                },
                optional: type.optional || new_type.optional
              };
              const did_change = JSON.stringify(resolved_key) !== JSON.stringify(type);
              if (did_change)
                changed_keys.set(key, resolved_key);
            }
            break;
          default:
            throw new Error("Unreachable code reached! Switch missing case!");
        }
        break;
      }
      case "misc":
        {
          if (new_type.type !== "misc")
            continue;
          if (type.misc_type !== new_type.misc_type) {
            changed_keys.set(key, {
              type: "primitive",
              typeof: ["unknown"],
              optional: true
            });
          }
          switch (type.misc_type) {
            case "Author":
              {
                if (new_type.misc_type !== "Author")
                  break;
                const had_optional_param = type.params[1] || new_type.params[1];
                const either_optional = type.optional || new_type.optional;
                const resolved_key = {
                  type: "misc",
                  misc_type: "Author",
                  optional: either_optional,
                  params: [new_type.params[0], had_optional_param]
                };
                const did_change = JSON.stringify(resolved_key) !== JSON.stringify(type);
                if (did_change)
                  changed_keys.set(key, resolved_key);
              }
              break;
          }
        }
        break;
      case "primitive":
        {
          if (new_type.type !== "primitive")
            continue;
          const resolved_key = {
            type: "primitive",
            typeof: Array.from(/* @__PURE__ */ new Set([...new_type.typeof, ...type.typeof])),
            optional: type.optional || new_type.optional
          };
          const did_change = JSON.stringify(resolved_key) !== JSON.stringify(type);
          if (did_change)
            changed_keys.set(key, resolved_key);
        }
        break;
    }
  }
  for (const [key, type] of added_keys) {
    changed_keys.set(key, {
      ...type,
      optional: true
    });
  }
  for (const [key, type] of removed_keys) {
    changed_keys.set(key, {
      ...type,
      optional: true
    });
  }
  const unchanged_keys = key_info.filter(([key]) => !changed_keys.has(key));
  const resolved_key_info_map = new Map([...unchanged_keys, ...changed_keys]);
  const resolved_key_info = [...resolved_key_info_map.entries()];
  return {
    resolved_key_info,
    changed_keys: [...changed_keys.entries()]
  };
}
__name(mergeKeyInfo, "mergeKeyInfo");

// dist/src/parser/continuations.js
var _ItemSectionContinuation = class _ItemSectionContinuation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "contents");
    __publicField(this, "continuation");
    this.contents = parseArray(data.contents);
    if (Array.isArray(data.continuations)) {
      this.continuation = data.continuations?.at(0)?.nextContinuationData?.continuation;
    }
  }
};
__name(_ItemSectionContinuation, "ItemSectionContinuation");
__publicField(_ItemSectionContinuation, "type", "itemSectionContinuation");
var ItemSectionContinuation = _ItemSectionContinuation;
var _NavigateAction = class _NavigateAction extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "endpoint");
    this.endpoint = new NavigationEndpoint(data.endpoint);
  }
};
__name(_NavigateAction, "NavigateAction");
__publicField(_NavigateAction, "type", "navigateAction");
var NavigateAction = _NavigateAction;
var _ShowMiniplayerCommand = class _ShowMiniplayerCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "miniplayer_command");
    __publicField(this, "show_premium_branding");
    this.miniplayer_command = new NavigationEndpoint(data.miniplayerCommand);
    this.show_premium_branding = data.showPremiumBranding;
  }
};
__name(_ShowMiniplayerCommand, "ShowMiniplayerCommand");
__publicField(_ShowMiniplayerCommand, "type", "showMiniplayerCommand");
var ShowMiniplayerCommand = _ShowMiniplayerCommand;
var _ReloadContinuationItemsCommand = class _ReloadContinuationItemsCommand extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "target_id");
    __publicField(this, "contents");
    __publicField(this, "slot");
    this.target_id = data.targetId;
    this.contents = parse(data.continuationItems, true);
    this.slot = data?.slot;
  }
};
__name(_ReloadContinuationItemsCommand, "ReloadContinuationItemsCommand");
__publicField(_ReloadContinuationItemsCommand, "type", "reloadContinuationItemsCommand");
var ReloadContinuationItemsCommand = _ReloadContinuationItemsCommand;
var _SectionListContinuation = class _SectionListContinuation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "continuation");
    __publicField(this, "contents");
    this.contents = parse(data.contents, true);
    this.continuation = data.continuations?.[0]?.nextContinuationData?.continuation || data.continuations?.[0]?.reloadContinuationData?.continuation || null;
  }
};
__name(_SectionListContinuation, "SectionListContinuation");
__publicField(_SectionListContinuation, "type", "sectionListContinuation");
var SectionListContinuation = _SectionListContinuation;
var _MusicPlaylistShelfContinuation = class _MusicPlaylistShelfContinuation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "continuation");
    __publicField(this, "contents");
    this.contents = parse(data.contents, true);
    this.continuation = data.continuations?.[0].nextContinuationData.continuation || null;
  }
};
__name(_MusicPlaylistShelfContinuation, "MusicPlaylistShelfContinuation");
__publicField(_MusicPlaylistShelfContinuation, "type", "musicPlaylistShelfContinuation");
var MusicPlaylistShelfContinuation = _MusicPlaylistShelfContinuation;
var _MusicShelfContinuation = class _MusicShelfContinuation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "continuation");
    __publicField(this, "contents");
    this.contents = parseArray(data.contents);
    this.continuation = data.continuations?.[0].nextContinuationData?.continuation || data.continuations?.[0].reloadContinuationData?.continuation || null;
  }
};
__name(_MusicShelfContinuation, "MusicShelfContinuation");
__publicField(_MusicShelfContinuation, "type", "musicShelfContinuation");
var MusicShelfContinuation = _MusicShelfContinuation;
var _GridContinuation = class _GridContinuation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "continuation");
    __publicField(this, "items");
    this.items = parse(data.items, true);
    this.continuation = data.continuations?.[0].nextContinuationData.continuation || null;
  }
  get contents() {
    return this.items;
  }
};
__name(_GridContinuation, "GridContinuation");
__publicField(_GridContinuation, "type", "gridContinuation");
var GridContinuation = _GridContinuation;
var _PlaylistPanelContinuation = class _PlaylistPanelContinuation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "continuation");
    __publicField(this, "contents");
    this.contents = parseArray(data.contents);
    this.continuation = data.continuations?.[0]?.nextContinuationData?.continuation || data.continuations?.[0]?.nextRadioContinuationData?.continuation || null;
  }
};
__name(_PlaylistPanelContinuation, "PlaylistPanelContinuation");
__publicField(_PlaylistPanelContinuation, "type", "playlistPanelContinuation");
var PlaylistPanelContinuation = _PlaylistPanelContinuation;
var _Continuation = class _Continuation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "continuation_type");
    __publicField(this, "timeout_ms");
    __publicField(this, "time_until_last_message_ms");
    __publicField(this, "token");
    this.continuation_type = data.type;
    this.timeout_ms = data.continuation?.timeoutMs;
    this.time_until_last_message_ms = data.continuation?.timeUntilLastMessageMsec;
    this.token = data.continuation?.continuation;
  }
};
__name(_Continuation, "Continuation");
__publicField(_Continuation, "type", "continuation");
var Continuation = _Continuation;
var _LiveChatContinuation = class _LiveChatContinuation extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "actions");
    __publicField(this, "action_panel");
    __publicField(this, "item_list");
    __publicField(this, "header");
    __publicField(this, "participants_list");
    __publicField(this, "popout_message");
    __publicField(this, "emojis");
    __publicField(this, "continuation");
    __publicField(this, "viewer_name");
    this.actions = parse(data.actions?.map((action) => {
      delete action.clickTrackingParams;
      return action;
    }), true) || observe([]);
    this.action_panel = parseItem(data.actionPanel);
    this.item_list = parseItem(data.itemList, LiveChatItemList);
    this.header = parseItem(data.header, LiveChatHeader);
    this.participants_list = parseItem(data.participantsList, LiveChatParticipantsList);
    this.popout_message = parseItem(data.popoutMessage, Message);
    this.emojis = data.emojis?.map((emoji) => ({
      emoji_id: emoji.emojiId,
      shortcuts: emoji.shortcuts,
      search_terms: emoji.searchTerms,
      image: Thumbnail.fromResponse(emoji.image),
      is_custom_emoji: emoji.isCustomEmoji
    })) || [];
    let continuation, type;
    if (data.continuations?.[0].timedContinuationData) {
      type = "timed";
      continuation = data.continuations?.[0].timedContinuationData;
    } else if (data.continuations?.[0].invalidationContinuationData) {
      type = "invalidation";
      continuation = data.continuations?.[0].invalidationContinuationData;
    } else if (data.continuations?.[0].liveChatReplayContinuationData) {
      type = "replay";
      continuation = data.continuations?.[0].liveChatReplayContinuationData;
    }
    this.continuation = new Continuation({ continuation, type });
    this.viewer_name = data.viewerName;
  }
};
__name(_LiveChatContinuation, "LiveChatContinuation");
__publicField(_LiveChatContinuation, "type", "liveChatContinuation");
var LiveChatContinuation = _LiveChatContinuation;
var _ContinuationCommand2 = class _ContinuationCommand2 extends YTNode {
  constructor(data) {
    super();
    __publicField(this, "request");
    __publicField(this, "token");
    this.request = data.request;
    this.token = data.token;
  }
};
__name(_ContinuationCommand2, "ContinuationCommand");
__publicField(_ContinuationCommand2, "type", "ContinuationCommand");
var ContinuationCommand2 = _ContinuationCommand2;

// dist/protos/generated/misc/common.js
function createBaseKeyValuePair() {
  return { key: void 0, value: void 0 };
}
__name(createBaseKeyValuePair, "createBaseKeyValuePair");
var KeyValuePair = {
  encode(message, writer = new BinaryWriter()) {
    if (message.key !== void 0) {
      writer.uint32(10).string(message.key);
    }
    if (message.value !== void 0) {
      writer.uint32(18).string(message.value);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseKeyValuePair();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.key = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.value = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseFormatXTags() {
  return { xtags: [] };
}
__name(createBaseFormatXTags, "createBaseFormatXTags");
var FormatXTags = {
  encode(message, writer = new BinaryWriter()) {
    for (const v of message.xtags) {
      KeyValuePair.encode(v, writer.uint32(10).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseFormatXTags();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.xtags.push(KeyValuePair.decode(reader, reader.uint32()));
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};

// dist/src/parser/classes/misc/Format.js
var _this_response_nsig_cache;
var _Format = class _Format {
  constructor(data, this_response_nsig_cache) {
    __privateAdd(this, _this_response_nsig_cache);
    __publicField(this, "itag");
    __publicField(this, "url");
    __publicField(this, "width");
    __publicField(this, "height");
    __publicField(this, "last_modified");
    __publicField(this, "last_modified_ms");
    __publicField(this, "content_length");
    __publicField(this, "quality");
    __publicField(this, "xtags");
    __publicField(this, "drm_families");
    __publicField(this, "fps");
    __publicField(this, "quality_label");
    __publicField(this, "projection_type");
    __publicField(this, "average_bitrate");
    __publicField(this, "bitrate");
    __publicField(this, "spatial_audio_type");
    __publicField(this, "target_duration_dec");
    __publicField(this, "fair_play_key_uri");
    __publicField(this, "stereo_layout");
    __publicField(this, "max_dvr_duration_sec");
    __publicField(this, "high_replication");
    __publicField(this, "audio_quality");
    __publicField(this, "approx_duration_ms");
    __publicField(this, "audio_sample_rate");
    __publicField(this, "audio_channels");
    __publicField(this, "loudness_db");
    __publicField(this, "signature_cipher");
    __publicField(this, "is_drc");
    __publicField(this, "is_vb");
    __publicField(this, "is_sr");
    __publicField(this, "drm_track_type");
    __publicField(this, "distinct_params");
    __publicField(this, "track_absolute_loudness_lkfs");
    __publicField(this, "mime_type");
    __publicField(this, "is_type_otf");
    __publicField(this, "init_range");
    __publicField(this, "index_range");
    __publicField(this, "cipher");
    __publicField(this, "audio_track");
    __publicField(this, "has_audio");
    __publicField(this, "has_video");
    __publicField(this, "has_text");
    __publicField(this, "language");
    __publicField(this, "is_dubbed");
    __publicField(this, "is_auto_dubbed");
    __publicField(this, "is_descriptive");
    __publicField(this, "is_secondary");
    __publicField(this, "is_original");
    __publicField(this, "color_info");
    __publicField(this, "caption_track");
    if (this_response_nsig_cache)
      __privateSet(this, _this_response_nsig_cache, this_response_nsig_cache);
    this.itag = data.itag;
    this.mime_type = data.mimeType;
    this.is_type_otf = data.type === "FORMAT_STREAM_TYPE_OTF";
    this.bitrate = data.bitrate;
    this.average_bitrate = data.averageBitrate;
    if (Reflect.has(data, "width") && Reflect.has(data, "height")) {
      this.width = parseInt(data.width);
      this.height = parseInt(data.height);
    }
    if (Reflect.has(data, "projectionType"))
      this.projection_type = data.projectionType;
    if (Reflect.has(data, "stereoLayout"))
      this.stereo_layout = data.stereoLayout?.replace("STEREO_LAYOUT_", "");
    if (Reflect.has(data, "initRange"))
      this.init_range = {
        start: parseInt(data.initRange.start),
        end: parseInt(data.initRange.end)
      };
    if (Reflect.has(data, "indexRange"))
      this.index_range = {
        start: parseInt(data.indexRange.start),
        end: parseInt(data.indexRange.end)
      };
    this.last_modified = new Date(Math.floor(parseInt(data.lastModified) / 1e3));
    this.last_modified_ms = data.lastModified;
    if (Reflect.has(data, "contentLength"))
      this.content_length = parseInt(data.contentLength);
    if (Reflect.has(data, "quality"))
      this.quality = data.quality;
    if (Reflect.has(data, "qualityLabel"))
      this.quality_label = data.qualityLabel;
    if (Reflect.has(data, "fps"))
      this.fps = data.fps;
    if (Reflect.has(data, "url"))
      this.url = data.url;
    if (Reflect.has(data, "cipher"))
      this.cipher = data.cipher;
    if (Reflect.has(data, "signatureCipher"))
      this.signature_cipher = data.signatureCipher;
    if (Reflect.has(data, "audioQuality"))
      this.audio_quality = data.audioQuality;
    this.approx_duration_ms = parseInt(data.approxDurationMs);
    if (Reflect.has(data, "audioSampleRate"))
      this.audio_sample_rate = parseInt(data.audioSampleRate);
    if (Reflect.has(data, "audioChannels"))
      this.audio_channels = data.audioChannels;
    if (Reflect.has(data, "loudnessDb"))
      this.loudness_db = data.loudnessDb;
    if (Reflect.has(data, "spatialAudioType"))
      this.spatial_audio_type = data.spatialAudioType?.replace("SPATIAL_AUDIO_TYPE_", "");
    if (Reflect.has(data, "maxDvrDurationSec"))
      this.max_dvr_duration_sec = data.maxDvrDurationSec;
    if (Reflect.has(data, "targetDurationSec"))
      this.target_duration_dec = data.targetDurationSec;
    this.has_audio = !!data.audioBitrate || !!data.audioQuality;
    this.has_video = !!data.qualityLabel;
    this.has_text = !!data.captionTrack;
    if (Reflect.has(data, "xtags"))
      this.xtags = data.xtags;
    if (Reflect.has(data, "fairPlayKeyUri"))
      this.fair_play_key_uri = data.fairPlayKeyUri;
    if (Reflect.has(data, "drmFamilies"))
      this.drm_families = data.drmFamilies;
    if (Reflect.has(data, "drmTrackType"))
      this.drm_track_type = data.drmTrackType;
    if (Reflect.has(data, "distinctParams"))
      this.distinct_params = data.distinctParams;
    if (Reflect.has(data, "trackAbsoluteLoudnessLkfs"))
      this.track_absolute_loudness_lkfs = data.trackAbsoluteLoudnessLkfs;
    if (Reflect.has(data, "highReplication"))
      this.high_replication = data.highReplication;
    if (Reflect.has(data, "colorInfo"))
      this.color_info = {
        primaries: data.colorInfo.primaries?.replace("COLOR_PRIMARIES_", ""),
        transfer_characteristics: data.colorInfo.transferCharacteristics?.replace("COLOR_TRANSFER_CHARACTERISTICS_", ""),
        matrix_coefficients: data.colorInfo.matrixCoefficients?.replace("COLOR_MATRIX_COEFFICIENTS_", "")
      };
    if (Reflect.has(data, "audioTrack"))
      this.audio_track = {
        audio_is_default: data.audioTrack.audioIsDefault,
        display_name: data.audioTrack.displayName,
        id: data.audioTrack.id
      };
    if (Reflect.has(data, "captionTrack"))
      this.caption_track = {
        display_name: data.captionTrack.displayName,
        vss_id: data.captionTrack.vssId,
        language_code: data.captionTrack.languageCode,
        kind: data.captionTrack.kind,
        id: data.captionTrack.id
      };
    const xtags = this.xtags ? FormatXTags.decode(base64ToU8(decodeURIComponent(this.xtags).replace(/-/g, "+").replace(/_/g, "/"))).xtags : [];
    if (this.has_audio || this.has_text) {
      this.language = xtags.find((tag) => tag.key === "lang")?.value || null;
      if (this.has_audio) {
        this.is_drc = !!data.isDrc || xtags.some((tag) => tag.key === "drc" && tag.value === "1");
        this.is_vb = !!data.isVb || xtags.some((tag) => tag.key === "vb" && tag.value === "1");
        const audio_content = xtags.find((tag) => tag.key === "acont")?.value;
        this.is_dubbed = audio_content === "dubbed";
        this.is_descriptive = audio_content === "descriptive";
        this.is_secondary = audio_content === "secondary";
        this.is_auto_dubbed = audio_content === "dubbed-auto";
        this.is_original = audio_content === "original" || !this.is_dubbed && !this.is_descriptive && !this.is_secondary && !this.is_auto_dubbed && !this.is_drc;
      }
      if (this.has_text && !this.language && this.caption_track) {
        this.language = this.caption_track.language_code;
      }
    }
    if (this.has_video) {
      this.is_sr = xtags.some((tag) => tag.key === "sr" && tag.value === "1");
    }
  }
  /**
   * Deciphers the URL using the provided player instance.
   * @param player - An optional instance of the Player class used to decipher the URL.
   * @returns The deciphered URL as a string. If no player is provided, returns the original URL or an empty string.
   */
  async decipher(player) {
    if (!player)
      return this.url || "";
    return player.decipher(this.url, this.signature_cipher, this.cipher, __privateGet(this, _this_response_nsig_cache));
  }
};
_this_response_nsig_cache = new WeakMap();
__name(_Format, "Format");
var Format = _Format;

// dist/src/parser/classes/misc/VideoDetails.js
var _VideoDetails = class _VideoDetails {
  constructor(data) {
    __publicField(this, "id");
    __publicField(this, "channel_id");
    __publicField(this, "title");
    __publicField(this, "duration");
    __publicField(this, "keywords");
    __publicField(this, "is_owner_viewing");
    __publicField(this, "short_description");
    __publicField(this, "thumbnail");
    __publicField(this, "allow_ratings");
    __publicField(this, "view_count");
    __publicField(this, "author");
    __publicField(this, "is_private");
    __publicField(this, "is_live");
    __publicField(this, "is_live_content");
    __publicField(this, "is_live_dvr_enabled");
    __publicField(this, "is_upcoming");
    __publicField(this, "is_crawlable");
    __publicField(this, "is_post_live_dvr");
    __publicField(this, "is_low_latency_live_stream");
    __publicField(this, "live_chunk_readahead");
    this.id = data.videoId;
    this.channel_id = data.channelId;
    this.title = data.title;
    this.duration = parseInt(data.lengthSeconds);
    this.keywords = data.keywords;
    this.is_owner_viewing = !!data.isOwnerViewing;
    this.short_description = data.shortDescription;
    this.thumbnail = Thumbnail.fromResponse(data.thumbnail);
    this.allow_ratings = !!data.allowRatings;
    this.view_count = parseInt(data.viewCount);
    this.author = data.author;
    this.is_private = !!data.isPrivate;
    this.is_live = !!data.isLive;
    this.is_live_content = !!data.isLiveContent;
    this.is_live_dvr_enabled = !!data.isLiveDvrEnabled;
    this.is_low_latency_live_stream = !!data.isLowLatencyLiveStream;
    this.is_upcoming = !!data.isUpcoming;
    this.is_post_live_dvr = !!data.isPostLiveDvr;
    this.is_crawlable = !!data.isCrawlable;
    this.live_chunk_readahead = data.liveChunkReadahead;
  }
};
__name(_VideoDetails, "VideoDetails");
var VideoDetails = _VideoDetails;

// dist/src/parser/parser.js
var TAG2 = "Parser";
var IGNORED_LIST = /* @__PURE__ */ new Set([
  "AdSlot",
  "DisplayAd",
  "SearchPyv",
  "MealbarPromo",
  "PrimetimePromo",
  "PromotedSparklesWeb",
  "CompactPromotedVideo",
  "BrandVideoShelf",
  "BrandVideoSingleton",
  "StatementBanner",
  "GuideSigninPromo",
  "AdsEngagementPanelContent",
  "MiniGameCardView",
  "GenAiFeedbackFormView"
]);
var RUNTIME_NODES = new Map(Object.entries(nodes_exports));
var DYNAMIC_NODES = /* @__PURE__ */ new Map();
var MEMO = null;
var ERROR_HANDLER = /* @__PURE__ */ __name(({ classname, ...context }) => {
  switch (context.error_type) {
    case "parse":
      if (context.error instanceof Error) {
        Log_exports.warn(TAG2, new InnertubeError(`Something went wrong at ${classname}!
This is a bug, please report it at ${package_default.bugs.url}`, {
          stack: context.error.stack,
          classdata: JSON.stringify(context.classdata, null, 2)
        }));
      }
      break;
    case "typecheck":
      Log_exports.warn(TAG2, new ParsingError(`Type mismatch, got ${classname} expected ${Array.isArray(context.expected) ? context.expected.join(" | ") : context.expected}.`, context.classdata));
      break;
    case "mutation_data_missing":
      Log_exports.warn(TAG2, new InnertubeError(`Mutation data required for processing ${classname}, but none found.
This is a bug, please report it at ${package_default.bugs.url}`));
      break;
    case "mutation_data_invalid":
      Log_exports.warn(TAG2, new InnertubeError(`Mutation data missing or invalid for ${context.failed} out of ${context.total} MusicMultiSelectMenuItems. The titles of the failed items are: ${context.titles.join(", ")}.
This is a bug, please report it at ${package_default.bugs.url}`));
      break;
    case "class_not_found":
      Log_exports.warn(TAG2, new InnertubeError(`${classname} not found!
This is a bug, want to help us fix it? Follow the instructions at ${package_default.homepage.split("#", 1)[0]}/blob/main/docs/updating-the-parser.md or report it at ${package_default.bugs.url}!
Introspected and JIT generated this class in the meantime:
${generateTypescriptClass(classname, context.key_info)}`));
      break;
    case "class_changed":
      Log_exports.warn(TAG2, `${classname} changed!
The following keys where altered: ${context.changed_keys.map(([key]) => camelToSnake(key)).join(", ")}
The class has changed to:
${generateTypescriptClass(classname, context.key_info)}`);
      break;
    default:
      Log_exports.warn(TAG2, "Unreachable code reached at ParserErrorHandler");
      break;
  }
}, "ERROR_HANDLER");
function setParserErrorHandler(handler) {
  ERROR_HANDLER = handler;
}
__name(setParserErrorHandler, "setParserErrorHandler");
function _clearMemo() {
  MEMO = null;
}
__name(_clearMemo, "_clearMemo");
function _createMemo() {
  MEMO = new Memo();
}
__name(_createMemo, "_createMemo");
function _addToMemo(classname, result) {
  if (!MEMO)
    return;
  const list = MEMO.get(classname);
  if (!list)
    return MEMO.set(classname, [result]);
  list.push(result);
}
__name(_addToMemo, "_addToMemo");
function _getMemo() {
  if (!MEMO)
    throw new Error("Parser#getMemo() called before Parser#createMemo()");
  return MEMO;
}
__name(_getMemo, "_getMemo");
function shouldIgnore(classname) {
  return IGNORED_LIST.has(classname);
}
__name(shouldIgnore, "shouldIgnore");
function sanitizeClassName(input) {
  return (input.charAt(0).toUpperCase() + input.slice(1)).replace(/Renderer|Model/g, "").replace(/Radio/g, "Mix").trim();
}
__name(sanitizeClassName, "sanitizeClassName");
function getParserByName(classname) {
  const ParserConstructor = RUNTIME_NODES.get(classname);
  if (!ParserConstructor) {
    const error2 = new Error(`Module not found: ${classname}`);
    error2.code = "MODULE_NOT_FOUND";
    throw error2;
  }
  return ParserConstructor;
}
__name(getParserByName, "getParserByName");
function hasParser(classname) {
  return RUNTIME_NODES.has(classname);
}
__name(hasParser, "hasParser");
function addRuntimeParser(classname, ParserConstructor) {
  RUNTIME_NODES.set(classname, ParserConstructor);
  DYNAMIC_NODES.set(classname, ParserConstructor);
}
__name(addRuntimeParser, "addRuntimeParser");
function getDynamicParsers() {
  return Object.fromEntries(DYNAMIC_NODES);
}
__name(getDynamicParsers, "getDynamicParsers");
function parseResponse(data) {
  const parsed_data = {};
  _createMemo();
  const contents = parse(data.contents);
  const contents_memo = _getMemo();
  if (contents) {
    parsed_data.contents = contents;
    parsed_data.contents_memo = contents_memo;
  }
  _clearMemo();
  _createMemo();
  const on_response_received_actions = data.onResponseReceivedActions ? parseRR(data.onResponseReceivedActions) : null;
  const on_response_received_actions_memo = _getMemo();
  if (on_response_received_actions) {
    parsed_data.on_response_received_actions = on_response_received_actions;
    parsed_data.on_response_received_actions_memo = on_response_received_actions_memo;
  }
  _clearMemo();
  _createMemo();
  const on_response_received_endpoints = data.onResponseReceivedEndpoints ? parseRR(data.onResponseReceivedEndpoints) : null;
  const on_response_received_endpoints_memo = _getMemo();
  if (on_response_received_endpoints) {
    parsed_data.on_response_received_endpoints = on_response_received_endpoints;
    parsed_data.on_response_received_endpoints_memo = on_response_received_endpoints_memo;
  }
  _clearMemo();
  _createMemo();
  const on_response_received_commands = data.onResponseReceivedCommands ? parseRR(data.onResponseReceivedCommands) : null;
  const on_response_received_commands_memo = _getMemo();
  if (on_response_received_commands) {
    parsed_data.on_response_received_commands = on_response_received_commands;
    parsed_data.on_response_received_commands_memo = on_response_received_commands_memo;
  }
  _clearMemo();
  _createMemo();
  const continuation_contents = data.continuationContents ? parseLC(data.continuationContents) : null;
  const continuation_contents_memo = _getMemo();
  if (continuation_contents) {
    parsed_data.continuation_contents = continuation_contents;
    parsed_data.continuation_contents_memo = continuation_contents_memo;
  }
  _clearMemo();
  _createMemo();
  const actions = data.actions ? parseActions(data.actions) : null;
  const actions_memo = _getMemo();
  if (actions) {
    parsed_data.actions = actions;
    parsed_data.actions_memo = actions_memo;
  }
  _clearMemo();
  _createMemo();
  const live_chat_item_context_menu_supported_renderers = data.liveChatItemContextMenuSupportedRenderers ? parseItem(data.liveChatItemContextMenuSupportedRenderers) : null;
  const live_chat_item_context_menu_supported_renderers_memo = _getMemo();
  if (live_chat_item_context_menu_supported_renderers) {
    parsed_data.live_chat_item_context_menu_supported_renderers = live_chat_item_context_menu_supported_renderers;
    parsed_data.live_chat_item_context_menu_supported_renderers_memo = live_chat_item_context_menu_supported_renderers_memo;
  }
  _clearMemo();
  _createMemo();
  const header = data.header ? parse(data.header) : null;
  const header_memo = _getMemo();
  if (header) {
    parsed_data.header = header;
    parsed_data.header_memo = header_memo;
  }
  _clearMemo();
  _createMemo();
  const sidebar = data.sidebar ? parseItem(data.sidebar) : null;
  const sidebar_memo = _getMemo();
  if (sidebar) {
    parsed_data.sidebar = sidebar;
    parsed_data.sidebar_memo = sidebar_memo;
  }
  _clearMemo();
  _createMemo();
  const items = parse(data.items);
  if (items) {
    parsed_data.items = items;
    parsed_data.items_memo = _getMemo();
  }
  _clearMemo();
  applyMutations(contents_memo, data.frameworkUpdates?.entityBatchUpdate?.mutations);
  if (on_response_received_endpoints_memo) {
    applyCommentsMutations(on_response_received_endpoints_memo, data.frameworkUpdates?.entityBatchUpdate?.mutations);
  }
  const continuation = data.continuation ? parseC(data.continuation) : null;
  if (continuation) {
    parsed_data.continuation = continuation;
  }
  const continuation_endpoint = data.continuationEndpoint ? parseLC(data.continuationEndpoint) : null;
  if (continuation_endpoint) {
    parsed_data.continuation_endpoint = continuation_endpoint;
  }
  const metadata = parse(data.metadata);
  if (metadata) {
    parsed_data.metadata = metadata;
  }
  const microformat = parseItem(data.microformat);
  if (microformat) {
    parsed_data.microformat = microformat;
  }
  const overlay = parseItem(data.overlay);
  if (overlay) {
    parsed_data.overlay = overlay;
  }
  const alerts = parseArray(data.alerts, [Alert, AlertWithButton]);
  if (alerts.length) {
    parsed_data.alerts = alerts;
  }
  const refinements = data.refinements;
  if (refinements) {
    parsed_data.refinements = refinements;
  }
  const estimated_results = data.estimatedResults ? parseInt(data.estimatedResults) : null;
  if (estimated_results) {
    parsed_data.estimated_results = estimated_results;
  }
  const player_overlays = parse(data.playerOverlays);
  if (player_overlays) {
    parsed_data.player_overlays = player_overlays;
  }
  const background = parseItem(data.background, MusicThumbnail);
  if (background) {
    parsed_data.background = background;
  }
  const playback_tracking = data.playbackTracking ? {
    videostats_watchtime_url: data.playbackTracking.videostatsWatchtimeUrl.baseUrl,
    videostats_playback_url: data.playbackTracking.videostatsPlaybackUrl.baseUrl
  } : null;
  if (playback_tracking) {
    parsed_data.playback_tracking = playback_tracking;
  }
  const playability_status = data.playabilityStatus ? {
    status: data.playabilityStatus.status,
    reason: data.playabilityStatus.reason || "",
    embeddable: !!data.playabilityStatus.playableInEmbed || false,
    audio_only_playability: parseItem(data.playabilityStatus.audioOnlyPlayability, AudioOnlyPlayability),
    error_screen: parseItem(data.playabilityStatus.errorScreen)
  } : null;
  if (playability_status) {
    parsed_data.playability_status = playability_status;
  }
  if (data.streamingData) {
    const this_response_nsig_cache = /* @__PURE__ */ new Map();
    parsed_data.streaming_data = {
      expires: new Date(Date.now() + parseInt(data.streamingData.expiresInSeconds) * 1e3),
      formats: parseFormats(data.streamingData.formats, this_response_nsig_cache),
      adaptive_formats: parseFormats(data.streamingData.adaptiveFormats, this_response_nsig_cache),
      dash_manifest_url: data.streamingData.dashManifestUrl,
      hls_manifest_url: data.streamingData.hlsManifestUrl,
      server_abr_streaming_url: data.streamingData.serverAbrStreamingUrl
    };
  }
  if (data.playerConfig) {
    parsed_data.player_config = {
      audio_config: {
        loudness_db: data.playerConfig.audioConfig?.loudnessDb,
        perceptual_loudness_db: data.playerConfig.audioConfig?.perceptualLoudnessDb,
        enable_per_format_loudness: data.playerConfig.audioConfig?.enablePerFormatLoudness
      },
      stream_selection_config: {
        max_bitrate: data.playerConfig.streamSelectionConfig?.maxBitrate || "0"
      },
      media_common_config: {
        dynamic_readahead_config: {
          max_read_ahead_media_time_ms: data.playerConfig.mediaCommonConfig?.dynamicReadaheadConfig?.maxReadAheadMediaTimeMs || 0,
          min_read_ahead_media_time_ms: data.playerConfig.mediaCommonConfig?.dynamicReadaheadConfig?.minReadAheadMediaTimeMs || 0,
          read_ahead_growth_rate_ms: data.playerConfig.mediaCommonConfig?.dynamicReadaheadConfig?.readAheadGrowthRateMs || 0
        },
        media_ustreamer_request_config: {
          video_playback_ustreamer_config: data.playerConfig.mediaCommonConfig?.mediaUstreamerRequestConfig?.videoPlaybackUstreamerConfig
        }
      }
    };
  }
  const current_video_endpoint = data.currentVideoEndpoint ? new NavigationEndpoint(data.currentVideoEndpoint) : null;
  if (current_video_endpoint) {
    parsed_data.current_video_endpoint = current_video_endpoint;
  }
  const endpoint = data.endpoint ? new NavigationEndpoint(data.endpoint) : null;
  if (endpoint) {
    parsed_data.endpoint = endpoint;
  }
  const captions = parseItem(data.captions, PlayerCaptionsTracklist);
  if (captions) {
    parsed_data.captions = captions;
  }
  const video_details = data.videoDetails ? new VideoDetails(data.videoDetails) : null;
  if (video_details) {
    parsed_data.video_details = video_details;
  }
  const annotations = parseArray(data.annotations, PlayerAnnotationsExpanded);
  if (annotations.length) {
    parsed_data.annotations = annotations;
  }
  const storyboards = parseItem(data.storyboards, [PlayerStoryboardSpec, PlayerLiveStoryboardSpec]);
  if (storyboards) {
    parsed_data.storyboards = storyboards;
  }
  const endscreen = parseItem(data.endscreen, Endscreen);
  if (endscreen) {
    parsed_data.endscreen = endscreen;
  }
  const cards = parseItem(data.cards, CardCollection);
  if (cards) {
    parsed_data.cards = cards;
  }
  const engagement_panels = parseArray(data.engagementPanels, EngagementPanelSectionList);
  if (engagement_panels.length) {
    parsed_data.engagement_panels = engagement_panels;
  }
  if (data.bgChallenge) {
    const interpreter_url = {
      private_do_not_access_or_else_trusted_resource_url_wrapped_value: data.bgChallenge.interpreterUrl.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue,
      private_do_not_access_or_else_safe_script_wrapped_value: data.bgChallenge.interpreterUrl.privateDoNotAccessOrElseSafeScriptWrappedValue
    };
    parsed_data.bg_challenge = {
      interpreter_url,
      interpreter_hash: data.bgChallenge.interpreterHash,
      program: data.bgChallenge.program,
      global_name: data.bgChallenge.globalName,
      client_experiments_state_blob: data.bgChallenge.clientExperimentsStateBlob
    };
  }
  if (data.challenge) {
    parsed_data.challenge = data.challenge;
  }
  if (data.playerResponse) {
    parsed_data.player_response = parseResponse(data.playerResponse);
  }
  if (data.watchNextResponse) {
    parsed_data.watch_next_response = parseResponse(data.watchNextResponse);
  }
  if (data.cpnInfo) {
    parsed_data.cpn_info = {
      cpn: data.cpnInfo.cpn,
      cpn_source: data.cpnInfo.cpnSource
    };
  }
  if (data.entries) {
    parsed_data.entries = data.entries.map((entry) => new NavigationEndpoint(entry));
  }
  if (data.targetId) {
    parsed_data.target_id = data.targetId;
  }
  return parsed_data;
}
__name(parseResponse, "parseResponse");
function parseItem(data, validTypes) {
  if (!data)
    return null;
  const keys = Object.keys(data);
  if (!keys.length)
    return null;
  const classname = sanitizeClassName(keys[0]);
  if (!shouldIgnore(classname)) {
    try {
      const has_target_class = hasParser(classname);
      const TargetClass = has_target_class ? getParserByName(classname) : generateRuntimeClass(classname, data[keys[0]], ERROR_HANDLER);
      if (validTypes) {
        if (Array.isArray(validTypes)) {
          if (!validTypes.some((type) => type.type === TargetClass.type)) {
            ERROR_HANDLER({
              classdata: data[keys[0]],
              classname,
              error_type: "typecheck",
              expected: validTypes.map((type) => type.type)
            });
            return null;
          }
        } else if (TargetClass.type !== validTypes.type) {
          ERROR_HANDLER({
            classdata: data[keys[0]],
            classname,
            error_type: "typecheck",
            expected: validTypes.type
          });
          return null;
        }
      }
      const result = new TargetClass(data[keys[0]]);
      _addToMemo(classname, result);
      return result;
    } catch (err) {
      ERROR_HANDLER({
        classname,
        classdata: data[keys[0]],
        error: err,
        error_type: "parse"
      });
      return null;
    }
  }
  return null;
}
__name(parseItem, "parseItem");
function parseArray(data, validTypes) {
  if (Array.isArray(data)) {
    const results = [];
    for (const item of data) {
      const result = parseItem(item, validTypes);
      if (result) {
        results.push(result);
      }
    }
    return observe(results);
  } else if (!data) {
    return observe([]);
  }
  throw new ParsingError("Expected array but got a single item");
}
__name(parseArray, "parseArray");
function parse(data, requireArray, validTypes) {
  if (!data)
    return null;
  if (Array.isArray(data)) {
    const results = [];
    for (const item of data) {
      const result = parseItem(item, validTypes);
      if (result) {
        results.push(result);
      }
    }
    const res = observe(results);
    return requireArray ? res : new SuperParsedResult(res);
  } else if (requireArray) {
    throw new ParsingError("Expected array but got a single item");
  }
  return new SuperParsedResult(parseItem(data, validTypes));
}
__name(parse, "parse");
var command_regexp = /Command$/;
var endpoint_regexp = /Endpoint$/;
var action_regexp = /Action$/;
function parseCommand(data) {
  let keys = [];
  try {
    keys = Object.keys(data);
  } catch {
  }
  for (const key of keys) {
    const value = data[key];
    if (command_regexp.test(key) || endpoint_regexp.test(key) || action_regexp.test(key)) {
      const classname = sanitizeClassName(key);
      if (shouldIgnore(classname))
        return void 0;
      try {
        const has_target_class = hasParser(classname);
        if (has_target_class)
          return new (getParserByName(classname))(value);
      } catch (error2) {
        ERROR_HANDLER({
          error: error2,
          classname,
          classdata: value,
          error_type: "parse"
        });
      }
    }
  }
}
__name(parseCommand, "parseCommand");
function parseCommands(commands) {
  if (Array.isArray(commands)) {
    const results = [];
    for (const item of commands) {
      const result = parseCommand(item);
      if (result) {
        results.push(result);
      }
    }
    return observe(results);
  } else if (!commands)
    return observe([]);
  throw new ParsingError("Expected array but got a single item");
}
__name(parseCommands, "parseCommands");
function parseC(data) {
  if (data.timedContinuationData)
    return new Continuation({ continuation: data.timedContinuationData, type: "timed" });
  return null;
}
__name(parseC, "parseC");
function parseLC(data) {
  if (data.itemSectionContinuation)
    return new ItemSectionContinuation(data.itemSectionContinuation);
  if (data.sectionListContinuation)
    return new SectionListContinuation(data.sectionListContinuation);
  if (data.liveChatContinuation)
    return new LiveChatContinuation(data.liveChatContinuation);
  if (data.musicPlaylistShelfContinuation)
    return new MusicPlaylistShelfContinuation(data.musicPlaylistShelfContinuation);
  if (data.musicShelfContinuation)
    return new MusicShelfContinuation(data.musicShelfContinuation);
  if (data.gridContinuation)
    return new GridContinuation(data.gridContinuation);
  if (data.playlistPanelContinuation)
    return new PlaylistPanelContinuation(data.playlistPanelContinuation);
  if (data.continuationCommand)
    return new ContinuationCommand2(data.continuationCommand);
  return null;
}
__name(parseLC, "parseLC");
function parseRR(actions) {
  return observe(actions.map((action) => {
    if (action.navigateAction)
      return new NavigateAction(action.navigateAction);
    else if (action.showMiniplayerCommand)
      return new ShowMiniplayerCommand(action.showMiniplayerCommand);
    else if (action.reloadContinuationItemsCommand)
      return new ReloadContinuationItemsCommand(action.reloadContinuationItemsCommand);
    else if (action.appendContinuationItemsAction)
      return new AppendContinuationItemsAction(action.appendContinuationItemsAction);
    else if (action.openPopupAction)
      return new OpenPopupAction(action.openPopupAction);
  }).filter((item) => item));
}
__name(parseRR, "parseRR");
function parseActions(data) {
  if (Array.isArray(data)) {
    return parse(data.map((action) => {
      delete action.clickTrackingParams;
      return action;
    }));
  }
  return new SuperParsedResult(parseItem(data));
}
__name(parseActions, "parseActions");
function parseFormats(formats, this_response_nsig_cache) {
  return formats?.map((format) => new Format(format, this_response_nsig_cache)) || [];
}
__name(parseFormats, "parseFormats");
function applyMutations(memo, mutations) {
  const music_multi_select_menu_items = memo.getType(MusicMultiSelectMenuItem);
  if (music_multi_select_menu_items.length > 0 && !mutations) {
    ERROR_HANDLER({
      error_type: "mutation_data_missing",
      classname: "MusicMultiSelectMenuItem"
    });
  } else {
    const missing_or_invalid_mutations = [];
    for (const menu_item of music_multi_select_menu_items) {
      const mutation = mutations.find((mutation2) => mutation2.payload?.musicFormBooleanChoice?.id === menu_item.form_item_entity_key);
      const choice = mutation?.payload.musicFormBooleanChoice;
      if (choice?.selected !== void 0 && choice?.opaqueToken) {
        menu_item.selected = choice.selected;
      } else {
        missing_or_invalid_mutations.push(`'${menu_item.title}'`);
      }
    }
    if (missing_or_invalid_mutations.length > 0) {
      ERROR_HANDLER({
        error_type: "mutation_data_invalid",
        classname: "MusicMultiSelectMenuItem",
        total: music_multi_select_menu_items.length,
        failed: missing_or_invalid_mutations.length,
        titles: missing_or_invalid_mutations
      });
    }
  }
  if (mutations) {
    const heat_map_mutations = mutations.filter((mutation) => mutation.payload?.macroMarkersListEntity && mutation.payload.macroMarkersListEntity.markersList?.markerType === "MARKER_TYPE_HEATMAP");
    for (const mutation of heat_map_mutations) {
      const macro_markers_entity = new MacroMarkersListEntity(mutation.payload.macroMarkersListEntity);
      const list = memo.get("MacroMarkersListEntity");
      if (!list) {
        memo.set("MacroMarkersListEntity", [macro_markers_entity]);
      } else {
        list.push(macro_markers_entity);
      }
    }
  }
}
__name(applyMutations, "applyMutations");
function applyCommentsMutations(memo, mutations) {
  const comment_view_items = memo.getType(CommentView);
  if (comment_view_items.length > 0) {
    if (!mutations) {
      ERROR_HANDLER({
        error_type: "mutation_data_missing",
        classname: "CommentView"
      });
    }
    for (const comment_view of comment_view_items) {
      const comment_mutation = mutations.find((mutation) => mutation.payload?.commentEntityPayload?.key === comment_view.keys.comment)?.payload?.commentEntityPayload;
      const toolbar_state_mutation = mutations.find((mutation) => mutation.payload?.engagementToolbarStateEntityPayload?.key === comment_view.keys.toolbar_state)?.payload?.engagementToolbarStateEntityPayload;
      const engagement_toolbar = mutations.find((mutation) => mutation.entityKey === comment_view.keys.toolbar_surface)?.payload?.engagementToolbarSurfaceEntityPayload;
      const comment_surface_mutation = mutations.find((mutation) => mutation.payload?.commentSurfaceEntityPayload?.key === comment_view.keys.comment_surface)?.payload?.commentSurfaceEntityPayload;
      comment_view.applyMutations(comment_mutation, toolbar_state_mutation, engagement_toolbar, comment_surface_mutation);
    }
  }
}
__name(applyCommentsMutations, "applyCommentsMutations");

// dist/src/parser/youtube/index.js
var youtube_exports = {};
__export(youtube_exports, {
  AccountInfo: () => AccountInfo,
  Channel: () => Channel2,
  ChannelListContinuation: () => ChannelListContinuation,
  Comments: () => Comments,
  FilteredChannelList: () => FilteredChannelList,
  Guide: () => Guide,
  HashtagFeed: () => HashtagFeed,
  History: () => History,
  HomeFeed: () => HomeFeed,
  ItemMenu: () => ItemMenu,
  Library: () => Library,
  LiveChat: () => LiveChat2,
  NotificationsMenu: () => NotificationsMenu,
  Playlist: () => Playlist2,
  Search: () => Search,
  Settings: () => Settings,
  SmoothedQueue: () => SmoothedQueue,
  TranscriptInfo: () => TranscriptInfo,
  VideoInfo: () => VideoInfo
});

// dist/src/parser/youtube/AccountInfo.js
var _page;
var _AccountInfo = class _AccountInfo {
  constructor(response) {
    __privateAdd(this, _page);
    __publicField(this, "contents");
    __privateSet(this, _page, parser_exports.parseResponse(response.data));
    if (!__privateGet(this, _page).contents)
      throw new InnertubeError("Page contents not found");
    const account_section_list = __privateGet(this, _page).contents.array().as(AccountSectionList)[0];
    if (!account_section_list)
      throw new InnertubeError("Account section list not found");
    this.contents = account_section_list.contents[0];
  }
  get page() {
    return __privateGet(this, _page);
  }
};
_page = new WeakMap();
__name(_AccountInfo, "AccountInfo");
var AccountInfo = _AccountInfo;

// dist/src/core/mixins/Feed.js
var _page2, _actions4, _memo, _continuation2, _Feed_instances, isParsed_fn, getBodyContinuations_fn;
var _Feed = class _Feed {
  constructor(actions, response, already_parsed = false) {
    __privateAdd(this, _Feed_instances);
    __privateAdd(this, _page2);
    __privateAdd(this, _actions4);
    __privateAdd(this, _memo);
    __privateAdd(this, _continuation2);
    if (__privateMethod(this, _Feed_instances, isParsed_fn).call(this, response) || already_parsed) {
      __privateSet(this, _page2, response);
    } else {
      __privateSet(this, _page2, parser_exports.parseResponse(response.data));
    }
    const memo = concatMemos(...[
      __privateGet(this, _page2).contents_memo,
      __privateGet(this, _page2).continuation_contents_memo,
      __privateGet(this, _page2).on_response_received_commands_memo,
      __privateGet(this, _page2).on_response_received_endpoints_memo,
      __privateGet(this, _page2).on_response_received_actions_memo,
      __privateGet(this, _page2).sidebar_memo,
      __privateGet(this, _page2).header_memo
    ]);
    if (!memo)
      throw new InnertubeError("No memo found in feed");
    __privateSet(this, _memo, memo);
    __privateSet(this, _actions4, actions);
  }
  /**
   * Get all videos on a given page via memo
   */
  static getVideosFromMemo(memo) {
    return memo.getType(Video, GridVideo, ReelItem, ShortsLockupView, CompactVideo, PlaylistVideo, PlaylistPanelVideo, WatchCardCompactVideo);
  }
  /**
   * Get all playlists on a given page via memo
   */
  static getPlaylistsFromMemo(memo) {
    const playlists = memo.getType(Playlist, GridPlaylist);
    const lockup_views = memo.getType(LockupView).filter((lockup) => {
      return ["PLAYLIST", "ALBUM", "PODCAST"].includes(lockup.content_type);
    });
    if (lockup_views.length > 0) {
      playlists.push(...lockup_views);
    }
    return playlists;
  }
  /**
   * Get all the videos in the feed
   */
  get videos() {
    return _Feed.getVideosFromMemo(__privateGet(this, _memo));
  }
  /**
   * Get all the community posts in the feed
   */
  get posts() {
    return __privateGet(this, _memo).getType(BackstagePost, Post, SharedPost);
  }
  /**
   * Get all the channels in the feed
   */
  get channels() {
    return __privateGet(this, _memo).getType(Channel, GridChannel);
  }
  /**
   * Get all playlists in the feed
   */
  get playlists() {
    return _Feed.getPlaylistsFromMemo(__privateGet(this, _memo));
  }
  get memo() {
    return __privateGet(this, _memo);
  }
  /**
   * Returns contents from the page.
   */
  get page_contents() {
    const tab_content = __privateGet(this, _memo).getType(Tab)?.[0].content;
    const reload_continuation_items = __privateGet(this, _memo).getType(ReloadContinuationItemsCommand)[0];
    const append_continuation_items = __privateGet(this, _memo).getType(AppendContinuationItemsAction)[0];
    return tab_content || reload_continuation_items || append_continuation_items;
  }
  /**
   * Returns all segments/sections from the page.
   */
  get shelves() {
    return __privateGet(this, _memo).getType(Shelf, RichShelf, ReelShelf);
  }
  /**
   * Finds shelf by title.
   */
  getShelf(title) {
    return this.shelves.find((shelf) => shelf.title.toString() === title);
  }
  /**
   * Returns secondary contents from the page.
   */
  get secondary_contents() {
    if (!__privateGet(this, _page2).contents?.is_node)
      return null;
    const node = __privateGet(this, _page2).contents?.item();
    if (!node.is(TwoColumnBrowseResults, TwoColumnSearchResults))
      return null;
    return node.secondary_contents;
  }
  get actions() {
    return __privateGet(this, _actions4);
  }
  /**
   * Get the original page data
   */
  get page() {
    return __privateGet(this, _page2);
  }
  /**
   * Checks if the feed has continuation.
   */
  get has_continuation() {
    return __privateMethod(this, _Feed_instances, getBodyContinuations_fn).call(this).length > 0;
  }
  /**
   * Retrieves continuation data as it is.
   */
  async getContinuationData() {
    if (__privateGet(this, _continuation2)) {
      if (__privateGet(this, _continuation2).length === 0)
        throw new InnertubeError("There are no continuations.");
      return await __privateGet(this, _continuation2)[0].endpoint.call(__privateGet(this, _actions4), { parse: true });
    }
    __privateSet(this, _continuation2, __privateMethod(this, _Feed_instances, getBodyContinuations_fn).call(this));
    if (__privateGet(this, _continuation2))
      return this.getContinuationData();
  }
  /**
   * Retrieves next batch of contents and returns a new {@link Feed} object.
   */
  async getContinuation() {
    const continuation_data = await this.getContinuationData();
    if (!continuation_data)
      throw new InnertubeError("Could not get continuation data");
    return new _Feed(this.actions, continuation_data, true);
  }
};
_page2 = new WeakMap();
_actions4 = new WeakMap();
_memo = new WeakMap();
_continuation2 = new WeakMap();
_Feed_instances = new WeakSet();
isParsed_fn = /* @__PURE__ */ __name(function(response) {
  return !("data" in response);
}, "#isParsed");
getBodyContinuations_fn = /* @__PURE__ */ __name(function() {
  if (__privateGet(this, _page2).header_memo) {
    const header_continuations = __privateGet(this, _page2).header_memo.getType(ContinuationItem);
    return __privateGet(this, _memo).getType(ContinuationItem).filter((continuation) => !header_continuations.includes(continuation));
  }
  return __privateGet(this, _memo).getType(ContinuationItem);
}, "#getBodyContinuations");
__name(_Feed, "Feed");
var Feed = _Feed;

// dist/src/core/mixins/FilterableFeed.js
var _chips;
var _FilterableFeed = class _FilterableFeed extends Feed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __privateAdd(this, _chips);
  }
  /**
   * Returns the filter chips.
   */
  get filter_chips() {
    if (__privateGet(this, _chips))
      return __privateGet(this, _chips) || [];
    if (this.memo.getType(FeedFilterChipBar)?.length > 1)
      throw new InnertubeError("There are too many feed filter chipbars, you'll need to find the correct one yourself in this.page");
    if (this.memo.getType(FeedFilterChipBar)?.length === 0)
      throw new InnertubeError("There are no feed filter chipbars");
    __privateSet(this, _chips, this.memo.getType(ChipCloudChip));
    return __privateGet(this, _chips) || [];
  }
  /**
   * Returns available filters.
   */
  get filters() {
    return this.filter_chips.map((chip) => chip.text.toString()) || [];
  }
  /**
   * Applies given filter and returns a new {@link Feed} object.
   */
  async getFilteredFeed(filter) {
    let target_filter;
    if (typeof filter === "string") {
      if (!this.filters.includes(filter))
        throw new InnertubeError("Filter not found", { available_filters: this.filters });
      target_filter = this.filter_chips.find((chip) => chip.text.toString() === filter);
    } else if (filter.type === "ChipCloudChip") {
      target_filter = filter;
    } else {
      throw new InnertubeError("Invalid filter");
    }
    if (!target_filter)
      throw new InnertubeError("Filter not found");
    if (target_filter.is_selected)
      return this;
    const response = await target_filter.endpoint?.call(this.actions, { parse: true });
    if (!response)
      throw new InnertubeError("Failed to get filtered feed");
    return new Feed(this.actions, response, true);
  }
};
_chips = new WeakMap();
__name(_FilterableFeed, "FilterableFeed");
var FilterableFeed = _FilterableFeed;

// dist/src/core/mixins/index.js
var mixins_exports = {};
__export(mixins_exports, {
  Feed: () => Feed,
  FilterableFeed: () => FilterableFeed,
  MediaInfo: () => MediaInfo,
  TabbedFeed: () => TabbedFeed
});

// dist/src/core/mixins/MediaInfo.js
var _page3, _actions5, _cpn, _playback_tracking;
var _MediaInfo = class _MediaInfo {
  constructor(data, actions, cpn) {
    __privateAdd(this, _page3);
    __privateAdd(this, _actions5);
    __privateAdd(this, _cpn);
    __privateAdd(this, _playback_tracking);
    __publicField(this, "basic_info");
    __publicField(this, "annotations");
    __publicField(this, "storyboards");
    __publicField(this, "endscreen");
    __publicField(this, "captions");
    __publicField(this, "cards");
    __publicField(this, "streaming_data");
    __publicField(this, "playability_status");
    __publicField(this, "player_config");
    __privateSet(this, _actions5, actions);
    const info2 = parser_exports.parseResponse(data[0].data.playerResponse ? data[0].data.playerResponse : data[0].data);
    const next = data[1]?.data ? parser_exports.parseResponse(data[1].data) : void 0;
    __privateSet(this, _page3, [info2, next]);
    __privateSet(this, _cpn, cpn);
    if (info2.playability_status?.status === "ERROR")
      throw new InnertubeError("This video is unavailable", info2.playability_status);
    if (info2.microformat && !info2.microformat?.is(PlayerMicroformat, MicroformatData))
      throw new InnertubeError("Unsupported microformat", info2.microformat);
    this.basic_info = {
      ...info2.video_details,
      /**
       * Microformat is a bit redundant, so only
       * a few things there are interesting to us.
       */
      ...{
        embed: info2.microformat?.is(PlayerMicroformat) ? info2.microformat?.embed : null,
        channel: info2.microformat?.is(PlayerMicroformat) ? info2.microformat?.channel : null,
        is_unlisted: info2.microformat?.is_unlisted,
        is_family_safe: info2.microformat?.is_family_safe,
        category: info2.microformat?.is(PlayerMicroformat) ? info2.microformat?.category : null,
        has_ypc_metadata: info2.microformat?.is(PlayerMicroformat) ? info2.microformat?.has_ypc_metadata : null,
        start_timestamp: info2.microformat?.is(PlayerMicroformat) ? info2.microformat.start_timestamp : null,
        end_timestamp: info2.microformat?.is(PlayerMicroformat) ? info2.microformat.end_timestamp : null,
        view_count: info2.microformat?.is(PlayerMicroformat) && isNaN(info2.video_details?.view_count) ? info2.microformat.view_count : info2.video_details?.view_count,
        url_canonical: info2.microformat?.is(MicroformatData) ? info2.microformat?.url_canonical : null,
        tags: info2.microformat?.is(MicroformatData) ? info2.microformat?.tags : null
      },
      like_count: void 0,
      is_liked: void 0,
      is_disliked: void 0
    };
    this.annotations = info2.annotations;
    this.storyboards = info2.storyboards;
    this.endscreen = info2.endscreen;
    this.captions = info2.captions;
    this.cards = info2.cards;
    this.streaming_data = info2.streaming_data;
    this.playability_status = info2.playability_status;
    this.player_config = info2.player_config;
    __privateSet(this, _playback_tracking, info2.playback_tracking);
  }
  /**
   * Generates a DASH manifest from the streaming data.
   * @param options
   * @returns DASH manifest
   */
  async toDash(options = {}) {
    const player_response = __privateGet(this, _page3)[0];
    const manifest_options = options.manifest_options || {};
    if (player_response.video_details && player_response.video_details.is_live) {
      throw new InnertubeError("Generating DASH manifests for live videos is not supported. Please use the DASH and HLS manifests provided by YouTube in `streaming_data.dash_manifest_url` and `streaming_data.hls_manifest_url` instead.");
    }
    let storyboards;
    let captions;
    if (manifest_options.include_thumbnails && player_response.storyboards) {
      storyboards = player_response.storyboards;
    }
    if (typeof manifest_options.captions_format === "string" && player_response.captions?.caption_tracks) {
      captions = player_response.captions.caption_tracks;
    }
    return FormatUtils_exports.toDash(this.streaming_data, this.page[0].video_details?.is_post_live_dvr, options.url_transformer, options.format_filter, __privateGet(this, _cpn), __privateGet(this, _actions5).session.player, __privateGet(this, _actions5), storyboards, captions, manifest_options);
  }
  /**
   * Get a cleaned up representation of the adaptive_formats
   */
  getStreamingInfo(url_transformer, format_filter) {
    return getStreamingInfo(this.streaming_data, this.page[0].video_details?.is_post_live_dvr, url_transformer, format_filter, this.cpn, __privateGet(this, _actions5).session.player, __privateGet(this, _actions5), __privateGet(this, _page3)[0].storyboards ? __privateGet(this, _page3)[0].storyboards : void 0);
  }
  /**
   * Selects the format that best matches the given options.
   * @param options - Options
   */
  chooseFormat(options) {
    return FormatUtils_exports.chooseFormat(options, this.streaming_data);
  }
  /**
   * Downloads the video.
   * @param options - Download options.
   */
  async download(options = {}) {
    const player_response = __privateGet(this, _page3)[0];
    if (player_response.video_details && (player_response.video_details.is_live || player_response.video_details.is_post_live_dvr)) {
      throw new InnertubeError("Downloading is not supported for live and Post-Live-DVR videos, as they are split up into 5 second segments that are individual files, which require using a tool such as ffmpeg to stitch them together, so they cannot be returned in a single stream.");
    }
    return FormatUtils_exports.download(options, __privateGet(this, _actions5), this.playability_status, this.streaming_data, __privateGet(this, _actions5).session.player, this.cpn);
  }
  /**
   * Retrieves the video's transcript.
   */
  async getTranscript() {
    const next_response = this.page[1];
    if (!next_response)
      throw new InnertubeError("Cannot get transcript from basic video info.");
    if (!next_response.engagement_panels)
      throw new InnertubeError("Engagement panels not found. Video likely has no transcript.");
    const transcript_panel = next_response.engagement_panels.find((panel) => {
      return panel.panel_identifier === "engagement-panel-searchable-transcript";
    });
    if (!transcript_panel)
      throw new InnertubeError("Transcript panel not found. Video likely has no transcript.");
    const transcript_continuation = transcript_panel.content?.as(ContinuationItem);
    if (!transcript_continuation)
      throw new InnertubeError("Transcript continuation not found.");
    const response = await transcript_continuation.endpoint.call(this.actions);
    return new TranscriptInfo(this.actions, response);
  }
  async addToWatchHistory(client_name, client_version, replacement = "https://www.") {
    if (!__privateGet(this, _playback_tracking))
      throw new InnertubeError("Playback tracking not available");
    const url_params = {
      cpn: __privateGet(this, _cpn),
      fmt: 251,
      rtn: 0,
      rt: 0
    };
    const url = __privateGet(this, _playback_tracking).videostats_playback_url.replace("https://s.", replacement);
    return await __privateGet(this, _actions5).stats(url, {
      client_name: client_name || Constants_exports.CLIENTS.WEB.NAME,
      client_version: client_version || Constants_exports.CLIENTS.WEB.VERSION
    }, url_params);
  }
  async updateWatchTime(startTime, client_name = Constants_exports.CLIENTS.WEB.NAME, client_version = Constants_exports.CLIENTS.WEB.VERSION, replacement = "https://www.") {
    if (!__privateGet(this, _playback_tracking))
      throw new InnertubeError("Playback tracking not available");
    const url_params = {
      cpn: __privateGet(this, _cpn),
      st: startTime.toFixed(3),
      et: startTime.toFixed(3),
      cmt: startTime.toFixed(3),
      final: "1"
    };
    const url = __privateGet(this, _playback_tracking).videostats_watchtime_url.replace("https://s.", replacement);
    return await __privateGet(this, _actions5).stats(url, {
      client_name,
      client_version
    }, url_params);
  }
  get actions() {
    return __privateGet(this, _actions5);
  }
  /**
   * Content Playback Nonce.
   */
  get cpn() {
    return __privateGet(this, _cpn);
  }
  /**
   * Parsed InnerTube response.
   */
  get page() {
    return __privateGet(this, _page3);
  }
};
_page3 = new WeakMap();
_actions5 = new WeakMap();
_cpn = new WeakMap();
_playback_tracking = new WeakMap();
__name(_MediaInfo, "MediaInfo");
var MediaInfo = _MediaInfo;

// dist/src/core/mixins/TabbedFeed.js
var _actions6, _tabs;
var _TabbedFeed = class _TabbedFeed extends Feed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __privateAdd(this, _actions6);
    __privateAdd(this, _tabs);
    __privateSet(this, _actions6, actions);
    __privateSet(this, _tabs, this.page.contents_memo?.getType(Tab));
  }
  get tabs() {
    return __privateGet(this, _tabs)?.map((tab) => tab.title.toString()) ?? [];
  }
  async getTabByName(title) {
    const tab = __privateGet(this, _tabs)?.find((tab2) => tab2.title.toLowerCase() === title.toLowerCase());
    if (!tab)
      throw new InnertubeError(`Tab "${title}" not found`);
    if (tab.selected)
      return this;
    const response = await tab.endpoint.call(__privateGet(this, _actions6));
    return new _TabbedFeed(__privateGet(this, _actions6), response, false);
  }
  async getTabByURL(url) {
    const tab = __privateGet(this, _tabs)?.find((tab2) => tab2.endpoint.metadata.url?.split("/").pop() === url);
    if (!tab)
      throw new InnertubeError(`Tab "${url}" not found`);
    if (tab.selected)
      return this;
    const response = await tab.endpoint.call(__privateGet(this, _actions6));
    return new _TabbedFeed(__privateGet(this, _actions6), response, false);
  }
  hasTabWithURL(url) {
    return __privateGet(this, _tabs)?.some((tab) => tab.endpoint.metadata.url?.split("/").pop() === url) ?? false;
  }
  get title() {
    return this.page.contents_memo?.getType(Tab)?.find((tab) => tab.selected)?.title.toString();
  }
};
_actions6 = new WeakMap();
_tabs = new WeakMap();
__name(_TabbedFeed, "TabbedFeed");
var TabbedFeed = _TabbedFeed;

// dist/src/parser/youtube/Channel.js
var _Channel2 = class _Channel2 extends TabbedFeed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __publicField(this, "header");
    __publicField(this, "metadata");
    __publicField(this, "subscribe_button");
    __publicField(this, "current_tab");
    this.header = this.page.header?.item()?.as(C4TabbedHeader, CarouselHeader, InteractiveTabbedHeader, PageHeader);
    const metadata = this.page.metadata?.item().as(ChannelMetadata);
    const microformat = this.page.microformat?.as(MicroformatData);
    if (this.page.alerts) {
      const alert = this.page.alerts[0];
      if (alert?.alert_type === "ERROR") {
        throw new ChannelError(alert.text.toString());
      }
    }
    if (!metadata && !this.page.contents)
      throw new InnertubeError("Invalid channel", this);
    this.metadata = { ...metadata, ...microformat || {} };
    this.subscribe_button = this.page.header_memo?.getType(SubscribeButton)[0];
    if (this.page.contents)
      this.current_tab = this.page.contents.item().as(TwoColumnBrowseResults).tabs.find((tab) => tab.selected);
  }
  /**
   * Applies given filter to the list. Use {@link filters} to get available filters.
   * @param filter - The filter to apply
   */
  async applyFilter(filter) {
    let target_filter;
    const filter_chipbar = this.memo.getType(FeedFilterChipBar)[0];
    if (typeof filter === "string") {
      target_filter = filter_chipbar?.contents.find((chip) => chip.text === filter);
      if (!target_filter)
        throw new InnertubeError(`Filter ${filter} not found`, { available_filters: this.filters });
    } else {
      target_filter = filter;
    }
    if (!target_filter.endpoint)
      throw new InnertubeError("Invalid filter", filter);
    const page = await target_filter.endpoint.call(this.actions, { parse: true });
    if (!page)
      throw new InnertubeError("No page returned", { filter: target_filter });
    return new FilteredChannelList(this.actions, page, true);
  }
  /**
   * Applies given sort filter to the list. Use {@link sort_filters} to get available filters.
   * @param sort - The sort filter to apply
   */
  async applySort(sort) {
    const sort_filter_sub_menu = this.memo.getType(SortFilterSubMenu)[0];
    if (!sort_filter_sub_menu || !sort_filter_sub_menu.sub_menu_items)
      throw new InnertubeError("No sort filter sub menu found");
    const target_sort = sort_filter_sub_menu.sub_menu_items.find((item) => item.title === sort);
    if (!target_sort)
      throw new InnertubeError(`Sort filter ${sort} not found`, { available_sort_filters: this.sort_filters });
    if (target_sort.selected)
      return this;
    const page = await target_sort.endpoint.call(this.actions, { parse: true });
    return new _Channel2(this.actions, page, true);
  }
  /**
   * Applies given content type filter to the list. Use {@link content_type_filters} to get available filters.
   * @param content_type_filter - The content type filter to apply
   */
  async applyContentTypeFilter(content_type_filter) {
    const sub_menu = this.current_tab?.content?.as(SectionList).sub_menu?.as(ChannelSubMenu);
    if (!sub_menu)
      throw new InnertubeError("Sub menu not found");
    const item = sub_menu.content_type_sub_menu_items.find((item2) => item2.title === content_type_filter);
    if (!item)
      throw new InnertubeError(`Sub menu item ${content_type_filter} not found`, { available_filters: this.content_type_filters });
    if (item.selected)
      return this;
    const page = await item.endpoint.call(this.actions, { parse: true });
    return new _Channel2(this.actions, page, true);
  }
  get filters() {
    return this.memo.getType(FeedFilterChipBar)?.[0]?.contents.filterType(ChipCloudChip).map((chip) => chip.text) || [];
  }
  get sort_filters() {
    const sort_filter_sub_menu = this.memo.getType(SortFilterSubMenu)[0];
    return sort_filter_sub_menu?.sub_menu_items?.map((item) => item.title) || [];
  }
  get content_type_filters() {
    const sub_menu = this.current_tab?.content?.as(SectionList).sub_menu?.as(ChannelSubMenu);
    return sub_menu?.content_type_sub_menu_items.map((item) => item.title) || [];
  }
  async getHome() {
    const tab = await this.getTabByURL("featured");
    return new _Channel2(this.actions, tab.page, true);
  }
  async getVideos() {
    const tab = await this.getTabByURL("videos");
    return new _Channel2(this.actions, tab.page, true);
  }
  async getShorts() {
    const tab = await this.getTabByURL("shorts");
    return new _Channel2(this.actions, tab.page, true);
  }
  async getLiveStreams() {
    const tab = await this.getTabByURL("streams");
    return new _Channel2(this.actions, tab.page, true);
  }
  async getReleases() {
    const tab = await this.getTabByURL("releases");
    return new _Channel2(this.actions, tab.page, true);
  }
  async getPodcasts() {
    const tab = await this.getTabByURL("podcasts");
    return new _Channel2(this.actions, tab.page, true);
  }
  async getCourses() {
    const tab = await this.getTabByURL("courses");
    return new _Channel2(this.actions, tab.page, true);
  }
  async getPlaylists() {
    const tab = await this.getTabByURL("playlists");
    return new _Channel2(this.actions, tab.page, true);
  }
  async getCommunity() {
    const tab = await this.getTabByURL("posts");
    return new _Channel2(this.actions, tab.page, true);
  }
  /**
   * Retrieves the about page.
   * Note that this does not return a new {@link Channel} object.
   */
  async getAbout() {
    if (this.hasTabWithURL("about")) {
      const tab = await this.getTabByURL("about");
      return tab.memo.getType(ChannelAboutFullMetadata)[0];
    }
    const tagline = this.header?.is(C4TabbedHeader) && this.header.tagline;
    if (tagline || this.header?.is(PageHeader) && this.header.content?.description) {
      if (tagline && tagline.more_endpoint instanceof NavigationEndpoint) {
        const response2 = await tagline.more_endpoint.call(this.actions);
        const tab = new TabbedFeed(this.actions, response2, false);
        return tab.memo.getType(ChannelAboutFullMetadata)[0];
      }
      const endpoint = this.page.header_memo?.getType(ContinuationItem)[0]?.endpoint;
      if (!endpoint) {
        throw new InnertubeError("Failed to extract continuation to get channel about");
      }
      const response = await endpoint.call(this.actions, { parse: true });
      if (!response.on_response_received_endpoints_memo) {
        throw new InnertubeError("Unexpected response while fetching channel about", { response });
      }
      return response.on_response_received_endpoints_memo.getType(AboutChannel)[0];
    }
    throw new InnertubeError("About not found");
  }
  /**
   * Searches within the channel.
   */
  async search(query) {
    const tab = this.memo.getType(ExpandableTab)?.[0];
    if (!tab)
      throw new InnertubeError("Search tab not found", this);
    const page = await tab.endpoint.call(this.actions, { query, parse: true });
    return new _Channel2(this.actions, page, true);
  }
  get has_home() {
    return this.hasTabWithURL("featured");
  }
  get has_videos() {
    return this.hasTabWithURL("videos");
  }
  get has_shorts() {
    return this.hasTabWithURL("shorts");
  }
  get has_live_streams() {
    return this.hasTabWithURL("streams");
  }
  get has_releases() {
    return this.hasTabWithURL("releases");
  }
  get has_podcasts() {
    return this.hasTabWithURL("podcasts");
  }
  get has_courses() {
    return this.hasTabWithURL("courses");
  }
  get has_playlists() {
    return this.hasTabWithURL("playlists");
  }
  get has_community() {
    return this.hasTabWithURL("posts");
  }
  get has_about() {
    return this.hasTabWithURL("about") || !!(this.header?.is(C4TabbedHeader) && this.header.tagline?.more_endpoint) || !!(this.header?.is(PageHeader) && this.header.content?.description?.more_endpoint);
  }
  get has_search() {
    return this.memo.getType(ExpandableTab)?.length > 0;
  }
  async getContinuation() {
    const page = await super.getContinuationData();
    if (!page)
      throw new InnertubeError("Could not get continuation data");
    return new ChannelListContinuation(this.actions, page, true);
  }
};
__name(_Channel2, "Channel");
var Channel2 = _Channel2;
var _ChannelListContinuation = class _ChannelListContinuation extends Feed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __publicField(this, "contents");
    this.contents = this.page.on_response_received_actions?.[0] || this.page.on_response_received_endpoints?.[0];
  }
  async getContinuation() {
    const page = await super.getContinuationData();
    if (!page)
      throw new InnertubeError("Could not get continuation data");
    return new _ChannelListContinuation(this.actions, page, true);
  }
};
__name(_ChannelListContinuation, "ChannelListContinuation");
var ChannelListContinuation = _ChannelListContinuation;
var _FilteredChannelList = class _FilteredChannelList extends FilterableFeed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __publicField(this, "applied_filter");
    __publicField(this, "contents");
    this.applied_filter = this.memo.getType(ChipCloudChip).find((chip) => chip.is_selected);
    if (this.page.on_response_received_actions && this.page.on_response_received_actions.length > 1) {
      this.page.on_response_received_actions.shift();
    }
    this.contents = this.page.on_response_received_actions?.[0];
  }
  /**
   * Applies given filter to the list.
   * @param filter - The filter to apply
   */
  async applyFilter(filter) {
    const feed = await super.getFilteredFeed(filter);
    return new _FilteredChannelList(this.actions, feed.page, true);
  }
  async getContinuation() {
    const page = await super.getContinuationData();
    if (!page?.on_response_received_actions_memo)
      throw new InnertubeError("Unexpected continuation data", page);
    page.on_response_received_actions_memo.set("FeedFilterChipBar", this.memo.getType(FeedFilterChipBar));
    page.on_response_received_actions_memo.set("ChipCloudChip", this.memo.getType(ChipCloudChip));
    return new _FilteredChannelList(this.actions, page, true);
  }
};
__name(_FilteredChannelList, "FilteredChannelList");
var FilteredChannelList = _FilteredChannelList;

// dist/src/parser/youtube/Comments.js
var _page4, _actions7, _continuation3;
var _Comments = class _Comments {
  constructor(actions, data, already_parsed = false) {
    __privateAdd(this, _page4);
    __privateAdd(this, _actions7);
    __privateAdd(this, _continuation3);
    __publicField(this, "header");
    __publicField(this, "contents");
    __privateSet(this, _page4, already_parsed ? data : parser_exports.parseResponse(data));
    __privateSet(this, _actions7, actions);
    const contents = __privateGet(this, _page4).on_response_received_endpoints;
    if (!contents)
      throw new InnertubeError("Comments page did not have any content.");
    const header_node = contents.at(0)?.as(AppendContinuationItemsAction, ReloadContinuationItemsCommand);
    const body_node = contents.at(1)?.as(AppendContinuationItemsAction, ReloadContinuationItemsCommand);
    this.header = header_node?.contents?.firstOfType(CommentsHeader);
    const threads = body_node?.contents?.filterType(CommentThread) || [];
    this.contents = observe(threads.map((thread) => {
      if (thread.comment)
        thread.comment.setActions(__privateGet(this, _actions7));
      thread.setActions(__privateGet(this, _actions7));
      return thread;
    }));
    __privateSet(this, _continuation3, body_node?.contents?.firstOfType(ContinuationItem));
  }
  /**
   * Applies given sort option to the comments.
   * @param sort - Sort type.
   */
  async applySort(sort) {
    if (!this.header)
      throw new InnertubeError("Page header is missing. Cannot apply sort option.");
    let button;
    if (sort === "TOP_COMMENTS") {
      button = this.header.sort_menu?.sub_menu_items?.at(0);
    } else if (sort === "NEWEST_FIRST") {
      button = this.header.sort_menu?.sub_menu_items?.at(1);
    }
    if (!button)
      throw new InnertubeError("Could not find target button.");
    if (button.selected)
      return this;
    const response = await button.endpoint.call(__privateGet(this, _actions7), { parse: true });
    return new _Comments(__privateGet(this, _actions7), response, true);
  }
  /**
   * Creates a top-level comment.
   * @param text - Comment text.
   */
  async createComment(text) {
    if (!this.header)
      throw new InnertubeError("Page header is missing. Cannot create comment.");
    const button = this.header.create_renderer?.as(CommentSimplebox).submit_button;
    if (!button)
      throw new InnertubeError("Could not find target button. You are probably not logged in.");
    if (!button.endpoint)
      throw new InnertubeError("Button does not have an endpoint.");
    return await button.endpoint.call(__privateGet(this, _actions7), { commentText: text });
  }
  /**
   * Retrieves next batch of comments.
   */
  async getContinuation() {
    if (!__privateGet(this, _continuation3))
      throw new InnertubeError("Continuation not found");
    const data = await __privateGet(this, _continuation3).endpoint.call(__privateGet(this, _actions7), { parse: true });
    const page = Object.assign({}, __privateGet(this, _page4));
    if (!page.on_response_received_endpoints || !data.on_response_received_endpoints)
      throw new InnertubeError("Invalid reponse format, missing on_response_received_endpoints.");
    page.on_response_received_endpoints.pop();
    page.on_response_received_endpoints.push(data.on_response_received_endpoints[0]);
    return new _Comments(__privateGet(this, _actions7), page, true);
  }
  get has_continuation() {
    return !!__privateGet(this, _continuation3);
  }
  get page() {
    return __privateGet(this, _page4);
  }
};
_page4 = new WeakMap();
_actions7 = new WeakMap();
_continuation3 = new WeakMap();
__name(_Comments, "Comments");
var Comments = _Comments;

// dist/src/parser/youtube/Guide.js
var _page5;
var _Guide = class _Guide {
  constructor(data) {
    __privateAdd(this, _page5);
    __publicField(this, "contents");
    __privateSet(this, _page5, parser_exports.parseResponse(data));
    if (__privateGet(this, _page5).items)
      this.contents = __privateGet(this, _page5).items.array().as(GuideSection, GuideSubscriptionsSection);
  }
  get page() {
    return __privateGet(this, _page5);
  }
};
_page5 = new WeakMap();
__name(_Guide, "Guide");
var Guide = _Guide;

// dist/src/parser/youtube/History.js
var _History = class _History extends Feed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __publicField(this, "sections");
    __publicField(this, "feed_actions");
    this.sections = this.memo.getType(ItemSection);
    this.feed_actions = this.memo.getType(BrowseFeedActions)[0];
  }
  /**
   * Retrieves next batch of contents.
   */
  async getContinuation() {
    const response = await this.getContinuationData();
    if (!response)
      throw new Error("No continuation data found");
    return new _History(this.actions, response, true);
  }
  /**
   * Removes a video from watch history.
   */
  async removeVideo(video_id, pages_to_load = 1) {
    let pagesToLoad = pages_to_load;
    while (pagesToLoad > 0) {
      let feedbackToken;
      for (const section of this.sections) {
        for (const content of section.contents) {
          if (content.is(Video)) {
            if (content.video_id === video_id && content.menu) {
              feedbackToken = content.menu.top_level_buttons[0].as(Button).endpoint.payload.feedbackToken;
              break;
            }
          } else if (content.is(LockupView)) {
            if (content.content_id === video_id) {
              const listItems = content.metadata?.menu_button?.on_tap?.payload.panelLoadingStrategy.inlineContent.sheetViewModel.content.listViewModel.listItems;
              const listItem = listItems.find((video) => video.listItemViewModel?.title.content === "Remove from watch history");
              feedbackToken = listItem.listItemViewModel.rendererContext.commandContext.onTap.innertubeCommand.feedbackEndpoint.feedbackToken;
              break;
            }
          }
        }
        if (feedbackToken) {
          break;
        }
      }
      if (feedbackToken) {
        const body = { feedbackTokens: [feedbackToken] };
        const response = await this.actions.execute("/feedback", body);
        const data = response.data;
        if (!data.feedbackResponses[0].isProcessed) {
          throw new Error("Failed to remove video from watch history");
        }
        return true;
      }
      if (--pagesToLoad > 0) {
        try {
          Object.assign(this, await this.getContinuation());
        } catch {
          throw new Error("Unable to find video in watch history");
        }
      } else {
        throw new Error("Unable to find video in watch history");
      }
    }
    return false;
  }
};
__name(_History, "History");
var History = _History;

// dist/src/parser/youtube/HomeFeed.js
var _HomeFeed = class _HomeFeed extends FilterableFeed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __publicField(this, "contents");
    __publicField(this, "header");
    this.header = this.memo.getType(FeedTabbedHeader)[0];
    this.contents = this.memo.getType(RichGrid)[0] || this.page.on_response_received_actions?.[0];
  }
  /**
   * Applies given filter to the feed. Use {@link filters} to get available filters.
   * @param filter - Filter to apply.
   */
  async applyFilter(filter) {
    const feed = await super.getFilteredFeed(filter);
    return new _HomeFeed(this.actions, feed.page, true);
  }
  /**
   * Retrieves next batch of contents.
   */
  async getContinuation() {
    const feed = await super.getContinuation();
    feed.page.header = this.page.header;
    if (this.header)
      feed.page.header_memo?.set(this.header.type, [this.header]);
    return new _HomeFeed(this.actions, feed.page, true);
  }
};
__name(_HomeFeed, "HomeFeed");
var HomeFeed = _HomeFeed;

// dist/src/parser/youtube/HashtagFeed.js
var _HashtagFeed = class _HashtagFeed extends FilterableFeed {
  constructor(actions, response) {
    super(actions, response);
    __publicField(this, "header");
    __publicField(this, "contents");
    if (!this.page.contents_memo)
      throw new InnertubeError("Unexpected response", this.page);
    const tab = this.page.contents_memo.getType(Tab)[0];
    if (!tab.content)
      throw new InnertubeError("Content tab has no content", tab);
    if (this.page.header) {
      this.header = this.page.header.item().as(HashtagHeader, PageHeader);
    }
    this.contents = tab.content.as(RichGrid);
  }
  /**
   * Applies given filter and returns a new {@link HashtagFeed} object. Use {@link HashtagFeed.filters} to get available filters.
   * @param filter - Filter to apply.
   */
  async applyFilter(filter) {
    const response = await super.getFilteredFeed(filter);
    return new _HashtagFeed(this.actions, response.page);
  }
};
__name(_HashtagFeed, "HashtagFeed");
var HashtagFeed = _HashtagFeed;

// dist/src/parser/youtube/ItemMenu.js
var _page6, _actions8, _items;
var _ItemMenu = class _ItemMenu {
  constructor(data, actions) {
    __privateAdd(this, _page6);
    __privateAdd(this, _actions8);
    __privateAdd(this, _items);
    __privateSet(this, _page6, data);
    __privateSet(this, _actions8, actions);
    const menu = data?.live_chat_item_context_menu_supported_renderers;
    if (!menu || !menu.is(Menu))
      throw new InnertubeError('Response did not have a "live_chat_item_context_menu_supported_renderers" property. The call may have failed.');
    __privateSet(this, _items, menu.as(Menu).items);
  }
  async selectItem(item) {
    let endpoint;
    if (item instanceof Button) {
      if (!item.endpoint)
        throw new InnertubeError("Item does not have an endpoint.");
      endpoint = item.endpoint;
    } else {
      const button = __privateGet(this, _items).find((button2) => {
        if (!button2.is(MenuServiceItem)) {
          return false;
        }
        const menuServiceItem = button2.as(MenuServiceItem);
        return menuServiceItem.icon_type === item;
      });
      if (!button || !button.is(MenuServiceItem))
        throw new InnertubeError(`Button "${item}" not found.`);
      endpoint = button.endpoint;
    }
    if (!endpoint)
      throw new InnertubeError("Target button does not have an endpoint.");
    return await endpoint.call(__privateGet(this, _actions8), { parse: true });
  }
  items() {
    return __privateGet(this, _items);
  }
  page() {
    return __privateGet(this, _page6);
  }
};
_page6 = new WeakMap();
_actions8 = new WeakMap();
_items = new WeakMap();
__name(_ItemMenu, "ItemMenu");
var ItemMenu = _ItemMenu;

// dist/src/parser/youtube/Playlist.js
var _Playlist_instances, getStat_fn;
var _Playlist2 = class _Playlist2 extends Feed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __privateAdd(this, _Playlist_instances);
    __publicField(this, "info");
    __publicField(this, "menu");
    __publicField(this, "endpoint");
    __publicField(this, "messages");
    const header = this.memo.getType(PlaylistHeader)[0];
    const primary_info = this.memo.getType(PlaylistSidebarPrimaryInfo)[0];
    const secondary_info = this.memo.getType(PlaylistSidebarSecondaryInfo)[0];
    const video_list = this.memo.getType(PlaylistVideoList)[0];
    const alert = this.page.alerts?.firstOfType(Alert);
    if (alert && alert.alert_type === "ERROR")
      throw new InnertubeError(alert.text.toString(), alert);
    if (!primary_info && !secondary_info && Object.keys(this.page).length === 0)
      throw new InnertubeError("Got empty continuation response. This is likely the end of the playlist.");
    this.info = {
      ...this.page.metadata?.item().as(PlaylistMetadata),
      ...{
        subtitle: header ? header.subtitle : null,
        author: secondary_info?.owner?.as(VideoOwner).author ?? header?.author,
        thumbnails: primary_info?.thumbnail_renderer?.as(PlaylistVideoThumbnail, PlaylistCustomThumbnail).thumbnail,
        total_items: __privateMethod(this, _Playlist_instances, getStat_fn).call(this, 0, primary_info),
        views: __privateMethod(this, _Playlist_instances, getStat_fn).call(this, 1, primary_info),
        last_updated: __privateMethod(this, _Playlist_instances, getStat_fn).call(this, 2, primary_info),
        can_share: header?.can_share,
        can_delete: header?.can_delete,
        can_reorder: video_list?.can_reorder,
        is_editable: video_list?.is_editable,
        privacy: header?.privacy
      }
    };
    this.menu = primary_info?.menu;
    this.endpoint = primary_info?.endpoint;
    this.messages = this.memo.getType(Message);
  }
  get items() {
    return observe(this.videos.as(PlaylistVideo, ReelItem, ShortsLockupView).filter((video) => video.style !== "PLAYLIST_VIDEO_RENDERER_STYLE_RECOMMENDED_VIDEO"));
  }
  get has_continuation() {
    const section_list = this.memo.getType(SectionList)[0];
    if (!section_list)
      return super.has_continuation;
    return !!this.memo.getType(ContinuationItem).find((node) => !section_list.contents.includes(node));
  }
  async getContinuationData() {
    const section_list = this.memo.getType(SectionList)[0];
    if (!section_list)
      return await super.getContinuationData();
    const playlist_contents_continuation = this.memo.getType(ContinuationItem).find((node) => !section_list.contents.includes(node));
    if (!playlist_contents_continuation)
      throw new InnertubeError("There are no continuations.");
    return await playlist_contents_continuation.endpoint.call(this.actions, { parse: true });
  }
  async getContinuation() {
    const page = await this.getContinuationData();
    if (!page)
      throw new InnertubeError("Could not get continuation data");
    return new _Playlist2(this.actions, page, true);
  }
};
_Playlist_instances = new WeakSet();
getStat_fn = /* @__PURE__ */ __name(function(index, primary_info) {
  if (!primary_info || !primary_info.stats)
    return "N/A";
  return primary_info.stats[index]?.toString() || "N/A";
}, "#getStat");
__name(_Playlist2, "Playlist");
var Playlist2 = _Playlist2;

// dist/src/parser/youtube/Library.js
var _Library_instances, getAll_fn;
var _Library = class _Library extends Feed {
  constructor(actions, data) {
    super(actions, data);
    __privateAdd(this, _Library_instances);
    __publicField(this, "header");
    __publicField(this, "sections");
    if (!this.page.contents_memo)
      throw new InnertubeError("Page contents not found");
    this.header = this.memo.getType(PageHeader)[0];
    const shelves = this.page.contents_memo.getType(Shelf);
    this.sections = shelves.map((shelf) => ({
      type: shelf.icon_type,
      title: shelf.title,
      contents: shelf.content?.key("items").array() || [],
      getAll: /* @__PURE__ */ __name(() => __privateMethod(this, _Library_instances, getAll_fn).call(this, shelf), "getAll")
    }));
  }
  get history() {
    return this.sections.find((section) => section.type === "WATCH_HISTORY");
  }
  get watch_later() {
    return this.sections.find((section) => section.type === "WATCH_LATER");
  }
  get liked_videos() {
    return this.sections.find((section) => section.type === "LIKE");
  }
  get playlists_section() {
    return this.sections.find((section) => section.type === "PLAYLISTS");
  }
  get clips() {
    return this.sections.find((section) => section.type === "CONTENT_CUT");
  }
};
_Library_instances = new WeakSet();
getAll_fn = /* @__PURE__ */ __name(async function(shelf) {
  if (!shelf.menu?.as(Menu).top_level_buttons)
    throw new InnertubeError(`The ${shelf.title.text} shelf doesn't have more items`);
  const button = shelf.menu.as(Menu).top_level_buttons.firstOfType(Button);
  if (!button)
    throw new InnertubeError("Did not find target button.");
  const page = await button.as(Button).endpoint.call(this.actions, { parse: true });
  switch (shelf.icon_type) {
    case "LIKE":
    case "WATCH_LATER":
      return new Playlist2(this.actions, page, true);
    case "WATCH_HISTORY":
      return new History(this.actions, page, true);
    case "CONTENT_CUT":
      return new Feed(this.actions, page, true);
    default:
      throw new InnertubeError("Target shelf not implemented.");
  }
}, "#getAll");
__name(_Library, "Library");
var Library = _Library;

// dist/src/parser/youtube/SmoothedQueue.js
function flattenQueue(queue) {
  const nodes = [];
  for (const group of queue) {
    if (Array.isArray(group)) {
      for (const node of group) {
        nodes.push(node);
      }
    } else {
      nodes.push(group);
    }
  }
  return nodes;
}
__name(flattenQueue, "flattenQueue");
var _DelayQueue = class _DelayQueue {
  constructor() {
    __publicField(this, "front");
    __publicField(this, "back");
    this.front = [];
    this.back = [];
  }
  isEmpty() {
    return !this.front.length && !this.back.length;
  }
  clear() {
    this.front = [];
    this.back = [];
  }
  getValues() {
    return this.front.concat(this.back.reverse());
  }
};
__name(_DelayQueue, "DelayQueue");
var DelayQueue = _DelayQueue;
var _last_update_time, _estimated_update_interval, _callback, _action_queue, _next_update_id, _poll_response_delay_queue;
var _SmoothedQueue = class _SmoothedQueue {
  constructor() {
    __privateAdd(this, _last_update_time);
    __privateAdd(this, _estimated_update_interval);
    __privateAdd(this, _callback);
    __privateAdd(this, _action_queue);
    __privateAdd(this, _next_update_id);
    __privateAdd(this, _poll_response_delay_queue);
    __privateSet(this, _last_update_time, null);
    __privateSet(this, _estimated_update_interval, null);
    __privateSet(this, _callback, null);
    __privateSet(this, _action_queue, []);
    __privateSet(this, _next_update_id, null);
    __privateSet(this, _poll_response_delay_queue, new DelayQueue());
  }
  enqueueActionGroup(group) {
    if (__privateGet(this, _last_update_time) !== null) {
      const delay = Date.now() - __privateGet(this, _last_update_time);
      __privateGet(this, _poll_response_delay_queue).back.push(delay);
      if (5 < __privateGet(this, _poll_response_delay_queue).front.length + __privateGet(this, _poll_response_delay_queue).back.length) {
        if (!__privateGet(this, _poll_response_delay_queue).front.length) {
          __privateGet(this, _poll_response_delay_queue).front = __privateGet(this, _poll_response_delay_queue).back;
          __privateGet(this, _poll_response_delay_queue).front.reverse();
          __privateGet(this, _poll_response_delay_queue).back = [];
        }
        __privateGet(this, _poll_response_delay_queue).front.pop();
      }
      __privateSet(this, _estimated_update_interval, Math.max(...__privateGet(this, _poll_response_delay_queue).getValues()));
    }
    __privateSet(this, _last_update_time, Date.now());
    __privateGet(this, _action_queue).push(group);
    if (__privateGet(this, _next_update_id) === null) {
      __privateSet(this, _next_update_id, setTimeout(this.emitSmoothedActions.bind(this)));
    }
  }
  emitSmoothedActions() {
    __privateSet(this, _next_update_id, null);
    if (__privateGet(this, _action_queue).length) {
      let delay = 1e4;
      if (__privateGet(this, _estimated_update_interval) !== null && __privateGet(this, _last_update_time) !== null) {
        delay = __privateGet(this, _estimated_update_interval) - Date.now() + __privateGet(this, _last_update_time);
      }
      delay = __privateGet(this, _action_queue).length < delay / 80 ? 1 : Math.ceil(__privateGet(this, _action_queue).length / (delay / 80));
      const actions = flattenQueue(__privateGet(this, _action_queue).splice(0, delay));
      if (__privateGet(this, _callback)) {
        __privateGet(this, _callback).call(this, actions);
      }
      if (__privateGet(this, _action_queue) !== null) {
        if (delay == 1) {
          delay = __privateGet(this, _estimated_update_interval) / __privateGet(this, _action_queue).length;
          delay *= Math.random() + 0.5;
          delay = Math.min(1e3, delay);
          delay = Math.max(80, delay);
        } else {
          delay = 80;
        }
        __privateSet(this, _next_update_id, setTimeout(this.emitSmoothedActions.bind(this), delay));
      }
    }
  }
  clear() {
    if (__privateGet(this, _next_update_id) !== null) {
      clearTimeout(__privateGet(this, _next_update_id));
      __privateSet(this, _next_update_id, null);
    }
    __privateSet(this, _action_queue, []);
  }
  set callback(cb) {
    __privateSet(this, _callback, cb);
  }
  get callback() {
    return __privateGet(this, _callback);
  }
  get action_queue() {
    return __privateGet(this, _action_queue);
  }
  get estimated_update_interval() {
    return __privateGet(this, _estimated_update_interval);
  }
  get last_update_time() {
    return __privateGet(this, _last_update_time);
  }
  get next_update_id() {
    return __privateGet(this, _next_update_id);
  }
  get poll_response_delay_queue() {
    return __privateGet(this, _poll_response_delay_queue);
  }
};
_last_update_time = new WeakMap();
_estimated_update_interval = new WeakMap();
_callback = new WeakMap();
_action_queue = new WeakMap();
_next_update_id = new WeakMap();
_poll_response_delay_queue = new WeakMap();
__name(_SmoothedQueue, "SmoothedQueue");
var SmoothedQueue = _SmoothedQueue;

// dist/src/parser/youtube/LiveChat.js
var _actions9, _video_id, _channel_id, _continuation4, _mcontinuation, _retry_count, _LiveChat_instances, pollLivechat_fn, emitSmoothedActions_fn, pollMetadata_fn, wait_fn;
var _LiveChat2 = class _LiveChat2 extends EventEmitterLike {
  constructor(video_info) {
    super();
    __privateAdd(this, _LiveChat_instances);
    __privateAdd(this, _actions9);
    __privateAdd(this, _video_id);
    __privateAdd(this, _channel_id);
    __privateAdd(this, _continuation4);
    __privateAdd(this, _mcontinuation);
    __privateAdd(this, _retry_count, 0);
    __publicField(this, "smoothed_queue");
    __publicField(this, "initial_info");
    __publicField(this, "metadata");
    __publicField(this, "running", false);
    __publicField(this, "is_replay", false);
    __privateSet(this, _video_id, video_info.basic_info.id);
    __privateSet(this, _channel_id, video_info.basic_info.channel_id);
    __privateSet(this, _actions9, video_info.actions);
    __privateSet(this, _continuation4, video_info.livechat?.continuation);
    this.is_replay = video_info.livechat?.is_replay || false;
    this.smoothed_queue = new SmoothedQueue();
    this.smoothed_queue.callback = async (actions) => {
      if (!actions.length) {
        await __privateMethod(this, _LiveChat_instances, wait_fn).call(this, 2e3);
      } else if (actions.length < 10) {
        await __privateMethod(this, _LiveChat_instances, emitSmoothedActions_fn).call(this, actions);
      } else if (this.is_replay) {
        __privateMethod(this, _LiveChat_instances, emitSmoothedActions_fn).call(this, actions);
        await __privateMethod(this, _LiveChat_instances, wait_fn).call(this, 2e3);
      } else {
        __privateMethod(this, _LiveChat_instances, emitSmoothedActions_fn).call(this, actions);
      }
      if (this.running) {
        __privateMethod(this, _LiveChat_instances, pollLivechat_fn).call(this);
      }
    };
  }
  on(type, listener) {
    super.on(type, listener);
  }
  once(type, listener) {
    super.once(type, listener);
  }
  start() {
    if (!this.running) {
      this.running = true;
      __privateMethod(this, _LiveChat_instances, pollLivechat_fn).call(this);
      __privateMethod(this, _LiveChat_instances, pollMetadata_fn).call(this);
    }
  }
  stop() {
    this.smoothed_queue.clear();
    this.running = false;
  }
  /**
   * Sends a message.
   * @param text - Text to send.
   */
  async sendMessage(text) {
    const writer = LiveMessageParams.encode({
      params: {
        ids: {
          videoId: __privateGet(this, _video_id),
          channelId: __privateGet(this, _channel_id)
        }
      },
      number0: 1,
      number1: 4
    });
    const params = btoa(encodeURIComponent(u8ToBase64(writer.finish())));
    const response = await __privateGet(this, _actions9).execute("/live_chat/send_message", {
      richMessage: { textSegments: [{ text }] },
      clientMessageId: Platform.shim.uuidv4(),
      client: "WEB",
      parse: true,
      params
    });
    if (!response.actions)
      throw new InnertubeError("Unexpected response from send_message", response);
    return response.actions.array().as(AddChatItemAction, RunAttestationCommand);
  }
  /**
   * Applies given filter to the live chat.
   * @param filter - Filter to apply.
   */
  applyFilter(filter) {
    if (!this.initial_info)
      throw new InnertubeError("Cannot apply filter before initial info is retrieved.");
    const menu_items = this.initial_info?.header?.view_selector?.sub_menu_items;
    if (filter === "TOP_CHAT") {
      if (menu_items?.at(0)?.selected)
        return;
      __privateSet(this, _continuation4, menu_items?.at(0)?.continuation);
    } else {
      if (menu_items?.at(1)?.selected)
        return;
      __privateSet(this, _continuation4, menu_items?.at(1)?.continuation);
    }
  }
  /**
   * Retrieves given chat item's menu.
   */
  async getItemMenu(item) {
    if (!item.hasKey("menu_endpoint") || !item.key("menu_endpoint").isInstanceof(NavigationEndpoint))
      throw new InnertubeError("This item does not have a menu.", item);
    const response = await item.key("menu_endpoint").instanceof(NavigationEndpoint).call(__privateGet(this, _actions9), { parse: true });
    if (!response)
      throw new InnertubeError("Could not retrieve item menu.", item);
    return new ItemMenu(response, __privateGet(this, _actions9));
  }
  /**
   * Equivalent to "clicking" a button.
   */
  async selectButton(button) {
    return await button.endpoint.call(__privateGet(this, _actions9), { parse: true });
  }
};
_actions9 = new WeakMap();
_video_id = new WeakMap();
_channel_id = new WeakMap();
_continuation4 = new WeakMap();
_mcontinuation = new WeakMap();
_retry_count = new WeakMap();
_LiveChat_instances = new WeakSet();
pollLivechat_fn = /* @__PURE__ */ __name(function() {
  (async () => {
    try {
      const response = await __privateGet(this, _actions9).execute(this.is_replay ? "live_chat/get_live_chat_replay" : "live_chat/get_live_chat", { continuation: __privateGet(this, _continuation4), parse: true });
      const contents = response.continuation_contents;
      if (!contents) {
        this.emit("error", new InnertubeError("Unexpected live chat incremental continuation response", response));
        this.emit("end");
        this.stop();
      }
      if (!(contents instanceof LiveChatContinuation)) {
        this.stop();
        this.emit("end");
        return;
      }
      __privateSet(this, _continuation4, contents.continuation.token);
      if (contents.header) {
        this.initial_info = contents;
        this.emit("start", contents);
        if (this.running)
          __privateMethod(this, _LiveChat_instances, pollLivechat_fn).call(this);
      } else {
        this.smoothed_queue.enqueueActionGroup(contents.actions);
      }
      __privateSet(this, _retry_count, 0);
    } catch (err) {
      this.emit("error", err);
      if (__privateWrapper(this, _retry_count)._++ < 10) {
        await __privateMethod(this, _LiveChat_instances, wait_fn).call(this, 2e3);
        __privateMethod(this, _LiveChat_instances, pollLivechat_fn).call(this);
      } else {
        this.emit("error", new InnertubeError("Reached retry limit for incremental continuation requests", err));
        this.emit("end");
        this.stop();
      }
    }
  })();
}, "#pollLivechat");
emitSmoothedActions_fn = /* @__PURE__ */ __name(async function(action_queue) {
  const base = 1e4;
  let delay = action_queue.length < base / 80 ? 1 : Math.ceil(action_queue.length / (base / 80));
  const emit_delay_ms = delay == 1 ? (delay = base / action_queue.length, delay *= Math.random() + 0.5, delay = Math.min(1e3, delay), delay = Math.max(80, delay)) : delay = 80;
  for (const action of action_queue) {
    await __privateMethod(this, _LiveChat_instances, wait_fn).call(this, emit_delay_ms);
    this.emit("chat-update", action);
  }
}, "#emitSmoothedActions");
pollMetadata_fn = /* @__PURE__ */ __name(function() {
  (async () => {
    try {
      const payload = { videoId: __privateGet(this, _video_id) };
      if (__privateGet(this, _mcontinuation)) {
        payload.continuation = __privateGet(this, _mcontinuation);
      }
      const response = await __privateGet(this, _actions9).execute("/updated_metadata", payload);
      const data = parser_exports.parseResponse(response.data);
      __privateSet(this, _mcontinuation, data.continuation?.token);
      this.metadata = {
        title: data.actions?.array().firstOfType(UpdateTitleAction) || this.metadata?.title,
        description: data.actions?.array().firstOfType(UpdateDescriptionAction) || this.metadata?.description,
        views: data.actions?.array().firstOfType(UpdateViewershipAction) || this.metadata?.views,
        likes: data.actions?.array().firstOfType(UpdateToggleButtonTextAction) || this.metadata?.likes,
        date: data.actions?.array().firstOfType(UpdateDateTextAction) || this.metadata?.date
      };
      this.emit("metadata-update", this.metadata);
      await __privateMethod(this, _LiveChat_instances, wait_fn).call(this, 5e3);
      if (this.running)
        __privateMethod(this, _LiveChat_instances, pollMetadata_fn).call(this);
    } catch {
      await __privateMethod(this, _LiveChat_instances, wait_fn).call(this, 2e3);
      if (this.running)
        __privateMethod(this, _LiveChat_instances, pollMetadata_fn).call(this);
    }
  })();
}, "#pollMetadata");
wait_fn = /* @__PURE__ */ __name(async function(ms) {
  return new Promise((resolve) => setTimeout(() => resolve(), ms));
}, "#wait");
__name(_LiveChat2, "LiveChat");
var LiveChat2 = _LiveChat2;

// dist/src/parser/youtube/NotificationsMenu.js
var _page7, _actions10;
var _NotificationsMenu = class _NotificationsMenu {
  constructor(actions, response) {
    __privateAdd(this, _page7);
    __privateAdd(this, _actions10);
    __publicField(this, "header");
    __publicField(this, "contents");
    __privateSet(this, _actions10, actions);
    __privateSet(this, _page7, parser_exports.parseResponse(response.data));
    if (!__privateGet(this, _page7).actions_memo)
      throw new InnertubeError("Page actions not found");
    this.header = __privateGet(this, _page7).actions_memo.getType(SimpleMenuHeader)[0];
    this.contents = __privateGet(this, _page7).actions_memo.getType(Notification);
  }
  async getContinuation() {
    const continuation = __privateGet(this, _page7).actions_memo?.getType(ContinuationItem)[0];
    if (!continuation)
      throw new InnertubeError("Continuation not found");
    const response = await continuation.endpoint.call(__privateGet(this, _actions10), { parse: false });
    return new _NotificationsMenu(__privateGet(this, _actions10), response);
  }
  get page() {
    return __privateGet(this, _page7);
  }
};
_page7 = new WeakMap();
_actions10 = new WeakMap();
__name(_NotificationsMenu, "NotificationsMenu");
var NotificationsMenu = _NotificationsMenu;

// dist/src/parser/youtube/Search.js
var _Search = class _Search extends Feed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __publicField(this, "header");
    __publicField(this, "results");
    __publicField(this, "refinements");
    __publicField(this, "estimated_results");
    __publicField(this, "sub_menu");
    __publicField(this, "watch_card");
    __publicField(this, "refinement_cards");
    const contents = this.page.contents_memo?.getType(SectionList)[0].contents || this.page.on_response_received_commands?.[0].as(AppendContinuationItemsAction, ReloadContinuationItemsCommand).contents;
    if (!contents)
      throw new InnertubeError("No contents found in search response");
    if (this.page.header)
      this.header = this.page.header.item().as(SearchHeader);
    this.results = observe(contents.filterType(ItemSection).flatMap((section) => section.contents));
    this.refinements = this.page.refinements || [];
    this.estimated_results = this.page.estimated_results || 0;
    if (this.page.contents_memo) {
      this.sub_menu = this.page.contents_memo.getType(SearchSubMenu)[0];
      this.watch_card = this.page.contents_memo.getType(UniversalWatchCard)[0];
    }
    this.refinement_cards = this.results?.firstOfType(HorizontalCardList);
  }
  /**
   * Applies given refinement card and returns a new {@link Search} object. Use {@link refinement_card_queries} to get a list of available refinement cards.
   */
  async selectRefinementCard(card) {
    let target_card;
    if (typeof card === "string") {
      if (!this.refinement_cards)
        throw new InnertubeError("No refinement cards found.");
      target_card = this.refinement_cards?.cards.find((refinement_card) => {
        return refinement_card.is(SearchRefinementCard) && refinement_card.query === card;
      });
      if (!target_card)
        throw new InnertubeError(`Refinement card "${card}" not found`, { available_cards: this.refinement_card_queries });
    } else if (card.type === "SearchRefinementCard") {
      target_card = card;
    } else {
      throw new InnertubeError("Invalid refinement card!");
    }
    const page = await target_card.endpoint.call(this.actions, { parse: true });
    return new _Search(this.actions, page, true);
  }
  /**
   * Returns a list of refinement card queries.
   */
  get refinement_card_queries() {
    return this.refinement_cards?.cards.as(SearchRefinementCard).map((card) => card.query) || [];
  }
  /**
   * Retrieves next batch of search results.
   */
  async getContinuation() {
    const response = await this.getContinuationData();
    if (!response)
      throw new InnertubeError("Could not get continuation data");
    return new _Search(this.actions, response, true);
  }
};
__name(_Search, "Search");
var Search = _Search;

// dist/src/parser/youtube/Settings.js
var _page8, _actions11;
var _Settings = class _Settings {
  constructor(actions, response) {
    __privateAdd(this, _page8);
    __privateAdd(this, _actions11);
    __publicField(this, "sidebar");
    __publicField(this, "introduction");
    __publicField(this, "sections");
    __privateSet(this, _actions11, actions);
    __privateSet(this, _page8, parser_exports.parseResponse(response.data));
    this.sidebar = __privateGet(this, _page8).sidebar?.as(SettingsSidebar);
    if (!__privateGet(this, _page8).contents)
      throw new InnertubeError("Page contents not found");
    const tab = __privateGet(this, _page8).contents.item().as(TwoColumnBrowseResults).tabs.find((tab2) => tab2.selected);
    if (!tab)
      throw new InnertubeError("Target tab not found");
    const contents = tab.content?.as(SectionList).contents.as(ItemSection);
    this.introduction = contents?.shift()?.contents?.firstOfType(PageIntroduction);
    this.sections = contents?.map((el) => ({
      title: el.header?.is(CommentsHeader, ItemSectionHeader, ItemSectionTabbedHeader) ? el.header.title.toString() : null,
      contents: el.contents
    }));
  }
  /**
   * Selects an item from the sidebar menu. Use {@link sidebar_items} to see available items.
   */
  async selectSidebarItem(target_item) {
    if (!this.sidebar)
      throw new InnertubeError("Sidebar not available");
    let item;
    if (typeof target_item === "string") {
      item = this.sidebar.items.find((link) => link.title === target_item);
      if (!item)
        throw new InnertubeError(`Item "${target_item}" not found`, { available_items: this.sidebar_items });
    } else if (target_item?.is(CompactLink)) {
      item = target_item;
    } else {
      throw new InnertubeError("Invalid item", { target_item });
    }
    const response = await item.endpoint.call(__privateGet(this, _actions11), { parse: false });
    return new _Settings(__privateGet(this, _actions11), response);
  }
  /**
   * Finds a setting by name and returns it. Use {@link setting_options} to see available options.
   */
  getSettingOption(name) {
    if (!this.sections)
      throw new InnertubeError("Sections not available");
    for (const section of this.sections) {
      if (!section.contents)
        continue;
      for (const el of section.contents) {
        const options = el.as(SettingsOptions).options;
        if (options) {
          for (const option of options) {
            if (option.is(SettingsSwitch) && option.title?.toString() === name)
              return option;
          }
        }
      }
    }
    throw new InnertubeError(`Option "${name}" not found`, { available_options: this.setting_options });
  }
  /**
   * Returns settings available in the page.
   */
  get setting_options() {
    if (!this.sections)
      throw new InnertubeError("Sections not available");
    let options = [];
    for (const section of this.sections) {
      if (!section.contents)
        continue;
      for (const el of section.contents) {
        if (el.as(SettingsOptions).options)
          options = options.concat(el.as(SettingsOptions).options);
      }
    }
    return options.map((opt) => opt.title?.toString()).filter((el) => el);
  }
  /**
   * Returns options available in the sidebar.
   */
  get sidebar_items() {
    if (!this.sidebar)
      throw new InnertubeError("Sidebar not available");
    return this.sidebar.items.map((item) => item.title.toString());
  }
  get page() {
    return __privateGet(this, _page8);
  }
};
_page8 = new WeakMap();
_actions11 = new WeakMap();
__name(_Settings, "Settings");
var Settings = _Settings;

// dist/src/parser/youtube/VideoInfo.js
var _watch_next_continuation;
var _VideoInfo = class _VideoInfo extends MediaInfo {
  constructor(data, actions, cpn) {
    super(data, actions, cpn);
    __publicField(this, "primary_info");
    __publicField(this, "secondary_info");
    __publicField(this, "playlist");
    __publicField(this, "game_info");
    __publicField(this, "merchandise");
    __publicField(this, "related_chip_cloud");
    __publicField(this, "watch_next_feed");
    __publicField(this, "player_overlays");
    __publicField(this, "comments_entry_point_header");
    __publicField(this, "livechat");
    __publicField(this, "autoplay");
    __publicField(this, "heat_map");
    __privateAdd(this, _watch_next_continuation);
    const [info2, next] = this.page;
    if (this.streaming_data) {
      const default_audio_track = this.streaming_data.adaptive_formats.find((format) => format.audio_track?.audio_is_default);
      if (default_audio_track) {
        this.streaming_data.formats.forEach((format) => format.language = default_audio_track.language);
      } else if (this.captions?.caption_tracks && this.captions?.caption_tracks.length > 0) {
        const auto_generated_caption_track = this.captions.caption_tracks.find((caption) => caption.kind === "asr");
        const language_code = auto_generated_caption_track?.language_code;
        this.streaming_data.adaptive_formats.forEach((format) => {
          if (format.has_audio) {
            format.language = language_code;
          }
        });
        this.streaming_data.formats.forEach((format) => format.language = language_code);
      }
    }
    const two_col = next?.contents?.item().as(TwoColumnWatchNextResults);
    const results = two_col?.results;
    const secondary_results = two_col?.secondary_results;
    if (results && secondary_results) {
      if (info2.microformat?.is(PlayerMicroformat) && info2.microformat?.category === "Gaming") {
        const row = results.firstOfType(VideoSecondaryInfo)?.metadata?.rows?.firstOfType(RichMetadataRow);
        if (row?.is(RichMetadataRow)) {
          this.game_info = {
            title: row?.contents?.firstOfType(RichMetadata)?.title,
            release_year: row?.contents?.firstOfType(RichMetadata)?.subtitle
          };
        }
      }
      this.primary_info = results.firstOfType(VideoPrimaryInfo);
      this.secondary_info = results.firstOfType(VideoSecondaryInfo);
      this.merchandise = results.firstOfType(MerchandiseShelf);
      this.related_chip_cloud = secondary_results.firstOfType(RelatedChipCloud)?.content.as(ChipCloud);
      if (two_col?.playlist) {
        this.playlist = two_col.playlist;
      }
      this.watch_next_feed = secondary_results.firstOfType(ItemSection)?.contents || secondary_results;
      if (this.watch_next_feed && Array.isArray(this.watch_next_feed) && this.watch_next_feed.at(-1)?.is(ContinuationItem))
        __privateSet(this, _watch_next_continuation, this.watch_next_feed.pop()?.as(ContinuationItem));
      this.player_overlays = next?.player_overlays?.item().as(PlayerOverlay);
      if (two_col?.autoplay) {
        this.autoplay = two_col.autoplay;
      }
      const segmented_like_dislike_button = this.primary_info?.menu?.top_level_buttons.firstOfType(SegmentedLikeDislikeButton);
      if (segmented_like_dislike_button?.like_button?.is(ToggleButton) && segmented_like_dislike_button?.dislike_button?.is(ToggleButton)) {
        this.basic_info.like_count = segmented_like_dislike_button?.like_button?.like_count;
        this.basic_info.is_liked = segmented_like_dislike_button?.like_button?.is_toggled;
        this.basic_info.is_disliked = segmented_like_dislike_button?.dislike_button?.is_toggled;
      }
      const segmented_like_dislike_button_view = this.primary_info?.menu?.top_level_buttons.firstOfType(SegmentedLikeDislikeButtonView);
      if (segmented_like_dislike_button_view) {
        this.basic_info.like_count = segmented_like_dislike_button_view.like_count;
        if (segmented_like_dislike_button_view.like_button) {
          const like_status = segmented_like_dislike_button_view.like_button.like_status_entity.like_status;
          this.basic_info.is_liked = like_status === "LIKE";
          this.basic_info.is_disliked = like_status === "DISLIKE";
        }
      }
      const comments_entry_point = results.find((node) => {
        return node.is(ItemSection) && node.target_id === "comments-entry-point";
      });
      this.comments_entry_point_header = comments_entry_point?.contents?.firstOfType(CommentsEntryPointHeader);
      this.livechat = next?.contents_memo?.getType(LiveChat)[0];
      const macro_markers_list_for_heatmap = this.page[1]?.contents_memo?.getType(MacroMarkersListEntity);
      let calculated_heat_map = null;
      if (macro_markers_list_for_heatmap) {
        const heatmap_markers_entity = macro_markers_list_for_heatmap.find((markers) => markers.isHeatmap());
        if (heatmap_markers_entity) {
          try {
            calculated_heat_map = heatmap_markers_entity.toHeatmap();
          } catch {
          }
        }
      }
      this.heat_map = calculated_heat_map;
    }
  }
  /**
   * Applies given filter to the watch next feed. Use {@link filters} to get available filters.
   * @param target_filter - Filter to apply.
   */
  async selectFilter(target_filter) {
    if (!this.related_chip_cloud)
      throw new InnertubeError("Chip cloud not found, cannot apply filter");
    let cloud_chip;
    if (typeof target_filter === "string") {
      const filter = this.related_chip_cloud?.chips?.find((chip) => chip.text === target_filter);
      if (!filter)
        throw new InnertubeError("Invalid filter", { available_filters: this.filters });
      cloud_chip = filter;
    } else if (target_filter?.is(ChipCloudChip)) {
      cloud_chip = target_filter;
    } else {
      throw new InnertubeError("Invalid cloud chip", target_filter);
    }
    if (cloud_chip.is_selected)
      return this;
    const response = await cloud_chip.endpoint?.call(this.actions, { parse: true });
    const data = response?.on_response_received_endpoints?.find((endpoint) => {
      return endpoint.is(ReloadContinuationItemsCommand) && endpoint.target_id === "watch-next-feed";
    });
    this.watch_next_feed = data?.contents;
    return this;
  }
  /**
   * Adds video to the watch history.
   */
  async addToWatchHistory() {
    return super.addToWatchHistory();
  }
  /**
   * Updates watch time for the video.
   */
  async updateWatchTime(startTime) {
    return super.updateWatchTime(startTime);
  }
  /**
   * Retrieves watch next feed continuation.
   */
  async getWatchNextContinuation() {
    if (!__privateGet(this, _watch_next_continuation))
      throw new InnertubeError("Watch next feed continuation not found");
    const response = await __privateGet(this, _watch_next_continuation)?.endpoint.call(this.actions, { parse: true });
    const data = response?.on_response_received_endpoints?.firstOfType(AppendContinuationItemsAction);
    if (!data)
      throw new InnertubeError("AppendContinuationItemsAction not found");
    this.watch_next_feed = data?.contents;
    if (this.watch_next_feed?.at(-1)?.is(ContinuationItem)) {
      __privateSet(this, _watch_next_continuation, this.watch_next_feed.pop()?.as(ContinuationItem));
    } else {
      __privateSet(this, _watch_next_continuation, void 0);
    }
    return this;
  }
  /**
   * Likes the video.
   */
  async like() {
    const segmented_like_dislike_button_view = this.primary_info?.menu?.top_level_buttons.firstOfType(SegmentedLikeDislikeButtonView);
    if (segmented_like_dislike_button_view) {
      const button2 = segmented_like_dislike_button_view?.like_button?.toggle_button;
      if (!button2 || !button2.default_button || !segmented_like_dislike_button_view.like_button)
        throw new InnertubeError("Like button not found", { video_id: this.basic_info.id });
      const like_status = segmented_like_dislike_button_view.like_button.like_status_entity.like_status;
      if (like_status === "LIKE")
        throw new InnertubeError("This video is already liked", { video_id: this.basic_info.id });
      if (!button2.default_button.on_tap)
        throw new InnertubeError("onTap command not found", { video_id: this.basic_info.id });
      const endpoint = new NavigationEndpoint(button2.default_button.on_tap.payload.commands.find((cmd) => cmd.innertubeCommand));
      return await endpoint.call(this.actions);
    }
    const segmented_like_dislike_button = this.primary_info?.menu?.top_level_buttons.firstOfType(SegmentedLikeDislikeButton);
    const button = segmented_like_dislike_button?.like_button;
    if (!button)
      throw new InnertubeError("Like button not found", { video_id: this.basic_info.id });
    if (!button.is(ToggleButton))
      throw new InnertubeError("Like button is not a toggle button. This action is likely disabled for this video.", { video_id: this.basic_info.id });
    if (button.is_toggled)
      throw new InnertubeError("This video is already liked", { video_id: this.basic_info.id });
    return await button.endpoint.call(this.actions);
  }
  /**
   * Dislikes the video.
   */
  async dislike() {
    const segmented_like_dislike_button_view = this.primary_info?.menu?.top_level_buttons.firstOfType(SegmentedLikeDislikeButtonView);
    if (segmented_like_dislike_button_view) {
      const button2 = segmented_like_dislike_button_view?.dislike_button?.toggle_button;
      if (!button2 || !button2.default_button || !segmented_like_dislike_button_view.dislike_button || !segmented_like_dislike_button_view.like_button)
        throw new InnertubeError("Dislike button not found", { video_id: this.basic_info.id });
      const like_status = segmented_like_dislike_button_view.like_button.like_status_entity.like_status;
      if (like_status === "DISLIKE")
        throw new InnertubeError("This video is already disliked", { video_id: this.basic_info.id });
      if (!button2.default_button.on_tap)
        throw new InnertubeError("onTap command not found", { video_id: this.basic_info.id });
      const endpoint = new NavigationEndpoint(button2.default_button.on_tap.payload.commands.find((cmd) => cmd.innertubeCommand));
      return await endpoint.call(this.actions);
    }
    const segmented_like_dislike_button = this.primary_info?.menu?.top_level_buttons.firstOfType(SegmentedLikeDislikeButton);
    const button = segmented_like_dislike_button?.dislike_button;
    if (!button)
      throw new InnertubeError("Dislike button not found", { video_id: this.basic_info.id });
    if (!button.is(ToggleButton))
      throw new InnertubeError("Dislike button is not a toggle button. This action is likely disabled for this video.", { video_id: this.basic_info.id });
    if (button.is_toggled)
      throw new InnertubeError("This video is already disliked", { video_id: this.basic_info.id });
    return await button.endpoint.call(this.actions);
  }
  /**
   * Removes like/dislike.
   */
  async removeRating() {
    let button;
    const segmented_like_dislike_button_view = this.primary_info?.menu?.top_level_buttons.firstOfType(SegmentedLikeDislikeButtonView);
    if (segmented_like_dislike_button_view) {
      const toggle_button = segmented_like_dislike_button_view?.like_button?.toggle_button;
      if (!toggle_button || !toggle_button.default_button || !segmented_like_dislike_button_view.like_button)
        throw new InnertubeError("Like button not found", { video_id: this.basic_info.id });
      const like_status = segmented_like_dislike_button_view.like_button.like_status_entity.like_status;
      if (like_status === "LIKE") {
        button = segmented_like_dislike_button_view?.like_button?.toggle_button;
      } else if (like_status === "DISLIKE") {
        button = segmented_like_dislike_button_view?.dislike_button?.toggle_button;
      } else {
        throw new InnertubeError("This video is not liked/disliked", { video_id: this.basic_info.id });
      }
      if (!button || !button.toggled_button)
        throw new InnertubeError("Like/Dislike button not found", { video_id: this.basic_info.id });
      if (!button.toggled_button.on_tap)
        throw new InnertubeError("onTap command not found", { video_id: this.basic_info.id });
      const endpoint = new NavigationEndpoint(button.toggled_button.on_tap.payload.commands.find((cmd) => cmd.innertubeCommand));
      return await endpoint.call(this.actions);
    }
    const segmented_like_dislike_button = this.primary_info?.menu?.top_level_buttons.firstOfType(SegmentedLikeDislikeButton);
    const like_button = segmented_like_dislike_button?.like_button;
    const dislike_button = segmented_like_dislike_button?.dislike_button;
    if (!like_button?.is(ToggleButton) || !dislike_button?.is(ToggleButton))
      throw new InnertubeError("Like/Dislike button is not a toggle button. This action is likely disabled for this video.", { video_id: this.basic_info.id });
    if (like_button?.is_toggled) {
      button = like_button;
    } else if (dislike_button?.is_toggled) {
      button = dislike_button;
    }
    if (!button)
      throw new InnertubeError("This video is not liked/disliked", { video_id: this.basic_info.id });
    return await button.toggled_endpoint.call(this.actions);
  }
  /**
   * Retrieves Live Chat if available.
   */
  getLiveChat() {
    if (!this.livechat)
      throw new InnertubeError("Live Chat is not available", { video_id: this.basic_info.id });
    return new LiveChat2(this);
  }
  /**
   * Retrieves trailer info if available (typically for non-purchased movies or films).
   * @returns `VideoInfo` for the trailer, or `null` if none.
   */
  getTrailerInfo() {
    if (this.has_trailer && this.playability_status?.error_screen) {
      let player_response;
      if (this.playability_status.error_screen.is(PlayerLegacyDesktopYpcTrailer)) {
        player_response = this.playability_status.error_screen.trailer?.player_response;
      } else if (this.playability_status.error_screen.is(YpcTrailer)) {
        player_response = this.playability_status.error_screen.player_response;
      }
      if (player_response) {
        return new _VideoInfo([{ data: player_response }], this.actions, this.cpn);
      }
    }
    return null;
  }
  /**
   * Watch next feed filters.
   */
  get filters() {
    return this.related_chip_cloud?.chips?.map((chip) => chip.text?.toString()) || [];
  }
  /**
   * Checks if continuation is available for the watch next feed.
   */
  get wn_has_continuation() {
    return !!__privateGet(this, _watch_next_continuation);
  }
  /**
   * Gets the endpoint of the autoplay video
   */
  get autoplay_video_endpoint() {
    return this.autoplay?.sets?.[0]?.autoplay_video || null;
  }
  /**
   * Checks if trailer is available.
   */
  get has_trailer() {
    return !!this.playability_status?.error_screen?.is(PlayerLegacyDesktopYpcTrailer, YpcTrailer);
  }
  /**
   * Get songs used in the video.
   */
  get music_tracks() {
    const description_content = this.page[1]?.engagement_panels?.filter((panel) => panel.content?.is(StructuredDescriptionContent));
    if (description_content !== void 0 && description_content.length > 0) {
      const music_section = description_content[0].content?.as(StructuredDescriptionContent)?.items?.filterType(VideoDescriptionMusicSection);
      if (music_section !== void 0 && music_section.length > 0) {
        return music_section[0].carousel_lockups?.map((lookup) => {
          let song;
          let artist;
          let album;
          let license;
          let videoId;
          let channelId;
          song = lookup.video_lockup?.title?.toString();
          videoId = lookup.video_lockup?.endpoint?.payload.videoId;
          for (let i = 0; i < lookup.info_rows.length; i++) {
            const info_row = lookup.info_rows[i];
            if (info_row.info_row_expand_status_key === void 0) {
              if (song === void 0) {
                song = info_row.default_metadata?.toString() || info_row.expanded_metadata?.toString();
                if (videoId === void 0) {
                  const endpoint = info_row.default_metadata?.endpoint || info_row.expanded_metadata?.endpoint;
                  videoId = endpoint?.payload?.videoId;
                }
              } else {
                album = info_row.default_metadata?.toString() || info_row.expanded_metadata?.toString();
              }
            } else {
              if (info_row.info_row_expand_status_key?.indexOf("structured-description-music-section-artists-row-state-id") !== -1) {
                artist = info_row.default_metadata?.toString() || info_row.expanded_metadata?.toString();
                if (channelId === void 0) {
                  const endpoint = info_row.default_metadata?.endpoint || info_row.expanded_metadata?.endpoint;
                  channelId = endpoint?.payload?.browseId;
                }
              }
              if (info_row.info_row_expand_status_key?.indexOf("structured-description-music-section-licenses-row-state-id") !== -1) {
                license = info_row.default_metadata?.toString() || info_row.expanded_metadata?.toString();
              }
            }
          }
          return { song, artist, album, license, videoId, channelId };
        });
      }
    }
    return [];
  }
};
_watch_next_continuation = new WeakMap();
__name(_VideoInfo, "VideoInfo");
var VideoInfo = _VideoInfo;

// dist/src/parser/youtube/TranscriptInfo.js
var _page9, _actions12;
var _TranscriptInfo = class _TranscriptInfo {
  constructor(actions, response) {
    __privateAdd(this, _page9);
    __privateAdd(this, _actions12);
    __publicField(this, "transcript");
    __privateSet(this, _page9, parser_exports.parseResponse(response.data));
    __privateSet(this, _actions12, actions);
    if (!__privateGet(this, _page9).actions_memo)
      throw new Error("Page actions not found");
    this.transcript = __privateGet(this, _page9).actions_memo.getType(Transcript)[0];
  }
  /**
   * Selects a language from the language menu and returns the updated transcript.
   * @param language - Language to select.
   */
  async selectLanguage(language) {
    const target_menu_item = this.transcript.content?.footer?.language_menu?.sub_menu_items?.find((item) => item.title.toString() === language);
    if (!target_menu_item)
      throw new Error(`Language not found: ${language}`);
    if (target_menu_item.selected)
      return this;
    const response = await __privateGet(this, _actions12).execute("/get_transcript", {
      params: target_menu_item.continuation
    });
    return new _TranscriptInfo(__privateGet(this, _actions12), response);
  }
  /**
   * Returns available languages.
   */
  get languages() {
    return this.transcript.content?.footer?.language_menu?.sub_menu_items?.map((item) => item.title.toString()) || [];
  }
  /**
   * Returns the currently selected language.
   */
  get selectedLanguage() {
    return this.transcript.content?.footer?.language_menu?.sub_menu_items?.find((item) => item.selected)?.title.toString() || "";
  }
  get page() {
    return __privateGet(this, _page9);
  }
};
_page9 = new WeakMap();
_actions12 = new WeakMap();
__name(_TranscriptInfo, "TranscriptInfo");
var TranscriptInfo = _TranscriptInfo;

// dist/src/parser/ytmusic/index.js
var ytmusic_exports = {};
__export(ytmusic_exports, {
  Album: () => Album,
  Artist: () => Artist,
  Explore: () => Explore,
  HomeFeed: () => HomeFeed2,
  Library: () => Library2,
  LibraryContinuation: () => LibraryContinuation,
  Playlist: () => Playlist3,
  Recap: () => Recap,
  Search: () => Search2,
  TrackInfo: () => TrackInfo_default
});

// dist/src/parser/ytmusic/Album.js
var _page10;
var _Album = class _Album {
  constructor(response) {
    __privateAdd(this, _page10);
    __publicField(this, "header");
    __publicField(this, "contents");
    __publicField(this, "sections");
    __publicField(this, "background");
    __publicField(this, "url");
    __privateSet(this, _page10, parser_exports.parseResponse(response.data));
    if (!__privateGet(this, _page10).contents_memo)
      throw new Error("No contents found in the response");
    this.header = __privateGet(this, _page10).contents_memo.getType(MusicDetailHeader, MusicResponsiveHeader)?.[0];
    this.contents = __privateGet(this, _page10).contents_memo.getType(MusicShelf)?.[0].contents || observe([]);
    this.sections = __privateGet(this, _page10).contents_memo.getType(MusicCarouselShelf) || observe([]);
    this.background = __privateGet(this, _page10).background;
    this.url = __privateGet(this, _page10).microformat?.as(MicroformatData).url_canonical;
  }
  get page() {
    return __privateGet(this, _page10);
  }
};
_page10 = new WeakMap();
__name(_Album, "Album");
var Album = _Album;

// dist/src/parser/ytmusic/Artist.js
var _page11, _actions13;
var _Artist = class _Artist {
  constructor(response, actions) {
    __privateAdd(this, _page11);
    __privateAdd(this, _actions13);
    __publicField(this, "header");
    __publicField(this, "sections");
    __privateSet(this, _page11, parser_exports.parseResponse(response.data));
    __privateSet(this, _actions13, actions);
    this.header = this.page.header?.item().as(MusicImmersiveHeader, MusicVisualHeader, MusicHeader);
    const music_shelf = __privateGet(this, _page11).contents_memo?.getType(MusicShelf) || [];
    const music_carousel_shelf = __privateGet(this, _page11).contents_memo?.getType(MusicCarouselShelf) || [];
    this.sections = observe([...music_shelf, ...music_carousel_shelf]);
  }
  async getAllSongs() {
    const music_shelves = this.sections.filter((section) => section.type === "MusicShelf");
    if (!music_shelves.length)
      throw new InnertubeError("Could not find any node of type MusicShelf.");
    const shelf = music_shelves.find((shelf2) => shelf2.title?.text === "Top songs");
    if (!shelf)
      throw new InnertubeError("Could not find target shelf (Top songs).");
    if (!shelf.endpoint)
      throw new InnertubeError("Target shelf (Top songs) did not have an endpoint.");
    const page = await shelf.endpoint.call(__privateGet(this, _actions13), { client: "YTMUSIC", parse: true });
    return page.contents_memo?.getType(MusicPlaylistShelf)?.[0];
  }
  get page() {
    return __privateGet(this, _page11);
  }
};
_page11 = new WeakMap();
_actions13 = new WeakMap();
__name(_Artist, "Artist");
var Artist = _Artist;

// dist/src/parser/ytmusic/Explore.js
var _page12;
var _Explore = class _Explore {
  constructor(response) {
    __privateAdd(this, _page12);
    __publicField(this, "top_buttons");
    __publicField(this, "sections");
    __privateSet(this, _page12, parser_exports.parseResponse(response.data));
    const tab = __privateGet(this, _page12).contents?.item().as(SingleColumnBrowseResults).tabs.find((tab2) => tab2.selected);
    if (!tab)
      throw new InnertubeError("Could not find target tab.");
    const section_list = tab.content?.as(SectionList);
    if (!section_list)
      throw new InnertubeError("Target tab did not have any content.");
    this.top_buttons = section_list.contents.firstOfType(Grid)?.items.as(MusicNavigationButton) || [];
    this.sections = section_list.contents.filterType(MusicCarouselShelf);
  }
  get page() {
    return __privateGet(this, _page12);
  }
};
_page12 = new WeakMap();
__name(_Explore, "Explore");
var Explore = _Explore;

// dist/src/parser/ytmusic/HomeFeed.js
var _page13, _actions14, _continuation5;
var _HomeFeed2 = class _HomeFeed2 {
  constructor(response, actions) {
    __privateAdd(this, _page13);
    __privateAdd(this, _actions14);
    __privateAdd(this, _continuation5);
    __publicField(this, "sections");
    __publicField(this, "header");
    __privateSet(this, _actions14, actions);
    __privateSet(this, _page13, parser_exports.parseResponse(response.data));
    const tab = __privateGet(this, _page13).contents?.item().as(SingleColumnBrowseResults).tabs.find((tab2) => tab2.selected);
    if (!tab)
      throw new InnertubeError("Could not find Home tab.");
    if (tab.content === null) {
      if (!__privateGet(this, _page13).continuation_contents)
        throw new InnertubeError("Continuation did not have any content.");
      __privateSet(this, _continuation5, __privateGet(this, _page13).continuation_contents.as(SectionListContinuation).continuation);
      this.sections = __privateGet(this, _page13).continuation_contents.as(SectionListContinuation).contents?.as(MusicCarouselShelf);
      return;
    }
    this.header = tab.content?.as(SectionList).header?.as(ChipCloud);
    __privateSet(this, _continuation5, tab.content?.as(SectionList).continuation);
    this.sections = tab.content?.as(SectionList).contents.as(MusicCarouselShelf, MusicTasteBuilderShelf);
  }
  /**
   * Retrieves home feed continuation.
   */
  async getContinuation() {
    if (!__privateGet(this, _continuation5))
      throw new InnertubeError("Continuation not found.");
    const response = await __privateGet(this, _actions14).execute("/browse", {
      client: "YTMUSIC",
      continuation: __privateGet(this, _continuation5)
    });
    return new _HomeFeed2(response, __privateGet(this, _actions14));
  }
  async applyFilter(target_filter) {
    let cloud_chip;
    if (typeof target_filter === "string") {
      cloud_chip = this.header?.chips?.as(ChipCloudChip).find((chip) => chip.text === target_filter);
      if (!cloud_chip)
        throw new InnertubeError("Could not find filter with given name.", { available_filters: this.filters });
    } else if (target_filter?.is(ChipCloudChip)) {
      cloud_chip = target_filter;
    }
    if (!cloud_chip)
      throw new InnertubeError("Invalid filter", { available_filters: this.filters });
    if (cloud_chip?.is_selected)
      return this;
    if (!cloud_chip.endpoint)
      throw new InnertubeError("Selected filter does not have an endpoint.");
    const response = await cloud_chip.endpoint.call(__privateGet(this, _actions14), { client: "YTMUSIC" });
    return new _HomeFeed2(response, __privateGet(this, _actions14));
  }
  get filters() {
    return this.header?.chips?.as(ChipCloudChip).map((chip) => chip.text) || [];
  }
  get has_continuation() {
    return !!__privateGet(this, _continuation5);
  }
  get page() {
    return __privateGet(this, _page13);
  }
};
_page13 = new WeakMap();
_actions14 = new WeakMap();
_continuation5 = new WeakMap();
__name(_HomeFeed2, "HomeFeed");
var HomeFeed2 = _HomeFeed2;

// dist/src/parser/ytmusic/Library.js
var _page14, _actions15, _continuation6;
var _Library2 = class _Library2 {
  constructor(response, actions) {
    __privateAdd(this, _page14);
    __privateAdd(this, _actions15);
    __privateAdd(this, _continuation6);
    __publicField(this, "header");
    __publicField(this, "contents");
    __privateSet(this, _page14, parser_exports.parseResponse(response.data));
    __privateSet(this, _actions15, actions);
    const section_list = __privateGet(this, _page14).contents_memo?.getType(SectionList)[0];
    this.header = section_list?.header?.as(MusicSideAlignedItem);
    this.contents = section_list?.contents?.as(Grid, MusicShelf);
    __privateSet(this, _continuation6, this.contents?.find((list) => list.continuation)?.continuation);
  }
  /**
   * Applies given sort option to the library items.
   */
  async applySort(sort_by) {
    let target_item;
    if (typeof sort_by === "string") {
      const button = __privateGet(this, _page14).contents_memo?.getType(MusicSortFilterButton)[0];
      const options = button?.menu?.options.filter((item) => item instanceof MusicMultiSelectMenuItem);
      target_item = options?.find((item) => item.title === sort_by);
      if (!target_item)
        throw new InnertubeError(`Sort option "${sort_by}" not found`, { available_filters: options.map((item) => item.title) });
    } else {
      target_item = sort_by;
    }
    if (!target_item.endpoint)
      throw new InnertubeError("Invalid sort option");
    if (target_item.selected)
      return this;
    const cmd = target_item.endpoint.payload?.commands?.find((cmd2) => cmd2.browseSectionListReloadEndpoint)?.browseSectionListReloadEndpoint;
    if (!cmd)
      throw new InnertubeError("Failed to find sort option command");
    const response = await __privateGet(this, _actions15).execute("/browse", {
      client: "YTMUSIC",
      continuation: cmd.continuation.reloadContinuationData.continuation,
      parse: true
    });
    const previously_selected_item = __privateGet(this, _page14).contents_memo?.getType(MusicMultiSelectMenuItem)?.find((item) => item.selected);
    if (previously_selected_item)
      previously_selected_item.selected = false;
    target_item.selected = true;
    this.contents = response.continuation_contents?.as(SectionListContinuation).contents?.as(Grid, MusicShelf);
    return this;
  }
  /**
   * Applies given filter to the library.
   */
  async applyFilter(filter) {
    let target_chip;
    const chip_cloud = __privateGet(this, _page14).contents_memo?.getType(ChipCloud)[0];
    if (typeof filter === "string") {
      target_chip = chip_cloud?.chips.find((chip) => chip.text === filter);
      if (!target_chip)
        throw new InnertubeError(`Filter "${filter}" not found`, { available_filters: this.filters });
    } else {
      target_chip = filter;
    }
    if (!target_chip.endpoint)
      throw new InnertubeError("Invalid filter", filter);
    const target_cmd = new NavigationEndpoint(target_chip.endpoint.payload?.commands?.[0]);
    const response = await target_cmd.call(__privateGet(this, _actions15), { client: "YTMUSIC" });
    return new _Library2(response, __privateGet(this, _actions15));
  }
  /**
   * Retrieves continuation of the library items.
   */
  async getContinuation() {
    if (!__privateGet(this, _continuation6))
      throw new InnertubeError("No continuation available");
    const page = await __privateGet(this, _actions15).execute("/browse", {
      client: "YTMUSIC",
      continuation: __privateGet(this, _continuation6)
    });
    return new LibraryContinuation(page, __privateGet(this, _actions15));
  }
  get has_continuation() {
    return !!__privateGet(this, _continuation6);
  }
  get sort_options() {
    const button = __privateGet(this, _page14).contents_memo?.getType(MusicSortFilterButton)[0];
    const options = button?.menu?.options.filter((item) => item instanceof MusicMultiSelectMenuItem);
    return options.map((item) => item.title);
  }
  get filters() {
    return __privateGet(this, _page14).contents_memo?.getType(ChipCloud)?.[0].chips.map((chip) => chip.text) || [];
  }
  get page() {
    return __privateGet(this, _page14);
  }
};
_page14 = new WeakMap();
_actions15 = new WeakMap();
_continuation6 = new WeakMap();
__name(_Library2, "Library");
var Library2 = _Library2;
var _page15, _actions16, _continuation7;
var _LibraryContinuation = class _LibraryContinuation {
  constructor(response, actions) {
    __privateAdd(this, _page15);
    __privateAdd(this, _actions16);
    __privateAdd(this, _continuation7);
    __publicField(this, "contents");
    __privateSet(this, _page15, parser_exports.parseResponse(response.data));
    __privateSet(this, _actions16, actions);
    if (!__privateGet(this, _page15).continuation_contents)
      throw new InnertubeError("No continuation contents found");
    this.contents = __privateGet(this, _page15).continuation_contents.as(MusicShelfContinuation, GridContinuation);
    __privateSet(this, _continuation7, this.contents.continuation || null);
  }
  async getContinuation() {
    if (!__privateGet(this, _continuation7))
      throw new InnertubeError("No continuation available");
    const response = await __privateGet(this, _actions16).execute("/browse", {
      client: "YTMUSIC",
      continuation: __privateGet(this, _continuation7)
    });
    return new _LibraryContinuation(response, __privateGet(this, _actions16));
  }
  get has_continuation() {
    return !!__privateGet(this, _continuation7);
  }
  get page() {
    return __privateGet(this, _page15);
  }
};
_page15 = new WeakMap();
_actions16 = new WeakMap();
_continuation7 = new WeakMap();
__name(_LibraryContinuation, "LibraryContinuation");
var LibraryContinuation = _LibraryContinuation;

// dist/src/parser/ytmusic/Playlist.js
var _page16, _actions17, _continuation8, _last_fetched_suggestions, _suggestions_continuation, _Playlist_instances2, fetchSuggestions_fn;
var _Playlist3 = class _Playlist3 {
  constructor(response, actions) {
    __privateAdd(this, _Playlist_instances2);
    __privateAdd(this, _page16);
    __privateAdd(this, _actions17);
    __privateAdd(this, _continuation8);
    __publicField(this, "header");
    __publicField(this, "contents");
    __publicField(this, "background");
    __privateAdd(this, _last_fetched_suggestions);
    __privateAdd(this, _suggestions_continuation);
    __privateSet(this, _actions17, actions);
    __privateSet(this, _page16, parser_exports.parseResponse(response.data));
    __privateSet(this, _last_fetched_suggestions, null);
    __privateSet(this, _suggestions_continuation, null);
    if (__privateGet(this, _page16).continuation_contents) {
      const data = __privateGet(this, _page16).continuation_contents?.as(MusicPlaylistShelfContinuation);
      if (!data.contents)
        throw new InnertubeError("No contents found in the response");
      this.contents = data.contents.as(MusicResponsiveListItem, ContinuationItem);
      const continuation_item = this.contents.firstOfType(ContinuationItem);
      __privateSet(this, _continuation8, data.continuation || continuation_item);
    } else if (__privateGet(this, _page16).contents_memo) {
      this.header = __privateGet(this, _page16).contents_memo.getType(MusicResponsiveHeader, MusicEditablePlaylistDetailHeader, MusicDetailHeader)?.[0];
      this.contents = __privateGet(this, _page16).contents_memo.getType(MusicPlaylistShelf)?.[0]?.contents.as(MusicResponsiveListItem, ContinuationItem) || observe([]);
      this.background = __privateGet(this, _page16).background;
      const continuation_item = this.contents.firstOfType(ContinuationItem);
      __privateSet(this, _continuation8, __privateGet(this, _page16).contents_memo.getType(MusicPlaylistShelf)?.[0]?.continuation || continuation_item);
    } else if (__privateGet(this, _page16).on_response_received_actions) {
      const append_continuation_action = __privateGet(this, _page16).on_response_received_actions.firstOfType(AppendContinuationItemsAction);
      this.contents = append_continuation_action?.contents?.as(MusicResponsiveListItem, ContinuationItem);
      __privateSet(this, _continuation8, this.contents?.firstOfType(ContinuationItem));
    }
  }
  /**
   * Retrieves playlist items continuation.
   */
  async getContinuation() {
    if (!__privateGet(this, _continuation8))
      throw new InnertubeError("Continuation not found.");
    let response;
    if (typeof __privateGet(this, _continuation8) === "string") {
      response = await __privateGet(this, _actions17).execute("/browse", {
        client: "YTMUSIC",
        continuation: __privateGet(this, _continuation8)
      });
    } else {
      response = await __privateGet(this, _continuation8).endpoint.call(__privateGet(this, _actions17), { client: "YTMUSIC" });
    }
    return new _Playlist3(response, __privateGet(this, _actions17));
  }
  /**
   * Retrieves related playlists
   */
  async getRelated() {
    const target_section_list = __privateGet(this, _page16).contents_memo?.getType(SectionList).find((section_list) => section_list.continuation);
    if (!target_section_list)
      throw new InnertubeError('Could not find "Related" section.');
    let section_continuation = target_section_list.continuation;
    while (section_continuation) {
      const data = await __privateGet(this, _actions17).execute("/browse", {
        client: "YTMUSIC",
        continuation: section_continuation,
        parse: true
      });
      const section_list = data.continuation_contents?.as(SectionListContinuation);
      const sections = section_list?.contents?.as(MusicCarouselShelf, MusicShelf);
      const related = sections?.find((section) => section.is(MusicCarouselShelf))?.as(MusicCarouselShelf);
      if (related)
        return related;
      section_continuation = section_list?.continuation;
    }
    throw new InnertubeError("Could not fetch related playlists.");
  }
  async getSuggestions(refresh = true) {
    const require_fetch = refresh || !__privateGet(this, _last_fetched_suggestions);
    const fetch_promise = require_fetch ? __privateMethod(this, _Playlist_instances2, fetchSuggestions_fn).call(this) : Promise.resolve(null);
    const fetch_result = await fetch_promise;
    if (fetch_result) {
      __privateSet(this, _last_fetched_suggestions, fetch_result.items);
      __privateSet(this, _suggestions_continuation, fetch_result.continuation);
    }
    return fetch_result?.items || __privateGet(this, _last_fetched_suggestions) || observe([]);
  }
  get page() {
    return __privateGet(this, _page16);
  }
  get items() {
    return this.contents || observe([]);
  }
  get has_continuation() {
    return !!__privateGet(this, _continuation8);
  }
};
_page16 = new WeakMap();
_actions17 = new WeakMap();
_continuation8 = new WeakMap();
_last_fetched_suggestions = new WeakMap();
_suggestions_continuation = new WeakMap();
_Playlist_instances2 = new WeakSet();
fetchSuggestions_fn = /* @__PURE__ */ __name(async function() {
  const target_section_list = __privateGet(this, _page16).contents_memo?.getType(SectionList).find((section_list) => section_list.continuation);
  const continuation = __privateGet(this, _suggestions_continuation) || target_section_list?.continuation;
  if (continuation) {
    const page = await __privateGet(this, _actions17).execute("/browse", {
      client: "YTMUSIC",
      continuation,
      parse: true
    });
    const section_list = page.continuation_contents?.as(SectionListContinuation);
    const sections = section_list?.contents?.as(MusicCarouselShelf, MusicShelf);
    const suggestions = sections?.find((section) => section.is(MusicShelf))?.as(MusicShelf);
    return {
      items: suggestions?.contents || observe([]),
      continuation: suggestions?.continuation || null
    };
  }
  return {
    items: observe([]),
    continuation: null
  };
}, "#fetchSuggestions");
__name(_Playlist3, "Playlist");
var Playlist3 = _Playlist3;

// dist/src/parser/ytmusic/Recap.js
var _page17, _actions18;
var _Recap = class _Recap {
  constructor(response, actions) {
    __privateAdd(this, _page17);
    __privateAdd(this, _actions18);
    __publicField(this, "header");
    __publicField(this, "sections");
    __privateSet(this, _page17, parser_exports.parseResponse(response.data));
    __privateSet(this, _actions18, actions);
    const header = __privateGet(this, _page17).header?.item();
    this.header = header?.is(MusicElementHeader) ? __privateGet(this, _page17).header?.item().as(MusicElementHeader).element?.model?.as(HighlightsCarousel) : __privateGet(this, _page17).header?.item().as(MusicHeader);
    const tab = __privateGet(this, _page17).contents?.item().as(SingleColumnBrowseResults).tabs.firstOfType(Tab);
    if (!tab)
      throw new InnertubeError("Target tab not found");
    this.sections = tab.content?.as(SectionList).contents.as(ItemSection, MusicCarouselShelf, Message);
  }
  /**
   * Retrieves recap playlist.
   */
  async getPlaylist() {
    if (!this.header)
      throw new InnertubeError("Header not found");
    if (!this.header.is(HighlightsCarousel))
      throw new InnertubeError("Recap playlist not available, check back later.");
    const endpoint = this.header.panels[0].text_on_tap_endpoint;
    const response = await endpoint.call(__privateGet(this, _actions18), { client: "YTMUSIC" });
    return new Playlist3(response, __privateGet(this, _actions18));
  }
  get page() {
    return __privateGet(this, _page17);
  }
};
_page17 = new WeakMap();
_actions18 = new WeakMap();
__name(_Recap, "Recap");
var Recap = _Recap;

// dist/src/parser/ytmusic/Search.js
var _page18, _actions19, _continuation9;
var _Search2 = class _Search2 {
  constructor(response, actions, is_filtered) {
    __privateAdd(this, _page18);
    __privateAdd(this, _actions19);
    __privateAdd(this, _continuation9);
    __publicField(this, "header");
    __publicField(this, "contents");
    __privateSet(this, _actions19, actions);
    __privateSet(this, _page18, parser_exports.parseResponse(response.data));
    if (!__privateGet(this, _page18).contents || !__privateGet(this, _page18).contents_memo)
      throw new InnertubeError("Response did not contain any contents.");
    const tab = __privateGet(this, _page18).contents.item().as(TabbedSearchResults).tabs.find((tab2) => tab2.selected);
    if (!tab)
      throw new InnertubeError("Could not find target tab.");
    const tab_content = tab.content?.as(SectionList);
    if (!tab_content)
      throw new InnertubeError("Target tab did not have any content.");
    this.header = tab_content.header?.as(ChipCloud);
    this.contents = tab_content.contents.as(MusicShelf, MusicCardShelf, ItemSection);
    if (is_filtered) {
      __privateSet(this, _continuation9, this.contents.firstOfType(MusicShelf)?.continuation);
    }
  }
  /**
   * Loads more items for the given shelf.
   */
  async getMore(shelf) {
    if (!shelf || !shelf.endpoint)
      throw new InnertubeError("Cannot retrieve more items for this shelf because it does not have an endpoint.");
    const response = await shelf.endpoint.call(__privateGet(this, _actions19), { client: "YTMUSIC" });
    if (!response)
      throw new InnertubeError("Endpoint did not return any data");
    return new _Search2(response, __privateGet(this, _actions19), true);
  }
  /**
   * Retrieves search continuation. Only available for filtered searches and shelf continuations.
   */
  async getContinuation() {
    if (!__privateGet(this, _continuation9))
      throw new InnertubeError("Continuation not found.");
    const response = await __privateGet(this, _actions19).execute("/search", {
      continuation: __privateGet(this, _continuation9),
      client: "YTMUSIC"
    });
    return new SearchContinuation(__privateGet(this, _actions19), response);
  }
  /**
   * Applies given filter to the search.
   */
  async applyFilter(target_filter) {
    let cloud_chip;
    if (typeof target_filter === "string") {
      cloud_chip = this.header?.chips?.as(ChipCloudChip).find((chip) => chip.text === target_filter);
      if (!cloud_chip)
        throw new InnertubeError("Could not find filter with given name.", { available_filters: this.filters });
    } else if (target_filter?.is(ChipCloudChip)) {
      cloud_chip = target_filter;
    }
    if (!cloud_chip)
      throw new InnertubeError("Invalid filter", { available_filters: this.filters });
    if (cloud_chip?.is_selected)
      return this;
    if (!cloud_chip.endpoint)
      throw new InnertubeError("Selected filter does not have an endpoint.");
    const response = await cloud_chip.endpoint.call(__privateGet(this, _actions19), { client: "YTMUSIC" });
    return new _Search2(response, __privateGet(this, _actions19), true);
  }
  get filters() {
    return this.header?.chips?.as(ChipCloudChip).map((chip) => chip.text) || [];
  }
  get has_continuation() {
    return !!__privateGet(this, _continuation9);
  }
  get did_you_mean() {
    return __privateGet(this, _page18).contents_memo?.getType(DidYouMean)[0];
  }
  get showing_results_for() {
    return __privateGet(this, _page18).contents_memo?.getType(ShowingResultsFor)[0];
  }
  get message() {
    return __privateGet(this, _page18).contents_memo?.getType(Message)[0];
  }
  get songs() {
    return this.contents?.filterType(MusicShelf).find((section) => section.title.toString() === "Songs");
  }
  get videos() {
    return this.contents?.filterType(MusicShelf).find((section) => section.title.toString() === "Videos");
  }
  get albums() {
    return this.contents?.filterType(MusicShelf).find((section) => section.title.toString() === "Albums");
  }
  get artists() {
    return this.contents?.filterType(MusicShelf).find((section) => section.title.toString() === "Artists");
  }
  get playlists() {
    return this.contents?.filterType(MusicShelf).find((section) => section.title.toString() === "Community playlists");
  }
  get page() {
    return __privateGet(this, _page18);
  }
};
_page18 = new WeakMap();
_actions19 = new WeakMap();
_continuation9 = new WeakMap();
__name(_Search2, "Search");
var Search2 = _Search2;
var _actions20, _page19;
var _SearchContinuation = class _SearchContinuation {
  constructor(actions, response) {
    __privateAdd(this, _actions20);
    __privateAdd(this, _page19);
    __publicField(this, "header");
    __publicField(this, "contents");
    __privateSet(this, _actions20, actions);
    __privateSet(this, _page19, parser_exports.parseResponse(response.data));
    this.header = __privateGet(this, _page19).header?.item().as(MusicHeader);
    this.contents = __privateGet(this, _page19).continuation_contents?.as(MusicShelfContinuation);
  }
  async getContinuation() {
    if (!this.contents?.continuation)
      throw new InnertubeError("Continuation not found.");
    const response = await __privateGet(this, _actions20).execute("/search", {
      continuation: this.contents.continuation,
      client: "YTMUSIC"
    });
    return new _SearchContinuation(__privateGet(this, _actions20), response);
  }
  get has_continuation() {
    return !!this.contents?.continuation;
  }
  get page() {
    return __privateGet(this, _page19);
  }
};
_actions20 = new WeakMap();
_page19 = new WeakMap();
__name(_SearchContinuation, "SearchContinuation");
var SearchContinuation = _SearchContinuation;

// dist/src/parser/ytmusic/TrackInfo.js
var _TrackInfo = class _TrackInfo extends MediaInfo {
  constructor(data, actions, cpn) {
    super(data, actions, cpn);
    __publicField(this, "tabs");
    __publicField(this, "current_video_endpoint");
    __publicField(this, "player_overlays");
    const next = this.page[1];
    if (next) {
      const tabbed_results = next.contents_memo?.getType(WatchNextTabbedResults)?.[0];
      this.tabs = tabbed_results?.tabs.as(Tab);
      this.current_video_endpoint = next.current_video_endpoint;
      this.player_overlays = next.player_overlays?.item().as(PlayerOverlay);
    }
  }
  /**
   * Retrieves contents of the given tab.
   */
  async getTab(title_or_page_type) {
    if (!this.tabs)
      throw new InnertubeError("Could not find any tab");
    const target_tab = this.tabs.find((tab) => tab.title === title_or_page_type) || this.tabs.find((tab) => tab.endpoint.payload.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType === title_or_page_type) || this.tabs?.[0];
    if (!target_tab)
      throw new InnertubeError(`Tab "${title_or_page_type}" not found`, { available_tabs: this.available_tabs });
    if (target_tab.content)
      return target_tab.content;
    const page = await target_tab.endpoint.call(this.actions, { client: "YTMUSIC", parse: true });
    if (page.contents?.item().type === "Message")
      return page.contents.item().as(Message);
    if (!page.contents)
      throw new InnertubeError("Page contents was empty", page);
    return page.contents.item().as(SectionList).contents;
  }
  /**
   * Retrieves up next.
   */
  async getUpNext(automix = true) {
    const music_queue = await this.getTab("Up next");
    if (!music_queue || !music_queue.content)
      throw new InnertubeError("Music queue was empty, the video id is probably invalid.", music_queue);
    const playlist_panel = music_queue.content.as(PlaylistPanel);
    if (!playlist_panel.playlist_id && automix) {
      const automix_preview_video = playlist_panel.contents.firstOfType(AutomixPreviewVideo);
      if (!automix_preview_video)
        throw new InnertubeError("Automix item not found");
      const page = await automix_preview_video.playlist_video?.endpoint.call(this.actions, {
        videoId: this.basic_info.id,
        client: "YTMUSIC",
        parse: true
      });
      if (!page || !page.contents_memo)
        throw new InnertubeError("Could not fetch automix");
      return page.contents_memo.getType(PlaylistPanel)?.[0];
    }
    return playlist_panel;
  }
  /**
   * Retrieves up next continuation relative to current TrackInfo.
   */
  async getUpNextContinuation(playlistPanel) {
    if (!this.current_video_endpoint)
      throw new InnertubeError("Current Video Endpoint was not defined.", this.current_video_endpoint);
    if (playlistPanel instanceof PlaylistPanel && playlistPanel.playlist_id !== this.current_video_endpoint.payload.playlistId) {
      throw new InnertubeError("PlaylistId from TrackInfo does not match with PlaylistPanel");
    }
    const watch_next_endpoint = new NavigationEndpoint({ watchNextEndpoint: { ...this.current_video_endpoint.payload, continuation: playlistPanel.continuation } });
    const response = await watch_next_endpoint.call(this.actions, { ...this.current_video_endpoint.payload, continuation: playlistPanel.continuation, client: "YTMUSIC", parse: true });
    const playlistCont = response.continuation_contents?.as(PlaylistPanelContinuation);
    if (!playlistCont)
      throw new InnertubeError("No PlaylistPanel Continuation available.", response);
    return playlistCont;
  }
  /**
   * Retrieves related content.
   */
  async getRelated() {
    return await this.getTab("MUSIC_PAGE_TYPE_TRACK_RELATED");
  }
  /**
   * Retrieves lyrics.
   */
  async getLyrics() {
    const tab = await this.getTab("MUSIC_PAGE_TYPE_TRACK_LYRICS");
    return tab.firstOfType(MusicDescriptionShelf);
  }
  /**
   * Adds the song to the watch history.
   */
  async addToWatchHistory() {
    return super.addToWatchHistory(Constants_exports.CLIENTS.YTMUSIC.NAME, Constants_exports.CLIENTS.YTMUSIC.VERSION, "https://music.");
  }
  /**
   * Updates the watch time of the song.
   */
  async updateWatchTime(startTime) {
    return super.updateWatchTime(startTime, Constants_exports.CLIENTS.YTMUSIC.NAME, Constants_exports.CLIENTS.YTMUSIC.VERSION, "https://music.");
  }
  get available_tabs() {
    return this.tabs ? this.tabs.map((tab) => tab.title) : [];
  }
};
__name(_TrackInfo, "TrackInfo");
var TrackInfo = _TrackInfo;
var TrackInfo_default = TrackInfo;

// dist/src/parser/ytkids/index.js
var ytkids_exports = {};
__export(ytkids_exports, {
  Channel: () => Channel3,
  HomeFeed: () => HomeFeed3,
  Search: () => Search3,
  VideoInfo: () => VideoInfo2
});

// dist/src/parser/ytkids/Channel.js
var _Channel3 = class _Channel3 extends Feed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __publicField(this, "header");
    __publicField(this, "contents");
    this.header = this.page.header?.item().as(C4TabbedHeader);
    this.contents = this.memo.getType(ItemSection)[0] || this.page.continuation_contents?.as(ItemSectionContinuation);
  }
  /**
   * Retrieves next batch of content.
   */
  async getContinuation() {
    if (!this.contents)
      throw new Error("No continuation available.");
    const continuation_request = new NavigationEndpoint({
      continuationCommand: {
        token: this.contents.continuation,
        request: "CONTINUATION_REQUEST_TYPE_BROWSE"
      }
    });
    const continuation_response = await continuation_request.call(this.actions, { client: "YTKIDS" });
    return new _Channel3(this.actions, continuation_response);
  }
  get has_continuation() {
    return !!this.contents?.continuation;
  }
};
__name(_Channel3, "Channel");
var Channel3 = _Channel3;

// dist/src/parser/ytkids/HomeFeed.js
var _HomeFeed3 = class _HomeFeed3 extends Feed {
  constructor(actions, data, already_parsed = false) {
    super(actions, data, already_parsed);
    __publicField(this, "header");
    __publicField(this, "contents");
    this.header = this.page.header?.item().as(KidsCategoriesHeader);
    this.contents = this.page.contents?.item().as(KidsHomeScreen);
  }
  /**
   * Retrieves the contents of the given category tab. Use {@link HomeFeed.categories} to get a list of available categories.
   * @param tab - The tab to select
   */
  async selectCategoryTab(tab) {
    let target_tab;
    if (typeof tab === "string") {
      target_tab = this.header?.category_tabs.find((t) => t.title.toString() === tab);
    } else if (tab?.is(KidsCategoryTab)) {
      target_tab = tab;
    }
    if (!target_tab)
      throw new InnertubeError(`Tab "${tab}" not found`);
    const page = await target_tab.endpoint.call(this.actions, { client: "YTKIDS", parse: true });
    page.header = this.page.header;
    page.header_memo = this.page.header_memo;
    return new _HomeFeed3(this.actions, page, true);
  }
  get categories() {
    return this.header?.category_tabs.map((tab) => tab.title.toString()) || [];
  }
};
__name(_HomeFeed3, "HomeFeed");
var HomeFeed3 = _HomeFeed3;

// dist/src/parser/ytkids/Search.js
var _Search3 = class _Search3 extends Feed {
  constructor(actions, data) {
    super(actions, data);
    __publicField(this, "estimated_results");
    __publicField(this, "contents");
    this.estimated_results = this.page.estimated_results;
    const item_section = this.memo.getType(ItemSection)[0];
    if (!item_section)
      throw new InnertubeError("No item section found in search response.");
    this.contents = item_section.contents;
  }
};
__name(_Search3, "Search");
var Search3 = _Search3;

// dist/src/parser/ytkids/VideoInfo.js
var _VideoInfo2 = class _VideoInfo2 extends MediaInfo {
  constructor(data, actions, cpn) {
    super(data, actions, cpn);
    __publicField(this, "slim_video_metadata");
    __publicField(this, "watch_next_feed");
    __publicField(this, "current_video_endpoint");
    __publicField(this, "player_overlays");
    const next = this.page[1];
    const two_col = next?.contents?.item().as(TwoColumnWatchNextResults);
    const results = two_col?.results;
    const secondary_results = two_col?.secondary_results;
    if (results && secondary_results) {
      this.slim_video_metadata = results.firstOfType(ItemSection)?.contents?.firstOfType(SlimVideoMetadata);
      this.watch_next_feed = secondary_results.firstOfType(ItemSection)?.contents || secondary_results;
      this.current_video_endpoint = next?.current_video_endpoint;
      this.player_overlays = next?.player_overlays?.item().as(PlayerOverlay);
    }
  }
};
__name(_VideoInfo2, "VideoInfo");
var VideoInfo2 = _VideoInfo2;

// dist/src/parser/ytshorts/index.js
var ytshorts_exports = {};
__export(ytshorts_exports, {
  ShortFormVideoInfo: () => ShortFormVideoInfo
});

// dist/src/parser/ytshorts/ShortFormVideoInfo.js
var _watch_next_continuation2;
var _ShortFormVideoInfo = class _ShortFormVideoInfo extends MediaInfo {
  constructor(data, actions, cpn, reel_watch_sequence_response) {
    super(data, actions, cpn);
    __privateAdd(this, _watch_next_continuation2);
    __publicField(this, "watch_next_feed");
    __publicField(this, "current_video_endpoint");
    __publicField(this, "player_overlays");
    if (reel_watch_sequence_response) {
      const reel_watch_sequence = parser_exports.parseResponse(reel_watch_sequence_response.data);
      if (reel_watch_sequence.entries)
        this.watch_next_feed = reel_watch_sequence.entries;
      if (reel_watch_sequence.continuation_endpoint)
        __privateSet(this, _watch_next_continuation2, reel_watch_sequence.continuation_endpoint?.as(ContinuationCommand2));
    }
  }
  async getWatchNextContinuation() {
    if (!__privateGet(this, _watch_next_continuation2))
      throw new InnertubeError("Continuation not found");
    const response = await this.actions.execute("/reel/reel_watch_sequence", {
      sequenceParams: __privateGet(this, _watch_next_continuation2).token,
      parse: true
    });
    if (response.entries)
      this.watch_next_feed = response.entries;
    __privateSet(this, _watch_next_continuation2, response.continuation_endpoint?.as(ContinuationCommand2));
    return this;
  }
  /**
   * Checks if continuation is available for the watch next feed.
   */
  get wn_has_continuation() {
    return !!__privateGet(this, _watch_next_continuation2);
  }
};
_watch_next_continuation2 = new WeakMap();
__name(_ShortFormVideoInfo, "ShortFormVideoInfo");
var ShortFormVideoInfo = _ShortFormVideoInfo;

// dist/src/parser/classes/misc/Author.js
var _Author = class _Author {
  constructor(item, badges, thumbs, id) {
    __publicField(this, "id");
    __publicField(this, "name");
    __publicField(this, "thumbnails");
    __publicField(this, "endpoint");
    __publicField(this, "badges");
    __publicField(this, "is_moderator");
    __publicField(this, "is_verified");
    __publicField(this, "is_verified_artist");
    __publicField(this, "url");
    const nav_text = new Text2(item);
    this.id = id || nav_text?.runs?.[0]?.endpoint?.payload?.browseId || nav_text?.endpoint?.payload?.browseId || "N/A";
    this.name = nav_text?.text || "N/A";
    this.thumbnails = thumbs ? Thumbnail.fromResponse(thumbs) : [];
    this.endpoint = nav_text?.runs?.[0]?.endpoint || nav_text?.endpoint;
    if (badges) {
      if (Array.isArray(badges)) {
        this.badges = parser_exports.parseArray(badges);
        this.is_moderator = this.badges?.some((badge) => badge.icon_type == "MODERATOR");
        this.is_verified = this.badges?.some((badge) => badge.style == "BADGE_STYLE_TYPE_VERIFIED");
        this.is_verified_artist = this.badges?.some((badge) => badge.style == "BADGE_STYLE_TYPE_VERIFIED_ARTIST");
      } else {
        this.badges = observe([]);
        this.is_verified = !!badges.isVerified;
        this.is_verified_artist = !!badges.isArtist;
      }
    } else {
      this.badges = observe([]);
    }
    this.url = nav_text?.runs?.[0]?.endpoint?.metadata?.api_url === "/browse" && `${URLS.YT_BASE}${nav_text?.runs?.[0]?.endpoint?.payload?.canonicalBaseUrl || `/u/${nav_text?.runs?.[0]?.endpoint?.payload?.browseId}`}` || `${URLS.YT_BASE}${nav_text?.endpoint?.payload?.canonicalBaseUrl || `/u/${nav_text?.endpoint?.payload?.browseId}`}`;
  }
  get best_thumbnail() {
    return this.thumbnails[0];
  }
};
__name(_Author, "Author");
var Author = _Author;

// dist/src/utils/user-agents.js
var user_agents_default = {
  "desktop": [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6.1 Safari/605.1.15",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 OPR/121.0.0.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Safari/605.1.15",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
    "Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 OPR/121.0.0.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0.1 Safari/605.1.15",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 OPR/122.0.0.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
  ],
  "mobile": [
    "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Mobile Safari/537.36",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 15_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/388.0.811331708 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_7_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/388.0.811331708 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Mobile Safari/537.36",
    "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Mobile Safari/537.36",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/388.0.811331708 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0.1 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/388.0.811331708 Mobile/15E148 Safari/604.1",
    "Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0.1 Mobile/15E148 Safari/604.1"
  ]
};

// dist/src/utils/Utils.js
var TAG_2 = "Utils";
var shim;
var _Platform = class _Platform {
  static load(platform) {
    shim = platform;
  }
  static get shim() {
    if (!shim) {
      throw new Error("Platform is not loaded");
    }
    return shim;
  }
};
__name(_Platform, "Platform");
var Platform = _Platform;
var _InnertubeError = class _InnertubeError extends Error {
  constructor(message, info2) {
    super(message);
    __publicField(this, "date");
    __publicField(this, "version");
    __publicField(this, "info");
    if (info2) {
      this.info = info2;
    }
    this.date = /* @__PURE__ */ new Date();
    this.version = package_default.version;
  }
};
__name(_InnertubeError, "InnertubeError");
var InnertubeError = _InnertubeError;
var _ParsingError = class _ParsingError extends InnertubeError {
};
__name(_ParsingError, "ParsingError");
var ParsingError = _ParsingError;
var _MissingParamError = class _MissingParamError extends InnertubeError {
};
__name(_MissingParamError, "MissingParamError");
var MissingParamError = _MissingParamError;
var _OAuth2Error = class _OAuth2Error extends InnertubeError {
};
__name(_OAuth2Error, "OAuth2Error");
var OAuth2Error = _OAuth2Error;
var _PlayerError = class _PlayerError extends Error {
};
__name(_PlayerError, "PlayerError");
var PlayerError = _PlayerError;
var _SessionError = class _SessionError extends Error {
};
__name(_SessionError, "SessionError");
var SessionError = _SessionError;
var _ChannelError = class _ChannelError extends Error {
};
__name(_ChannelError, "ChannelError");
var ChannelError = _ChannelError;
function deepCompare(obj1, obj2) {
  const keys = Reflect.ownKeys(obj1);
  return keys.some((key) => {
    const is_text = obj2[key] instanceof Text2;
    if (!is_text && typeof obj2[key] === "object") {
      return JSON.stringify(obj1[key]) === JSON.stringify(obj2[key]);
    }
    return obj1[key] === (is_text ? obj2[key].toString() : obj2[key]);
  });
}
__name(deepCompare, "deepCompare");
function getStringBetweenStrings(data, start_string, end_string) {
  const regex = new RegExp(`${escapeStringRegexp(start_string)}(.*?)${escapeStringRegexp(end_string)}`, "s");
  const match = data.match(regex);
  return match ? match[1] : void 0;
}
__name(getStringBetweenStrings, "getStringBetweenStrings");
function escapeStringRegexp(input) {
  return input.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
}
__name(escapeStringRegexp, "escapeStringRegexp");
function getRandomUserAgent(type) {
  const available_agents = user_agents_default[type];
  const random_index = Math.floor(Math.random() * available_agents.length);
  return available_agents[random_index];
}
__name(getRandomUserAgent, "getRandomUserAgent");
async function generateSidAuth(sid) {
  const youtube = "https://www.youtube.com";
  const timestamp = Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3);
  const input = [timestamp, sid, youtube].join(" ");
  const gen_hash = await Platform.shim.sha1Hash(input);
  return ["SAPISIDHASH", [timestamp, gen_hash].join("_")].join(" ");
}
__name(generateSidAuth, "generateSidAuth");
function generateRandomString(length) {
  const result = [];
  const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
  for (let i = 0; i < length; i++) {
    result.push(alphabet.charAt(Math.floor(Math.random() * alphabet.length)));
  }
  return result.join("");
}
__name(generateRandomString, "generateRandomString");
function timeToSeconds(time) {
  const params = time.split(":").map((param) => parseInt(param.replace(/\D/g, "")));
  switch (params.length) {
    case 1:
      return params[0];
    case 2:
      return params[0] * 60 + params[1];
    case 3:
      return params[0] * 3600 + params[1] * 60 + params[2];
    default:
      throw new Error("Invalid time string");
  }
}
__name(timeToSeconds, "timeToSeconds");
function concatMemos(...iterables) {
  const memo = new Memo();
  for (const iterable of iterables) {
    if (!iterable)
      continue;
    for (const item of iterable) {
      const memo_item = memo.get(item[0]);
      if (memo_item) {
        memo.set(item[0], [...memo_item, ...item[1]]);
        continue;
      }
      memo.set(...item);
    }
  }
  return memo;
}
__name(concatMemos, "concatMemos");
function throwIfMissing(params) {
  for (const [key, value] of Object.entries(params)) {
    if (!value)
      throw new MissingParamError(`${key} is missing`);
  }
}
__name(throwIfMissing, "throwIfMissing");
function hasKeys(params, ...keys) {
  for (const key of keys) {
    if (!Reflect.has(params, key) || params[key] === void 0)
      return false;
  }
  return true;
}
__name(hasKeys, "hasKeys");
async function* streamToIterable(stream) {
  const reader = stream.getReader();
  try {
    while (true) {
      const { done, value } = await reader.read();
      if (done) {
        return;
      }
      yield value;
    }
  } finally {
    reader.releaseLock();
  }
}
__name(streamToIterable, "streamToIterable");
var debugFetch = /* @__PURE__ */ __name((input, init) => {
  const url = typeof input === "string" ? new URL(input) : input instanceof URL ? input : new URL(input.url);
  const headers = init?.headers ? new Headers(init.headers) : input instanceof Request ? input.headers : new Headers();
  const arr_headers = [...headers];
  const body_contents = init?.body ? typeof init.body === "string" ? headers.get("content-type") === "application/json" ? JSON.stringify(JSON.parse(init.body), null, 2) : (
    // Body is string and json
    init.body
  ) : (
    // Body is string
    "    <binary>"
  ) : (
    // Body is not string
    "    (none)"
  );
  const headers_serialized = arr_headers.length > 0 ? `${arr_headers.map(([key, value]) => `    ${key}: ${value}`).join("\n")}` : "    (none)";
  warn(TAG_2, `Fetch:
  url: ${url.toString()}
  method: ${init?.method || "GET"}
  headers:
${headers_serialized}
' + 
    '  body:
${body_contents}`);
  return Platform.shim.fetch(input, init);
}, "debugFetch");
function u8ToBase64(u8) {
  return btoa(String.fromCharCode.apply(null, Array.from(u8)));
}
__name(u8ToBase64, "u8ToBase64");
function base64ToU8(base64) {
  const standard_base64 = base64.replace(/-/g, "+").replace(/_/g, "/");
  const padded_base64 = standard_base64.padEnd(standard_base64.length + (4 - standard_base64.length % 4) % 4, "=");
  return new Uint8Array(atob(padded_base64).split("").map((char) => char.charCodeAt(0)));
}
__name(base64ToU8, "base64ToU8");
function isTextRun(run) {
  return !("emoji" in run);
}
__name(isTextRun, "isTextRun");
function getCookie(cookies, name, matchWholeName = false) {
  const regex = matchWholeName ? `(^|\\s?)\\b${name}\\b=([^;]+)` : `(^|s?)${name}=([^;]+)`;
  const match = cookies.match(new RegExp(regex));
  return match ? match[2] : void 0;
}
__name(getCookie, "getCookie");
function getNsigProcessorFn(n, sp, s) {
  return `function process(n = "", sp = "", s = "") {
  const mockStreamingURL = "https://ytjs.googlevideo.com/videoplayback?expire=1234567890&"+"n="+encodeURIComponent(n);
  const urlCtorFunction = exportedVars.nsigFunction || (() => { throw new Error('No n/sig decipher function extracted') });
  const urlCtor = urlCtorFunction(mockStreamingURL, sp, s);

  const proto = Object.getPrototypeOf(urlCtor);
  const properties = Object.getOwnPropertyNames(proto);
  const methodBlacklist = ['constructor', 'clone', 'set', 'get'];

  for (const prop of properties) {
    if (methodBlacklist.includes(prop))
      continue;

    if (typeof urlCtor[prop] === 'function')
      urlCtor[prop]();
  }

  const sigResult = urlCtor.get(sp);
  const nResult = urlCtor.get('n');

  return {
    sig: sigResult ? decodeURIComponent(sigResult) : undefined,
    n: nResult ? decodeURIComponent(nResult) : undefined
  };
}

return process("${n || ""}", "${sp || ""}", "${s || ""}");`;
}
__name(getNsigProcessorFn, "getNsigProcessorFn");

// dist/src/platform/jsruntime/default.js
function evaluate(_data23, _env) {
  throw new Error("To decipher URLs, you must provide your own JavaScript evaluator. See https://ytjs.dev/guide/getting-started.html#providing-a-custom-javascript-interpreter for more details.");
}
__name(evaluate, "evaluate");

// dist/src/platform/polyfills/web-crypto.js
async function sha1Hash(str) {
  const byteToHex = [
    "00",
    "01",
    "02",
    "03",
    "04",
    "05",
    "06",
    "07",
    "08",
    "09",
    "0a",
    "0b",
    "0c",
    "0d",
    "0e",
    "0f",
    "10",
    "11",
    "12",
    "13",
    "14",
    "15",
    "16",
    "17",
    "18",
    "19",
    "1a",
    "1b",
    "1c",
    "1d",
    "1e",
    "1f",
    "20",
    "21",
    "22",
    "23",
    "24",
    "25",
    "26",
    "27",
    "28",
    "29",
    "2a",
    "2b",
    "2c",
    "2d",
    "2e",
    "2f",
    "30",
    "31",
    "32",
    "33",
    "34",
    "35",
    "36",
    "37",
    "38",
    "39",
    "3a",
    "3b",
    "3c",
    "3d",
    "3e",
    "3f",
    "40",
    "41",
    "42",
    "43",
    "44",
    "45",
    "46",
    "47",
    "48",
    "49",
    "4a",
    "4b",
    "4c",
    "4d",
    "4e",
    "4f",
    "50",
    "51",
    "52",
    "53",
    "54",
    "55",
    "56",
    "57",
    "58",
    "59",
    "5a",
    "5b",
    "5c",
    "5d",
    "5e",
    "5f",
    "60",
    "61",
    "62",
    "63",
    "64",
    "65",
    "66",
    "67",
    "68",
    "69",
    "6a",
    "6b",
    "6c",
    "6d",
    "6e",
    "6f",
    "70",
    "71",
    "72",
    "73",
    "74",
    "75",
    "76",
    "77",
    "78",
    "79",
    "7a",
    "7b",
    "7c",
    "7d",
    "7e",
    "7f",
    "80",
    "81",
    "82",
    "83",
    "84",
    "85",
    "86",
    "87",
    "88",
    "89",
    "8a",
    "8b",
    "8c",
    "8d",
    "8e",
    "8f",
    "90",
    "91",
    "92",
    "93",
    "94",
    "95",
    "96",
    "97",
    "98",
    "99",
    "9a",
    "9b",
    "9c",
    "9d",
    "9e",
    "9f",
    "a0",
    "a1",
    "a2",
    "a3",
    "a4",
    "a5",
    "a6",
    "a7",
    "a8",
    "a9",
    "aa",
    "ab",
    "ac",
    "ad",
    "ae",
    "af",
    "b0",
    "b1",
    "b2",
    "b3",
    "b4",
    "b5",
    "b6",
    "b7",
    "b8",
    "b9",
    "ba",
    "bb",
    "bc",
    "bd",
    "be",
    "bf",
    "c0",
    "c1",
    "c2",
    "c3",
    "c4",
    "c5",
    "c6",
    "c7",
    "c8",
    "c9",
    "ca",
    "cb",
    "cc",
    "cd",
    "ce",
    "cf",
    "d0",
    "d1",
    "d2",
    "d3",
    "d4",
    "d5",
    "d6",
    "d7",
    "d8",
    "d9",
    "da",
    "db",
    "dc",
    "dd",
    "de",
    "df",
    "e0",
    "e1",
    "e2",
    "e3",
    "e4",
    "e5",
    "e6",
    "e7",
    "e8",
    "e9",
    "ea",
    "eb",
    "ec",
    "ed",
    "ee",
    "ef",
    "f0",
    "f1",
    "f2",
    "f3",
    "f4",
    "f5",
    "f6",
    "f7",
    "f8",
    "f9",
    "fa",
    "fb",
    "fc",
    "fd",
    "fe",
    "ff"
  ];
  function hex(arrayBuffer) {
    const buff = new Uint8Array(arrayBuffer);
    const hexOctets = [];
    for (let i = 0; i < buff.length; ++i)
      hexOctets.push(byteToHex[buff[i]]);
    return hexOctets.join("");
  }
  __name(hex, "hex");
  return hex(await crypto.subtle.digest("SHA-1", new TextEncoder().encode(str)));
}
__name(sha1Hash, "sha1Hash");

// dist/src/core/Actions.js
var _Actions_instances, isBrowse_fn, needsLogin_fn;
var _Actions = class _Actions {
  constructor(session) {
    __privateAdd(this, _Actions_instances);
    __publicField(this, "session");
    this.session = session;
  }
  /**
   * Makes calls to the playback tracking API.
   * @param url - The URL to call.
   * @param client - The client to use.
   * @param params - Call parameters.
   */
  async stats(url, client, params) {
    const s_url = new URL(url);
    s_url.searchParams.set("ver", "2");
    s_url.searchParams.set("c", client.client_name.toLowerCase());
    s_url.searchParams.set("cbrver", client.client_version);
    s_url.searchParams.set("cver", client.client_version);
    for (const key of Object.keys(params)) {
      s_url.searchParams.set(key, params[key]);
    }
    return await this.session.http.fetch(s_url);
  }
  async execute(endpoint, args) {
    let data;
    if (args && !args.protobuf) {
      data = { ...args };
      if (Reflect.has(data, "browseId") && !args.skip_auth_check) {
        if (__privateMethod(this, _Actions_instances, needsLogin_fn).call(this, data.browseId) && !this.session.logged_in)
          throw new InnertubeError("You must be signed in to perform this operation.");
      }
      if (Reflect.has(data, "skip_auth_check"))
        delete data.skip_auth_check;
      if (Reflect.has(data, "override_endpoint"))
        delete data.override_endpoint;
      if (Reflect.has(data, "parse"))
        delete data.parse;
      if (Reflect.has(data, "request"))
        delete data.request;
      if (Reflect.has(data, "clientActions"))
        delete data.clientActions;
      if (Reflect.has(data, "settingItemIdForClient"))
        delete data.settingItemIdForClient;
      if (Reflect.has(data, "action")) {
        data.actions = [data.action];
        delete data.action;
      }
      if (Reflect.has(data, "boolValue")) {
        data.newValue = { boolValue: data.boolValue };
        delete data.boolValue;
      }
      if (Reflect.has(data, "token")) {
        data.continuation = data.token;
        delete data.token;
      }
      if (data?.client === "YTMUSIC") {
        data.isAudioOnly = true;
      }
    } else if (args) {
      data = args.serialized_data;
    }
    const target_endpoint = Reflect.has(args || {}, "override_endpoint") ? args?.override_endpoint : endpoint;
    const response = await this.session.http.fetch(target_endpoint, {
      method: "POST",
      body: args?.protobuf ? data : JSON.stringify(data || {}),
      headers: {
        "Content-Type": args?.protobuf ? "application/x-protobuf" : "application/json"
      }
    });
    if (args?.parse) {
      let parsed_response = parser_exports.parseResponse(await response.json());
      if (__privateMethod(this, _Actions_instances, isBrowse_fn).call(this, parsed_response) && parsed_response.on_response_received_actions?.[0]?.type === "navigateAction") {
        const navigate_action = parsed_response.on_response_received_actions.firstOfType(NavigateAction);
        if (navigate_action) {
          parsed_response = await navigate_action.endpoint.call(this, { parse: true });
        }
      }
      return parsed_response;
    }
    return {
      success: response.ok,
      status_code: response.status,
      data: await response.json()
    };
  }
};
_Actions_instances = new WeakSet();
isBrowse_fn = /* @__PURE__ */ __name(function(response) {
  return "on_response_received_actions" in response;
}, "#isBrowse");
needsLogin_fn = /* @__PURE__ */ __name(function(id) {
  return [
    "FElibrary",
    "FEhistory",
    "FEsubscriptions",
    "FEchannels",
    "FEplaylist_aggregation",
    "FEmusic_listening_review",
    "FEmusic_library_landing",
    "SPaccount_overview",
    "SPaccount_notifications",
    "SPaccount_privacy",
    "SPtime_watched"
  ].includes(id);
}, "#needsLogin");
__name(_Actions, "Actions");
var Actions = _Actions;

// dist/src/core/OAuth2.js
var TAG3 = "OAuth2";
var _session2, _OAuth2_instances, loadFromCache_fn, http_get;
var _OAuth2 = class _OAuth2 {
  constructor(session) {
    __privateAdd(this, _OAuth2_instances);
    __privateAdd(this, _session2);
    __publicField(this, "YTTV_URL");
    __publicField(this, "AUTH_SERVER_CODE_URL");
    __publicField(this, "AUTH_SERVER_TOKEN_URL");
    __publicField(this, "AUTH_SERVER_REVOKE_TOKEN_URL");
    __publicField(this, "client_id");
    __publicField(this, "oauth2_tokens");
    __privateSet(this, _session2, session);
    this.YTTV_URL = new URL("/tv", Constants_exports.URLS.YT_BASE);
    this.AUTH_SERVER_CODE_URL = new URL("/o/oauth2/device/code", Constants_exports.URLS.YT_BASE);
    this.AUTH_SERVER_TOKEN_URL = new URL("/o/oauth2/token", Constants_exports.URLS.YT_BASE);
    this.AUTH_SERVER_REVOKE_TOKEN_URL = new URL("/o/oauth2/revoke", Constants_exports.URLS.YT_BASE);
  }
  async init(tokens) {
    if (tokens) {
      this.setTokens(tokens);
      if (this.shouldRefreshToken()) {
        await this.refreshAccessToken();
      }
      __privateGet(this, _session2).emit("auth", { credentials: this.oauth2_tokens });
      return;
    }
    const loaded_from_cache = await __privateMethod(this, _OAuth2_instances, loadFromCache_fn).call(this);
    if (loaded_from_cache) {
      Log_exports.info(TAG3, "Loaded OAuth2 tokens from cache.", this.oauth2_tokens);
      return;
    }
    if (!this.client_id)
      this.client_id = await this.getClientID();
    const device_and_user_code = await this.getDeviceAndUserCode();
    __privateGet(this, _session2).emit("auth-pending", device_and_user_code);
    this.pollForAccessToken(device_and_user_code);
  }
  setTokens(tokens) {
    const tokensMod = tokens;
    if (tokensMod.expires_in) {
      tokensMod.expiry_date = new Date(Date.now() + tokensMod.expires_in * 1e3).toISOString();
      delete tokensMod.expires_in;
    }
    if (!this.validateTokens(tokensMod))
      throw new OAuth2Error("Invalid tokens provided.");
    this.oauth2_tokens = tokensMod;
    if (tokensMod.client) {
      Log_exports.info(TAG3, "Using provided client id and secret.");
      this.client_id = tokensMod.client;
    }
  }
  async cacheCredentials() {
    const encoder = new TextEncoder();
    const data = encoder.encode(JSON.stringify(this.oauth2_tokens));
    await __privateGet(this, _session2).cache?.set("youtubei_oauth_credentials", data.buffer);
  }
  async removeCache() {
    await __privateGet(this, _session2).cache?.remove("youtubei_oauth_credentials");
  }
  pollForAccessToken(device_and_user_code) {
    if (!this.client_id)
      throw new OAuth2Error("Client ID is missing.");
    const { device_code, interval } = device_and_user_code;
    const { client_id, client_secret } = this.client_id;
    const payload = {
      client_id,
      client_secret,
      code: device_code,
      grant_type: "http://oauth.net/grant_type/device/1.0"
    };
    const connInterval = setInterval(async () => {
      const response = await __privateGet(this, _OAuth2_instances, http_get).fetch_function(this.AUTH_SERVER_TOKEN_URL, {
        body: JSON.stringify(payload),
        method: "POST",
        headers: {
          "Content-Type": "application/json"
        }
      });
      const response_data = await response.json();
      if (response_data.error) {
        switch (response_data.error) {
          case "access_denied":
            __privateGet(this, _session2).emit("auth-error", new OAuth2Error("Access was denied.", response_data));
            clearInterval(connInterval);
            break;
          case "expired_token":
            __privateGet(this, _session2).emit("auth-error", new OAuth2Error("The device code has expired.", response_data));
            clearInterval(connInterval);
            break;
          case "authorization_pending":
          case "slow_down":
            Log_exports.info(TAG3, "Polling for access token...");
            break;
          default:
            __privateGet(this, _session2).emit("auth-error", new OAuth2Error("Server returned an unexpected error.", response_data));
            clearInterval(connInterval);
            break;
        }
        return;
      }
      this.setTokens(response_data);
      __privateGet(this, _session2).emit("auth", { credentials: this.oauth2_tokens });
      clearInterval(connInterval);
    }, interval * 1e3);
  }
  async revokeCredentials() {
    if (!this.oauth2_tokens)
      throw new OAuth2Error("Access token not found");
    await this.removeCache();
    const url = this.AUTH_SERVER_REVOKE_TOKEN_URL;
    url.searchParams.set("token", this.oauth2_tokens.access_token);
    return __privateGet(this, _session2).http.fetch_function(url, { method: "POST" });
  }
  async refreshAccessToken() {
    if (!this.client_id)
      this.client_id = await this.getClientID();
    if (!this.oauth2_tokens)
      throw new OAuth2Error("No tokens available to refresh.");
    const { client_id, client_secret } = this.client_id;
    const { refresh_token } = this.oauth2_tokens;
    const payload = {
      client_id,
      client_secret,
      refresh_token,
      grant_type: "refresh_token"
    };
    const response = await __privateGet(this, _OAuth2_instances, http_get).fetch_function(this.AUTH_SERVER_TOKEN_URL, {
      body: JSON.stringify(payload),
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      }
    });
    if (!response.ok)
      throw new OAuth2Error(`Failed to refresh access token: ${response.status}`);
    const response_data = await response.json();
    if (response_data.error_code)
      throw new OAuth2Error("Authorization server returned an error", response_data);
    this.oauth2_tokens.access_token = response_data.access_token;
    this.oauth2_tokens.expiry_date = new Date(Date.now() + response_data.expires_in * 1e3).toISOString();
    __privateGet(this, _session2).emit("update-credentials", { credentials: this.oauth2_tokens });
  }
  async getDeviceAndUserCode() {
    if (!this.client_id)
      throw new OAuth2Error("Client ID is missing.");
    const { client_id } = this.client_id;
    const payload = {
      client_id,
      scope: "http://gdata.youtube.com https://www.googleapis.com/auth/youtube-paid-content",
      device_id: Platform.shim.uuidv4(),
      device_model: "ytlr::"
    };
    const response = await __privateGet(this, _OAuth2_instances, http_get).fetch_function(this.AUTH_SERVER_CODE_URL, {
      body: JSON.stringify(payload),
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      }
    });
    if (!response.ok)
      throw new OAuth2Error(`Failed to get device/user code: ${response.status}`);
    const response_data = await response.json();
    if (response_data.error_code)
      throw new OAuth2Error("Authorization server returned an error", response_data);
    return response_data;
  }
  async getClientID() {
    const yttv_response = await __privateGet(this, _OAuth2_instances, http_get).fetch_function(this.YTTV_URL, {
      headers: {
        "User-Agent": "Mozilla/5.0 (ChromiumStylePlatform) Cobalt/Version",
        "Referer": "https://www.youtube.com/tv",
        "Accept-Language": "en-US"
      }
    });
    if (!yttv_response.ok)
      throw new OAuth2Error(`Failed to get client ID: ${yttv_response.status}`);
    const yttv_response_data = await yttv_response.text();
    let script_url_body;
    if ((script_url_body = Constants_exports.OAUTH.REGEX.TV_SCRIPT.exec(yttv_response_data)) !== null) {
      Log_exports.info(TAG3, `Got YouTubeTV script URL (${script_url_body[1]})`);
      const script_response = await __privateGet(this, _OAuth2_instances, http_get).fetch(script_url_body[1], { baseURL: Constants_exports.URLS.YT_BASE });
      if (!script_response.ok)
        throw new OAuth2Error(`TV script request failed with status code ${script_response.status}`);
      const script_response_data = await script_response.text();
      const client_identity = script_response_data.match(Constants_exports.OAUTH.REGEX.CLIENT_IDENTITY);
      if (!client_identity || !client_identity.groups)
        throw new OAuth2Error("Could not obtain client ID.");
      const { client_id, client_secret } = client_identity.groups;
      Log_exports.info(TAG3, `Client identity retrieved (clientId=${client_id}, clientSecret=${client_secret}).`);
      return {
        client_id,
        client_secret
      };
    }
    throw new OAuth2Error("Could not obtain script URL.");
  }
  shouldRefreshToken() {
    if (!this.oauth2_tokens)
      return false;
    return Date.now() > new Date(this.oauth2_tokens.expiry_date).getTime();
  }
  validateTokens(tokens) {
    return !(!tokens.access_token || !tokens.refresh_token || !tokens.expiry_date);
  }
};
_session2 = new WeakMap();
_OAuth2_instances = new WeakSet();
loadFromCache_fn = /* @__PURE__ */ __name(async function() {
  const data = await __privateGet(this, _session2).cache?.get("youtubei_oauth_credentials");
  if (!data)
    return false;
  const decoder = new TextDecoder();
  const credentials = JSON.parse(decoder.decode(data));
  this.setTokens(credentials);
  __privateGet(this, _session2).emit("auth", { credentials });
  return true;
}, "#loadFromCache");
http_get = /* @__PURE__ */ __name(function() {
  return __privateGet(this, _session2).http;
}, "#http");
__name(_OAuth2, "OAuth2");
var OAuth2 = _OAuth2;

// dist/src/core/Player.js
var TAG4 = "Player";
var _Player = class _Player {
  constructor(player_id, signature_timestamp, data) {
    __publicField(this, "player_id");
    __publicField(this, "signature_timestamp");
    __publicField(this, "data");
    __publicField(this, "po_token");
    this.player_id = player_id;
    this.signature_timestamp = signature_timestamp;
    this.data = data;
  }
  static async create(cache, fetch2 = Platform.shim.fetch, po_token, player_id) {
    if (!player_id) {
      const url = new URL("/iframe_api", Constants_exports.URLS.YT_BASE);
      const res = await fetch2(url);
      if (!res.ok)
        throw new PlayerError(`Failed to get player id: ${res.status} (${res.statusText})`);
      const js = await res.text();
      player_id = getStringBetweenStrings(js, "player\\/", "\\/");
    }
    Log_exports.info(TAG4, `Using player id (${player_id}). Checking for cached players..`);
    if (!player_id)
      throw new PlayerError("Failed to get player id");
    if (cache) {
      const cached_player = await _Player.fromCache(cache, player_id);
      if (cached_player) {
        Log_exports.info(TAG4, "Found up-to-date player data in cache.");
        cached_player.po_token = po_token;
        return cached_player;
      }
    }
    const player_url = new URL(`/s/player/${player_id}/player_es6.vflset/en_US/base.js`, Constants_exports.URLS.YT_BASE);
    Log_exports.info(TAG4, `Could not find any cached player. Will download a new player from ${player_url}.`);
    const player_res = await fetch2(player_url, {
      headers: {
        "user-agent": getRandomUserAgent("desktop")
      }
    });
    if (!player_res.ok) {
      throw new PlayerError(`Failed to get player data: ${player_res.status}`);
    }
    const player_js = await player_res.text();
    const nsigFunctionName = "nsigFunction";
    const timestampVarName = "signatureTimestampVar";
    const extractions = [
      { friendlyName: nsigFunctionName, match: nsigMatcher },
      { friendlyName: timestampVarName, match: timestampMatcher, collectDependencies: false }
    ];
    const jsAnalyzer = new JsAnalyzer(player_js, { extractions });
    const jsExtractor = new JsExtractor(jsAnalyzer);
    const result = jsExtractor.buildScript({
      disallowSideEffectInitializers: true,
      exportRawValues: true,
      rawValueOnly: [timestampVarName]
    });
    if (result.exportedRawValues && !(timestampVarName in result.exportedRawValues)) {
      Log_exports.warn(TAG4, "Failed to extract signature timestamp.");
    }
    if (!result.exported.includes(nsigFunctionName)) {
      Log_exports.warn(TAG4, "Failed to extract n/sig decipher function.");
    }
    const signatureTimestamp = result.exportedRawValues?.[timestampVarName];
    const player = await _Player.fromSource(player_id, {
      cache,
      signature_timestamp: parseInt(signatureTimestamp) || 0,
      data: result
    });
    player.po_token = po_token;
    return player;
  }
  async decipher(url, signature_cipher, cipher, this_response_nsig_cache) {
    url = url || signature_cipher || cipher;
    if (!url)
      throw new PlayerError("No valid URL to decipher");
    const args = new URLSearchParams(url);
    const url_components = new URL(args.get("url") || url);
    const n = url_components.searchParams.get("n");
    const s = args.get("s");
    const sp = args.get("sp");
    if (this.data && (signature_cipher || cipher || n)) {
      const eval_args = {};
      if (signature_cipher || cipher) {
        eval_args.sig = s;
        eval_args.sp = sp;
      }
      if (n) {
        if (this_response_nsig_cache?.has(n)) {
          const nsig = this_response_nsig_cache.get(n);
          url_components.searchParams.set("n", nsig);
        } else {
          eval_args.n = n;
        }
      }
      if (Object.keys(eval_args).length > 0) {
        const data = { ...this.data };
        data.output = `${data.output}
${getNsigProcessorFn(eval_args.n, eval_args.sp, eval_args.sig)}`;
        const result2 = await Platform.shim.eval(data, eval_args);
        if (typeof result2 !== "object" || result2 === null) {
          throw new PlayerError("Got invalid result from player script evaluation.");
        }
        if (typeof eval_args.sig === "string") {
          const signatureResult = result2.sig;
          Log_exports.info(TAG4, `Transformed signature from ${s} to ${signatureResult}.`);
          if (typeof signatureResult !== "string")
            throw new PlayerError("Got invalid signature from player script evaluation.");
          if (sp) {
            url_components.searchParams.set(sp, signatureResult);
          } else {
            url_components.searchParams.set("signature", signatureResult);
          }
        }
        if (typeof eval_args.n === "string") {
          const nResult = result2.n;
          Log_exports.info(TAG4, `Transformed n from ${n} to ${nResult}.`);
          if (typeof nResult !== "string")
            throw new PlayerError("Failed to decipher nsig");
          if (nResult.startsWith("enhanced_except_")) {
            Log_exports.warn(TAG4, `Decipher script returned an error (n=${n}):`, nResult);
          } else if (this_response_nsig_cache) {
            this_response_nsig_cache.set(n, nResult);
          }
          url_components.searchParams.set("n", nResult);
        }
      }
    }
    if (url_components.searchParams.get("sabr") !== "1" && this.po_token)
      url_components.searchParams.set("pot", this.po_token);
    const client = url_components.searchParams.get("c");
    switch (client) {
      case "WEB":
        url_components.searchParams.set("cver", Constants_exports.CLIENTS.WEB.VERSION);
        break;
      case "MWEB":
        url_components.searchParams.set("cver", Constants_exports.CLIENTS.MWEB.VERSION);
        break;
      case "WEB_REMIX":
        url_components.searchParams.set("cver", Constants_exports.CLIENTS.YTMUSIC.VERSION);
        break;
      case "WEB_KIDS":
        url_components.searchParams.set("cver", Constants_exports.CLIENTS.WEB_KIDS.VERSION);
        break;
      case "TVHTML5":
        url_components.searchParams.set("cver", Constants_exports.CLIENTS.TV.VERSION);
        break;
      case "TVHTML5_SIMPLY":
        url_components.searchParams.set("cver", Constants_exports.CLIENTS.TV_SIMPLY.VERSION);
        break;
      case "TVHTML5_SIMPLY_EMBEDDED_PLAYER":
        url_components.searchParams.set("cver", Constants_exports.CLIENTS.TV_EMBEDDED.VERSION);
        break;
      case "WEB_EMBEDDED_PLAYER":
        url_components.searchParams.set("cver", Constants_exports.CLIENTS.WEB_EMBEDDED.VERSION);
        break;
    }
    const result = url_components.toString();
    Log_exports.info(TAG4, `Deciphered URL: ${result}`);
    return url_components.toString();
  }
  static async fromCache(cache, player_id) {
    const buffer = await cache.get(player_id);
    if (!buffer)
      return null;
    try {
      const deserializedCache = BinarySerializer_exports.deserialize(new Uint8Array(buffer));
      if (deserializedCache.libraryVersion !== package_default.version) {
        Log_exports.warn(TAG4, `Cached player data is from a different library version (${deserializedCache.libraryVersion}). Ignoring it.`);
        return null;
      }
      return new _Player(deserializedCache.playerId, deserializedCache.signatureTimestamp, deserializedCache.data);
    } catch (e) {
      Log_exports.error(TAG4, "Failed to deserialize player data from cache:", e);
      return null;
    }
  }
  static async fromSource(player_id, options) {
    const player = new _Player(player_id, options.signature_timestamp, options.data);
    await player.cache(options.cache);
    return player;
  }
  async cache(cache) {
    if (!cache || !this.data)
      return;
    const buffer = BinarySerializer_exports.serialize({
      playerId: this.player_id,
      signatureTimestamp: this.signature_timestamp,
      libraryVersion: package_default.version,
      data: this.data
    });
    await cache.set(this.player_id, buffer);
  }
  get url() {
    return new URL(`/s/player/${this.player_id}/player_ias.vflset/en_US/base.js`, Constants_exports.URLS.YT_BASE).toString();
  }
  static get LIBRARY_VERSION() {
    return 14;
  }
};
__name(_Player, "Player");
var Player = _Player;

// dist/src/core/Session.js
var ClientType = {
  WEB: "WEB",
  MWEB: "MWEB",
  KIDS: "WEB_KIDS",
  MUSIC: "WEB_REMIX",
  IOS: "iOS",
  ANDROID: "ANDROID",
  ANDROID_VR: "ANDROID_VR",
  ANDROID_MUSIC: "ANDROID_MUSIC",
  ANDROID_CREATOR: "ANDROID_CREATOR",
  TV: "TVHTML5",
  TV_SIMPLY: "TVHTML5_SIMPLY",
  TV_EMBEDDED: "TVHTML5_SIMPLY_EMBEDDED_PLAYER",
  WEB_EMBEDDED: "WEB_EMBEDDED_PLAYER",
  WEB_CREATOR: "WEB_CREATOR"
};
var TAG5 = "Session";
var _Session_static, storeSession_fn, getSessionData_fn, buildContext_fn, getVisitorID_fn;
var _Session = class _Session extends EventEmitterLike {
  constructor(context, api_key, api_version, account_index, config_data, player, cookie, fetch2, cache, po_token) {
    super();
    __publicField(this, "context");
    __publicField(this, "api_key");
    __publicField(this, "api_version");
    __publicField(this, "account_index");
    __publicField(this, "config_data");
    __publicField(this, "player");
    __publicField(this, "cookie");
    __publicField(this, "cache");
    __publicField(this, "po_token");
    __publicField(this, "oauth");
    __publicField(this, "http");
    __publicField(this, "logged_in");
    __publicField(this, "actions");
    __publicField(this, "user_agent");
    this.context = context;
    this.api_key = api_key;
    this.api_version = api_version;
    this.account_index = account_index;
    this.config_data = config_data;
    this.player = player;
    this.cookie = cookie;
    this.cache = cache;
    this.po_token = po_token;
    this.http = new HTTPClient(this, cookie, fetch2);
    this.actions = new Actions(this);
    this.oauth = new OAuth2(this);
    this.logged_in = !!cookie;
    this.user_agent = context.client.userAgent;
  }
  on(type, listener) {
    super.on(type, listener);
  }
  once(type, listener) {
    super.once(type, listener);
  }
  static async create(options = {}) {
    const { context, api_key, api_version, account_index, config_data } = await _Session.getSessionData(options.lang, options.location, options.account_index, options.visitor_data, options.user_agent, options.enable_safety_mode, options.generate_session_locally, options.fail_fast, options.device_category, options.client_type, options.timezone, options.fetch, options.on_behalf_of_user, options.cache, options.enable_session_cache, options.po_token, options.retrieve_innertube_config);
    return new _Session(context, api_key, api_version, account_index, config_data, options.retrieve_player === false ? void 0 : await Player.create(options.cache, options.fetch, options.po_token, options.player_id), options.cookie, options.fetch, options.cache, options.po_token);
  }
  /**
   * Retrieves session data from cache.
   * @param cache - A valid cache implementation.
   * @param session_args - User provided session arguments.
   */
  static async fromCache(cache, session_args) {
    const buffer = await cache.get("innertube_session_data");
    if (!buffer)
      return null;
    try {
      const session_data = BinarySerializer_exports.deserialize(new Uint8Array(buffer));
      if (session_data.library_version !== parseInt(package_default.version.split(".", 1)[0])) {
        Log_exports.warn(TAG5, `Cached session data is from a different library version (${session_data.library_version}). Regenerating session data.`);
        return null;
      }
      if (session_args.visitor_data) {
        session_data.context.client.visitorData = session_args.visitor_data;
      }
      if (session_args.lang)
        session_data.context.client.hl = session_args.lang;
      if (session_args.location)
        session_data.context.client.gl = session_args.location;
      if (session_args.on_behalf_of_user)
        session_data.context.user.onBehalfOfUser = session_args.on_behalf_of_user;
      if (session_args.user_agent)
        session_data.context.client.userAgent = session_args.user_agent;
      if (session_args.client_name) {
        const client = Object.values(CLIENTS).find((c) => c.NAME === session_args.client_name);
        if (client) {
          session_data.context.client.clientName = client.NAME;
          session_data.context.client.clientVersion = client.VERSION;
        } else
          Log_exports.warn(TAG5, `Unknown client name: ${session_args.client_name}.`);
      }
      session_data.context.client.timeZone = session_args.time_zone;
      session_data.context.client.platform = session_args.device_category.toUpperCase();
      session_data.context.user.enableSafetyMode = session_args.enable_safety_mode;
      return session_data;
    } catch (error2) {
      Log_exports.error(TAG5, "Failed to deserialize session data from cache.", error2);
      return null;
    }
  }
  static async getSessionData(lang = "", location = "", account_index = 0, visitor_data = "", user_agent = getRandomUserAgent("desktop"), enable_safety_mode = false, generate_session_locally = false, fail_fast = false, device_category = "desktop", client_name = ClientType.WEB, tz = Intl.DateTimeFormat().resolvedOptions().timeZone, fetch2 = Platform.shim.fetch, on_behalf_of_user, cache, enable_session_cache = true, po_token, retrieve_innertube_config = true) {
    const session_args = {
      lang,
      location,
      time_zone: tz,
      user_agent,
      device_category,
      client_name,
      enable_safety_mode,
      visitor_data,
      on_behalf_of_user,
      po_token
    };
    let session_data;
    if (cache && enable_session_cache) {
      const cached_session_data = await this.fromCache(cache, session_args);
      if (cached_session_data) {
        Log_exports.info(TAG5, "Found session data in cache.");
        session_data = cached_session_data;
      }
    }
    if (!session_data) {
      Log_exports.info(TAG5, "Generating session data.");
      let api_key = CLIENTS.WEB.API_KEY;
      let api_version = CLIENTS.WEB.API_VERSION;
      let context_data = {
        hl: lang || "en",
        gl: location || "US",
        remote_host: "",
        user_agent,
        visitor_data: visitor_data || ProtoUtils_exports.encodeVisitorData(generateRandomString(11), Math.floor(Date.now() / 1e3)),
        client_name,
        client_version: Object.values(CLIENTS).find((v) => v.NAME === client_name)?.VERSION ?? CLIENTS.WEB.VERSION,
        device_category: device_category.toUpperCase(),
        os_name: "Windows",
        os_version: "10.0",
        time_zone: tz,
        browser_name: "Chrome",
        browser_version: "125.0.0.0",
        device_make: "",
        device_model: "",
        enable_safety_mode
      };
      if (!generate_session_locally) {
        try {
          const sw_session_data = await __privateMethod(this, _Session_static, getSessionData_fn).call(this, session_args, fetch2);
          api_key = sw_session_data.api_key;
          api_version = sw_session_data.api_version;
          context_data = sw_session_data.context_data;
        } catch (error2) {
          if (fail_fast)
            throw error2;
          Log_exports.error(TAG5, "Failed to retrieve session data from server. Session data generated locally will be used instead.", error2);
        }
      }
      if (on_behalf_of_user) {
        context_data.on_behalf_of_user = on_behalf_of_user;
      }
      session_data = {
        api_key,
        api_version,
        context: __privateMethod(this, _Session_static, buildContext_fn).call(this, context_data)
      };
      if (retrieve_innertube_config) {
        try {
          Log_exports.info(TAG5, "Retrieving InnerTube config data.");
          const config_headers = {
            "Accept-Language": lang,
            "Accept": "*/*",
            "Referer": URLS.YT_BASE,
            "X-Goog-Visitor-Id": context_data.visitor_data,
            "X-Origin": URLS.YT_BASE,
            "X-Youtube-Client-Version": context_data.client_version
          };
          if (Platform.shim.server) {
            config_headers["User-Agent"] = user_agent;
            config_headers["Origin"] = URLS.YT_BASE;
          }
          const config = await fetch2(`${URLS.API.PRODUCTION_1}v1/config?prettyPrint=false`, {
            headers: config_headers,
            method: "POST",
            body: JSON.stringify({ context: session_data.context })
          });
          const configJson = await config.json();
          const coldConfigData = configJson.responseContext?.globalConfigGroup?.rawColdConfigGroup?.configData;
          const coldHashData = configJson.responseContext?.globalConfigGroup?.coldHashData;
          const hotHashData = configJson.responseContext?.globalConfigGroup?.hotHashData;
          session_data.config_data = configJson.configData;
          session_data.context.client.configInfo = {
            ...session_data.context.client.configInfo,
            coldConfigData,
            coldHashData,
            hotHashData
          };
        } catch (error2) {
          Log_exports.error(TAG5, "Failed to retrieve config data.", error2);
        }
      }
      if (enable_session_cache)
        await __privateMethod(this, _Session_static, storeSession_fn).call(this, session_data, cache);
    }
    Log_exports.debug(TAG5, "Session data:", session_data);
    return { ...session_data, account_index };
  }
  async signIn(credentials) {
    return new Promise(async (resolve, reject) => {
      const error_handler = /* @__PURE__ */ __name((err) => reject(err), "error_handler");
      this.once("auth-error", error_handler);
      this.once("auth", () => {
        this.off("auth-error", error_handler);
        this.logged_in = true;
        resolve();
      });
      try {
        await this.oauth.init(credentials);
      } catch (err) {
        reject(err);
      }
    });
  }
  /**
   * Signs out of the current account and revokes the credentials.
   */
  async signOut() {
    if (!this.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const response = await this.oauth.revokeCredentials();
    this.logged_in = false;
    return response;
  }
  get client_version() {
    return this.context.client.clientVersion;
  }
  get client_name() {
    return this.context.client.clientName;
  }
  get lang() {
    return this.context.client.hl;
  }
};
_Session_static = new WeakSet();
storeSession_fn = /* @__PURE__ */ __name(async function(session_data, cache) {
  if (!cache)
    return;
  Log_exports.info(TAG5, "Compressing and caching session data.");
  const buffer = BinarySerializer_exports.serialize({
    ...session_data,
    library_version: parseInt(package_default.version)
  });
  await cache.set("innertube_session_data", buffer);
}, "#storeSession");
getSessionData_fn = /* @__PURE__ */ __name(async function(options, fetch2 = Platform.shim.fetch) {
  let visitor_id = generateRandomString(11);
  if (options.visitor_data)
    visitor_id = __privateMethod(this, _Session_static, getVisitorID_fn).call(this, options.visitor_data);
  const url = new URL("/sw.js_data", URLS.YT_BASE);
  const res = await fetch2(url, {
    headers: {
      "Accept-Language": options.lang || "en-US",
      "User-Agent": options.user_agent,
      "Accept": "*/*",
      "Referer": `${URLS.YT_BASE}/sw.js`,
      "Cookie": `PREF=tz=${options.time_zone.replace("/", ".")};VISITOR_INFO1_LIVE=${visitor_id};`
    }
  });
  if (!res.ok)
    throw new SessionError(`Failed to retrieve session data: ${res.status}`);
  const text = await res.text();
  if (!text.startsWith(")]}'"))
    throw new SessionError("Invalid JSPB response");
  const data = JSON.parse(text.replace(/^\)\]\}'/, ""));
  const ytcfg = data[0][2];
  const api_version = CLIENTS.WEB.API_VERSION;
  const [[device_info], api_key] = ytcfg;
  const config_info = device_info[61];
  const app_install_data = config_info[config_info.length - 1];
  const context_info = {
    hl: options.lang || device_info[0],
    gl: options.location || device_info[1],
    remote_host: device_info[3],
    visitor_data: options.visitor_data || device_info[13],
    user_agent: options.user_agent,
    client_name: options.client_name,
    client_version: options.client_name === "WEB" ? device_info[16] : Object.values(CLIENTS).find((c) => c.NAME === options.client_name)?.VERSION || device_info[16],
    os_name: device_info[17],
    os_version: device_info[18],
    time_zone: device_info[79] || options.time_zone,
    device_category: options.device_category,
    browser_name: device_info[86],
    browser_version: device_info[87],
    device_make: device_info[11],
    device_model: device_info[12],
    app_install_data,
    device_experiment_id: device_info[103],
    rollout_token: device_info[107],
    enable_safety_mode: options.enable_safety_mode
  };
  return { context_data: context_info, api_key, api_version };
}, "#getSessionData");
buildContext_fn = /* @__PURE__ */ __name(function(args) {
  const context = {
    client: {
      hl: args.hl || "en",
      gl: args.gl || "US",
      remoteHost: args.remote_host,
      screenDensityFloat: 1,
      screenHeightPoints: 1440,
      screenPixelDensity: 1,
      screenWidthPoints: 2560,
      visitorData: args.visitor_data,
      clientName: args.client_name,
      clientVersion: args.client_version,
      osName: args.os_name,
      osVersion: args.os_version,
      userAgent: args.user_agent,
      platform: args.device_category.toUpperCase(),
      clientFormFactor: "UNKNOWN_FORM_FACTOR",
      userInterfaceTheme: "USER_INTERFACE_THEME_LIGHT",
      timeZone: args.time_zone,
      originalUrl: URLS.YT_BASE,
      deviceMake: args.device_make,
      deviceModel: args.device_model,
      browserName: args.browser_name,
      browserVersion: args.browser_version,
      utcOffsetMinutes: -Math.floor((/* @__PURE__ */ new Date()).getTimezoneOffset()),
      memoryTotalKbytes: "8000000",
      rolloutToken: args.rollout_token,
      deviceExperimentId: args.device_experiment_id,
      mainAppWebInfo: {
        graftUrl: URLS.YT_BASE,
        pwaInstallabilityStatus: "PWA_INSTALLABILITY_STATUS_UNKNOWN",
        webDisplayMode: "WEB_DISPLAY_MODE_BROWSER",
        isWebNativeShareAvailable: true
      }
    },
    user: {
      enableSafetyMode: args.enable_safety_mode,
      lockedSafetyMode: false
    },
    request: {
      useSsl: true,
      internalExperimentFlags: []
    }
  };
  if (args.app_install_data)
    context.client.configInfo = { appInstallData: args.app_install_data };
  if (args.on_behalf_of_user)
    context.user.onBehalfOfUser = args.on_behalf_of_user;
  return context;
}, "#buildContext");
getVisitorID_fn = /* @__PURE__ */ __name(function(visitor_data) {
  const decoded_visitor_data = ProtoUtils_exports.decodeVisitorData(visitor_data);
  return decoded_visitor_data.id;
}, "#getVisitorID");
__privateAdd(_Session, _Session_static);
__name(_Session, "Session");
var Session = _Session;

// dist/src/core/clients/index.js
var clients_exports = {};
__export(clients_exports, {
  Kids: () => Kids,
  Music: () => Music,
  Studio: () => Studio
});

// dist/src/core/clients/Kids.js
var _session3;
var _Kids = class _Kids {
  constructor(session) {
    __privateAdd(this, _session3);
    __privateSet(this, _session3, session);
  }
  async search(query) {
    const search_endpoint = new NavigationEndpoint({ searchEndpoint: { query } });
    const response = await search_endpoint.call(__privateGet(this, _session3).actions, { client: "YTKIDS" });
    return new Search3(__privateGet(this, _session3).actions, response);
  }
  async getInfo(video_id, options) {
    const payload = { videoId: video_id };
    const watch_endpoint = new NavigationEndpoint({ watchEndpoint: payload });
    const watch_next_endpoint = new NavigationEndpoint({ watchNextEndpoint: payload });
    const session = __privateGet(this, _session3);
    const extra_payload = {
      playbackContext: {
        contentPlaybackContext: {
          vis: 0,
          splay: false,
          lactMilliseconds: "-1",
          signatureTimestamp: session.player?.signature_timestamp
        }
      },
      client: "YTKIDS"
    };
    if (options?.po_token) {
      extra_payload.serviceIntegrityDimensions = {
        poToken: options.po_token
      };
    } else if (session.po_token) {
      extra_payload.serviceIntegrityDimensions = {
        poToken: session.po_token
      };
    }
    const watch_response = watch_endpoint.call(session.actions, extra_payload);
    const watch_next_response = watch_next_endpoint.call(session.actions, { client: "YTKIDS" });
    const response = await Promise.all([watch_response, watch_next_response]);
    const cpn = generateRandomString(16);
    return new VideoInfo2(response, session.actions, cpn);
  }
  async getChannel(channel_id) {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: channel_id } });
    const response = await browse_endpoint.call(__privateGet(this, _session3).actions, { client: "YTKIDS" });
    return new Channel3(__privateGet(this, _session3).actions, response);
  }
  async getHomeFeed() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEkids_home" } });
    const response = await browse_endpoint.call(__privateGet(this, _session3).actions, { client: "YTKIDS" });
    return new HomeFeed3(__privateGet(this, _session3).actions, response);
  }
  /**
   * Retrieves the list of supervised accounts that the signed-in user has
   * access to, and blocks the given channel for each of them.
   * @param channel_id - The channel id to block.
   * @returns A list of API responses.
   */
  async blockChannel(channel_id) {
    const session = __privateGet(this, _session3);
    if (!session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const kids_blocklist_picker_command = new NavigationEndpoint({
      getKidsBlocklistPickerCommand: {
        blockedForKidsContent: {
          external_channel_id: channel_id
        }
      }
    });
    const response = await kids_blocklist_picker_command.call(session.actions, { client: "YTKIDS" });
    const popup = response.data.command.confirmDialogEndpoint;
    const popup_fragment = { contents: popup.content, engagementPanels: [] };
    const kid_picker = parser_exports.parseResponse(popup_fragment);
    const kids = kid_picker.contents_memo?.getType(KidsBlocklistPickerItem);
    if (!kids)
      throw new InnertubeError("Could not find any kids profiles or supervised accounts.");
    const responses = [];
    for (const kid of kids) {
      if (!kid.block_button?.is_toggled) {
        kid.setActions(session.actions);
        responses.push(await kid.blockChannel());
      }
    }
    return responses;
  }
};
_session3 = new WeakMap();
__name(_Kids, "Kids");
var Kids = _Kids;

// dist/src/core/clients/Music.js
var _session4, _actions21, _Music_instances, fetchInfoFromVideoId_fn, fetchInfoFromEndpoint_fn;
var _Music = class _Music {
  constructor(session) {
    __privateAdd(this, _Music_instances);
    __privateAdd(this, _session4);
    __privateAdd(this, _actions21);
    __privateSet(this, _session4, session);
    __privateSet(this, _actions21, session.actions);
  }
  /**
   * Retrieves track info. Passing a list item of type MusicTwoRowItem automatically starts a radio.
   * @param target - Video id or a list item.
   * @param options - Options for fetching video info.
   */
  getInfo(target, options) {
    if (target instanceof MusicTwoRowItem) {
      return __privateMethod(this, _Music_instances, fetchInfoFromEndpoint_fn).call(this, target.endpoint, options);
    } else if (target instanceof MusicResponsiveListItem) {
      return __privateMethod(this, _Music_instances, fetchInfoFromEndpoint_fn).call(this, target.overlay?.content?.endpoint ?? target.endpoint, options);
    } else if (target instanceof NavigationEndpoint) {
      return __privateMethod(this, _Music_instances, fetchInfoFromEndpoint_fn).call(this, target, options);
    }
    return __privateMethod(this, _Music_instances, fetchInfoFromVideoId_fn).call(this, target, options);
  }
  async search(query, filters = {}) {
    throwIfMissing({ query });
    let params;
    if (filters.type && filters.type !== "all") {
      const writer = SearchFilter.encode({
        filters: {
          musicSearchType: {
            [filters.type]: true
          }
        }
      });
      params = encodeURIComponent(u8ToBase64(writer.finish()));
    }
    const search_endpoint = new NavigationEndpoint({ searchEndpoint: { query, params } });
    const response = await search_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC" });
    return new Search2(response, __privateGet(this, _actions21), Reflect.has(filters, "type") && filters.type !== "all");
  }
  async getHomeFeed() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEmusic_home" } });
    const response = await browse_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC" });
    return new HomeFeed2(response, __privateGet(this, _actions21));
  }
  async getExplore() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEmusic_explore" } });
    const response = await browse_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC" });
    return new Explore(response);
  }
  async getLibrary() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEmusic_library_landing" } });
    const response = await browse_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC" });
    return new Library2(response, __privateGet(this, _actions21));
  }
  async getArtist(artist_id) {
    if (!artist_id || !artist_id.startsWith("UC") && !artist_id.startsWith("FEmusic_library_privately_owned_artist"))
      throw new InnertubeError("Invalid artist id", artist_id);
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: artist_id } });
    const response = await browse_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC" });
    return new Artist(response, __privateGet(this, _actions21));
  }
  async getAlbum(album_id) {
    if (!album_id || !album_id.startsWith("MPR") && !album_id.startsWith("FEmusic_library_privately_owned_release"))
      throw new InnertubeError("Invalid album id", album_id);
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: album_id } });
    const response = await browse_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC" });
    return new Album(response);
  }
  async getPlaylist(playlist_id) {
    if (!playlist_id.startsWith("VL"))
      playlist_id = `VL${playlist_id}`;
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: playlist_id } });
    const response = await browse_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC" });
    return new Playlist3(response, __privateGet(this, _actions21));
  }
  async getUpNext(video_id, automix = true) {
    throwIfMissing({ video_id });
    const watch_next_endpoint = new NavigationEndpoint({ watchNextEndpoint: { videoId: video_id } });
    const response = await watch_next_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC", parse: true });
    const tabs = response.contents_memo?.getType(Tab);
    const tab = tabs?.[0];
    if (!tab)
      throw new InnertubeError("Could not find target tab.");
    const music_queue = tab.content?.as(MusicQueue);
    if (!music_queue || !music_queue.content)
      throw new InnertubeError("Music queue was empty, the given id is probably invalid.", music_queue);
    const playlist_panel = music_queue.content.as(PlaylistPanel);
    if (!playlist_panel.playlist_id && automix) {
      const automix_preview_video = playlist_panel.contents.firstOfType(AutomixPreviewVideo);
      if (!automix_preview_video)
        throw new InnertubeError("Automix item not found");
      const page = await automix_preview_video.playlist_video?.endpoint.call(__privateGet(this, _actions21), {
        videoId: video_id,
        client: "YTMUSIC",
        parse: true
      });
      if (!page || !page.contents_memo)
        throw new InnertubeError("Could not fetch automix");
      return page.contents_memo.getType(PlaylistPanel)[0];
    }
    return playlist_panel;
  }
  async getRelated(video_id) {
    throwIfMissing({ video_id });
    const watch_next_endpoint = new NavigationEndpoint({ watchNextEndpoint: { videoId: video_id } });
    const response = await watch_next_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC", parse: true });
    const tabs = response.contents_memo?.getType(Tab);
    const tab = tabs?.find((tab2) => tab2.endpoint.payload.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType === "MUSIC_PAGE_TYPE_TRACK_RELATED");
    if (!tab)
      throw new InnertubeError("Could not find target tab.");
    const page = await tab.endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC", parse: true });
    if (!page.contents)
      throw new InnertubeError("Unexpected response", page);
    return page.contents.item().as(SectionList, Message);
  }
  async getLyrics(video_id) {
    throwIfMissing({ video_id });
    const watch_next_endpoint = new NavigationEndpoint({ watchNextEndpoint: { videoId: video_id } });
    const response = await watch_next_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC", parse: true });
    const tabs = response.contents_memo?.getType(Tab);
    const tab = tabs?.find((tab2) => tab2.endpoint.payload.browseEndpointContextSupportedConfigs?.browseEndpointContextMusicConfig?.pageType === "MUSIC_PAGE_TYPE_TRACK_LYRICS");
    if (!tab)
      throw new InnertubeError("Could not find target tab.");
    const page = await tab.endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC", parse: true });
    if (!page.contents)
      throw new InnertubeError("Unexpected response", page);
    if (page.contents.item().type === "Message")
      throw new InnertubeError(page.contents.item().as(Message).text.toString(), video_id);
    const section_list = page.contents.item().as(SectionList).contents;
    return section_list.firstOfType(MusicDescriptionShelf);
  }
  async getRecap() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEmusic_listening_review" } });
    const response = await browse_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC" });
    return new Recap(response, __privateGet(this, _actions21));
  }
  async getSearchSuggestions(input) {
    const response = await __privateGet(this, _actions21).execute("/music/get_search_suggestions", {
      input,
      client: "YTMUSIC",
      parse: true
    });
    if (!response.contents_memo)
      return [];
    return response.contents_memo.getType(SearchSuggestionsSection);
  }
};
_session4 = new WeakMap();
_actions21 = new WeakMap();
_Music_instances = new WeakSet();
fetchInfoFromVideoId_fn = /* @__PURE__ */ __name(async function(video_id, options) {
  const payload = { videoId: video_id, racyCheckOk: true, contentCheckOk: true };
  const watch_endpoint = new NavigationEndpoint({ watchEndpoint: payload });
  const watch_next_endpoint = new NavigationEndpoint({ watchNextEndpoint: payload });
  const extra_payload = {
    playbackContext: {
      contentPlaybackContext: {
        vis: 0,
        splay: false,
        lactMilliseconds: "-1",
        signatureTimestamp: __privateGet(this, _session4).player?.signature_timestamp
      }
    },
    client: "YTMUSIC"
  };
  if (options?.po_token) {
    extra_payload.serviceIntegrityDimensions = {
      poToken: options.po_token
    };
  } else if (__privateGet(this, _session4).po_token) {
    extra_payload.serviceIntegrityDimensions = {
      poToken: __privateGet(this, _session4).po_token
    };
  }
  const watch_response = watch_endpoint.call(__privateGet(this, _actions21), extra_payload);
  const watch_next_response = watch_next_endpoint.call(__privateGet(this, _actions21), { client: "YTMUSIC" });
  const response = await Promise.all([watch_response, watch_next_response]);
  const cpn = generateRandomString(16);
  return new TrackInfo_default(response, __privateGet(this, _actions21), cpn);
}, "#fetchInfoFromVideoId");
fetchInfoFromEndpoint_fn = /* @__PURE__ */ __name(async function(endpoint, options) {
  if (!endpoint)
    throw new Error("This item does not have an endpoint.");
  const extra_payload = {
    playbackContext: {
      contentPlaybackContext: {
        vis: 0,
        splay: false,
        lactMilliseconds: "-1",
        signatureTimestamp: __privateGet(this, _session4).player?.signature_timestamp
      }
    },
    client: "YTMUSIC"
  };
  if (options?.po_token) {
    extra_payload.serviceIntegrityDimensions = {
      poToken: options.po_token
    };
  } else if (__privateGet(this, _session4).po_token) {
    extra_payload.serviceIntegrityDimensions = {
      poToken: __privateGet(this, _session4).po_token
    };
  }
  const player_response = endpoint.call(__privateGet(this, _actions21), extra_payload);
  const next_response = endpoint.call(__privateGet(this, _actions21), {
    client: "YTMUSIC",
    enablePersistentPlaylistPanel: true,
    override_endpoint: "/next"
  });
  const cpn = generateRandomString(16);
  const response = await Promise.all([player_response, next_response]);
  return new TrackInfo_default(response, __privateGet(this, _actions21), cpn);
}, "#fetchInfoFromEndpoint");
__name(_Music, "Music");
var Music = _Music;

// dist/protos/generated/youtube/api/pfiinnertube/capability_info.js
function createBaseCapabilityInfo() {
  return { profile: void 0, supportedCapabilities: [], disabledCapabilities: [], snapshot: void 0 };
}
__name(createBaseCapabilityInfo, "createBaseCapabilityInfo");
var CapabilityInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.profile !== void 0) {
      writer.uint32(10).string(message.profile);
    }
    for (const v of message.supportedCapabilities) {
      InnerTubeCapability.encode(v, writer.uint32(18).fork()).join();
    }
    for (const v of message.disabledCapabilities) {
      InnerTubeCapability.encode(v, writer.uint32(26).fork()).join();
    }
    if (message.snapshot !== void 0) {
      writer.uint32(42).string(message.snapshot);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseCapabilityInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.profile = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.supportedCapabilities.push(InnerTubeCapability.decode(reader, reader.uint32()));
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.disabledCapabilities.push(InnerTubeCapability.decode(reader, reader.uint32()));
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.snapshot = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseInnerTubeCapability() {
  return { capability: void 0, features: void 0, experimentFlags: void 0 };
}
__name(createBaseInnerTubeCapability, "createBaseInnerTubeCapability");
var InnerTubeCapability = {
  encode(message, writer = new BinaryWriter()) {
    if (message.capability !== void 0) {
      writer.uint32(8).uint32(message.capability);
    }
    if (message.features !== void 0) {
      writer.uint32(16).uint32(message.features);
    }
    if (message.experimentFlags !== void 0) {
      writer.uint32(50).string(message.experimentFlags);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseInnerTubeCapability();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.capability = reader.uint32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.features = reader.uint32();
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.experimentFlags = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};

// dist/protos/generated/youtube/api/pfiinnertube/client_info.js
function createBaseClientInfo() {
  return {
    hl: void 0,
    gl: void 0,
    remoteHost: void 0,
    deviceId: void 0,
    debugDeviceIdOverride: void 0,
    carrierGeo: void 0,
    crackedHl: void 0,
    deviceMake: void 0,
    deviceModel: void 0,
    visitorData: void 0,
    userAgent: void 0,
    clientName: void 0,
    clientVersion: void 0,
    osName: void 0,
    osVersion: void 0,
    projectId: void 0,
    acceptLanguage: void 0,
    acceptRegion: void 0,
    originalUrl: void 0,
    rawDeviceId: void 0,
    configData: void 0,
    spacecastToken: void 0,
    internalGeo: void 0,
    screenWidthPoints: void 0,
    screenHeightPoints: void 0,
    screenWidthInches: void 0,
    screenHeightInches: void 0,
    screenPixelDensity: void 0,
    platform: void 0,
    spacecastClientInfo: void 0,
    clientFormFactor: void 0,
    forwardedFor: void 0,
    mobileDataPlanInfo: void 0,
    gmscoreVersionCode: void 0,
    webpSupport: void 0,
    cameraType: void 0,
    experimentsToken: void 0,
    windowWidthPoints: void 0,
    windowHeightPoints: void 0,
    configInfo: void 0,
    unpluggedLocationInfo: void 0,
    androidSdkVersion: void 0,
    screenDensityFloat: void 0,
    firstTimeSignInExperimentIds: void 0,
    utcOffsetMinutes: void 0,
    animatedWebpSupport: void 0,
    kidsAppInfo: void 0,
    musicAppInfo: void 0,
    tvAppInfo: void 0,
    internalGeoIp: void 0,
    unpluggedAppInfo: void 0,
    locationInfo: void 0,
    contentSizeCategory: void 0,
    fontScale: void 0,
    userInterfaceTheme: void 0,
    timeZone: void 0,
    homeGroupInfo: void 0,
    emlTemplateContext: void 0,
    coldAppBundleConfigData: void 0,
    browserName: void 0,
    browserVersion: void 0,
    locationPlayabilityToken: void 0,
    chipset: void 0,
    firmwareVersion: void 0,
    memoryTotalKbytes: void 0,
    mainAppWebInfo: void 0,
    notificationPermissionInfo: void 0,
    deviceBrand: void 0,
    glDeviceInfo: void 0
  };
}
__name(createBaseClientInfo, "createBaseClientInfo");
var ClientInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.hl !== void 0) {
      writer.uint32(10).string(message.hl);
    }
    if (message.gl !== void 0) {
      writer.uint32(18).string(message.gl);
    }
    if (message.remoteHost !== void 0) {
      writer.uint32(34).string(message.remoteHost);
    }
    if (message.deviceId !== void 0) {
      writer.uint32(50).string(message.deviceId);
    }
    if (message.debugDeviceIdOverride !== void 0) {
      writer.uint32(66).string(message.debugDeviceIdOverride);
    }
    if (message.carrierGeo !== void 0) {
      writer.uint32(82).string(message.carrierGeo);
    }
    if (message.crackedHl !== void 0) {
      writer.uint32(88).bool(message.crackedHl);
    }
    if (message.deviceMake !== void 0) {
      writer.uint32(98).string(message.deviceMake);
    }
    if (message.deviceModel !== void 0) {
      writer.uint32(106).string(message.deviceModel);
    }
    if (message.visitorData !== void 0) {
      writer.uint32(114).string(message.visitorData);
    }
    if (message.userAgent !== void 0) {
      writer.uint32(122).string(message.userAgent);
    }
    if (message.clientName !== void 0) {
      writer.uint32(128).int32(message.clientName);
    }
    if (message.clientVersion !== void 0) {
      writer.uint32(138).string(message.clientVersion);
    }
    if (message.osName !== void 0) {
      writer.uint32(146).string(message.osName);
    }
    if (message.osVersion !== void 0) {
      writer.uint32(154).string(message.osVersion);
    }
    if (message.projectId !== void 0) {
      writer.uint32(162).string(message.projectId);
    }
    if (message.acceptLanguage !== void 0) {
      writer.uint32(170).string(message.acceptLanguage);
    }
    if (message.acceptRegion !== void 0) {
      writer.uint32(178).string(message.acceptRegion);
    }
    if (message.originalUrl !== void 0) {
      writer.uint32(186).string(message.originalUrl);
    }
    if (message.rawDeviceId !== void 0) {
      writer.uint32(202).string(message.rawDeviceId);
    }
    if (message.configData !== void 0) {
      writer.uint32(218).string(message.configData);
    }
    if (message.spacecastToken !== void 0) {
      writer.uint32(250).string(message.spacecastToken);
    }
    if (message.internalGeo !== void 0) {
      writer.uint32(274).string(message.internalGeo);
    }
    if (message.screenWidthPoints !== void 0) {
      writer.uint32(296).int32(message.screenWidthPoints);
    }
    if (message.screenHeightPoints !== void 0) {
      writer.uint32(304).int32(message.screenHeightPoints);
    }
    if (message.screenWidthInches !== void 0) {
      writer.uint32(317).float(message.screenWidthInches);
    }
    if (message.screenHeightInches !== void 0) {
      writer.uint32(325).float(message.screenHeightInches);
    }
    if (message.screenPixelDensity !== void 0) {
      writer.uint32(328).int32(message.screenPixelDensity);
    }
    if (message.platform !== void 0) {
      writer.uint32(336).int32(message.platform);
    }
    if (message.spacecastClientInfo !== void 0) {
      ClientInfo_SpacecastClientInfo.encode(message.spacecastClientInfo, writer.uint32(362).fork()).join();
    }
    if (message.clientFormFactor !== void 0) {
      writer.uint32(368).int32(message.clientFormFactor);
    }
    if (message.forwardedFor !== void 0) {
      writer.uint32(386).string(message.forwardedFor);
    }
    if (message.mobileDataPlanInfo !== void 0) {
      ClientInfo_MobileDataPlanInfo.encode(message.mobileDataPlanInfo, writer.uint32(394).fork()).join();
    }
    if (message.gmscoreVersionCode !== void 0) {
      writer.uint32(400).int32(message.gmscoreVersionCode);
    }
    if (message.webpSupport !== void 0) {
      writer.uint32(408).bool(message.webpSupport);
    }
    if (message.cameraType !== void 0) {
      writer.uint32(416).int32(message.cameraType);
    }
    if (message.experimentsToken !== void 0) {
      writer.uint32(434).string(message.experimentsToken);
    }
    if (message.windowWidthPoints !== void 0) {
      writer.uint32(440).int32(message.windowWidthPoints);
    }
    if (message.windowHeightPoints !== void 0) {
      writer.uint32(448).int32(message.windowHeightPoints);
    }
    if (message.configInfo !== void 0) {
      ClientInfo_ConfigGroupsClientInfo.encode(message.configInfo, writer.uint32(498).fork()).join();
    }
    if (message.unpluggedLocationInfo !== void 0) {
      ClientInfo_UnpluggedLocationInfo.encode(message.unpluggedLocationInfo, writer.uint32(506).fork()).join();
    }
    if (message.androidSdkVersion !== void 0) {
      writer.uint32(512).int32(message.androidSdkVersion);
    }
    if (message.screenDensityFloat !== void 0) {
      writer.uint32(525).float(message.screenDensityFloat);
    }
    if (message.firstTimeSignInExperimentIds !== void 0) {
      writer.uint32(528).int32(message.firstTimeSignInExperimentIds);
    }
    if (message.utcOffsetMinutes !== void 0) {
      writer.uint32(536).int32(message.utcOffsetMinutes);
    }
    if (message.animatedWebpSupport !== void 0) {
      writer.uint32(544).bool(message.animatedWebpSupport);
    }
    if (message.kidsAppInfo !== void 0) {
      ClientInfo_KidsAppInfo.encode(message.kidsAppInfo, writer.uint32(554).fork()).join();
    }
    if (message.musicAppInfo !== void 0) {
      ClientInfo_MusicAppInfo.encode(message.musicAppInfo, writer.uint32(562).fork()).join();
    }
    if (message.tvAppInfo !== void 0) {
      ClientInfo_TvAppInfo.encode(message.tvAppInfo, writer.uint32(570).fork()).join();
    }
    if (message.internalGeoIp !== void 0) {
      writer.uint32(578).string(message.internalGeoIp);
    }
    if (message.unpluggedAppInfo !== void 0) {
      ClientInfo_UnpluggedAppInfo.encode(message.unpluggedAppInfo, writer.uint32(586).fork()).join();
    }
    if (message.locationInfo !== void 0) {
      ClientInfo_LocationInfo.encode(message.locationInfo, writer.uint32(594).fork()).join();
    }
    if (message.contentSizeCategory !== void 0) {
      writer.uint32(610).string(message.contentSizeCategory);
    }
    if (message.fontScale !== void 0) {
      writer.uint32(621).float(message.fontScale);
    }
    if (message.userInterfaceTheme !== void 0) {
      writer.uint32(624).int32(message.userInterfaceTheme);
    }
    if (message.timeZone !== void 0) {
      writer.uint32(642).string(message.timeZone);
    }
    if (message.homeGroupInfo !== void 0) {
      ClientInfo_HomeGroupInfo.encode(message.homeGroupInfo, writer.uint32(650).fork()).join();
    }
    if (message.emlTemplateContext !== void 0) {
      writer.uint32(674).bytes(message.emlTemplateContext);
    }
    if (message.coldAppBundleConfigData !== void 0) {
      writer.uint32(682).bytes(message.coldAppBundleConfigData);
    }
    if (message.browserName !== void 0) {
      writer.uint32(698).string(message.browserName);
    }
    if (message.browserVersion !== void 0) {
      writer.uint32(706).string(message.browserVersion);
    }
    if (message.locationPlayabilityToken !== void 0) {
      writer.uint32(714).string(message.locationPlayabilityToken);
    }
    if (message.chipset !== void 0) {
      writer.uint32(738).string(message.chipset);
    }
    if (message.firmwareVersion !== void 0) {
      writer.uint32(746).string(message.firmwareVersion);
    }
    if (message.memoryTotalKbytes !== void 0) {
      writer.uint32(760).int64(message.memoryTotalKbytes);
    }
    if (message.mainAppWebInfo !== void 0) {
      ClientInfo_MainAppWebInfo.encode(message.mainAppWebInfo, writer.uint32(770).fork()).join();
    }
    if (message.notificationPermissionInfo !== void 0) {
      ClientInfo_NotificationPermissionInfo.encode(message.notificationPermissionInfo, writer.uint32(778).fork()).join();
    }
    if (message.deviceBrand !== void 0) {
      writer.uint32(786).string(message.deviceBrand);
    }
    if (message.glDeviceInfo !== void 0) {
      ClientInfo_GLDeviceInfo.encode(message.glDeviceInfo, writer.uint32(818).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.hl = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.gl = reader.string();
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.remoteHost = reader.string();
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.deviceId = reader.string();
          continue;
        }
        case 8: {
          if (tag !== 66) {
            break;
          }
          message.debugDeviceIdOverride = reader.string();
          continue;
        }
        case 10: {
          if (tag !== 82) {
            break;
          }
          message.carrierGeo = reader.string();
          continue;
        }
        case 11: {
          if (tag !== 88) {
            break;
          }
          message.crackedHl = reader.bool();
          continue;
        }
        case 12: {
          if (tag !== 98) {
            break;
          }
          message.deviceMake = reader.string();
          continue;
        }
        case 13: {
          if (tag !== 106) {
            break;
          }
          message.deviceModel = reader.string();
          continue;
        }
        case 14: {
          if (tag !== 114) {
            break;
          }
          message.visitorData = reader.string();
          continue;
        }
        case 15: {
          if (tag !== 122) {
            break;
          }
          message.userAgent = reader.string();
          continue;
        }
        case 16: {
          if (tag !== 128) {
            break;
          }
          message.clientName = reader.int32();
          continue;
        }
        case 17: {
          if (tag !== 138) {
            break;
          }
          message.clientVersion = reader.string();
          continue;
        }
        case 18: {
          if (tag !== 146) {
            break;
          }
          message.osName = reader.string();
          continue;
        }
        case 19: {
          if (tag !== 154) {
            break;
          }
          message.osVersion = reader.string();
          continue;
        }
        case 20: {
          if (tag !== 162) {
            break;
          }
          message.projectId = reader.string();
          continue;
        }
        case 21: {
          if (tag !== 170) {
            break;
          }
          message.acceptLanguage = reader.string();
          continue;
        }
        case 22: {
          if (tag !== 178) {
            break;
          }
          message.acceptRegion = reader.string();
          continue;
        }
        case 23: {
          if (tag !== 186) {
            break;
          }
          message.originalUrl = reader.string();
          continue;
        }
        case 25: {
          if (tag !== 202) {
            break;
          }
          message.rawDeviceId = reader.string();
          continue;
        }
        case 27: {
          if (tag !== 218) {
            break;
          }
          message.configData = reader.string();
          continue;
        }
        case 31: {
          if (tag !== 250) {
            break;
          }
          message.spacecastToken = reader.string();
          continue;
        }
        case 34: {
          if (tag !== 274) {
            break;
          }
          message.internalGeo = reader.string();
          continue;
        }
        case 37: {
          if (tag !== 296) {
            break;
          }
          message.screenWidthPoints = reader.int32();
          continue;
        }
        case 38: {
          if (tag !== 304) {
            break;
          }
          message.screenHeightPoints = reader.int32();
          continue;
        }
        case 39: {
          if (tag !== 317) {
            break;
          }
          message.screenWidthInches = reader.float();
          continue;
        }
        case 40: {
          if (tag !== 325) {
            break;
          }
          message.screenHeightInches = reader.float();
          continue;
        }
        case 41: {
          if (tag !== 328) {
            break;
          }
          message.screenPixelDensity = reader.int32();
          continue;
        }
        case 42: {
          if (tag !== 336) {
            break;
          }
          message.platform = reader.int32();
          continue;
        }
        case 45: {
          if (tag !== 362) {
            break;
          }
          message.spacecastClientInfo = ClientInfo_SpacecastClientInfo.decode(reader, reader.uint32());
          continue;
        }
        case 46: {
          if (tag !== 368) {
            break;
          }
          message.clientFormFactor = reader.int32();
          continue;
        }
        case 48: {
          if (tag !== 386) {
            break;
          }
          message.forwardedFor = reader.string();
          continue;
        }
        case 49: {
          if (tag !== 394) {
            break;
          }
          message.mobileDataPlanInfo = ClientInfo_MobileDataPlanInfo.decode(reader, reader.uint32());
          continue;
        }
        case 50: {
          if (tag !== 400) {
            break;
          }
          message.gmscoreVersionCode = reader.int32();
          continue;
        }
        case 51: {
          if (tag !== 408) {
            break;
          }
          message.webpSupport = reader.bool();
          continue;
        }
        case 52: {
          if (tag !== 416) {
            break;
          }
          message.cameraType = reader.int32();
          continue;
        }
        case 54: {
          if (tag !== 434) {
            break;
          }
          message.experimentsToken = reader.string();
          continue;
        }
        case 55: {
          if (tag !== 440) {
            break;
          }
          message.windowWidthPoints = reader.int32();
          continue;
        }
        case 56: {
          if (tag !== 448) {
            break;
          }
          message.windowHeightPoints = reader.int32();
          continue;
        }
        case 62: {
          if (tag !== 498) {
            break;
          }
          message.configInfo = ClientInfo_ConfigGroupsClientInfo.decode(reader, reader.uint32());
          continue;
        }
        case 63: {
          if (tag !== 506) {
            break;
          }
          message.unpluggedLocationInfo = ClientInfo_UnpluggedLocationInfo.decode(reader, reader.uint32());
          continue;
        }
        case 64: {
          if (tag !== 512) {
            break;
          }
          message.androidSdkVersion = reader.int32();
          continue;
        }
        case 65: {
          if (tag !== 525) {
            break;
          }
          message.screenDensityFloat = reader.float();
          continue;
        }
        case 66: {
          if (tag !== 528) {
            break;
          }
          message.firstTimeSignInExperimentIds = reader.int32();
          continue;
        }
        case 67: {
          if (tag !== 536) {
            break;
          }
          message.utcOffsetMinutes = reader.int32();
          continue;
        }
        case 68: {
          if (tag !== 544) {
            break;
          }
          message.animatedWebpSupport = reader.bool();
          continue;
        }
        case 69: {
          if (tag !== 554) {
            break;
          }
          message.kidsAppInfo = ClientInfo_KidsAppInfo.decode(reader, reader.uint32());
          continue;
        }
        case 70: {
          if (tag !== 562) {
            break;
          }
          message.musicAppInfo = ClientInfo_MusicAppInfo.decode(reader, reader.uint32());
          continue;
        }
        case 71: {
          if (tag !== 570) {
            break;
          }
          message.tvAppInfo = ClientInfo_TvAppInfo.decode(reader, reader.uint32());
          continue;
        }
        case 72: {
          if (tag !== 578) {
            break;
          }
          message.internalGeoIp = reader.string();
          continue;
        }
        case 73: {
          if (tag !== 586) {
            break;
          }
          message.unpluggedAppInfo = ClientInfo_UnpluggedAppInfo.decode(reader, reader.uint32());
          continue;
        }
        case 74: {
          if (tag !== 594) {
            break;
          }
          message.locationInfo = ClientInfo_LocationInfo.decode(reader, reader.uint32());
          continue;
        }
        case 76: {
          if (tag !== 610) {
            break;
          }
          message.contentSizeCategory = reader.string();
          continue;
        }
        case 77: {
          if (tag !== 621) {
            break;
          }
          message.fontScale = reader.float();
          continue;
        }
        case 78: {
          if (tag !== 624) {
            break;
          }
          message.userInterfaceTheme = reader.int32();
          continue;
        }
        case 80: {
          if (tag !== 642) {
            break;
          }
          message.timeZone = reader.string();
          continue;
        }
        case 81: {
          if (tag !== 650) {
            break;
          }
          message.homeGroupInfo = ClientInfo_HomeGroupInfo.decode(reader, reader.uint32());
          continue;
        }
        case 84: {
          if (tag !== 674) {
            break;
          }
          message.emlTemplateContext = reader.bytes();
          continue;
        }
        case 85: {
          if (tag !== 682) {
            break;
          }
          message.coldAppBundleConfigData = reader.bytes();
          continue;
        }
        case 87: {
          if (tag !== 698) {
            break;
          }
          message.browserName = reader.string();
          continue;
        }
        case 88: {
          if (tag !== 706) {
            break;
          }
          message.browserVersion = reader.string();
          continue;
        }
        case 89: {
          if (tag !== 714) {
            break;
          }
          message.locationPlayabilityToken = reader.string();
          continue;
        }
        case 92: {
          if (tag !== 738) {
            break;
          }
          message.chipset = reader.string();
          continue;
        }
        case 93: {
          if (tag !== 746) {
            break;
          }
          message.firmwareVersion = reader.string();
          continue;
        }
        case 95: {
          if (tag !== 760) {
            break;
          }
          message.memoryTotalKbytes = longToNumber(reader.int64());
          continue;
        }
        case 96: {
          if (tag !== 770) {
            break;
          }
          message.mainAppWebInfo = ClientInfo_MainAppWebInfo.decode(reader, reader.uint32());
          continue;
        }
        case 97: {
          if (tag !== 778) {
            break;
          }
          message.notificationPermissionInfo = ClientInfo_NotificationPermissionInfo.decode(reader, reader.uint32());
          continue;
        }
        case 98: {
          if (tag !== 786) {
            break;
          }
          message.deviceBrand = reader.string();
          continue;
        }
        case 102: {
          if (tag !== 818) {
            break;
          }
          message.glDeviceInfo = ClientInfo_GLDeviceInfo.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_MainAppWebInfo() {
  return {
    graftUrl: void 0,
    pwaInstallabilityStatus: void 0,
    webDisplayMode: void 0,
    isWebNativeShareAvailable: void 0,
    storeDigitalGoodsApiSupportStatus: void 0
  };
}
__name(createBaseClientInfo_MainAppWebInfo, "createBaseClientInfo_MainAppWebInfo");
var ClientInfo_MainAppWebInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.graftUrl !== void 0) {
      writer.uint32(10).string(message.graftUrl);
    }
    if (message.pwaInstallabilityStatus !== void 0) {
      writer.uint32(16).int32(message.pwaInstallabilityStatus);
    }
    if (message.webDisplayMode !== void 0) {
      writer.uint32(24).int32(message.webDisplayMode);
    }
    if (message.isWebNativeShareAvailable !== void 0) {
      writer.uint32(32).bool(message.isWebNativeShareAvailable);
    }
    if (message.storeDigitalGoodsApiSupportStatus !== void 0) {
      writer.uint32(40).int32(message.storeDigitalGoodsApiSupportStatus);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_MainAppWebInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.graftUrl = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.pwaInstallabilityStatus = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.webDisplayMode = reader.int32();
          continue;
        }
        case 4: {
          if (tag !== 32) {
            break;
          }
          message.isWebNativeShareAvailable = reader.bool();
          continue;
        }
        case 5: {
          if (tag !== 40) {
            break;
          }
          message.storeDigitalGoodsApiSupportStatus = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_NotificationPermissionInfo() {
  return { notificationsSetting: void 0, lastDeviceOptInChangeTimeAgoSec: void 0 };
}
__name(createBaseClientInfo_NotificationPermissionInfo, "createBaseClientInfo_NotificationPermissionInfo");
var ClientInfo_NotificationPermissionInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.notificationsSetting !== void 0) {
      writer.uint32(8).int32(message.notificationsSetting);
    }
    if (message.lastDeviceOptInChangeTimeAgoSec !== void 0) {
      writer.uint32(16).int64(message.lastDeviceOptInChangeTimeAgoSec);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_NotificationPermissionInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.notificationsSetting = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.lastDeviceOptInChangeTimeAgoSec = longToNumber(reader.int64());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_GLDeviceInfo() {
  return { glRenderer: void 0, glEsVersionMajor: void 0, glEsVersionMinor: void 0 };
}
__name(createBaseClientInfo_GLDeviceInfo, "createBaseClientInfo_GLDeviceInfo");
var ClientInfo_GLDeviceInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.glRenderer !== void 0) {
      writer.uint32(10).string(message.glRenderer);
    }
    if (message.glEsVersionMajor !== void 0) {
      writer.uint32(16).int32(message.glEsVersionMajor);
    }
    if (message.glEsVersionMinor !== void 0) {
      writer.uint32(24).int32(message.glEsVersionMinor);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_GLDeviceInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.glRenderer = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.glEsVersionMajor = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.glEsVersionMinor = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_SpacecastClientInfo() {
  return { appliances: void 0, interactionLevel: void 0 };
}
__name(createBaseClientInfo_SpacecastClientInfo, "createBaseClientInfo_SpacecastClientInfo");
var ClientInfo_SpacecastClientInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.appliances !== void 0) {
      ClientInfo_SpacecastClientInfo_SpacecastAppliance.encode(message.appliances, writer.uint32(10).fork()).join();
    }
    if (message.interactionLevel !== void 0) {
      writer.uint32(16).int32(message.interactionLevel);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_SpacecastClientInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.appliances = ClientInfo_SpacecastClientInfo_SpacecastAppliance.decode(reader, reader.uint32());
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.interactionLevel = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_SpacecastClientInfo_SpacecastAppliance() {
  return {
    contentProfileToken: void 0,
    status: void 0,
    hostname: void 0,
    active: void 0,
    deviceId: void 0
  };
}
__name(createBaseClientInfo_SpacecastClientInfo_SpacecastAppliance, "createBaseClientInfo_SpacecastClientInfo_SpacecastAppliance");
var ClientInfo_SpacecastClientInfo_SpacecastAppliance = {
  encode(message, writer = new BinaryWriter()) {
    if (message.contentProfileToken !== void 0) {
      writer.uint32(10).bytes(message.contentProfileToken);
    }
    if (message.status !== void 0) {
      writer.uint32(16).int32(message.status);
    }
    if (message.hostname !== void 0) {
      writer.uint32(26).string(message.hostname);
    }
    if (message.active !== void 0) {
      writer.uint32(32).bool(message.active);
    }
    if (message.deviceId !== void 0) {
      writer.uint32(42).string(message.deviceId);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_SpacecastClientInfo_SpacecastAppliance();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.contentProfileToken = reader.bytes();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.status = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.hostname = reader.string();
          continue;
        }
        case 4: {
          if (tag !== 32) {
            break;
          }
          message.active = reader.bool();
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.deviceId = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_MobileDataPlanInfo() {
  return {
    cpid: void 0,
    serializedDataPlanStatus: void 0,
    dataSavingQualityPickerEnabled: void 0,
    mccmnc: void 0
  };
}
__name(createBaseClientInfo_MobileDataPlanInfo, "createBaseClientInfo_MobileDataPlanInfo");
var ClientInfo_MobileDataPlanInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.cpid !== void 0) {
      writer.uint32(394).string(message.cpid);
    }
    if (message.serializedDataPlanStatus !== void 0) {
      writer.uint32(402).string(message.serializedDataPlanStatus);
    }
    if (message.dataSavingQualityPickerEnabled !== void 0) {
      writer.uint32(416).bool(message.dataSavingQualityPickerEnabled);
    }
    if (message.mccmnc !== void 0) {
      writer.uint32(426).string(message.mccmnc);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_MobileDataPlanInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 49: {
          if (tag !== 394) {
            break;
          }
          message.cpid = reader.string();
          continue;
        }
        case 50: {
          if (tag !== 402) {
            break;
          }
          message.serializedDataPlanStatus = reader.string();
          continue;
        }
        case 52: {
          if (tag !== 416) {
            break;
          }
          message.dataSavingQualityPickerEnabled = reader.bool();
          continue;
        }
        case 53: {
          if (tag !== 426) {
            break;
          }
          message.mccmnc = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_ConfigGroupsClientInfo() {
  return { coldConfigData: void 0, coldHashData: void 0, hotHashData: void 0, appInstallData: void 0 };
}
__name(createBaseClientInfo_ConfigGroupsClientInfo, "createBaseClientInfo_ConfigGroupsClientInfo");
var ClientInfo_ConfigGroupsClientInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.coldConfigData !== void 0) {
      writer.uint32(10).string(message.coldConfigData);
    }
    if (message.coldHashData !== void 0) {
      writer.uint32(26).string(message.coldHashData);
    }
    if (message.hotHashData !== void 0) {
      writer.uint32(42).string(message.hotHashData);
    }
    if (message.appInstallData !== void 0) {
      writer.uint32(50).string(message.appInstallData);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_ConfigGroupsClientInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.coldConfigData = reader.string();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.coldHashData = reader.string();
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.hotHashData = reader.string();
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.appInstallData = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_UnpluggedLocationInfo() {
  return {
    latitudeE7: void 0,
    longitudeE7: void 0,
    localTimestampMs: void 0,
    ipAddress: void 0,
    timezone: void 0,
    prefer24HourTime: void 0,
    locationRadiusMeters: void 0,
    isInitialLoad: void 0,
    browserPermissionGranted: void 0,
    clientPermissionState: void 0,
    locationOverrideToken: void 0
  };
}
__name(createBaseClientInfo_UnpluggedLocationInfo, "createBaseClientInfo_UnpluggedLocationInfo");
var ClientInfo_UnpluggedLocationInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.latitudeE7 !== void 0) {
      writer.uint32(8).int32(message.latitudeE7);
    }
    if (message.longitudeE7 !== void 0) {
      writer.uint32(16).int32(message.longitudeE7);
    }
    if (message.localTimestampMs !== void 0) {
      writer.uint32(24).int64(message.localTimestampMs);
    }
    if (message.ipAddress !== void 0) {
      writer.uint32(34).string(message.ipAddress);
    }
    if (message.timezone !== void 0) {
      writer.uint32(42).string(message.timezone);
    }
    if (message.prefer24HourTime !== void 0) {
      writer.uint32(48).bool(message.prefer24HourTime);
    }
    if (message.locationRadiusMeters !== void 0) {
      writer.uint32(56).int32(message.locationRadiusMeters);
    }
    if (message.isInitialLoad !== void 0) {
      writer.uint32(64).bool(message.isInitialLoad);
    }
    if (message.browserPermissionGranted !== void 0) {
      writer.uint32(72).bool(message.browserPermissionGranted);
    }
    if (message.clientPermissionState !== void 0) {
      writer.uint32(80).int32(message.clientPermissionState);
    }
    if (message.locationOverrideToken !== void 0) {
      writer.uint32(90).string(message.locationOverrideToken);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_UnpluggedLocationInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.latitudeE7 = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.longitudeE7 = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.localTimestampMs = longToNumber(reader.int64());
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.ipAddress = reader.string();
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.timezone = reader.string();
          continue;
        }
        case 6: {
          if (tag !== 48) {
            break;
          }
          message.prefer24HourTime = reader.bool();
          continue;
        }
        case 7: {
          if (tag !== 56) {
            break;
          }
          message.locationRadiusMeters = reader.int32();
          continue;
        }
        case 8: {
          if (tag !== 64) {
            break;
          }
          message.isInitialLoad = reader.bool();
          continue;
        }
        case 9: {
          if (tag !== 72) {
            break;
          }
          message.browserPermissionGranted = reader.bool();
          continue;
        }
        case 10: {
          if (tag !== 80) {
            break;
          }
          message.clientPermissionState = reader.int32();
          continue;
        }
        case 11: {
          if (tag !== 90) {
            break;
          }
          message.locationOverrideToken = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_KidsAppInfo() {
  return {
    contentSettings: void 0,
    parentCurationMode: void 0,
    categorySettings: void 0,
    userEducationSettings: void 0
  };
}
__name(createBaseClientInfo_KidsAppInfo, "createBaseClientInfo_KidsAppInfo");
var ClientInfo_KidsAppInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.contentSettings !== void 0) {
      ClientInfo_KidsAppInfo_KidsContentSettings.encode(message.contentSettings, writer.uint32(10).fork()).join();
    }
    if (message.parentCurationMode !== void 0) {
      writer.uint32(16).int32(message.parentCurationMode);
    }
    if (message.categorySettings !== void 0) {
      ClientInfo_KidsAppInfo_KidsCategorySettings.encode(message.categorySettings, writer.uint32(26).fork()).join();
    }
    if (message.userEducationSettings !== void 0) {
      ClientInfo_KidsAppInfo_KidsUserEducationSettings.encode(message.userEducationSettings, writer.uint32(34).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_KidsAppInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.contentSettings = ClientInfo_KidsAppInfo_KidsContentSettings.decode(reader, reader.uint32());
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.parentCurationMode = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.categorySettings = ClientInfo_KidsAppInfo_KidsCategorySettings.decode(reader, reader.uint32());
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.userEducationSettings = ClientInfo_KidsAppInfo_KidsUserEducationSettings.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_KidsAppInfo_KidsContentSettings() {
  return { kidsNoSearchMode: void 0, ageUpMode: void 0, contentDensity: void 0 };
}
__name(createBaseClientInfo_KidsAppInfo_KidsContentSettings, "createBaseClientInfo_KidsAppInfo_KidsContentSettings");
var ClientInfo_KidsAppInfo_KidsContentSettings = {
  encode(message, writer = new BinaryWriter()) {
    if (message.kidsNoSearchMode !== void 0) {
      writer.uint32(8).int32(message.kidsNoSearchMode);
    }
    if (message.ageUpMode !== void 0) {
      writer.uint32(16).int32(message.ageUpMode);
    }
    if (message.contentDensity !== void 0) {
      writer.uint32(24).int32(message.contentDensity);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_KidsAppInfo_KidsContentSettings();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.kidsNoSearchMode = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.ageUpMode = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.contentDensity = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_KidsAppInfo_KidsCategorySettings() {
  return { enabledCategories: void 0 };
}
__name(createBaseClientInfo_KidsAppInfo_KidsCategorySettings, "createBaseClientInfo_KidsAppInfo_KidsCategorySettings");
var ClientInfo_KidsAppInfo_KidsCategorySettings = {
  encode(message, writer = new BinaryWriter()) {
    if (message.enabledCategories !== void 0) {
      writer.uint32(10).string(message.enabledCategories);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_KidsAppInfo_KidsCategorySettings();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.enabledCategories = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_KidsAppInfo_KidsUserEducationSettings() {
  return {
    hasSeenHomeChipBarUserEducation: void 0,
    hasSeenHomePivotBarUserEducation: void 0,
    hasSeenParentMuirUserEducation: void 0
  };
}
__name(createBaseClientInfo_KidsAppInfo_KidsUserEducationSettings, "createBaseClientInfo_KidsAppInfo_KidsUserEducationSettings");
var ClientInfo_KidsAppInfo_KidsUserEducationSettings = {
  encode(message, writer = new BinaryWriter()) {
    if (message.hasSeenHomeChipBarUserEducation !== void 0) {
      writer.uint32(8).bool(message.hasSeenHomeChipBarUserEducation);
    }
    if (message.hasSeenHomePivotBarUserEducation !== void 0) {
      writer.uint32(16).bool(message.hasSeenHomePivotBarUserEducation);
    }
    if (message.hasSeenParentMuirUserEducation !== void 0) {
      writer.uint32(24).bool(message.hasSeenParentMuirUserEducation);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_KidsAppInfo_KidsUserEducationSettings();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.hasSeenHomeChipBarUserEducation = reader.bool();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.hasSeenHomePivotBarUserEducation = reader.bool();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.hasSeenParentMuirUserEducation = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_MusicAppInfo() {
  return {
    playBackMode: void 0,
    musicLocationMasterSwitch: void 0,
    musicActivityMasterSwitch: void 0,
    offlineMixtapeEnabled: void 0,
    autoOfflineEnabled: void 0,
    iosBackgroundRefreshStatus: void 0,
    smartDownloadsSongLimit: void 0,
    transitionedFromMixtapeToSmartDownloads: void 0,
    pwaInstallabilityStatus: void 0,
    webDisplayMode: void 0,
    musicTier: void 0,
    storeDigitalGoodsApiSupportStatus: void 0,
    smartDownloadsTimeSinceLastOptOutSec: void 0
  };
}
__name(createBaseClientInfo_MusicAppInfo, "createBaseClientInfo_MusicAppInfo");
var ClientInfo_MusicAppInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.playBackMode !== void 0) {
      writer.uint32(8).int32(message.playBackMode);
    }
    if (message.musicLocationMasterSwitch !== void 0) {
      writer.uint32(16).int32(message.musicLocationMasterSwitch);
    }
    if (message.musicActivityMasterSwitch !== void 0) {
      writer.uint32(24).int32(message.musicActivityMasterSwitch);
    }
    if (message.offlineMixtapeEnabled !== void 0) {
      writer.uint32(32).bool(message.offlineMixtapeEnabled);
    }
    if (message.autoOfflineEnabled !== void 0) {
      writer.uint32(40).bool(message.autoOfflineEnabled);
    }
    if (message.iosBackgroundRefreshStatus !== void 0) {
      writer.uint32(48).int32(message.iosBackgroundRefreshStatus);
    }
    if (message.smartDownloadsSongLimit !== void 0) {
      writer.uint32(56).int32(message.smartDownloadsSongLimit);
    }
    if (message.transitionedFromMixtapeToSmartDownloads !== void 0) {
      writer.uint32(64).bool(message.transitionedFromMixtapeToSmartDownloads);
    }
    if (message.pwaInstallabilityStatus !== void 0) {
      writer.uint32(72).int32(message.pwaInstallabilityStatus);
    }
    if (message.webDisplayMode !== void 0) {
      writer.uint32(80).int32(message.webDisplayMode);
    }
    if (message.musicTier !== void 0) {
      writer.uint32(88).int32(message.musicTier);
    }
    if (message.storeDigitalGoodsApiSupportStatus !== void 0) {
      writer.uint32(96).int32(message.storeDigitalGoodsApiSupportStatus);
    }
    if (message.smartDownloadsTimeSinceLastOptOutSec !== void 0) {
      writer.uint32(104).int64(message.smartDownloadsTimeSinceLastOptOutSec);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_MusicAppInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.playBackMode = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.musicLocationMasterSwitch = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.musicActivityMasterSwitch = reader.int32();
          continue;
        }
        case 4: {
          if (tag !== 32) {
            break;
          }
          message.offlineMixtapeEnabled = reader.bool();
          continue;
        }
        case 5: {
          if (tag !== 40) {
            break;
          }
          message.autoOfflineEnabled = reader.bool();
          continue;
        }
        case 6: {
          if (tag !== 48) {
            break;
          }
          message.iosBackgroundRefreshStatus = reader.int32();
          continue;
        }
        case 7: {
          if (tag !== 56) {
            break;
          }
          message.smartDownloadsSongLimit = reader.int32();
          continue;
        }
        case 8: {
          if (tag !== 64) {
            break;
          }
          message.transitionedFromMixtapeToSmartDownloads = reader.bool();
          continue;
        }
        case 9: {
          if (tag !== 72) {
            break;
          }
          message.pwaInstallabilityStatus = reader.int32();
          continue;
        }
        case 10: {
          if (tag !== 80) {
            break;
          }
          message.webDisplayMode = reader.int32();
          continue;
        }
        case 11: {
          if (tag !== 88) {
            break;
          }
          message.musicTier = reader.int32();
          continue;
        }
        case 12: {
          if (tag !== 96) {
            break;
          }
          message.storeDigitalGoodsApiSupportStatus = reader.int32();
          continue;
        }
        case 13: {
          if (tag !== 104) {
            break;
          }
          message.smartDownloadsTimeSinceLastOptOutSec = longToNumber(reader.int64());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_TvAppInfo() {
  return {
    mdxImpactedSessionsServerEvents: void 0,
    enablePrivacyFilter: void 0,
    zylonLeftNav: void 0,
    certificationScope: void 0,
    livingRoomPoTokenId: void 0,
    jsEngineString: void 0,
    voiceCapability: void 0,
    systemIntegrator: void 0,
    androidBuildFingerprint: void 0,
    cobaltAppVersion: void 0,
    cobaltStarboardVersion: void 0,
    useStartPlaybackPreviewCommand: void 0,
    shouldShowPersistentSigninOnHome: void 0,
    androidPlayServicesVersion: void 0
  };
}
__name(createBaseClientInfo_TvAppInfo, "createBaseClientInfo_TvAppInfo");
var ClientInfo_TvAppInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.mdxImpactedSessionsServerEvents !== void 0) {
      writer.uint32(26).string(message.mdxImpactedSessionsServerEvents);
    }
    if (message.enablePrivacyFilter !== void 0) {
      writer.uint32(48).bool(message.enablePrivacyFilter);
    }
    if (message.zylonLeftNav !== void 0) {
      writer.uint32(56).bool(message.zylonLeftNav);
    }
    if (message.certificationScope !== void 0) {
      writer.uint32(74).string(message.certificationScope);
    }
    if (message.livingRoomPoTokenId !== void 0) {
      writer.uint32(82).string(message.livingRoomPoTokenId);
    }
    if (message.jsEngineString !== void 0) {
      writer.uint32(98).string(message.jsEngineString);
    }
    if (message.voiceCapability !== void 0) {
      ClientInfo_TvAppInfo_VoiceCapability.encode(message.voiceCapability, writer.uint32(106).fork()).join();
    }
    if (message.systemIntegrator !== void 0) {
      writer.uint32(114).string(message.systemIntegrator);
    }
    if (message.androidBuildFingerprint !== void 0) {
      writer.uint32(146).string(message.androidBuildFingerprint);
    }
    if (message.cobaltAppVersion !== void 0) {
      writer.uint32(154).string(message.cobaltAppVersion);
    }
    if (message.cobaltStarboardVersion !== void 0) {
      writer.uint32(162).string(message.cobaltStarboardVersion);
    }
    if (message.useStartPlaybackPreviewCommand !== void 0) {
      writer.uint32(176).bool(message.useStartPlaybackPreviewCommand);
    }
    if (message.shouldShowPersistentSigninOnHome !== void 0) {
      writer.uint32(184).bool(message.shouldShowPersistentSigninOnHome);
    }
    if (message.androidPlayServicesVersion !== void 0) {
      writer.uint32(194).string(message.androidPlayServicesVersion);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_TvAppInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.mdxImpactedSessionsServerEvents = reader.string();
          continue;
        }
        case 6: {
          if (tag !== 48) {
            break;
          }
          message.enablePrivacyFilter = reader.bool();
          continue;
        }
        case 7: {
          if (tag !== 56) {
            break;
          }
          message.zylonLeftNav = reader.bool();
          continue;
        }
        case 9: {
          if (tag !== 74) {
            break;
          }
          message.certificationScope = reader.string();
          continue;
        }
        case 10: {
          if (tag !== 82) {
            break;
          }
          message.livingRoomPoTokenId = reader.string();
          continue;
        }
        case 12: {
          if (tag !== 98) {
            break;
          }
          message.jsEngineString = reader.string();
          continue;
        }
        case 13: {
          if (tag !== 106) {
            break;
          }
          message.voiceCapability = ClientInfo_TvAppInfo_VoiceCapability.decode(reader, reader.uint32());
          continue;
        }
        case 14: {
          if (tag !== 114) {
            break;
          }
          message.systemIntegrator = reader.string();
          continue;
        }
        case 18: {
          if (tag !== 146) {
            break;
          }
          message.androidBuildFingerprint = reader.string();
          continue;
        }
        case 19: {
          if (tag !== 154) {
            break;
          }
          message.cobaltAppVersion = reader.string();
          continue;
        }
        case 20: {
          if (tag !== 162) {
            break;
          }
          message.cobaltStarboardVersion = reader.string();
          continue;
        }
        case 22: {
          if (tag !== 176) {
            break;
          }
          message.useStartPlaybackPreviewCommand = reader.bool();
          continue;
        }
        case 23: {
          if (tag !== 184) {
            break;
          }
          message.shouldShowPersistentSigninOnHome = reader.bool();
          continue;
        }
        case 24: {
          if (tag !== 194) {
            break;
          }
          message.androidPlayServicesVersion = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_TvAppInfo_VoiceCapability() {
  return { hasSoftMicSupport: void 0, hasHardMicSupport: void 0 };
}
__name(createBaseClientInfo_TvAppInfo_VoiceCapability, "createBaseClientInfo_TvAppInfo_VoiceCapability");
var ClientInfo_TvAppInfo_VoiceCapability = {
  encode(message, writer = new BinaryWriter()) {
    if (message.hasSoftMicSupport !== void 0) {
      writer.uint32(8).bool(message.hasSoftMicSupport);
    }
    if (message.hasHardMicSupport !== void 0) {
      writer.uint32(16).bool(message.hasHardMicSupport);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_TvAppInfo_VoiceCapability();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.hasSoftMicSupport = reader.bool();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.hasHardMicSupport = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_UnpluggedAppInfo() {
  return { enableFilterMode: void 0, iosNotificationPermission: void 0, forceEnableEpg3: void 0 };
}
__name(createBaseClientInfo_UnpluggedAppInfo, "createBaseClientInfo_UnpluggedAppInfo");
var ClientInfo_UnpluggedAppInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.enableFilterMode !== void 0) {
      writer.uint32(16).bool(message.enableFilterMode);
    }
    if (message.iosNotificationPermission !== void 0) {
      writer.uint32(24).bool(message.iosNotificationPermission);
    }
    if (message.forceEnableEpg3 !== void 0) {
      writer.uint32(56).bool(message.forceEnableEpg3);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_UnpluggedAppInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.enableFilterMode = reader.bool();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.iosNotificationPermission = reader.bool();
          continue;
        }
        case 7: {
          if (tag !== 56) {
            break;
          }
          message.forceEnableEpg3 = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_LocationInfo() {
  return {
    locationInfoStatus: void 0,
    ulrStatus: void 0,
    latitudeE7: void 0,
    longitudeE7: void 0,
    horizontalAccuracyMeters: void 0,
    locationFreshnessMs: void 0,
    locationPermissionAuthorizationStatus: void 0,
    locationOverrideToken: void 0,
    forceLocationPlayabilityTokenRefresh: void 0
  };
}
__name(createBaseClientInfo_LocationInfo, "createBaseClientInfo_LocationInfo");
var ClientInfo_LocationInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.locationInfoStatus !== void 0) {
      writer.uint32(8).int32(message.locationInfoStatus);
    }
    if (message.ulrStatus !== void 0) {
      ClientInfo_LocationInfo_UrlStatus.encode(message.ulrStatus, writer.uint32(18).fork()).join();
    }
    if (message.latitudeE7 !== void 0) {
      writer.uint32(26).string(message.latitudeE7);
    }
    if (message.longitudeE7 !== void 0) {
      writer.uint32(34).string(message.longitudeE7);
    }
    if (message.horizontalAccuracyMeters !== void 0) {
      writer.uint32(42).string(message.horizontalAccuracyMeters);
    }
    if (message.locationFreshnessMs !== void 0) {
      writer.uint32(50).string(message.locationFreshnessMs);
    }
    if (message.locationPermissionAuthorizationStatus !== void 0) {
      writer.uint32(56).int32(message.locationPermissionAuthorizationStatus);
    }
    if (message.locationOverrideToken !== void 0) {
      writer.uint32(66).string(message.locationOverrideToken);
    }
    if (message.forceLocationPlayabilityTokenRefresh !== void 0) {
      writer.uint32(72).bool(message.forceLocationPlayabilityTokenRefresh);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_LocationInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.locationInfoStatus = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.ulrStatus = ClientInfo_LocationInfo_UrlStatus.decode(reader, reader.uint32());
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.latitudeE7 = reader.string();
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.longitudeE7 = reader.string();
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.horizontalAccuracyMeters = reader.string();
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.locationFreshnessMs = reader.string();
          continue;
        }
        case 7: {
          if (tag !== 56) {
            break;
          }
          message.locationPermissionAuthorizationStatus = reader.int32();
          continue;
        }
        case 8: {
          if (tag !== 66) {
            break;
          }
          message.locationOverrideToken = reader.string();
          continue;
        }
        case 9: {
          if (tag !== 72) {
            break;
          }
          message.forceLocationPlayabilityTokenRefresh = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_LocationInfo_UrlStatus() {
  return {
    reportingEnabledSetting: void 0,
    historyEnabledSetting: void 0,
    isAllowed: void 0,
    isActive: void 0
  };
}
__name(createBaseClientInfo_LocationInfo_UrlStatus, "createBaseClientInfo_LocationInfo_UrlStatus");
var ClientInfo_LocationInfo_UrlStatus = {
  encode(message, writer = new BinaryWriter()) {
    if (message.reportingEnabledSetting !== void 0) {
      writer.uint32(8).int32(message.reportingEnabledSetting);
    }
    if (message.historyEnabledSetting !== void 0) {
      writer.uint32(16).int32(message.historyEnabledSetting);
    }
    if (message.isAllowed !== void 0) {
      writer.uint32(24).bool(message.isAllowed);
    }
    if (message.isActive !== void 0) {
      writer.uint32(32).bool(message.isActive);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_LocationInfo_UrlStatus();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.reportingEnabledSetting = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.historyEnabledSetting = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.isAllowed = reader.bool();
          continue;
        }
        case 4: {
          if (tag !== 32) {
            break;
          }
          message.isActive = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseClientInfo_HomeGroupInfo() {
  return { isPartOfGroup: void 0, isGroup: void 0 };
}
__name(createBaseClientInfo_HomeGroupInfo, "createBaseClientInfo_HomeGroupInfo");
var ClientInfo_HomeGroupInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.isPartOfGroup !== void 0) {
      writer.uint32(8).bool(message.isPartOfGroup);
    }
    if (message.isGroup !== void 0) {
      writer.uint32(24).bool(message.isGroup);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseClientInfo_HomeGroupInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.isPartOfGroup = reader.bool();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.isGroup = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function longToNumber(int64) {
  const num = globalThis.Number(int64.toString());
  if (num > globalThis.Number.MAX_SAFE_INTEGER) {
    throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
  }
  if (num < globalThis.Number.MIN_SAFE_INTEGER) {
    throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER");
  }
  return num;
}
__name(longToNumber, "longToNumber");

// dist/protos/generated/youtube/api/pfiinnertube/attestation_response_data.js
function createBaseAttestationResponseData() {
  return {
    challenge: void 0,
    webResponse: void 0,
    androidResponse: void 0,
    iosResponse: void 0,
    error: void 0,
    adblockReporting: void 0
  };
}
__name(createBaseAttestationResponseData, "createBaseAttestationResponseData");
var AttestationResponseData = {
  encode(message, writer = new BinaryWriter()) {
    if (message.challenge !== void 0) {
      writer.uint32(10).string(message.challenge);
    }
    if (message.webResponse !== void 0) {
      writer.uint32(18).string(message.webResponse);
    }
    if (message.androidResponse !== void 0) {
      writer.uint32(26).string(message.androidResponse);
    }
    if (message.iosResponse !== void 0) {
      writer.uint32(34).bytes(message.iosResponse);
    }
    if (message.error !== void 0) {
      writer.uint32(40).int32(message.error);
    }
    if (message.adblockReporting !== void 0) {
      AttestationResponseData_AdblockReporting.encode(message.adblockReporting, writer.uint32(50).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseAttestationResponseData();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.challenge = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.webResponse = reader.string();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.androidResponse = reader.string();
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.iosResponse = reader.bytes();
          continue;
        }
        case 5: {
          if (tag !== 40) {
            break;
          }
          message.error = reader.int32();
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.adblockReporting = AttestationResponseData_AdblockReporting.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseAttestationResponseData_AdblockReporting() {
  return { reportingStatus: void 0, broadSpectrumDetectionResult: void 0 };
}
__name(createBaseAttestationResponseData_AdblockReporting, "createBaseAttestationResponseData_AdblockReporting");
var AttestationResponseData_AdblockReporting = {
  encode(message, writer = new BinaryWriter()) {
    if (message.reportingStatus !== void 0) {
      writer.uint32(8).uint64(message.reportingStatus);
    }
    if (message.broadSpectrumDetectionResult !== void 0) {
      writer.uint32(16).uint64(message.broadSpectrumDetectionResult);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseAttestationResponseData_AdblockReporting();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.reportingStatus = longToNumber2(reader.uint64());
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.broadSpectrumDetectionResult = longToNumber2(reader.uint64());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function longToNumber2(int64) {
  const num = globalThis.Number(int64.toString());
  if (num > globalThis.Number.MAX_SAFE_INTEGER) {
    throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
  }
  if (num < globalThis.Number.MIN_SAFE_INTEGER) {
    throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER");
  }
  return num;
}
__name(longToNumber2, "longToNumber");

// dist/protos/generated/youtube/api/pfiinnertube/request_info.js
function createBaseRequestInfo() {
  return {
    thirdPartyDigest: void 0,
    useSsl: void 0,
    returnErrorDetail: void 0,
    ifNoneMatch: void 0,
    returnLogEntry: void 0,
    isPrefetch: void 0,
    internalExperimentFlags: [],
    returnDebugData: void 0,
    innertubez: void 0,
    traceProto: void 0,
    returnLogEntryJson: void 0,
    sherlogUsername: void 0,
    reauthRequestInfo: void 0,
    sessionInfo: void 0,
    returnLogEntryProto: void 0,
    externalPrequestContext: void 0,
    attestationResponseData: void 0,
    eats: void 0,
    requestQos: void 0
  };
}
__name(createBaseRequestInfo, "createBaseRequestInfo");
var RequestInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.thirdPartyDigest !== void 0) {
      writer.uint32(50).string(message.thirdPartyDigest);
    }
    if (message.useSsl !== void 0) {
      writer.uint32(56).bool(message.useSsl);
    }
    if (message.returnErrorDetail !== void 0) {
      writer.uint32(72).bool(message.returnErrorDetail);
    }
    if (message.ifNoneMatch !== void 0) {
      writer.uint32(98).string(message.ifNoneMatch);
    }
    if (message.returnLogEntry !== void 0) {
      writer.uint32(104).bool(message.returnLogEntry);
    }
    if (message.isPrefetch !== void 0) {
      writer.uint32(112).bool(message.isPrefetch);
    }
    for (const v of message.internalExperimentFlags) {
      KeyValuePair.encode(v, writer.uint32(122).fork()).join();
    }
    if (message.returnDebugData !== void 0) {
      writer.uint32(128).bool(message.returnDebugData);
    }
    if (message.innertubez !== void 0) {
      writer.uint32(146).string(message.innertubez);
    }
    if (message.traceProto !== void 0) {
      writer.uint32(184).bool(message.traceProto);
    }
    if (message.returnLogEntryJson !== void 0) {
      writer.uint32(192).bool(message.returnLogEntryJson);
    }
    if (message.sherlogUsername !== void 0) {
      writer.uint32(202).string(message.sherlogUsername);
    }
    if (message.reauthRequestInfo !== void 0) {
      RequestInfo_ReauthRequestInfo.encode(message.reauthRequestInfo, writer.uint32(234).fork()).join();
    }
    if (message.sessionInfo !== void 0) {
      RequestInfo_SessionInfo.encode(message.sessionInfo, writer.uint32(242).fork()).join();
    }
    if (message.returnLogEntryProto !== void 0) {
      writer.uint32(248).bool(message.returnLogEntryProto);
    }
    if (message.externalPrequestContext !== void 0) {
      writer.uint32(258).string(message.externalPrequestContext);
    }
    if (message.attestationResponseData !== void 0) {
      AttestationResponseData.encode(message.attestationResponseData, writer.uint32(274).fork()).join();
    }
    if (message.eats !== void 0) {
      writer.uint32(282).bytes(message.eats);
    }
    if (message.requestQos !== void 0) {
      RequestInfo_RequestQoS.encode(message.requestQos, writer.uint32(290).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseRequestInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.thirdPartyDigest = reader.string();
          continue;
        }
        case 7: {
          if (tag !== 56) {
            break;
          }
          message.useSsl = reader.bool();
          continue;
        }
        case 9: {
          if (tag !== 72) {
            break;
          }
          message.returnErrorDetail = reader.bool();
          continue;
        }
        case 12: {
          if (tag !== 98) {
            break;
          }
          message.ifNoneMatch = reader.string();
          continue;
        }
        case 13: {
          if (tag !== 104) {
            break;
          }
          message.returnLogEntry = reader.bool();
          continue;
        }
        case 14: {
          if (tag !== 112) {
            break;
          }
          message.isPrefetch = reader.bool();
          continue;
        }
        case 15: {
          if (tag !== 122) {
            break;
          }
          message.internalExperimentFlags.push(KeyValuePair.decode(reader, reader.uint32()));
          continue;
        }
        case 16: {
          if (tag !== 128) {
            break;
          }
          message.returnDebugData = reader.bool();
          continue;
        }
        case 18: {
          if (tag !== 146) {
            break;
          }
          message.innertubez = reader.string();
          continue;
        }
        case 23: {
          if (tag !== 184) {
            break;
          }
          message.traceProto = reader.bool();
          continue;
        }
        case 24: {
          if (tag !== 192) {
            break;
          }
          message.returnLogEntryJson = reader.bool();
          continue;
        }
        case 25: {
          if (tag !== 202) {
            break;
          }
          message.sherlogUsername = reader.string();
          continue;
        }
        case 29: {
          if (tag !== 234) {
            break;
          }
          message.reauthRequestInfo = RequestInfo_ReauthRequestInfo.decode(reader, reader.uint32());
          continue;
        }
        case 30: {
          if (tag !== 242) {
            break;
          }
          message.sessionInfo = RequestInfo_SessionInfo.decode(reader, reader.uint32());
          continue;
        }
        case 31: {
          if (tag !== 248) {
            break;
          }
          message.returnLogEntryProto = reader.bool();
          continue;
        }
        case 32: {
          if (tag !== 258) {
            break;
          }
          message.externalPrequestContext = reader.string();
          continue;
        }
        case 34: {
          if (tag !== 274) {
            break;
          }
          message.attestationResponseData = AttestationResponseData.decode(reader, reader.uint32());
          continue;
        }
        case 35: {
          if (tag !== 282) {
            break;
          }
          message.eats = reader.bytes();
          continue;
        }
        case 36: {
          if (tag !== 290) {
            break;
          }
          message.requestQos = RequestInfo_RequestQoS.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseRequestInfo_RequestQoS() {
  return { criticality: void 0 };
}
__name(createBaseRequestInfo_RequestQoS, "createBaseRequestInfo_RequestQoS");
var RequestInfo_RequestQoS = {
  encode(message, writer = new BinaryWriter()) {
    if (message.criticality !== void 0) {
      writer.uint32(8).int32(message.criticality);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseRequestInfo_RequestQoS();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.criticality = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseRequestInfo_SessionInfo() {
  return { token: void 0 };
}
__name(createBaseRequestInfo_SessionInfo, "createBaseRequestInfo_SessionInfo");
var RequestInfo_SessionInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.token !== void 0) {
      writer.uint32(10).string(message.token);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseRequestInfo_SessionInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.token = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseRequestInfo_ReauthRequestInfo() {
  return { encodedReauthProofToken: void 0 };
}
__name(createBaseRequestInfo_ReauthRequestInfo, "createBaseRequestInfo_ReauthRequestInfo");
var RequestInfo_ReauthRequestInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.encodedReauthProofToken !== void 0) {
      writer.uint32(10).string(message.encodedReauthProofToken);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseRequestInfo_ReauthRequestInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.encodedReauthProofToken = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};

// dist/protos/generated/youtube/api/pfiinnertube/third_party_info.js
function createBaseThirdPartyInfo() {
  return {
    developerKey: void 0,
    appName: void 0,
    appPublisher: void 0,
    embedUrl: void 0,
    appVersion: void 0,
    embeddedPlayerContext: void 0
  };
}
__name(createBaseThirdPartyInfo, "createBaseThirdPartyInfo");
var ThirdPartyInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.developerKey !== void 0) {
      writer.uint32(10).string(message.developerKey);
    }
    if (message.appName !== void 0) {
      writer.uint32(18).string(message.appName);
    }
    if (message.appPublisher !== void 0) {
      writer.uint32(26).string(message.appPublisher);
    }
    if (message.embedUrl !== void 0) {
      writer.uint32(34).string(message.embedUrl);
    }
    if (message.appVersion !== void 0) {
      writer.uint32(50).string(message.appVersion);
    }
    if (message.embeddedPlayerContext !== void 0) {
      ThirdPartyInfo_EmbeddedPlayerContext.encode(message.embeddedPlayerContext, writer.uint32(58).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseThirdPartyInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.developerKey = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.appName = reader.string();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.appPublisher = reader.string();
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.embedUrl = reader.string();
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.appVersion = reader.string();
          continue;
        }
        case 7: {
          if (tag !== 58) {
            break;
          }
          message.embeddedPlayerContext = ThirdPartyInfo_EmbeddedPlayerContext.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseThirdPartyInfo_EmbeddedPlayerContext() {
  return { ancestorOrigins: void 0, embeddedPlayerEncryptedContext: void 0, ancestorOriginsSupported: void 0 };
}
__name(createBaseThirdPartyInfo_EmbeddedPlayerContext, "createBaseThirdPartyInfo_EmbeddedPlayerContext");
var ThirdPartyInfo_EmbeddedPlayerContext = {
  encode(message, writer = new BinaryWriter()) {
    if (message.ancestorOrigins !== void 0) {
      writer.uint32(10).string(message.ancestorOrigins);
    }
    if (message.embeddedPlayerEncryptedContext !== void 0) {
      writer.uint32(18).string(message.embeddedPlayerEncryptedContext);
    }
    if (message.ancestorOriginsSupported !== void 0) {
      writer.uint32(24).bool(message.ancestorOriginsSupported);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseThirdPartyInfo_EmbeddedPlayerContext();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.ancestorOrigins = reader.string();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.embeddedPlayerEncryptedContext = reader.string();
          continue;
        }
        case 3: {
          if (tag !== 24) {
            break;
          }
          message.ancestorOriginsSupported = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};

// dist/protos/generated/youtube/api/pfiinnertube/user_info.js
function createBaseUserInfo() {
  return {
    onBehalfOfUser: void 0,
    enableSafetyMode: void 0,
    credentialTransferTokens: [],
    delegatePurchases: void 0,
    kidsParent: void 0,
    isIncognito: void 0,
    lockedSafetyMode: void 0,
    delegationContext: void 0,
    serializedDelegationContext: void 0
  };
}
__name(createBaseUserInfo, "createBaseUserInfo");
var UserInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.onBehalfOfUser !== void 0) {
      writer.uint32(26).string(message.onBehalfOfUser);
    }
    if (message.enableSafetyMode !== void 0) {
      writer.uint32(56).bool(message.enableSafetyMode);
    }
    for (const v of message.credentialTransferTokens) {
      UserInfo_CredentialTransferToken.encode(v, writer.uint32(98).fork()).join();
    }
    if (message.delegatePurchases !== void 0) {
      UserInfo_DelegatePurchases.encode(message.delegatePurchases, writer.uint32(106).fork()).join();
    }
    if (message.kidsParent !== void 0) {
      UserInfo_KidsParent.encode(message.kidsParent, writer.uint32(114).fork()).join();
    }
    if (message.isIncognito !== void 0) {
      writer.uint32(120).bool(message.isIncognito);
    }
    if (message.lockedSafetyMode !== void 0) {
      writer.uint32(128).bool(message.lockedSafetyMode);
    }
    if (message.delegationContext !== void 0) {
      UserInfo_DelegationContext.encode(message.delegationContext, writer.uint32(138).fork()).join();
    }
    if (message.serializedDelegationContext !== void 0) {
      writer.uint32(146).string(message.serializedDelegationContext);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseUserInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.onBehalfOfUser = reader.string();
          continue;
        }
        case 7: {
          if (tag !== 56) {
            break;
          }
          message.enableSafetyMode = reader.bool();
          continue;
        }
        case 12: {
          if (tag !== 98) {
            break;
          }
          message.credentialTransferTokens.push(UserInfo_CredentialTransferToken.decode(reader, reader.uint32()));
          continue;
        }
        case 13: {
          if (tag !== 106) {
            break;
          }
          message.delegatePurchases = UserInfo_DelegatePurchases.decode(reader, reader.uint32());
          continue;
        }
        case 14: {
          if (tag !== 114) {
            break;
          }
          message.kidsParent = UserInfo_KidsParent.decode(reader, reader.uint32());
          continue;
        }
        case 15: {
          if (tag !== 120) {
            break;
          }
          message.isIncognito = reader.bool();
          continue;
        }
        case 16: {
          if (tag !== 128) {
            break;
          }
          message.lockedSafetyMode = reader.bool();
          continue;
        }
        case 17: {
          if (tag !== 138) {
            break;
          }
          message.delegationContext = UserInfo_DelegationContext.decode(reader, reader.uint32());
          continue;
        }
        case 18: {
          if (tag !== 146) {
            break;
          }
          message.serializedDelegationContext = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseUserInfo_KidsParent() {
  return {};
}
__name(createBaseUserInfo_KidsParent, "createBaseUserInfo_KidsParent");
var UserInfo_KidsParent = {
  encode(_, writer = new BinaryWriter()) {
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseUserInfo_KidsParent();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseUserInfo_DelegatePurchases() {
  return {};
}
__name(createBaseUserInfo_DelegatePurchases, "createBaseUserInfo_DelegatePurchases");
var UserInfo_DelegatePurchases = {
  encode(_, writer = new BinaryWriter()) {
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseUserInfo_DelegatePurchases();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseUserInfo_DelegationContext() {
  return {};
}
__name(createBaseUserInfo_DelegationContext, "createBaseUserInfo_DelegationContext");
var UserInfo_DelegationContext = {
  encode(_, writer = new BinaryWriter()) {
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseUserInfo_DelegationContext();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseUserInfo_CredentialTransferToken() {
  return {};
}
__name(createBaseUserInfo_CredentialTransferToken, "createBaseUserInfo_CredentialTransferToken");
var UserInfo_CredentialTransferToken = {
  encode(_, writer = new BinaryWriter()) {
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseUserInfo_CredentialTransferToken();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};

// dist/protos/generated/youtube/api/pfiinnertube/innertube_context.js
function createBaseInnerTubeContext() {
  return {
    client: void 0,
    user: void 0,
    capabilities: void 0,
    request: void 0,
    clickTracking: void 0,
    thirdParty: void 0,
    remoteClient: void 0,
    adSignalsInfo: void 0,
    experimentalData: void 0,
    clientScreenNonce: void 0,
    activePlayers: []
  };
}
__name(createBaseInnerTubeContext, "createBaseInnerTubeContext");
var InnerTubeContext = {
  encode(message, writer = new BinaryWriter()) {
    if (message.client !== void 0) {
      ClientInfo.encode(message.client, writer.uint32(10).fork()).join();
    }
    if (message.user !== void 0) {
      UserInfo.encode(message.user, writer.uint32(26).fork()).join();
    }
    if (message.capabilities !== void 0) {
      CapabilityInfo.encode(message.capabilities, writer.uint32(34).fork()).join();
    }
    if (message.request !== void 0) {
      RequestInfo.encode(message.request, writer.uint32(42).fork()).join();
    }
    if (message.clickTracking !== void 0) {
      InnerTubeContext_ClickTrackingInfo.encode(message.clickTracking, writer.uint32(50).fork()).join();
    }
    if (message.thirdParty !== void 0) {
      ThirdPartyInfo.encode(message.thirdParty, writer.uint32(58).fork()).join();
    }
    if (message.remoteClient !== void 0) {
      ClientInfo.encode(message.remoteClient, writer.uint32(66).fork()).join();
    }
    if (message.adSignalsInfo !== void 0) {
      InnerTubeContext_AdSignalsInfo.encode(message.adSignalsInfo, writer.uint32(74).fork()).join();
    }
    if (message.experimentalData !== void 0) {
      InnerTubeContext_ExperimentalData.encode(message.experimentalData, writer.uint32(82).fork()).join();
    }
    if (message.clientScreenNonce !== void 0) {
      writer.uint32(90).string(message.clientScreenNonce);
    }
    for (const v of message.activePlayers) {
      InnerTubeContext_ActivePlayerInfo.encode(v, writer.uint32(98).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseInnerTubeContext();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.client = ClientInfo.decode(reader, reader.uint32());
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.user = UserInfo.decode(reader, reader.uint32());
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.capabilities = CapabilityInfo.decode(reader, reader.uint32());
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.request = RequestInfo.decode(reader, reader.uint32());
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.clickTracking = InnerTubeContext_ClickTrackingInfo.decode(reader, reader.uint32());
          continue;
        }
        case 7: {
          if (tag !== 58) {
            break;
          }
          message.thirdParty = ThirdPartyInfo.decode(reader, reader.uint32());
          continue;
        }
        case 8: {
          if (tag !== 66) {
            break;
          }
          message.remoteClient = ClientInfo.decode(reader, reader.uint32());
          continue;
        }
        case 9: {
          if (tag !== 74) {
            break;
          }
          message.adSignalsInfo = InnerTubeContext_AdSignalsInfo.decode(reader, reader.uint32());
          continue;
        }
        case 10: {
          if (tag !== 82) {
            break;
          }
          message.experimentalData = InnerTubeContext_ExperimentalData.decode(reader, reader.uint32());
          continue;
        }
        case 11: {
          if (tag !== 90) {
            break;
          }
          message.clientScreenNonce = reader.string();
          continue;
        }
        case 12: {
          if (tag !== 98) {
            break;
          }
          message.activePlayers.push(InnerTubeContext_ActivePlayerInfo.decode(reader, reader.uint32()));
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseInnerTubeContext_ExperimentalData() {
  return { params: [] };
}
__name(createBaseInnerTubeContext_ExperimentalData, "createBaseInnerTubeContext_ExperimentalData");
var InnerTubeContext_ExperimentalData = {
  encode(message, writer = new BinaryWriter()) {
    for (const v of message.params) {
      KeyValuePair.encode(v, writer.uint32(10).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseInnerTubeContext_ExperimentalData();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.params.push(KeyValuePair.decode(reader, reader.uint32()));
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseInnerTubeContext_ActivePlayerInfo() {
  return { playerContextParams: void 0 };
}
__name(createBaseInnerTubeContext_ActivePlayerInfo, "createBaseInnerTubeContext_ActivePlayerInfo");
var InnerTubeContext_ActivePlayerInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.playerContextParams !== void 0) {
      writer.uint32(10).bytes(message.playerContextParams);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseInnerTubeContext_ActivePlayerInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.playerContextParams = reader.bytes();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseInnerTubeContext_ClickTrackingInfo() {
  return { clickTrackingParams: void 0 };
}
__name(createBaseInnerTubeContext_ClickTrackingInfo, "createBaseInnerTubeContext_ClickTrackingInfo");
var InnerTubeContext_ClickTrackingInfo = {
  encode(message, writer = new BinaryWriter()) {
    if (message.clickTrackingParams !== void 0) {
      writer.uint32(18).bytes(message.clickTrackingParams);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseInnerTubeContext_ClickTrackingInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.clickTrackingParams = reader.bytes();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseInnerTubeContext_AdSignalsInfo() {
  return {
    params: [],
    bid: void 0,
    mutsuId: void 0,
    consentBumpState: void 0,
    advertisingId: void 0,
    limitAdTracking: void 0,
    attributionOsSupportedVersion: void 0
  };
}
__name(createBaseInnerTubeContext_AdSignalsInfo, "createBaseInnerTubeContext_AdSignalsInfo");
var InnerTubeContext_AdSignalsInfo = {
  encode(message, writer = new BinaryWriter()) {
    for (const v of message.params) {
      KeyValuePair.encode(v, writer.uint32(10).fork()).join();
    }
    if (message.bid !== void 0) {
      writer.uint32(18).string(message.bid);
    }
    if (message.mutsuId !== void 0) {
      writer.uint32(26).string(message.mutsuId);
    }
    if (message.consentBumpState !== void 0) {
      writer.uint32(34).string(message.consentBumpState);
    }
    if (message.advertisingId !== void 0) {
      writer.uint32(58).string(message.advertisingId);
    }
    if (message.limitAdTracking !== void 0) {
      writer.uint32(72).bool(message.limitAdTracking);
    }
    if (message.attributionOsSupportedVersion !== void 0) {
      writer.uint32(82).string(message.attributionOsSupportedVersion);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseInnerTubeContext_AdSignalsInfo();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.params.push(KeyValuePair.decode(reader, reader.uint32()));
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.bid = reader.string();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.mutsuId = reader.string();
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.consentBumpState = reader.string();
          continue;
        }
        case 7: {
          if (tag !== 58) {
            break;
          }
          message.advertisingId = reader.string();
          continue;
        }
        case 9: {
          if (tag !== 72) {
            break;
          }
          message.limitAdTracking = reader.bool();
          continue;
        }
        case 10: {
          if (tag !== 82) {
            break;
          }
          message.attributionOsSupportedVersion = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};

// dist/protos/generated/youtube/api/pfiinnertube/metadata_update_request.js
function createBaseMetadataUpdateRequest() {
  return {
    context: void 0,
    encryptedVideoId: void 0,
    title: void 0,
    description: void 0,
    privacy: void 0,
    tags: void 0,
    category: void 0,
    license: void 0,
    ageRestriction: void 0,
    videoStill: void 0,
    madeForKids: void 0,
    racy: void 0
  };
}
__name(createBaseMetadataUpdateRequest, "createBaseMetadataUpdateRequest");
var MetadataUpdateRequest = {
  encode(message, writer = new BinaryWriter()) {
    if (message.context !== void 0) {
      InnerTubeContext.encode(message.context, writer.uint32(10).fork()).join();
    }
    if (message.encryptedVideoId !== void 0) {
      writer.uint32(18).string(message.encryptedVideoId);
    }
    if (message.title !== void 0) {
      MetadataUpdateRequest_MdeTitleUpdateRequest.encode(message.title, writer.uint32(26).fork()).join();
    }
    if (message.description !== void 0) {
      MetadataUpdateRequest_MdeDescriptionUpdateRequest.encode(message.description, writer.uint32(34).fork()).join();
    }
    if (message.privacy !== void 0) {
      MetadataUpdateRequest_MdePrivacyUpdateRequest.encode(message.privacy, writer.uint32(42).fork()).join();
    }
    if (message.tags !== void 0) {
      MetadataUpdateRequest_MdeTagsUpdateRequest.encode(message.tags, writer.uint32(50).fork()).join();
    }
    if (message.category !== void 0) {
      MetadataUpdateRequest_MdeCategoryUpdateRequest.encode(message.category, writer.uint32(58).fork()).join();
    }
    if (message.license !== void 0) {
      MetadataUpdateRequest_MdeLicenseUpdateRequest.encode(message.license, writer.uint32(66).fork()).join();
    }
    if (message.ageRestriction !== void 0) {
      MetadataUpdateRequest_MdeAgeRestrictionUpdateRequest.encode(message.ageRestriction, writer.uint32(90).fork()).join();
    }
    if (message.videoStill !== void 0) {
      MetadataUpdateRequest_MdeVideoStillRequestParams.encode(message.videoStill, writer.uint32(162).fork()).join();
    }
    if (message.madeForKids !== void 0) {
      MetadataUpdateRequest_MdeMadeForKidsUpdateRequestParams.encode(message.madeForKids, writer.uint32(546).fork()).join();
    }
    if (message.racy !== void 0) {
      MetadataUpdateRequest_MdeRacyRequestParams.encode(message.racy, writer.uint32(554).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.context = InnerTubeContext.decode(reader, reader.uint32());
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.encryptedVideoId = reader.string();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.title = MetadataUpdateRequest_MdeTitleUpdateRequest.decode(reader, reader.uint32());
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.description = MetadataUpdateRequest_MdeDescriptionUpdateRequest.decode(reader, reader.uint32());
          continue;
        }
        case 5: {
          if (tag !== 42) {
            break;
          }
          message.privacy = MetadataUpdateRequest_MdePrivacyUpdateRequest.decode(reader, reader.uint32());
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.tags = MetadataUpdateRequest_MdeTagsUpdateRequest.decode(reader, reader.uint32());
          continue;
        }
        case 7: {
          if (tag !== 58) {
            break;
          }
          message.category = MetadataUpdateRequest_MdeCategoryUpdateRequest.decode(reader, reader.uint32());
          continue;
        }
        case 8: {
          if (tag !== 66) {
            break;
          }
          message.license = MetadataUpdateRequest_MdeLicenseUpdateRequest.decode(reader, reader.uint32());
          continue;
        }
        case 11: {
          if (tag !== 90) {
            break;
          }
          message.ageRestriction = MetadataUpdateRequest_MdeAgeRestrictionUpdateRequest.decode(reader, reader.uint32());
          continue;
        }
        case 20: {
          if (tag !== 162) {
            break;
          }
          message.videoStill = MetadataUpdateRequest_MdeVideoStillRequestParams.decode(reader, reader.uint32());
          continue;
        }
        case 68: {
          if (tag !== 546) {
            break;
          }
          message.madeForKids = MetadataUpdateRequest_MdeMadeForKidsUpdateRequestParams.decode(reader, reader.uint32());
          continue;
        }
        case 69: {
          if (tag !== 554) {
            break;
          }
          message.racy = MetadataUpdateRequest_MdeRacyRequestParams.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeTitleUpdateRequest() {
  return { newTitle: void 0 };
}
__name(createBaseMetadataUpdateRequest_MdeTitleUpdateRequest, "createBaseMetadataUpdateRequest_MdeTitleUpdateRequest");
var MetadataUpdateRequest_MdeTitleUpdateRequest = {
  encode(message, writer = new BinaryWriter()) {
    if (message.newTitle !== void 0) {
      writer.uint32(10).string(message.newTitle);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeTitleUpdateRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.newTitle = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeDescriptionUpdateRequest() {
  return { newDescription: void 0 };
}
__name(createBaseMetadataUpdateRequest_MdeDescriptionUpdateRequest, "createBaseMetadataUpdateRequest_MdeDescriptionUpdateRequest");
var MetadataUpdateRequest_MdeDescriptionUpdateRequest = {
  encode(message, writer = new BinaryWriter()) {
    if (message.newDescription !== void 0) {
      writer.uint32(10).string(message.newDescription);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeDescriptionUpdateRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.newDescription = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdePrivacyUpdateRequest() {
  return { newPrivacy: void 0, clearPrivacyDraft: void 0 };
}
__name(createBaseMetadataUpdateRequest_MdePrivacyUpdateRequest, "createBaseMetadataUpdateRequest_MdePrivacyUpdateRequest");
var MetadataUpdateRequest_MdePrivacyUpdateRequest = {
  encode(message, writer = new BinaryWriter()) {
    if (message.newPrivacy !== void 0) {
      writer.uint32(8).int32(message.newPrivacy);
    }
    if (message.clearPrivacyDraft !== void 0) {
      writer.uint32(16).bool(message.clearPrivacyDraft);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdePrivacyUpdateRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.newPrivacy = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.clearPrivacyDraft = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeTagsUpdateRequest() {
  return { newTags: [] };
}
__name(createBaseMetadataUpdateRequest_MdeTagsUpdateRequest, "createBaseMetadataUpdateRequest_MdeTagsUpdateRequest");
var MetadataUpdateRequest_MdeTagsUpdateRequest = {
  encode(message, writer = new BinaryWriter()) {
    for (const v of message.newTags) {
      writer.uint32(10).string(v);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeTagsUpdateRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.newTags.push(reader.string());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeCategoryUpdateRequest() {
  return { newCategoryId: void 0 };
}
__name(createBaseMetadataUpdateRequest_MdeCategoryUpdateRequest, "createBaseMetadataUpdateRequest_MdeCategoryUpdateRequest");
var MetadataUpdateRequest_MdeCategoryUpdateRequest = {
  encode(message, writer = new BinaryWriter()) {
    if (message.newCategoryId !== void 0) {
      writer.uint32(8).int32(message.newCategoryId);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeCategoryUpdateRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.newCategoryId = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeLicenseUpdateRequest() {
  return { newLicenseId: void 0 };
}
__name(createBaseMetadataUpdateRequest_MdeLicenseUpdateRequest, "createBaseMetadataUpdateRequest_MdeLicenseUpdateRequest");
var MetadataUpdateRequest_MdeLicenseUpdateRequest = {
  encode(message, writer = new BinaryWriter()) {
    if (message.newLicenseId !== void 0) {
      writer.uint32(10).string(message.newLicenseId);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeLicenseUpdateRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.newLicenseId = reader.string();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeMadeForKidsUpdateRequestParams() {
  return { operation: void 0, newMfk: void 0 };
}
__name(createBaseMetadataUpdateRequest_MdeMadeForKidsUpdateRequestParams, "createBaseMetadataUpdateRequest_MdeMadeForKidsUpdateRequestParams");
var MetadataUpdateRequest_MdeMadeForKidsUpdateRequestParams = {
  encode(message, writer = new BinaryWriter()) {
    if (message.operation !== void 0) {
      writer.uint32(8).int32(message.operation);
    }
    if (message.newMfk !== void 0) {
      writer.uint32(16).int32(message.newMfk);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeMadeForKidsUpdateRequestParams();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.operation = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.newMfk = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeRacyRequestParams() {
  return { operation: void 0, newRacy: void 0 };
}
__name(createBaseMetadataUpdateRequest_MdeRacyRequestParams, "createBaseMetadataUpdateRequest_MdeRacyRequestParams");
var MetadataUpdateRequest_MdeRacyRequestParams = {
  encode(message, writer = new BinaryWriter()) {
    if (message.operation !== void 0) {
      writer.uint32(8).int32(message.operation);
    }
    if (message.newRacy !== void 0) {
      writer.uint32(16).int32(message.newRacy);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeRacyRequestParams();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.operation = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.newRacy = reader.int32();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeAgeRestrictionUpdateRequest() {
  return { newIsAgeRestricted: void 0 };
}
__name(createBaseMetadataUpdateRequest_MdeAgeRestrictionUpdateRequest, "createBaseMetadataUpdateRequest_MdeAgeRestrictionUpdateRequest");
var MetadataUpdateRequest_MdeAgeRestrictionUpdateRequest = {
  encode(message, writer = new BinaryWriter()) {
    if (message.newIsAgeRestricted !== void 0) {
      writer.uint32(8).bool(message.newIsAgeRestricted);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeAgeRestrictionUpdateRequest();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.newIsAgeRestricted = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeVideoStillRequestParams() {
  return { operation: void 0, newStillId: void 0, image: void 0, testImage: void 0, experimentImage: [] };
}
__name(createBaseMetadataUpdateRequest_MdeVideoStillRequestParams, "createBaseMetadataUpdateRequest_MdeVideoStillRequestParams");
var MetadataUpdateRequest_MdeVideoStillRequestParams = {
  encode(message, writer = new BinaryWriter()) {
    if (message.operation !== void 0) {
      writer.uint32(8).int32(message.operation);
    }
    if (message.newStillId !== void 0) {
      writer.uint32(16).int32(message.newStillId);
    }
    if (message.image !== void 0) {
      MetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage.encode(message.image, writer.uint32(26).fork()).join();
    }
    if (message.testImage !== void 0) {
      MetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage.encode(message.testImage, writer.uint32(34).fork()).join();
    }
    for (const v of message.experimentImage) {
      MetadataUpdateRequest_MdeVideoStillRequestParams_ThumbnailExperimentImageData.encode(v, writer.uint32(50).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeVideoStillRequestParams();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 8) {
            break;
          }
          message.operation = reader.int32();
          continue;
        }
        case 2: {
          if (tag !== 16) {
            break;
          }
          message.newStillId = reader.int32();
          continue;
        }
        case 3: {
          if (tag !== 26) {
            break;
          }
          message.image = MetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage.decode(reader, reader.uint32());
          continue;
        }
        case 4: {
          if (tag !== 34) {
            break;
          }
          message.testImage = MetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage.decode(reader, reader.uint32());
          continue;
        }
        case 6: {
          if (tag !== 50) {
            break;
          }
          message.experimentImage.push(MetadataUpdateRequest_MdeVideoStillRequestParams_ThumbnailExperimentImageData.decode(reader, reader.uint32()));
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeVideoStillRequestParams_ThumbnailExperimentImageData() {
  return { image: void 0 };
}
__name(createBaseMetadataUpdateRequest_MdeVideoStillRequestParams_ThumbnailExperimentImageData, "createBaseMetadataUpdateRequest_MdeVideoStillRequestParams_ThumbnailExperimentImageData");
var MetadataUpdateRequest_MdeVideoStillRequestParams_ThumbnailExperimentImageData = {
  encode(message, writer = new BinaryWriter()) {
    if (message.image !== void 0) {
      MetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage.encode(message.image, writer.uint32(10).fork()).join();
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeVideoStillRequestParams_ThumbnailExperimentImageData();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.image = MetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage.decode(reader, reader.uint32());
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function createBaseMetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage() {
  return { rawBytes: void 0, dataUri: void 0, frameTimestampUs: void 0, isVertical: void 0 };
}
__name(createBaseMetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage, "createBaseMetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage");
var MetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage = {
  encode(message, writer = new BinaryWriter()) {
    if (message.rawBytes !== void 0) {
      writer.uint32(10).bytes(message.rawBytes);
    }
    if (message.dataUri !== void 0) {
      writer.uint32(18).string(message.dataUri);
    }
    if (message.frameTimestampUs !== void 0) {
      writer.uint32(32).int64(message.frameTimestampUs);
    }
    if (message.isVertical !== void 0) {
      writer.uint32(40).bool(message.isVertical);
    }
    return writer;
  },
  decode(input, length) {
    const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
    const end = length === void 0 ? reader.len : reader.pos + length;
    const message = createBaseMetadataUpdateRequest_MdeVideoStillRequestParams_CustomThumbnailImage();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1: {
          if (tag !== 10) {
            break;
          }
          message.rawBytes = reader.bytes();
          continue;
        }
        case 2: {
          if (tag !== 18) {
            break;
          }
          message.dataUri = reader.string();
          continue;
        }
        case 4: {
          if (tag !== 32) {
            break;
          }
          message.frameTimestampUs = longToNumber3(reader.int64());
          continue;
        }
        case 5: {
          if (tag !== 40) {
            break;
          }
          message.isVertical = reader.bool();
          continue;
        }
      }
      if ((tag & 7) === 4 || tag === 0) {
        break;
      }
      reader.skip(tag & 7);
    }
    return message;
  }
};
function longToNumber3(int64) {
  const num = globalThis.Number(int64.toString());
  if (num > globalThis.Number.MAX_SAFE_INTEGER) {
    throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
  }
  if (num < globalThis.Number.MIN_SAFE_INTEGER) {
    throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER");
  }
  return num;
}
__name(longToNumber3, "longToNumber");

// dist/src/core/clients/Studio.js
var _session5, _Studio_instances, getInitialUploadData_fn, uploadVideo_fn, setVideoMetadata_fn;
var _Studio = class _Studio {
  constructor(session) {
    __privateAdd(this, _Studio_instances);
    __privateAdd(this, _session5);
    __privateSet(this, _session5, session);
  }
  /**
   * Updates the metadata of a video.
   * @example
   * ```ts
   * const videoId = 'abcdefg';
   * const thumbnail = fs.readFileSync('./my_awesome_thumbnail.jpg');
   *
   * const response = await yt.studio.updateVideoMetadata(videoId, {
   *   tags: [ 'astronomy', 'NASA', 'APOD' ],
   *   title: 'Artemis Mission',
   *   description: 'A nicely written description...',
   *   category: 27,
   *   license: 'creative_commons',
   *   thumbnail,
   *   // ...
   * });
   * ```
   */
  async updateVideoMetadata(video_id, metadata) {
    const session = __privateGet(this, _session5);
    if (!session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const payload = {
      context: {
        client: {
          osName: "Android",
          clientName: parseInt(Constants_exports.CLIENT_NAME_IDS.ANDROID),
          clientVersion: Constants_exports.CLIENTS.ANDROID.VERSION,
          androidSdkVersion: Constants_exports.CLIENTS.ANDROID.SDK_VERSION,
          visitorData: session.context.client.visitorData,
          osVersion: "13",
          acceptLanguage: session.context.client.hl,
          acceptRegion: session.context.client.gl,
          deviceMake: "Google",
          deviceModel: "sdk_gphone64_x86_64",
          screenHeightPoints: 840,
          screenWidthPoints: 432,
          configInfo: {
            appInstallData: session.context.client.configInfo?.appInstallData
          },
          timeZone: session.context.client.timeZone,
          chipset: "qcom;taro"
        },
        activePlayers: []
      },
      encryptedVideoId: video_id
    };
    if (metadata.title)
      payload.title = { newTitle: metadata.title };
    if (metadata.description)
      payload.description = { newDescription: metadata.description };
    if (metadata.license)
      payload.license = { newLicenseId: metadata.license };
    if (metadata.tags)
      payload.tags = { newTags: metadata.tags };
    if (metadata.thumbnail) {
      payload.videoStill = {
        operation: 3,
        image: {
          rawBytes: metadata.thumbnail
        },
        experimentImage: []
      };
    }
    if (Reflect.has(metadata, "category"))
      payload.category = { newCategoryId: metadata.category };
    if (Reflect.has(metadata, "privacy")) {
      switch (metadata.privacy) {
        case "PUBLIC":
          payload.privacy = { newPrivacy: 1 };
          break;
        case "UNLISTED":
          payload.privacy = { newPrivacy: 2 };
          break;
        case "PRIVATE":
          payload.privacy = { newPrivacy: 3 };
          break;
        default:
          throw new Error("Invalid privacy setting");
      }
    }
    if (Reflect.has(metadata, "made_for_kids")) {
      payload.madeForKids = {
        operation: 1,
        newMfk: metadata.made_for_kids ? 1 : 2
      };
    }
    if (Reflect.has(metadata, "age_restricted")) {
      payload.racy = {
        operation: 1,
        newRacy: metadata.age_restricted ? 1 : 2
      };
    }
    const writer = MetadataUpdateRequest.encode(payload);
    return await session.actions.execute("/video_manager/metadata_update", {
      protobuf: true,
      serialized_data: writer.finish()
    });
  }
  /**
   * Uploads a video to YouTube.
   * @example
   * ```ts
   * const file = fs.readFileSync('./my_awesome_video.mp4');
   * const response = await yt.studio.upload(file.buffer, { title: 'Wow!' });
   * ```
   */
  async upload(file, metadata = {}) {
    if (!__privateGet(this, _session5).logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const initial_data = await __privateMethod(this, _Studio_instances, getInitialUploadData_fn).call(this);
    const upload_result = await __privateMethod(this, _Studio_instances, uploadVideo_fn).call(this, initial_data.upload_url, file);
    if (upload_result.status !== "STATUS_SUCCESS")
      throw new InnertubeError("Could not process video.");
    return await __privateMethod(this, _Studio_instances, setVideoMetadata_fn).call(this, initial_data, upload_result, metadata);
  }
};
_session5 = new WeakMap();
_Studio_instances = new WeakSet();
getInitialUploadData_fn = /* @__PURE__ */ __name(async function() {
  const frontend_upload_id = `innertube_android:${Platform.shim.uuidv4()}:0:v=3,api=1,cf=3`;
  const payload = {
    frontendUploadId: frontend_upload_id,
    deviceDisplayName: "Pixel 6 Pro",
    fileId: `goog-edited-video://generated?videoFileUri=content://media/external/video/media/${Platform.shim.uuidv4()}`,
    mp4MoovAtomRelocationStatus: "UNSUPPORTED",
    transcodeResult: "DISABLED",
    connectionType: "WIFI"
  };
  const response = await __privateGet(this, _session5).http.fetch("/upload/youtubei", {
    baseURL: Constants_exports.URLS.YT_UPLOAD,
    method: "POST",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
      "x-goog-upload-command": "start",
      "x-goog-upload-protocol": "resumable"
    },
    body: JSON.stringify(payload)
  });
  if (!response.ok)
    throw new InnertubeError("Could not get initial upload data");
  return {
    frontend_upload_id,
    upload_id: response.headers.get("x-guploader-uploadid"),
    upload_url: response.headers.get("x-goog-upload-url"),
    scotty_resource_id: response.headers.get("x-goog-upload-header-scotty-resource-id"),
    chunk_granularity: response.headers.get("x-goog-upload-chunk-granularity")
  };
}, "#getInitialUploadData");
uploadVideo_fn = /* @__PURE__ */ __name(async function(upload_url, file) {
  const response = await __privateGet(this, _session5).http.fetch_function(upload_url, {
    method: "POST",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
      "x-goog-upload-command": "upload, finalize",
      "x-goog-upload-file-name": `file-${Date.now()}`,
      "x-goog-upload-offset": "0"
    },
    body: file
  });
  if (!response.ok)
    throw new InnertubeError("Could not upload video");
  return await response.json();
}, "#uploadVideo");
setVideoMetadata_fn = /* @__PURE__ */ __name(async function(initial_data, upload_result, metadata) {
  return await __privateGet(this, _session5).actions.execute("/upload/createvideo", {
    resourceId: {
      scottyResourceId: {
        id: upload_result.scottyResourceId
      }
    },
    frontendUploadId: initial_data.frontend_upload_id,
    initialMetadata: {
      title: {
        newTitle: metadata.title
      },
      description: {
        newDescription: metadata.description,
        shouldSegment: true
      },
      privacy: {
        newPrivacy: metadata.privacy || "PRIVATE"
      },
      draftState: {
        isDraft: !!metadata.is_draft
      }
    }
  });
}, "#setVideoMetadata");
__name(_Studio, "Studio");
var Studio = _Studio;

// dist/src/core/managers/index.js
var managers_exports = {};
__export(managers_exports, {
  AccountManager: () => AccountManager,
  InteractionManager: () => InteractionManager,
  PlaylistManager: () => PlaylistManager
});

// dist/src/core/managers/AccountManager.js
var _actions22;
var _AccountManager = class _AccountManager {
  constructor(actions) {
    __privateAdd(this, _actions22);
    __privateSet(this, _actions22, actions);
  }
  async getInfo(all = false) {
    if (!__privateGet(this, _actions22).session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    if (!all && !!__privateGet(this, _actions22).session.context.user.onBehalfOfUser) {
      throw new InnertubeError('Boolean argument must be true when "on_behalf_of_user" is specified.');
    }
    if (all) {
      const get_accounts_list_endpoint2 = new NavigationEndpoint({ getAccountsListInnertubeEndpoint: {
        requestType: "ACCOUNTS_LIST_REQUEST_TYPE_CHANNEL_SWITCHER",
        callCircumstance: "SWITCHING_USERS_FULL"
      } });
      const response2 = await get_accounts_list_endpoint2.call(__privateGet(this, _actions22), { client: "WEB", parse: true });
      return response2.actions_memo?.getType(AccountItem) || [];
    }
    const get_accounts_list_endpoint = new NavigationEndpoint({ getAccountsListInnertubeEndpoint: {} });
    const response = await get_accounts_list_endpoint.call(__privateGet(this, _actions22), { client: "TV" });
    return new AccountInfo(response);
  }
  /**
   * Gets YouTube settings.
   */
  async getSettings() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "SPaccount_overview" } });
    const response = await browse_endpoint.call(__privateGet(this, _actions22));
    return new Settings(__privateGet(this, _actions22), response);
  }
};
_actions22 = new WeakMap();
__name(_AccountManager, "AccountManager");
var AccountManager = _AccountManager;

// dist/src/core/managers/PlaylistManager.js
var _actions23, _PlaylistManager_instances, getPlaylist_fn;
var _PlaylistManager = class _PlaylistManager {
  constructor(actions) {
    __privateAdd(this, _PlaylistManager_instances);
    __privateAdd(this, _actions23);
    __privateSet(this, _actions23, actions);
  }
  /**
   * Creates a playlist.
   * @param title - The title of the playlist.
   * @param video_ids - An array of video IDs to add to the playlist.
   */
  async create(title, video_ids) {
    throwIfMissing({ title, video_ids });
    if (!__privateGet(this, _actions23).session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const create_playlist_endpoint = new NavigationEndpoint({
      createPlaylistServiceEndpoint: {
        title,
        videoIds: video_ids
      }
    });
    const response = await create_playlist_endpoint.call(__privateGet(this, _actions23));
    return {
      success: response.success,
      status_code: response.status_code,
      playlist_id: response.data.playlistId,
      data: response.data
    };
  }
  /**
   * Deletes a given playlist.
   * @param playlist_id - The playlist ID.
   */
  async delete(playlist_id) {
    throwIfMissing({ playlist_id });
    if (!__privateGet(this, _actions23).session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const delete_playlist_endpoint = new NavigationEndpoint({
      deletePlaylistServiceEndpoint: {
        sourcePlaylistId: playlist_id
      }
    });
    const response = await delete_playlist_endpoint.call(__privateGet(this, _actions23));
    return {
      playlist_id,
      success: response.success,
      status_code: response.status_code,
      data: response.data
    };
  }
  /**
   * Adds a given playlist to the library of a user.
   * @param playlist_id - The playlist ID.
   */
  async addToLibrary(playlist_id) {
    throwIfMissing({ playlist_id });
    if (!__privateGet(this, _actions23).session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const like_playlist_endpoint = new NavigationEndpoint({
      likeEndpoint: {
        status: "LIKE",
        target: playlist_id
      }
    });
    return await like_playlist_endpoint.call(__privateGet(this, _actions23));
  }
  /**
   * Remove a given playlist to the library of a user.
   * @param playlist_id - The playlist ID.
   */
  async removeFromLibrary(playlist_id) {
    throwIfMissing({ playlist_id });
    if (!__privateGet(this, _actions23).session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const remove_like_playlist_endpoint = new NavigationEndpoint({
      likeEndpoint: {
        status: "INDIFFERENT",
        target: playlist_id
      }
    });
    return await remove_like_playlist_endpoint.call(__privateGet(this, _actions23));
  }
  /**
   * Adds videos to a given playlist.
   * @param playlist_id - The playlist ID.
   * @param video_ids - An array of video IDs to add to the playlist.
   */
  async addVideos(playlist_id, video_ids) {
    throwIfMissing({ playlist_id, video_ids });
    if (!__privateGet(this, _actions23).session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const playlist_edit_endpoint = new NavigationEndpoint({
      playlistEditEndpoint: {
        playlistId: playlist_id,
        actions: video_ids.map((id) => ({
          action: "ACTION_ADD_VIDEO",
          addedVideoId: id
        }))
      }
    });
    const response = await playlist_edit_endpoint.call(__privateGet(this, _actions23));
    return {
      playlist_id,
      action_result: response.data.actions
      // TODO: implement actions in the parser
    };
  }
  /**
   * Removes videos from a given playlist.
   * @param playlist_id - The playlist ID.
   * @param video_ids - An array of video IDs to remove from the playlist.
   * @param use_set_video_ids - Option to remove videos using set video IDs.
   */
  async removeVideos(playlist_id, video_ids, use_set_video_ids = false) {
    throwIfMissing({ playlist_id, video_ids });
    if (!__privateGet(this, _actions23).session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const playlist = await __privateMethod(this, _PlaylistManager_instances, getPlaylist_fn).call(this, playlist_id);
    if (!playlist.info.is_editable)
      throw new InnertubeError("This playlist cannot be edited.", playlist_id);
    const payload = { playlistId: playlist_id, actions: [] };
    const getSetVideoIds = /* @__PURE__ */ __name(async (pl) => {
      const key_id = use_set_video_ids ? "set_video_id" : "id";
      const videos = pl.videos.filter((video) => video_ids.includes(video.key(key_id).string()));
      videos.forEach((video) => payload.actions.push({
        action: "ACTION_REMOVE_VIDEO",
        setVideoId: video.key("set_video_id").string()
      }));
      if (payload.actions.length < video_ids.length) {
        const next = await pl.getContinuation();
        return getSetVideoIds(next);
      }
    }, "getSetVideoIds");
    await getSetVideoIds(playlist);
    if (!payload.actions.length)
      throw new InnertubeError("Given video ids were not found in this playlist.", video_ids);
    const playlist_edit_endpoint = new NavigationEndpoint({ playlistEditEndpoint: payload });
    const response = await playlist_edit_endpoint.call(__privateGet(this, _actions23));
    return {
      playlist_id,
      action_result: response.data.actions
      // TODO: implement actions in the parser
    };
  }
  /**
   * Moves a video to a new position within a given playlist.
   * @param playlist_id - The playlist ID.
   * @param moved_video_id - The video ID to move.
   * @param predecessor_video_id - The video ID to move the moved video before.
   */
  async moveVideo(playlist_id, moved_video_id, predecessor_video_id) {
    throwIfMissing({ playlist_id, moved_video_id, predecessor_video_id });
    if (!__privateGet(this, _actions23).session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const playlist = await __privateMethod(this, _PlaylistManager_instances, getPlaylist_fn).call(this, playlist_id);
    if (!playlist.info.is_editable)
      throw new InnertubeError("This playlist cannot be edited.", playlist_id);
    const payload = { playlistId: playlist_id, actions: [] };
    let set_video_id_0, set_video_id_1;
    const getSetVideoIds = /* @__PURE__ */ __name(async (pl) => {
      const video_0 = pl.videos.find((video) => moved_video_id === video.key("id").string());
      const video_1 = pl.videos.find((video) => predecessor_video_id === video.key("id").string());
      set_video_id_0 = set_video_id_0 || video_0?.key("set_video_id").string();
      set_video_id_1 = set_video_id_1 || video_1?.key("set_video_id").string();
      if (!set_video_id_0 || !set_video_id_1) {
        const next = await pl.getContinuation();
        return getSetVideoIds(next);
      }
    }, "getSetVideoIds");
    await getSetVideoIds(playlist);
    payload.actions.push({
      action: "ACTION_MOVE_VIDEO_AFTER",
      setVideoId: set_video_id_0,
      movedSetVideoIdPredecessor: set_video_id_1
    });
    const playlist_edit_endpoint = new NavigationEndpoint({ playlistEditEndpoint: payload });
    const response = await playlist_edit_endpoint.call(__privateGet(this, _actions23));
    return {
      playlist_id,
      action_result: response.data.actions
      // TODO: implement actions in the parser
    };
  }
  /**
   * Sets the name for the given playlist.
   * @param playlist_id - The playlist ID.
   * @param name - The name / title to use for the playlist.
   */
  async setName(playlist_id, name) {
    throwIfMissing({ playlist_id, name });
    if (!__privateGet(this, _actions23).session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const payload = { playlist_id, actions: [] };
    payload.actions.push({
      action: "ACTION_SET_PLAYLIST_NAME",
      playlistName: name
    });
    const playlist_edit_endpoint = new NavigationEndpoint({ playlistEditEndpoint: payload });
    const response = await playlist_edit_endpoint.call(__privateGet(this, _actions23));
    return {
      playlist_id,
      action_result: response.data.actions
    };
  }
  /**
   * Sets the description for the given playlist.
   * @param playlist_id - The playlist ID.
   * @param description - The description to use for the playlist.
   */
  async setDescription(playlist_id, description) {
    throwIfMissing({ playlist_id, description });
    if (!__privateGet(this, _actions23).session.logged_in)
      throw new InnertubeError("You must be signed in to perform this operation.");
    const payload = { playlistId: playlist_id, actions: [] };
    payload.actions.push({
      action: "ACTION_SET_PLAYLIST_DESCRIPTION",
      playlistDescription: description
    });
    const playlist_edit_endpoint = new NavigationEndpoint({ playlistEditEndpoint: payload });
    const response = await playlist_edit_endpoint.call(__privateGet(this, _actions23));
    return {
      playlist_id,
      action_result: response.data.actions
    };
  }
};
_actions23 = new WeakMap();
_PlaylistManager_instances = new WeakSet();
getPlaylist_fn = /* @__PURE__ */ __name(async function(playlist_id) {
  if (!playlist_id.startsWith("VL")) {
    playlist_id = `VL${playlist_id}`;
  }
  const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: playlist_id } });
  const browse_response = await browse_endpoint.call(__privateGet(this, _actions23), { parse: true });
  return new Playlist2(__privateGet(this, _actions23), browse_response, true);
}, "#getPlaylist");
__name(_PlaylistManager, "PlaylistManager");
var PlaylistManager = _PlaylistManager;

// dist/src/core/managers/InteractionManager.js
var _actions24;
var _InteractionManager = class _InteractionManager {
  constructor(actions) {
    __privateAdd(this, _actions24);
    __privateSet(this, _actions24, actions);
  }
  /**
   * Likes a given video.
   * @param video_id - The video ID
   */
  async like(video_id) {
    throwIfMissing({ video_id });
    if (!__privateGet(this, _actions24).session.logged_in)
      throw new Error("You must be signed in to perform this operation.");
    const like_endpoint = new NavigationEndpoint({
      likeEndpoint: {
        status: "LIKE",
        target: video_id
      }
    });
    return like_endpoint.call(__privateGet(this, _actions24), { client: "TV" });
  }
  /**
   * Dislikes a given video.
   * @param video_id - The video ID
   */
  async dislike(video_id) {
    throwIfMissing({ video_id });
    if (!__privateGet(this, _actions24).session.logged_in)
      throw new Error("You must be signed in to perform this operation.");
    const dislike_endpoint = new NavigationEndpoint({
      likeEndpoint: {
        status: "DISLIKE",
        target: video_id
      }
    });
    return dislike_endpoint.call(__privateGet(this, _actions24), { client: "TV" });
  }
  /**
   * Removes a like/dislike.
   * @param video_id - The video ID
   */
  async removeRating(video_id) {
    throwIfMissing({ video_id });
    if (!__privateGet(this, _actions24).session.logged_in)
      throw new Error("You must be signed in to perform this operation.");
    const remove_like_endpoint = new NavigationEndpoint({
      likeEndpoint: {
        status: "INDIFFERENT",
        target: video_id
      }
    });
    return remove_like_endpoint.call(__privateGet(this, _actions24), { client: "TV" });
  }
  /**
   * Subscribes to the given channel.
   * @param channel_id - The channel ID
   */
  async subscribe(channel_id) {
    throwIfMissing({ channel_id });
    if (!__privateGet(this, _actions24).session.logged_in)
      throw new Error("You must be signed in to perform this operation.");
    const subscribe_endpoint = new NavigationEndpoint({
      subscribeEndpoint: {
        channelIds: [channel_id],
        params: "EgIIAhgA"
      }
    });
    return subscribe_endpoint.call(__privateGet(this, _actions24));
  }
  /**
   * Unsubscribes from the given channel.
   * @param channel_id - The channel ID
   */
  async unsubscribe(channel_id) {
    throwIfMissing({ channel_id });
    if (!__privateGet(this, _actions24).session.logged_in)
      throw new Error("You must be signed in to perform this operation.");
    const unsubscribe_endpoint = new NavigationEndpoint({
      unsubscribeEndpoint: {
        channelIds: [channel_id],
        params: "CgIIAhgA"
      }
    });
    return unsubscribe_endpoint.call(__privateGet(this, _actions24));
  }
  /**
   * Posts a comment on a given video.
   * @param video_id - The video ID
   * @param text - The comment text
   */
  async comment(video_id, text) {
    throwIfMissing({ video_id, text });
    if (!__privateGet(this, _actions24).session.logged_in)
      throw new Error("You must be signed in to perform this operation.");
    const writer = CreateCommentParams.encode({
      videoId: video_id,
      params: {
        index: 0
      },
      number: 7
    });
    const params = encodeURIComponent(u8ToBase64(writer.finish()));
    const create_comment_endpoint = new NavigationEndpoint({
      createCommentEndpoint: {
        commentText: text,
        createCommentParams: params
      }
    });
    return create_comment_endpoint.call(__privateGet(this, _actions24));
  }
  /**
   * Translates a given text using YouTube's comment translation feature.
   * @param text - The text to translate
   * @param target_language - an ISO language code
   * @param args - optional arguments
   */
  async translate(text, target_language, args = {}) {
    throwIfMissing({ text, target_language });
    const action = encodeCommentActionParams(22, { text, target_language, ...args });
    const perform_comment_action_endpoint = new NavigationEndpoint({ performCommentActionEndpoint: { action } });
    const response = await perform_comment_action_endpoint.call(__privateGet(this, _actions24));
    const mutation = response.data.frameworkUpdates.entityBatchUpdate.mutations[0].payload.commentEntityPayload;
    return {
      success: response.success,
      status_code: response.status_code,
      translated_content: mutation.translatedContent.content,
      data: response.data
    };
  }
  /**
   * Changes notification preferences for a given channel.
   * Only works with channels you are subscribed to.
   * @param channel_id - The channel ID.
   * @param type - The notification type.
   */
  async setNotificationPreferences(channel_id, type) {
    throwIfMissing({ channel_id, type });
    if (!__privateGet(this, _actions24).session.logged_in)
      throw new Error("You must be signed in to perform this operation.");
    const pref_types = {
      PERSONALIZED: 1,
      ALL: 2,
      NONE: 3
    };
    if (!Object.keys(pref_types).includes(type.toUpperCase()))
      throw new Error(`Invalid notification preference type: ${type}`);
    const writer = NotificationPreferences.encode({
      channelId: channel_id,
      prefId: {
        index: pref_types[type.toUpperCase()]
      },
      number0: 0,
      number1: 4
    });
    const params = encodeURIComponent(u8ToBase64(writer.finish()));
    const modify_channel_notification_preference_endpoint = new NavigationEndpoint({ modifyChannelNotificationPreferenceEndpoint: { params } });
    return modify_channel_notification_preference_endpoint.call(__privateGet(this, _actions24));
  }
};
_actions24 = new WeakMap();
__name(_InteractionManager, "InteractionManager");
var InteractionManager = _InteractionManager;

// dist/src/Innertube.js
var _session6;
var _Innertube = class _Innertube {
  constructor(session) {
    __privateAdd(this, _session6);
    __privateSet(this, _session6, session);
  }
  static async create(config = {}) {
    return new _Innertube(await Session.create(config));
  }
  async getInfo(target, options) {
    throwIfMissing({ target });
    const payload = {
      videoId: target instanceof NavigationEndpoint ? target.payload?.videoId : target,
      playlistId: target instanceof NavigationEndpoint ? target.payload?.playlistId : void 0,
      playlistIndex: target instanceof NavigationEndpoint ? target.payload?.playlistIndex : void 0,
      params: target instanceof NavigationEndpoint ? target.payload?.params : void 0,
      racyCheckOk: true,
      contentCheckOk: true
    };
    const watch_endpoint = new NavigationEndpoint({ watchEndpoint: payload });
    const watch_next_endpoint = new NavigationEndpoint({ watchNextEndpoint: payload });
    const session = __privateGet(this, _session6);
    const extra_payload = {
      playbackContext: {
        contentPlaybackContext: {
          vis: 0,
          splay: false,
          lactMilliseconds: "-1",
          signatureTimestamp: session.player?.signature_timestamp
        }
      },
      client: options?.client
    };
    if (options?.po_token) {
      extra_payload.serviceIntegrityDimensions = {
        poToken: options.po_token
      };
    } else if (session.po_token) {
      extra_payload.serviceIntegrityDimensions = {
        poToken: session.po_token
      };
    }
    const watch_response = watch_endpoint.call(session.actions, extra_payload);
    const watch_next_response = watch_next_endpoint.call(session.actions);
    const response = await Promise.all([watch_response, watch_next_response]);
    const cpn = generateRandomString(16);
    return new VideoInfo(response, session.actions, cpn);
  }
  async getBasicInfo(video_id, options) {
    throwIfMissing({ video_id });
    const watch_endpoint = new NavigationEndpoint({
      watchEndpoint: {
        videoId: video_id,
        racyCheckOk: true,
        contentCheckOk: true
      }
    });
    const session = __privateGet(this, _session6);
    const extra_payload = {
      playbackContext: {
        contentPlaybackContext: {
          vis: 0,
          splay: false,
          lactMilliseconds: "-1",
          signatureTimestamp: session.player?.signature_timestamp
        }
      },
      client: options?.client
    };
    if (options?.po_token) {
      extra_payload.serviceIntegrityDimensions = {
        poToken: options.po_token
      };
    } else if (session.po_token) {
      extra_payload.serviceIntegrityDimensions = {
        poToken: session.po_token
      };
    }
    const watch_response = await watch_endpoint.call(session.actions, extra_payload);
    const cpn = generateRandomString(16);
    return new VideoInfo([watch_response], session.actions, cpn);
  }
  async getShortsVideoInfo(video_id, client) {
    throwIfMissing({ video_id });
    const reel_watch_endpoint = new NavigationEndpoint({
      reelWatchEndpoint: {
        disablePlayerResponse: false,
        params: "CAUwAg%3D%3D",
        videoId: video_id
      }
    });
    const actions = __privateGet(this, _session6).actions;
    const reel_watch_response = reel_watch_endpoint.call(actions, { client });
    const writer = ReelSequence.encode({
      shortId: video_id,
      params: {
        number: 5
      },
      feature2: 25,
      feature3: 0
    });
    const params = encodeURIComponent(u8ToBase64(writer.finish()));
    const sequence_response = actions.execute("/reel/reel_watch_sequence", { sequenceParams: params });
    const response = await Promise.all([reel_watch_response, sequence_response]);
    const cpn = generateRandomString(16);
    return new ShortFormVideoInfo([response[0]], actions, cpn, response[1]);
  }
  async search(query, filters = {}) {
    throwIfMissing({ query });
    const search_filter = {};
    search_filter.filters = {};
    if (filters.prioritize) {
      search_filter.prioritize = SearchFilter_Prioritize[filters.prioritize.toUpperCase()];
    }
    if (filters.upload_date) {
      search_filter.filters.uploadDate = SearchFilter_Filters_UploadDate[filters.upload_date.toUpperCase()];
    }
    if (filters.type) {
      search_filter.filters.type = SearchFilter_Filters_SearchType[filters.type.toUpperCase()];
    }
    if (filters.duration) {
      search_filter.filters.duration = SearchFilter_Filters_Duration[filters.duration.toUpperCase()];
    }
    if (filters.features) {
      for (const feature of filters.features) {
        switch (feature) {
          case "360":
            search_filter.filters.features360 = true;
            break;
          case "3d":
            search_filter.filters.features3d = true;
            break;
          case "4k":
            search_filter.filters.features4k = true;
            break;
          case "creative_commons":
            search_filter.filters.featuresCreativeCommons = true;
            break;
          case "hd":
            search_filter.filters.featuresHd = true;
            break;
          case "hdr":
            search_filter.filters.featuresHdr = true;
            break;
          case "live":
            search_filter.filters.featuresLive = true;
            break;
          case "location":
            search_filter.filters.featuresLocation = true;
            break;
          case "purchased":
            search_filter.filters.featuresPurchased = true;
            break;
          case "subtitles":
            search_filter.filters.featuresSubtitles = true;
            break;
          case "vr180":
            search_filter.filters.featuresVr180 = true;
            break;
          default:
            break;
        }
      }
    }
    const search_endpoint = new NavigationEndpoint({
      searchEndpoint: {
        query,
        params: filters ? encodeURIComponent(u8ToBase64(SearchFilter.encode(search_filter).finish())) : void 0
      }
    });
    const response = await search_endpoint.call(__privateGet(this, _session6).actions);
    return new Search(this.actions, response);
  }
  async getSearchSuggestions(query, previous_query) {
    const session = __privateGet(this, _session6);
    const url = new URL(`${URLS.YT_SUGGESTIONS}/complete/search`);
    url.searchParams.set("client", "youtube");
    url.searchParams.set("gs_ri", "youtube");
    url.searchParams.set("gs_id", "0");
    url.searchParams.set("cp", "0");
    url.searchParams.set("ds", "yt");
    url.searchParams.set("sugexp", CLIENTS.WEB.SUGG_EXP_ID);
    url.searchParams.set("hl", session.context.client.hl);
    url.searchParams.set("gl", session.context.client.gl);
    url.searchParams.set("q", query);
    if (previous_query)
      url.searchParams.set("pq", previous_query);
    const response = await session.http.fetch_function(url, {
      headers: {
        "Cookie": session.cookie || ""
      }
    });
    const text = await response.text();
    const data = JSON.parse(text.replace("window.google.ac.h(", "").slice(0, -1));
    return data[1].map((suggestion) => suggestion[0]);
  }
  async getComments(video_id, sort_by, comment_id) {
    throwIfMissing({ video_id });
    const SORT_OPTIONS = {
      TOP_COMMENTS: 0,
      NEWEST_FIRST: 1
    };
    const token = GetCommentsSectionParams.encode({
      ctx: {
        videoId: video_id
      },
      unkParam: 6,
      params: {
        opts: {
          videoId: video_id,
          sortBy: SORT_OPTIONS[sort_by || "TOP_COMMENTS"],
          type: 2,
          commentId: comment_id || ""
        },
        target: "comments-section"
      }
    });
    const continuation = encodeURIComponent(u8ToBase64(token.finish()));
    const continuation_command = new NavigationEndpoint({
      continuationCommand: {
        request: "CONTINUATION_REQUEST_TYPE_WATCH_NEXT",
        token: continuation
      }
    });
    const response = await continuation_command.call(__privateGet(this, _session6).actions);
    return new Comments(this.actions, response.data);
  }
  async getHomeFeed() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEwhat_to_watch" } });
    const response = await browse_endpoint.call(__privateGet(this, _session6).actions);
    return new HomeFeed(this.actions, response);
  }
  async getGuide() {
    const response = await this.actions.execute("/guide");
    return new Guide(response.data);
  }
  async getLibrary() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FElibrary" } });
    const response = await browse_endpoint.call(__privateGet(this, _session6).actions);
    return new Library(this.actions, response);
  }
  async getHistory() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEhistory" } });
    const response = await browse_endpoint.call(__privateGet(this, _session6).actions);
    return new History(this.actions, response);
  }
  async getCourses() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEcourses_destination" } });
    const response = await browse_endpoint.call(__privateGet(this, _session6).actions, { parse: true });
    return new Feed(this.actions, response);
  }
  async getSubscriptionsFeed() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEsubscriptions" } });
    const response = await browse_endpoint.call(__privateGet(this, _session6).actions, { parse: true });
    return new Feed(this.actions, response);
  }
  async getChannelsFeed() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEchannels" } });
    const response = await browse_endpoint.call(__privateGet(this, _session6).actions, { parse: true });
    return new Feed(this.actions, response);
  }
  async getChannel(id) {
    throwIfMissing({ id });
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: id } });
    let response = await browse_endpoint.call(__privateGet(this, _session6).actions, { parse: true });
    if (response.on_response_received_actions?.[0]?.is(NavigateAction)) {
      response = await response.on_response_received_actions[0].endpoint.call(__privateGet(this, _session6).actions, { parse: true });
    }
    return new Channel2(this.actions, response, true);
  }
  async getNotifications() {
    const response = await this.actions.execute("/notification/get_notification_menu", { notificationsMenuRequestType: "NOTIFICATIONS_MENU_REQUEST_TYPE_INBOX" });
    return new NotificationsMenu(this.actions, response);
  }
  async getUnseenNotificationsCount() {
    const response = await this.actions.execute("/notification/get_unseen_count");
    return response.data?.unseenCount || response.data?.actions?.[0].updateNotificationsUnseenCountAction?.unseenCount || 0;
  }
  /**
   * Retrieves the user's playlists.
   */
  async getPlaylists() {
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEplaylist_aggregation" } });
    const response = await browse_endpoint.call(__privateGet(this, _session6).actions, { parse: true });
    return new Feed(this.actions, response);
  }
  async getPlaylist(id) {
    throwIfMissing({ id });
    if (!id.startsWith("VL")) {
      id = `VL${id}`;
    }
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: id } });
    const response = await browse_endpoint.call(__privateGet(this, _session6).actions);
    return new Playlist2(this.actions, response);
  }
  async getHashtag(hashtag) {
    throwIfMissing({ hashtag });
    const writer = Hashtag.encode({
      params: {
        hashtag,
        type: 1
      }
    });
    const params = encodeURIComponent(u8ToBase64(writer.finish()));
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEhashtag", params } });
    const response = await browse_endpoint.call(__privateGet(this, _session6).actions);
    return new HashtagFeed(this.actions, response);
  }
  /**
   * An alternative to {@link download}.
   * Returns deciphered streaming data.
   *
   * If you wish to retrieve the video info too, have a look at {@link getBasicInfo} or {@link getInfo}.
   * @param video_id - The video id.
   * @param options - Format options.
   */
  async getStreamingData(video_id, options = {}) {
    const info2 = await this.getBasicInfo(video_id, options);
    const format = info2.chooseFormat(options);
    format.url = await format.decipher(__privateGet(this, _session6).player);
    return format;
  }
  /**
   * Downloads a given video. If all you need the direct download link, see {@link getStreamingData}.
   * If you wish to retrieve the video info too, have a look at {@link getBasicInfo} or {@link getInfo}.
   * @param video_id - The video id.
   * @param options - Download options.
   */
  async download(video_id, options) {
    const info2 = await this.getBasicInfo(video_id, options);
    return info2.download(options);
  }
  /**
   * Resolves the given URL.
   */
  async resolveURL(url) {
    const response = await this.actions.execute("/navigation/resolve_url", { url, parse: true });
    if (!response.endpoint)
      throw new InnertubeError("Failed to resolve URL. Expected a NavigationEndpoint but got undefined", response);
    return response.endpoint;
  }
  /**
   * Gets a post page given a post id and the channel id
   */
  async getPost(post_id, channel_id) {
    throwIfMissing({ post_id, channel_id });
    const writer = CommunityPostParams.encode({
      f1: {
        ucid1: channel_id,
        postId: post_id,
        ucid2: channel_id
      }
    });
    const params = encodeURIComponent(u8ToBase64(writer.finish()).replace(/\+/g, "-").replace(/\//g, "_"));
    const browse_endpoint = new NavigationEndpoint({ browseEndpoint: { browseId: "FEpost_detail", params } });
    const response = await browse_endpoint.call(__privateGet(this, _session6).actions, { parse: true });
    return new Feed(this.actions, response);
  }
  /**
   * Gets the comments of a post.
   */
  async getPostComments(post_id, channel_id, sort_by) {
    throwIfMissing({ post_id, channel_id });
    const SORT_OPTIONS = {
      TOP_COMMENTS: 0,
      NEWEST_FIRST: 1
    };
    const writer1 = CommunityPostCommentsParam.encode({
      title: "posts",
      commentDataContainer: {
        title: "comments-section",
        commentData: {
          sortBy: SORT_OPTIONS[sort_by || "TOP_COMMENTS"],
          f0: 2,
          f1: 0,
          channelId: channel_id,
          postId: post_id
        },
        f0: 0
      }
    });
    const writer2 = CommunityPostCommentsParamContainer.encode({
      f0: {
        location: "FEcomment_post_detail_page_web_top_level",
        protoData: encodeURIComponent(u8ToBase64(writer1.finish()).replace(/\+/g, "-").replace(/\//g, "_"))
      }
    });
    const continuation = encodeURIComponent(u8ToBase64(writer2.finish()));
    const continuation_command = new NavigationEndpoint({
      continuationCommand: {
        request: "CONTINUATION_REQUEST_TYPE_BROWSE",
        token: continuation
      }
    });
    const response = await continuation_command.call(__privateGet(this, _session6).actions);
    return new Comments(this.actions, response.data);
  }
  /**
   * Fetches an attestation challenge.
   */
  async getAttestationChallenge(engagement_type, ids) {
    const payload = {
      engagementType: engagement_type
    };
    if (ids)
      payload.ids = ids;
    return this.actions.execute("/att/get", { parse: true, ...payload });
  }
  call(endpoint, args) {
    return endpoint.call(this.actions, args);
  }
  /**
   * An interface for interacting with YouTube Music.
   */
  get music() {
    return new Music(__privateGet(this, _session6));
  }
  /**
   * An interface for interacting with YouTube Studio.
   */
  get studio() {
    return new Studio(__privateGet(this, _session6));
  }
  /**
   * An interface for interacting with YouTube Kids.
   */
  get kids() {
    return new Kids(__privateGet(this, _session6));
  }
  /**
   * An interface for managing and retrieving account information.
   */
  get account() {
    return new AccountManager(__privateGet(this, _session6).actions);
  }
  /**
   * An interface for managing playlists.
   */
  get playlist() {
    return new PlaylistManager(__privateGet(this, _session6).actions);
  }
  /**
   * An interface for directly interacting with certain YouTube features.
   */
  get interact() {
    return new InteractionManager(__privateGet(this, _session6).actions);
  }
  /**
   * An internal class used to dispatch requests.
   */
  get actions() {
    return __privateGet(this, _session6).actions;
  }
  /**
   * The session used by this instance.
   */
  get session() {
    return __privateGet(this, _session6);
  }
};
_session6 = new WeakMap();
__name(_Innertube, "Innertube");
var Innertube = _Innertube;

// dist/src/platform/lib.js
var lib_default = Innertube;

// dist/src/platform/cf-worker.js
var _persistent_directory, _persistent;
var _Cache = class _Cache {
  constructor(persistent = false, persistent_directory) {
    __privateAdd(this, _persistent_directory);
    __privateAdd(this, _persistent);
    __privateSet(this, _persistent_directory, persistent_directory || "");
    __privateSet(this, _persistent, persistent);
  }
  get cache_dir() {
    return __privateGet(this, _persistent) ? __privateGet(this, _persistent_directory) : "";
  }
  async get(key) {
    const cache = await caches.open("yt-api");
    const response = await cache.match(key);
    if (!response)
      return void 0;
    return response.arrayBuffer();
  }
  async set(key, value) {
    const cache = await caches.open("yt-api");
    cache.put(key, new Response(value));
  }
  async remove(key) {
    const cache = await caches.open("yt-api");
    await cache.delete(key);
  }
};
_persistent_directory = new WeakMap();
_persistent = new WeakMap();
__name(_Cache, "Cache");
var Cache = _Cache;
Platform.load({
  runtime: "cf-worker",
  server: true,
  Cache,
  sha1Hash,
  uuidv4() {
    return crypto.randomUUID();
  },
  eval: evaluate,
  fetch: fetch.bind(globalThis),
  Request,
  Response,
  Headers,
  FormData,
  File,
  ReadableStream,
  CustomEvent
});
var cf_worker_default = lib_default;
export {
  Actions,
  AppendContinuationItemsAction,
  BinarySerializer_exports as BinarySerializer,
  ClientType,
  clients_exports as Clients,
  Constants_exports as Constants,
  Continuation,
  ContinuationCommand2 as ContinuationCommand,
  EventEmitterLike as EventEmitter,
  FormatUtils_exports as FormatUtils,
  generator_exports as Generator,
  GridContinuation,
  HTTPClient,
  helpers_exports as Helpers,
  Innertube,
  ItemSectionContinuation,
  JsAnalyzer,
  JsExtractor,
  helpers_exports2 as JsHelpers,
  matchers_exports as JsMatchers,
  LZW_exports as LZW,
  LiveChatContinuation,
  Log_exports as Log,
  managers_exports as Managers,
  misc_exports as Misc,
  mixins_exports as Mixins,
  MusicPlaylistShelfContinuation,
  MusicShelfContinuation,
  NavigateAction,
  OAuth2,
  parser_exports as Parser,
  Platform,
  Player,
  PlaylistPanelContinuation,
  ProtoUtils_exports as ProtoUtils,
  ReloadContinuationItemsCommand,
  SectionListContinuation,
  Session,
  ShowMiniplayerCommand,
  UniversalCache,
  Utils_exports as Utils,
  youtube_exports as YT,
  ytkids_exports as YTKids,
  ytmusic_exports as YTMusic,
  nodes_exports as YTNodes,
  ytshorts_exports as YTShorts,
  cf_worker_default as default
};
//# sourceMappingURL=cf-worker.js.map
