SILENT KILLERPanel

Current Path: > home > ivftiowh > > www > wp-includes


Operation   : Linux premium88.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
Software     : Apache
Server IP    : 185.61.154.216 | Your IP: 216.73.216.164
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: /home/ivftiowh//www/wp-includes

NameTypeSizeLast ModifiedActions
ID3 Directory - -
IXR Directory - -
PHPMailer Directory - -
Requests Directory - -
SimplePie Directory - -
Text Directory - -
assets Directory - -
block-patterns Directory - -
block-supports Directory - -
blocks Directory - -
certificates Directory - -
css Directory - -
customize Directory - -
fonts Directory - -
html-api Directory - -
images Directory - -
js Directory - -
php-compat Directory - -
pomo Directory - -
rest-api Directory - -
sitemaps Directory - -
sodium_compat Directory - -
style-engine Directory - -
theme-compat Directory - -
widgets Directory - -
.htaccess File 160 bytes June 28 2024 08:27:59.
admin-bar.php File 35131 bytes September 13 2023 04:25:41.
atomlib.php File 11950 bytes September 13 2023 04:25:41.
author-template.php File 18951 bytes September 13 2023 04:25:41.
block-editor.php File 27598 bytes September 13 2023 04:25:41.
block-i18n.json File 316 bytes September 13 2023 04:25:41.
block-patterns.php File 15901 bytes September 13 2023 04:25:41.
block-template-utils.php File 49130 bytes September 13 2023 04:25:41.
block-template.php File 10592 bytes September 13 2023 04:25:42.
blocks.php File 59159 bytes June 24 2024 20:05:07.
bookmark-template.php File 12909 bytes September 13 2023 04:25:41.
bookmark.php File 15378 bytes September 13 2023 04:25:41.
cache-compat.php File 5969 bytes September 13 2023 04:25:42.
cache.php File 13474 bytes September 13 2023 04:25:42.
canonical.php File 33339 bytes September 13 2023 04:25:41.
capabilities.php File 40026 bytes September 13 2023 04:25:41.
category-template.php File 57009 bytes September 13 2023 04:25:41.
category.php File 12702 bytes September 13 2023 04:25:41.
class-IXR.php File 2543 bytes August 05 2020 08:21:22.
class-feed.php File 529 bytes August 05 2020 08:21:23.
class-http.php File 367 bytes September 13 2023 04:25:42.
class-json.php File 43684 bytes September 13 2023 04:25:42.
class-oembed.php File 401 bytes September 13 2023 04:25:41.
class-phpass.php File 6708 bytes September 13 2023 04:25:41.
class-phpmailer.php File 664 bytes September 13 2023 04:25:41.
class-pop3.php File 20969 bytes September 13 2023 04:25:41.
class-requests.php File 2237 bytes September 13 2023 04:25:41.
class-simplepie.php File 98124 bytes September 13 2023 04:25:41.
class-smtp.php File 457 bytes September 13 2023 04:25:41.
class-snoopy.php File 37715 bytes September 13 2023 04:25:42.
class-walker-category-dropdown.php File 2473 bytes September 13 2023 04:25:41.
class-walker-category.php File 8478 bytes September 13 2023 04:25:41.
class-walker-comment.php File 14214 bytes September 13 2023 04:25:41.
class-walker-nav-menu.php File 11313 bytes September 13 2023 04:25:42.
class-walker-page-dropdown.php File 2710 bytes September 13 2023 04:25:41.
class-walker-page.php File 7623 bytes September 13 2023 04:25:41.
class-wp-admin-bar-plain.php File 1000 bytes September 13 2023 04:25:41.
class-wp-admin-bar.php File 17364 bytes September 13 2023 04:25:41.
class-wp-ajax-response.php File 5266 bytes September 13 2023 04:25:41.
class-wp-application-passwords.php File 12854 bytes September 13 2023 04:25:41.
class-wp-block-editor-context.php File 1350 bytes September 13 2023 04:25:42.
class-wp-block-list.php File 4749 bytes September 13 2023 04:25:42.
class-wp-block-live.php File 1000 bytes September 13 2023 04:25:41.
class-wp-block-parser-block.php File 2555 bytes September 13 2023 04:25:42.
class-wp-block-parser-frame.php File 1916 bytes September 13 2023 04:25:41.
class-wp-block-parser.php File 11761 bytes September 13 2023 04:25:41.
class-wp-block-pattern-categories-registry.php File 5371 bytes September 13 2023 04:25:42.
class-wp-block-patterns-registry.php File 8775 bytes October 13 2023 06:16:03.
class-wp-block-styles-registry.php File 5883 bytes September 13 2023 04:25:41.
class-wp-block-supports.php File 5521 bytes September 13 2023 04:25:42.
class-wp-block-template.php File 1951 bytes September 13 2023 04:25:41.
class-wp-block-type-registry.php File 5013 bytes October 13 2023 06:16:03.
class-wp-block-type.php File 14301 bytes September 13 2023 04:25:41.
class-wp-block.php File 8402 bytes September 13 2023 04:25:42.
class-wp-classic-to-block-menu-converter.php File 4088 bytes September 13 2023 04:25:42.
class-wp-comment-query.php File 47829 bytes September 13 2023 04:25:41.
class-wp-comment.php File 9357 bytes September 13 2023 04:25:41.
class-wp-customize-control.php File 25843 bytes September 13 2023 04:25:41.
class-wp-customize-manager.php File 202163 bytes September 13 2023 04:25:41.
class-wp-customize-nav-menus.php File 57304 bytes September 13 2023 04:25:41.
class-wp-customize-panel.php File 10671 bytes September 13 2023 04:25:41.
class-wp-customize-section.php File 11245 bytes September 13 2023 04:25:42.
class-wp-customize-setting.php File 29890 bytes September 13 2023 04:25:41.
class-wp-customize-widgets.php File 71633 bytes September 13 2023 04:25:41.
class-wp-date-query.php File 35719 bytes September 13 2023 04:25:42.
class-wp-dependencies.php File 14063 bytes September 13 2023 04:25:42.
class-wp-dependency.php File 2627 bytes September 13 2023 04:25:42.
class-wp-duotone.php File 39362 bytes September 13 2023 04:25:41.
class-wp-editor.php File 72084 bytes September 13 2023 04:25:42.
class-wp-embed.php File 15994 bytes September 13 2023 04:25:42.
class-wp-error.php File 7502 bytes September 13 2023 04:25:41.
class-wp-fatal-error-handler.php File 7872 bytes September 13 2023 04:25:41.
class-wp-feed-cache-transient.php File 2586 bytes September 13 2023 04:25:41.
class-wp-feed-cache.php File 996 bytes September 13 2023 04:25:41.
class-wp-hook.php File 15628 bytes September 13 2023 04:25:41.
class-wp-http-cookie.php File 7389 bytes September 13 2023 04:25:41.
class-wp-http-curl.php File 12492 bytes September 13 2023 04:25:41.
class-wp-http-encoding.php File 6689 bytes September 13 2023 04:25:41.
class-wp-http-ixr-client.php File 3501 bytes September 13 2023 04:25:41.
class-wp-http-proxy.php File 5980 bytes September 13 2023 04:25:42.
class-wp-http-requests-hooks.php File 2022 bytes September 13 2023 04:25:41.
class-wp-http-requests-response.php File 4400 bytes September 13 2023 04:25:41.
class-wp-http-response.php File 2977 bytes September 13 2023 04:25:41.
class-wp-http-streams.php File 16810 bytes September 13 2023 04:25:42.
class-wp-http.php File 40350 bytes September 13 2023 04:25:41.
class-wp-image-editor-gd.php File 16623 bytes September 13 2023 04:25:41.
class-wp-image-editor-imagick.php File 29990 bytes September 13 2023 04:25:41.
class-wp-image-editor.php File 17133 bytes September 13 2023 04:25:42.
class-wp-list-util.php File 7443 bytes September 13 2023 04:25:41.
class-wp-locale-switcher.php File 6561 bytes September 13 2023 04:25:41.
class-wp-locale.php File 16115 bytes September 13 2023 04:25:41.
class-wp-matchesmapregex.php File 1826 bytes September 13 2023 04:25:41.
class-wp-meta-query.php File 30533 bytes September 13 2023 04:25:41.
class-wp-metadata-lazyloader.php File 6833 bytes September 13 2023 04:25:41.
class-wp-navigation-fallback.php File 6980 bytes September 13 2023 04:25:41.
class-wp-network-query.php File 19291 bytes September 13 2023 04:25:41.
class-wp-network.php File 12189 bytes September 13 2023 04:25:41.
class-wp-object-cache.php File 17594 bytes September 13 2023 04:25:42.
class-wp-oembed-controller.php File 6879 bytes September 13 2023 04:25:42.
class-wp-oembed.php File 31394 bytes September 13 2023 04:25:42.
class-wp-paused-extensions-storage.php File 5062 bytes September 13 2023 04:25:41.
class-wp-post-type.php File 25964 bytes September 13 2023 04:25:42.
class-wp-post.php File 6484 bytes September 13 2023 04:25:41.
class-wp-query.php File 150699 bytes September 13 2023 04:25:41.
class-wp-recovery-mode-cookie-service.php File 6877 bytes September 13 2023 04:25:41.
class-wp-recovery-mode-email-service.php File 11183 bytes September 13 2023 04:25:41.
class-wp-recovery-mode-key-service.php File 4501 bytes September 13 2023 04:25:41.
class-wp-recovery-mode-link-service.php File 3463 bytes September 13 2023 04:25:41.
class-wp-recovery-mode.php File 11435 bytes September 13 2023 04:25:41.
class-wp-rewrite.php File 63038 bytes September 13 2023 04:25:41.
class-wp-role.php File 2524 bytes September 13 2023 04:25:42.
class-wp-roles.php File 8578 bytes September 13 2023 04:25:41.
class-wp-scripts.php File 28351 bytes September 13 2023 04:25:41.
class-wp-session-tokens.php File 7451 bytes September 13 2023 04:25:41.
class-wp-simplepie-file.php File 3403 bytes September 13 2023 04:25:42.
class-wp-simplepie-sanitize-kses.php File 1800 bytes September 13 2023 04:25:41.
class-wp-site-query.php File 31020 bytes September 13 2023 04:25:42.
class-wp-site.php File 7454 bytes September 13 2023 04:25:41.
class-wp-styles.php File 10898 bytes September 13 2023 04:25:41.
class-wp-tax-query.php File 19545 bytes September 13 2023 04:25:42.
class-wp-taxonomy.php File 18567 bytes September 13 2023 04:25:41.
class-wp-term-query.php File 40451 bytes September 13 2023 04:25:42.
class-wp-term.php File 5298 bytes September 13 2023 04:25:41.
class-wp-text-diff-renderer-inline.php File 830 bytes September 13 2023 04:25:41.
class-wp-text-diff-renderer-table.php File 17187 bytes September 13 2023 04:25:41.
class-wp-textdomain-registry.php File 5976 bytes September 13 2023 04:25:41.
class-wp-theme-json-data.php File 1554 bytes September 13 2023 04:25:41.
class-wp-theme-json-resolver.php File 24669 bytes September 13 2023 04:25:41.
class-wp-theme-json-schema.php File 4301 bytes September 13 2023 04:25:41.
class-wp-theme-json.php File 129295 bytes October 13 2023 06:16:03.
class-wp-theme.php File 56188 bytes October 13 2023 06:16:03.
class-wp-user-meta-session-tokens.php File 2990 bytes August 05 2020 08:21:22.
class-wp-user-query.php File 42242 bytes September 13 2023 04:25:41.
class-wp-user-request.php File 2222 bytes September 13 2023 04:25:41.
class-wp-user.php File 22762 bytes September 13 2023 04:25:41.
class-wp-walker.php File 13167 bytes September 13 2023 04:25:41.
class-wp-widget-factory.php File 3347 bytes September 13 2023 04:25:42.
class-wp-widget.php File 18383 bytes September 13 2023 04:25:42.
class-wp-xmlrpc-server.php File 214130 bytes September 13 2023 04:25:41.
class-wp.php File 25978 bytes September 13 2023 04:25:41.
class-wpdb.php File 120418 bytes September 13 2023 04:25:41.
class.wp-dependencies.php File 373 bytes September 13 2023 04:25:42.
class.wp-scripts.php File 343 bytes September 13 2023 04:25:42.
class.wp-styles.php File 338 bytes September 13 2023 04:25:42.
comment-template.php File 101319 bytes September 13 2023 04:25:41.
comment.php File 128537 bytes September 13 2023 04:25:41.
compat.php File 15219 bytes September 13 2023 04:25:41.
cron.php File 41540 bytes September 13 2023 04:25:41.
date-long.php File 1000 bytes September 13 2023 04:25:41.
date.php File 400 bytes September 13 2023 04:25:41.
default-constants.php File 10981 bytes September 13 2023 04:25:41.
default-filters.php File 33016 bytes October 13 2023 06:16:03.
default-widgets.php File 2222 bytes September 13 2023 04:25:42.
deprecated.php File 159498 bytes September 13 2023 04:25:41.
embed-template.php File 338 bytes September 13 2023 04:25:41.
embed.php File 37470 bytes September 13 2023 04:25:42.
error-protection.php File 4121 bytes September 13 2023 04:25:42.
feed-atom-comments.php File 5448 bytes September 13 2023 04:25:42.
feed-atom.php File 3048 bytes September 13 2023 04:25:41.
feed-rdf.php File 2668 bytes August 05 2020 08:21:22.
feed-rss.php File 1189 bytes August 05 2020 08:21:23.
feed-rss2-comments.php File 4080 bytes September 13 2023 04:25:42.
feed-rss2.php File 3799 bytes August 05 2020 08:21:22.
feed.php File 23057 bytes September 13 2023 04:25:42.
formatting.php File 334312 bytes June 24 2024 20:05:07.
functions.php File 265650 bytes June 24 2024 20:05:07.
functions.wp-scripts.php File 14758 bytes September 13 2023 04:25:42.
functions.wp-styles.php File 8583 bytes September 13 2023 04:25:42.
general-template.php File 167726 bytes September 13 2023 04:25:42.
global-styles-and-settings.php File 18842 bytes September 13 2023 04:25:41.
http.php File 23848 bytes September 13 2023 04:25:42.
https-detection.php File 6505 bytes September 13 2023 04:25:41.
https-migration.php File 4741 bytes September 13 2023 04:25:42.
kses.php File 71670 bytes September 13 2023 04:25:41.
l10n.php File 62783 bytes September 13 2023 04:25:42.
link-template.php File 154510 bytes September 13 2023 04:25:41.
load.php File 53954 bytes September 13 2023 04:25:42.
locale.php File 162 bytes August 05 2020 08:21:22.
media-template.php File 61601 bytes September 13 2023 04:25:42.
media.php File 205173 bytes October 13 2023 06:16:03.
meta.php File 63276 bytes September 13 2023 04:25:42.
ms-blogs.php File 25628 bytes September 13 2023 04:25:42.
ms-default-constants.php File 4900 bytes September 13 2023 04:25:42.
ms-default-filters.php File 6636 bytes September 13 2023 04:25:41.
ms-deprecated.php File 21758 bytes September 13 2023 04:25:41.
ms-files.php File 2652 bytes September 13 2023 04:25:41.
ms-functions.php File 91258 bytes September 13 2023 04:25:42.
ms-load.php File 19870 bytes September 13 2023 04:25:41.
ms-network.php File 3782 bytes September 13 2023 04:25:41.
ms-settings.php File 4124 bytes September 13 2023 04:25:42.
ms-site.php File 40476 bytes September 13 2023 04:25:41.
nav-menu-template.php File 25785 bytes September 13 2023 04:25:42.
nav-menu.php File 44078 bytes September 13 2023 04:25:41.
navigation-fallback.php File 2298 bytes September 13 2023 04:25:41.
option.php File 80051 bytes September 13 2023 04:25:42.
pluggable-deprecated.php File 6263 bytes August 05 2020 08:21:22.
pluggable.php File 111475 bytes September 13 2023 04:25:41.
plugin.php File 35465 bytes September 13 2023 04:25:41.
post-formats.php File 7100 bytes September 13 2023 04:25:41.
post-template.php File 66904 bytes September 13 2023 04:25:41.
post-thumbnail-template.php File 10308 bytes September 13 2023 04:25:42.
post.php File 274389 bytes October 13 2023 06:16:03.
query.php File 37032 bytes September 13 2023 04:25:41.
registration-functions.php File 200 bytes September 13 2023 04:25:41.
registration.php File 200 bytes September 13 2023 04:25:41.
rest-api.php File 97068 bytes October 13 2023 06:16:03.
revision.php File 25433 bytes September 13 2023 04:25:41.
rewrite.php File 19514 bytes September 13 2023 04:25:41.
robots-template.php File 5185 bytes September 13 2023 04:25:41.
rss-functions.php File 255 bytes September 13 2023 04:25:41.
rss.php File 23015 bytes September 13 2023 04:25:41.
script-loader.php File 137080 bytes September 13 2023 04:25:41.
session.php File 258 bytes August 05 2020 08:21:23.
shortcodes.php File 23854 bytes October 13 2023 06:16:03.
sitemaps.php File 3238 bytes September 13 2023 04:25:42.
spl-autoload-compat.php File 441 bytes September 13 2023 04:25:41.
style-engine.php File 7198 bytes September 13 2023 04:25:42.
taxonomy.php File 172884 bytes September 13 2023 04:25:41.
template-canvas.php File 592 bytes September 13 2023 04:25:42.
template-loader.php File 3012 bytes September 13 2023 04:25:41.
template.php File 23327 bytes September 13 2023 04:25:41.
theme-i18n.json File 1151 bytes September 13 2023 04:25:41.
theme-previews.php File 2826 bytes October 13 2023 06:16:03.
theme-templates.php File 5522 bytes September 13 2023 04:25:42.
theme.json File 7203 bytes September 13 2023 04:25:42.
theme.php File 130874 bytes September 13 2023 04:25:42.
update.php File 36755 bytes September 13 2023 04:25:41.
user.php File 170915 bytes September 13 2023 04:25:41.
vars.php File 5838 bytes September 13 2023 04:25:42.
version.php File 928 bytes June 24 2024 20:05:07.
widgets.php File 69875 bytes September 13 2023 04:25:42.
wp-db.php File 445 bytes September 13 2023 04:25:41.
wp-diff.php File 647 bytes August 05 2020 08:21:23.

Reading File: /home/ivftiowh//www/wp-includes/class-wp-admin-bar.php

<?php
/**
 * Toolbar API: WP_Admin_Bar class
 *
 * @package WordPress
 * @subpackage Toolbar
 * @since 3.1.0
 */

/**
 * Core class used to implement the Toolbar API.
 *
 * @since 3.1.0
 */
#[AllowDynamicProperties]
class WP_Admin_Bar {
	private $nodes = array();
	private $bound = false;
	public $user;

	/**
	 * Deprecated menu property.
	 *
	 * @since 3.1.0
	 * @deprecated 3.3.0 Modify admin bar nodes with WP_Admin_Bar::get_node(),
	 *                   WP_Admin_Bar::add_node(), and WP_Admin_Bar::remove_node().
	 * @var array
	 */
	public $menu = array();

	/**
	 * Initializes the admin bar.
	 *
	 * @since 3.1.0
	 */
	public function initialize() {
		$this->user = new stdClass();

		if ( is_user_logged_in() ) {
			/* Populate settings we need for the menu based on the current user. */
			$this->user->blogs = get_blogs_of_user( get_current_user_id() );
			if ( is_multisite() ) {
				$this->user->active_blog    = get_active_blog_for_user( get_current_user_id() );
				$this->user->domain         = empty( $this->user->active_blog ) ? user_admin_url() : trailingslashit( get_home_url( $this->user->active_blog->blog_id ) );
				$this->user->account_domain = $this->user->domain;
			} else {
				$this->user->active_blog    = $this->user->blogs[ get_current_blog_id() ];
				$this->user->domain         = trailingslashit( home_url() );
				$this->user->account_domain = $this->user->domain;
			}
		}

		add_action( 'wp_head', 'wp_admin_bar_header' );

		add_action( 'admin_head', 'wp_admin_bar_header' );

		if ( current_theme_supports( 'admin-bar' ) ) {
			/**
			 * To remove the default padding styles from WordPress for the Toolbar, use the following code:
			 * add_theme_support( 'admin-bar', array( 'callback' => '__return_false' ) );
			 */
			$admin_bar_args  = get_theme_support( 'admin-bar' );
			$header_callback = $admin_bar_args[0]['callback'];
		}

		if ( empty( $header_callback ) ) {
			$header_callback = '_admin_bar_bump_cb';
		}

		add_action( 'wp_head', $header_callback );

		wp_enqueue_script( 'admin-bar' );
		wp_enqueue_style( 'admin-bar' );

		/**
		 * Fires after WP_Admin_Bar is initialized.
		 *
		 * @since 3.1.0
		 */
		do_action( 'admin_bar_init' );
	}

	/**
	 * Adds a node (menu item) to the admin bar menu.
	 *
	 * @since 3.3.0
	 *
	 * @param array $node The attributes that define the node.
	 */
	public function add_menu( $node ) {
		$this->add_node( $node );
	}

	/**
	 * Removes a node from the admin bar.
	 *
	 * @since 3.1.0
	 *
	 * @param string $id The menu slug to remove.
	 */
	public function remove_menu( $id ) {
		$this->remove_node( $id );
	}

	/**
	 * Adds a node to the menu.
	 *
	 * @since 3.1.0
	 * @since 4.5.0 Added the ability to pass 'lang' and 'dir' meta data.
	 *
	 * @param array $args {
	 *     Arguments for adding a node.
	 *
	 *     @type string $id     ID of the item.
	 *     @type string $title  Title of the node.
	 *     @type string $parent Optional. ID of the parent node.
	 *     @type string $href   Optional. Link for the item.
	 *     @type bool   $group  Optional. Whether or not the node is a group. Default false.
	 *     @type array  $meta   Meta data including the following keys: 'html', 'class', 'rel', 'lang', 'dir',
	 *                          'onclick', 'target', 'title', 'tabindex'. Default empty.
	 * }
	 */
	public function add_node( $args ) {
		// Shim for old method signature: add_node( $parent_id, $menu_obj, $args ).
		if ( func_num_args() >= 3 && is_string( $args ) ) {
			$args = array_merge( array( 'parent' => $args ), func_get_arg( 2 ) );
		}

		if ( is_object( $args ) ) {
			$args = get_object_vars( $args );
		}

		// Ensure we have a valid title.
		if ( empty( $args['id'] ) ) {
			if ( empty( $args['title'] ) ) {
				return;
			}

			_doing_it_wrong( __METHOD__, __( 'The menu ID should not be empty.' ), '3.3.0' );
			// Deprecated: Generate an ID from the title.
			$args['id'] = esc_attr( sanitize_title( trim( $args['title'] ) ) );
		}

		$defaults = array(
			'id'     => false,
			'title'  => false,
			'parent' => false,
			'href'   => false,
			'group'  => false,
			'meta'   => array(),
		);

		// If the node already exists, keep any data that isn't provided.
		$maybe_defaults = $this->get_node( $args['id'] );
		if ( $maybe_defaults ) {
			$defaults = get_object_vars( $maybe_defaults );
		}

		// Do the same for 'meta' items.
		if ( ! empty( $defaults['meta'] ) && ! empty( $args['meta'] ) ) {
			$args['meta'] = wp_parse_args( $args['meta'], $defaults['meta'] );
		}

		$args = wp_parse_args( $args, $defaults );

		$back_compat_parents = array(
			'my-account-with-avatar' => array( 'my-account', '3.3' ),
			'my-blogs'               => array( 'my-sites', '3.3' ),
		);

		if ( isset( $back_compat_parents[ $args['parent'] ] ) ) {
			list( $new_parent, $version ) = $back_compat_parents[ $args['parent'] ];
			_deprecated_argument( __METHOD__, $version, sprintf( 'Use <code>%s</code> as the parent for the <code>%s</code> admin bar node instead of <code>%s</code>.', $new_parent, $args['id'], $args['parent'] ) );
			$args['parent'] = $new_parent;
		}

		$this->_set_node( $args );
	}

	/**
	 * @since 3.3.0
	 *
	 * @param array $args
	 */
	final protected function _set_node( $args ) {
		$this->nodes[ $args['id'] ] = (object) $args;
	}

	/**
	 * Gets a node.
	 *
	 * @since 3.3.0
	 *
	 * @param string $id
	 * @return object|void Node.
	 */
	final public function get_node( $id ) {
		$node = $this->_get_node( $id );
		if ( $node ) {
			return clone $node;
		}
	}

	/**
	 * @since 3.3.0
	 *
	 * @param string $id
	 * @return object|void
	 */
	final protected function _get_node( $id ) {
		if ( $this->bound ) {
			return;
		}

		if ( empty( $id ) ) {
			$id = 'root';
		}

		if ( isset( $this->nodes[ $id ] ) ) {
			return $this->nodes[ $id ];
		}
	}

	/**
	 * @since 3.3.0
	 *
	 * @return array|void
	 */
	final public function get_nodes() {
		$nodes = $this->_get_nodes();
		if ( ! $nodes ) {
			return;
		}

		foreach ( $nodes as &$node ) {
			$node = clone $node;
		}
		return $nodes;
	}

	/**
	 * @since 3.3.0
	 *
	 * @return array|void
	 */
	final protected function _get_nodes() {
		if ( $this->bound ) {
			return;
		}

		return $this->nodes;
	}

	/**
	 * Adds a group to a toolbar menu node.
	 *
	 * Groups can be used to organize toolbar items into distinct sections of a toolbar menu.
	 *
	 * @since 3.3.0
	 *
	 * @param array $args {
	 *     Array of arguments for adding a group.
	 *
	 *     @type string $id     ID of the item.
	 *     @type string $parent Optional. ID of the parent node. Default 'root'.
	 *     @type array  $meta   Meta data for the group including the following keys:
	 *                         'class', 'onclick', 'target', and 'title'.
	 * }
	 */
	final public function add_group( $args ) {
		$args['group'] = true;

		$this->add_node( $args );
	}

	/**
	 * Remove a node.
	 *
	 * @since 3.1.0
	 *
	 * @param string $id The ID of the item.
	 */
	public function remove_node( $id ) {
		$this->_unset_node( $id );
	}

	/**
	 * @since 3.3.0
	 *
	 * @param string $id
	 */
	final protected function _unset_node( $id ) {
		unset( $this->nodes[ $id ] );
	}

	/**
	 * @since 3.1.0
	 */
	public function render() {
		$root = $this->_bind();
		if ( $root ) {
			$this->_render( $root );
		}
	}

	/**
	 * @since 3.3.0
	 *
	 * @return object|void
	 */
	final protected function _bind() {
		if ( $this->bound ) {
			return;
		}

		/*
		 * Add the root node.
		 * Clear it first, just in case. Don't mess with The Root.
		 */
		$this->remove_node( 'root' );
		$this->add_node(
			array(
				'id'    => 'root',
				'group' => false,
			)
		);

		// Normalize nodes: define internal 'children' and 'type' properties.
		foreach ( $this->_get_nodes() as $node ) {
			$node->children = array();
			$node->type     = ( $node->group ) ? 'group' : 'item';
			unset( $node->group );

			// The Root wants your orphans. No lonely items allowed.
			if ( ! $node->parent ) {
				$node->parent = 'root';
			}
		}

		foreach ( $this->_get_nodes() as $node ) {
			if ( 'root' === $node->id ) {
				continue;
			}

			// Fetch the parent node. If it isn't registered, ignore the node.
			$parent = $this->_get_node( $node->parent );
			if ( ! $parent ) {
				continue;
			}

			// Generate the group class (we distinguish between top level and other level groups).
			$group_class = ( 'root' === $node->parent ) ? 'ab-top-menu' : 'ab-submenu';

			if ( 'group' === $node->type ) {
				if ( empty( $node->meta['class'] ) ) {
					$node->meta['class'] = $group_class;
				} else {
					$node->meta['class'] .= ' ' . $group_class;
				}
			}

			// Items in items aren't allowed. Wrap nested items in 'default' groups.
			if ( 'item' === $parent->type && 'item' === $node->type ) {
				$default_id = $parent->id . '-default';
				$default    = $this->_get_node( $default_id );

				/*
				 * The default group is added here to allow groups that are
				 * added before standard menu items to render first.
				 */
				if ( ! $default ) {
					/*
					 * Use _set_node because add_node can be overloaded.
					 * Make sure to specify default settings for all properties.
					 */
					$this->_set_node(
						array(
							'id'       => $default_id,
							'parent'   => $parent->id,
							'type'     => 'group',
							'children' => array(),
							'meta'     => array(
								'class' => $group_class,
							),
							'title'    => false,
							'href'     => false,
						)
					);
					$default            = $this->_get_node( $default_id );
					$parent->children[] = $default;
				}
				$parent = $default;

				/*
				 * Groups in groups aren't allowed. Add a special 'container' node.
				 * The container will invisibly wrap both groups.
				 */
			} elseif ( 'group' === $parent->type && 'group' === $node->type ) {
				$container_id = $parent->id . '-container';
				$container    = $this->_get_node( $container_id );

				// We need to create a container for this group, life is sad.
				if ( ! $container ) {
					/*
					 * Use _set_node because add_node can be overloaded.
					 * Make sure to specify default settings for all properties.
					 */
					$this->_set_node(
						array(
							'id'       => $container_id,
							'type'     => 'container',
							'children' => array( $parent ),
							'parent'   => false,
							'title'    => false,
							'href'     => false,
							'meta'     => array(),
						)
					);

					$container = $this->_get_node( $container_id );

					// Link the container node if a grandparent node exists.
					$grandparent = $this->_get_node( $parent->parent );

					if ( $grandparent ) {
						$container->parent = $grandparent->id;

						$index = array_search( $parent, $grandparent->children, true );
						if ( false === $index ) {
							$grandparent->children[] = $container;
						} else {
							array_splice( $grandparent->children, $index, 1, array( $container ) );
						}
					}

					$parent->parent = $container->id;
				}

				$parent = $container;
			}

			// Update the parent ID (it might have changed).
			$node->parent = $parent->id;

			// Add the node to the tree.
			$parent->children[] = $node;
		}

		$root        = $this->_get_node( 'root' );
		$this->bound = true;
		return $root;
	}

	/**
	 * @since 3.3.0
	 *
	 * @param object $root
	 */
	final protected function _render( $root ) {
		/*
		 * Add browser classes.
		 * We have to do this here since admin bar shows on the front end.
		 */
		$class = 'nojq nojs';
		if ( wp_is_mobile() ) {
			$class .= ' mobile';
		}

		?>
		<div id="wpadminbar" class="<?php echo $class; ?>">
			<?php if ( ! is_admin() && ! did_action( 'wp_body_open' ) ) { ?>
				<a class="screen-reader-shortcut" href="#wp-toolbar" tabindex="1"><?php _e( 'Skip to toolbar' ); ?></a>
			<?php } ?>
			<div class="quicklinks" id="wp-toolbar" role="navigation" aria-label="<?php esc_attr_e( 'Toolbar' ); ?>">
				<?php
				foreach ( $root->children as $group ) {
					$this->_render_group( $group );
				}
				?>
			</div>
			<?php if ( is_user_logged_in() ) : ?>
			<a class="screen-reader-shortcut" href="<?php echo esc_url( wp_logout_url() ); ?>"><?php _e( 'Log Out' ); ?></a>
			<?php endif; ?>
		</div>

		<?php
	}

	/**
	 * @since 3.3.0
	 *
	 * @param object $node
	 */
	final protected function _render_container( $node ) {
		if ( 'container' !== $node->type || empty( $node->children ) ) {
			return;
		}

		echo '<div id="' . esc_attr( 'wp-admin-bar-' . $node->id ) . '" class="ab-group-container">';
		foreach ( $node->children as $group ) {
			$this->_render_group( $group );
		}
		echo '</div>';
	}

	/**
	 * @since 3.3.0
	 *
	 * @param object $node
	 */
	final protected function _render_group( $node ) {
		if ( 'container' === $node->type ) {
			$this->_render_container( $node );
			return;
		}
		if ( 'group' !== $node->type || empty( $node->children ) ) {
			return;
		}

		if ( ! empty( $node->meta['class'] ) ) {
			$class = ' class="' . esc_attr( trim( $node->meta['class'] ) ) . '"';
		} else {
			$class = '';
		}

		echo "<ul id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$class>";
		foreach ( $node->children as $item ) {
			$this->_render_item( $item );
		}
		echo '</ul>';
	}

	/**
	 * @since 3.3.0
	 *
	 * @param object $node
	 */
	final protected function _render_item( $node ) {
		if ( 'item' !== $node->type ) {
			return;
		}

		$is_parent             = ! empty( $node->children );
		$has_link              = ! empty( $node->href );
		$is_root_top_item      = 'root-default' === $node->parent;
		$is_top_secondary_item = 'top-secondary' === $node->parent;

		// Allow only numeric values, then casted to integers, and allow a tabindex value of `0` for a11y.
		$tabindex        = ( isset( $node->meta['tabindex'] ) && is_numeric( $node->meta['tabindex'] ) ) ? (int) $node->meta['tabindex'] : '';
		$aria_attributes = ( '' !== $tabindex ) ? ' tabindex="' . $tabindex . '"' : '';

		$menuclass = '';
		$arrow     = '';

		if ( $is_parent ) {
			$menuclass        = 'menupop ';
			$aria_attributes .= ' aria-haspopup="true"';
		}

		if ( ! empty( $node->meta['class'] ) ) {
			$menuclass .= $node->meta['class'];
		}

		// Print the arrow icon for the menu children with children.
		if ( ! $is_root_top_item && ! $is_top_secondary_item && $is_parent ) {
			$arrow = '<span class="wp-admin-bar-arrow" aria-hidden="true"></span>';
		}

		if ( $menuclass ) {
			$menuclass = ' class="' . esc_attr( trim( $menuclass ) ) . '"';
		}

		echo "<li id='" . esc_attr( 'wp-admin-bar-' . $node->id ) . "'$menuclass>";

		if ( $has_link ) {
			$attributes = array( 'onclick', 'target', 'title', 'rel', 'lang', 'dir' );
			echo "<a class='ab-item'$aria_attributes href='" . esc_url( $node->href ) . "'";
		} else {
			$attributes = array( 'onclick', 'target', 'title', 'rel', 'lang', 'dir' );
			echo '<div class="ab-item ab-empty-item"' . $aria_attributes;
		}

		foreach ( $attributes as $attribute ) {
			if ( empty( $node->meta[ $attribute ] ) ) {
				continue;
			}

			if ( 'onclick' === $attribute ) {
				echo " $attribute='" . esc_js( $node->meta[ $attribute ] ) . "'";
			} else {
				echo " $attribute='" . esc_attr( $node->meta[ $attribute ] ) . "'";
			}
		}

		echo ">{$arrow}{$node->title}";

		if ( $has_link ) {
			echo '</a>';
		} else {
			echo '</div>';
		}

		if ( $is_parent ) {
			echo '<div class="ab-sub-wrapper">';
			foreach ( $node->children as $group ) {
				$this->_render_group( $group );
			}
			echo '</div>';
		}

		if ( ! empty( $node->meta['html'] ) ) {
			echo $node->meta['html'];
		}

		echo '</li>';
	}

	/**
	 * Renders toolbar items recursively.
	 *
	 * @since 3.1.0
	 * @deprecated 3.3.0 Use WP_Admin_Bar::_render_item() or WP_Admin_bar::render() instead.
	 * @see WP_Admin_Bar::_render_item()
	 * @see WP_Admin_Bar::render()
	 *
	 * @param string $id    Unused.
	 * @param object $node
	 */
	public function recursive_render( $id, $node ) {
		_deprecated_function( __METHOD__, '3.3.0', 'WP_Admin_bar::render(), WP_Admin_Bar::_render_item()' );
		$this->_render_item( $node );
	}

	/**
	 * Adds menus to the admin bar.
	 *
	 * @since 3.1.0
	 */
	public function add_menus() {
		// User-related, aligned right.
		add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_menu', 0 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', 4 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_item', 7 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_recovery_mode_menu', 8 );

		// Site-related.
		add_action( 'admin_bar_menu', 'wp_admin_bar_sidebar_toggle', 0 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_my_sites_menu', 20 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_site_menu', 30 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_edit_site_menu', 40 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 );
		add_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 );

		// Content-related.
		if ( ! is_network_admin() && ! is_user_admin() ) {
			add_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 );
			add_action( 'admin_bar_menu', 'wp_admin_bar_new_content_menu', 70 );
		}
		add_action( 'admin_bar_menu', 'wp_admin_bar_edit_menu', 80 );

		add_action( 'admin_bar_menu', 'wp_admin_bar_add_secondary_groups', 200 );

		/**
		 * Fires after menus are added to the menu bar.
		 *
		 * @since 3.1.0
		 */
		do_action( 'add_admin_bar_menus' );
	}
}

SILENT KILLER Tool