| @@ -35,8 +35,9 @@ | ||
| 35 | 35 | // Admin Init |
| 36 | 36 | add_action('admin_init', [$this, 'adminInit']); |
| 37 | 37 | |
| 38 | 38 | add_action('admin_menu', [$this, 'add_menu'], 10); |
| 39 | + add_action('admin_notices', [$this, 'storage_credentials_admin_notice']); | |
| 39 | 40 | |
| 40 | 41 | add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_scripts'], 10, 1); |
| 41 | 42 | add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_styles'], 10, 1); |
| 42 | 43 | // Load media scripts |
| @@ -56,17 +57,35 @@ | ||
| 56 | 57 | * Method that is used on plugin initialization time |
| 57 | 58 | * @since 1.0.0 |
| 58 | 59 | */ |
| 59 | 60 | public function adminInit() { |
| 60 | - if (version_compare(get_option( $this->token.'_db_version' ), WPMCS_DB_VERSION, '!=') ) { | |
| 61 | + $current_db_version = get_option( $this->token . '_db_version', false ); | |
| 62 | + /** | |
| 63 | + * Run DB upgrades only if: | |
| 64 | + * - DB version exists | |
| 65 | + * - DB version is lower than plugin DB version | |
| 66 | + */ | |
| 67 | + if ( | |
| 68 | + $current_db_version === false || | |
| 69 | + version_compare( $current_db_version, WPMCS_DB_VERSION, '<' ) | |
| 70 | + ) { | |
| 61 | 71 | Db::instance()->do_database_upgrade(); |
| 62 | 72 | } |
| 63 | 73 | |
| 64 | - if (get_option($this->token.'_do_activation_redirect', false) && !Utils::get_service()) { | |
| 65 | - delete_option($this->token.'_do_activation_redirect'); | |
| 66 | - wp_redirect(admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure')); | |
| 67 | - } else { | |
| 68 | - delete_option($this->token.'_do_activation_redirect'); | |
| 74 | + /** | |
| 75 | + * One-time activation redirect | |
| 76 | + */ | |
| 77 | + $do_redirect = get_option( $this->token . '_do_activation_redirect', false ); | |
| 78 | + | |
| 79 | + if ( $do_redirect ) { | |
| 80 | + delete_option( $this->token . '_do_activation_redirect' ); | |
| 81 | + | |
| 82 | + if ( ! Utils::get_service() ) { | |
| 83 | + wp_redirect( | |
| 84 | + admin_url( 'admin.php?page=' . $this->token . '-admin-ui#/configure' ) | |
| 85 | + ); | |
| 86 | + exit; | |
| 87 | + } | |
| 69 | 88 | } |
| 70 | 89 | } |
| 71 | 90 | |
| 72 | 91 | /** |
| @@ -75,26 +94,16 @@ | ||
| 75 | 94 | * @access public |
| 76 | 95 | * @return void |
| 77 | 96 | * @since 1.0.0 |
| 78 | 97 | */ |
| 79 | - public function install($network_wide = false) { | |
| 98 | + public static function install($network_wide = false) { | |
| 80 | 99 | Db::handle_tables($network_wide); |
| 81 | - | |
| 100 | + | |
| 82 | 101 | // Redirection on activation |
| 83 | - add_option($this->token.'_do_activation_redirect', true); | |
| 102 | + add_option(WPMCS_TOKEN . '_do_activation_redirect', true); | |
| 84 | 103 | |
| 85 | 104 | //Protect directories |
| 86 | - /** | |
| 87 | - * Removed the directory protection from the upload directory | |
| 88 | - * because it is not needed anymore. | |
| 89 | - * If you want to protect the upload directory, | |
| 90 | - * you can use the following code: | |
| 91 | - * $this->_protect_upload_dir(); | |
| 92 | - * @since 1.2.13 | |
| 93 | - * @deprecated 1.2.13 | |
| 94 | - * @see \Dudlewebs\WPMCS\Admin::_protect_upload_dir | |
| 95 | - */ | |
| 96 | - // $this->_protect_upload_dir(); | |
| 105 | + self::_protect_upload_dir(); | |
| 97 | 106 | } |
| 98 | 107 | |
| 99 | 108 | /** |
| 100 | 109 | * Create plugin specific upload directory |
| @@ -101,19 +110,9 @@ | ||
| 101 | 110 | * @since 1.0.0 |
| 102 | 111 | */ |
| 103 | 112 | public function create_plugin_dir() { |
| 104 | 113 | //Protect directories |
| 105 | - /** | |
| 106 | - * Removed the directory protection from the upload directory | |
| 107 | - * because it is not needed anymore. | |
| 108 | - * If you want to protect the upload directory, | |
| 109 | - * you can use the following code: | |
| 110 | - * $this->_protect_upload_dir(); | |
| 111 | - * @since 1.2.13 | |
| 112 | - * @deprecated 1.2.13 | |
| 113 | - * @see \Dudlewebs\WPMCS\Admin::_protect_upload_dir | |
| 114 | - */ | |
| 115 | - // $this->_protect_upload_dir(); | |
| 114 | + self::_protect_upload_dir(); | |
| 116 | 115 | } |
| 117 | 116 | |
| 118 | 117 | /** |
| 119 | 118 | * Protect Directory from external access. |
| @@ -119,29 +118,26 @@ | ||
| 119 | 118 | * Protect Directory from external access. |
| 120 | 119 | * |
| 121 | 120 | * @access private |
| 122 | 121 | * @return void |
| 123 | - * @since 1.0.0 | |
| 124 | - * @deprecated 1.2.13 | |
| 122 | + * @since 1.3.0 | |
| 125 | 123 | * @see \Dudlewebs\WPMCS\Admin::_protect_upload_dir |
| 126 | 124 | */ |
| 127 | - private function _protect_upload_dir(){ | |
| 125 | + private static function _protect_upload_dir(){ | |
| 128 | 126 | $upload_dir = wp_upload_dir(); |
| 129 | 127 | |
| 128 | + $upload_base = $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS'); | |
| 129 | + | |
| 130 | 130 | $files = array( |
| 131 | 131 | array( |
| 132 | - 'base' => $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS'), | |
| 132 | + 'base' => $upload_base, | |
| 133 | 133 | 'file' => '.htaccess', |
| 134 | - 'content' => 'Options -Indexes' . "\n" | |
| 135 | - . '<Files *.php>' . "\n" | |
| 136 | - . 'deny from all' . "\n" | |
| 137 | - . '</Files>' | |
| 134 | + 'content' => "Options -Indexes\nDeny from all" | |
| 138 | 135 | ), |
| 139 | 136 | array( |
| 140 | - 'base' => $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS'), | |
| 137 | + 'base' => $upload_base, | |
| 141 | 138 | 'file' => 'index.php', |
| 142 | - 'content' => '<?php ' . "\n" | |
| 143 | - . '// Silence is golden.' | |
| 139 | + 'content' => "<?php\n// Silence is golden." | |
| 144 | 140 | ) |
| 145 | 141 | ); |
| 146 | 142 | |
| 147 | 143 | foreach ($files as $file) { |
| @@ -157,9 +153,9 @@ | ||
| 157 | 153 | |
| 158 | 154 | /** |
| 159 | 155 | * Deactivation hook |
| 160 | 156 | */ |
| 161 | - public function deactivation(){ | |
| 157 | + public static function deactivation(){ | |
| 162 | 158 | } |
| 163 | 159 | |
| 164 | 160 | |
| 165 | 161 | /** |
| @@ -213,9 +209,15 @@ | ||
| 213 | 209 | $this->token . '_object', |
| 214 | 210 | array( |
| 215 | 211 | 'api_nonce' => wp_create_nonce('wp_rest'), |
| 216 | 212 | 'root' => rest_url($this->token . '/v1/'), |
| 213 | + 'pro_root' => rest_url($this->token . '/pro/v1/'), | |
| 217 | 214 | 'assets_url' => $this->assets_url, |
| 215 | + 'admin_url' => admin_url(), | |
| 216 | + 'is_db_upgrade_required' => Upgrade::instance()->is_upgrade_needed(), | |
| 217 | + 'is_cron_disabled' => defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON, | |
| 218 | + 'is_pro_active' => defined('WPMCS_PRO_VERSION'), | |
| 219 | + 'license_status' => defined('WPMCS_PRO_VERSION') ? Utils::get_safe_license_data() : [], | |
| 218 | 220 | ) |
| 219 | 221 | ); |
| 220 | 222 | } |
| 221 | 223 | } |
| @@ -256,8 +258,12 @@ | ||
| 256 | 258 | 'getstarted' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure') . '">' . esc_html__('Get Started', 'media-cloud-sync') . '</a>', |
| 257 | 259 | 'settings' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui/') . '">' . esc_html__('Settings', 'media-cloud-sync') . '</a>', |
| 258 | 260 | ); |
| 259 | 261 | |
| 262 | + if (!Utils::is_pro_licensed()) { | |
| 263 | + $action_links['upgrade'] = '<a href="https://dudlewebs.com/product/media-cloud-sync/" target="_blank" style="color:#d54e21;font-weight:600;">' . esc_html__('Upgrade', 'media-cloud-sync') . '</a>'; | |
| 264 | + } | |
| 265 | + | |
| 260 | 266 | return array_merge($action_links, $links); |
| 261 | 267 | } |
| 262 | 268 | |
| 263 | 269 | |
| @@ -272,9 +278,9 @@ | ||
| 272 | 278 | esc_html__('Media Cloud Sync', 'media-cloud-sync'), |
| 273 | 279 | 'manage_options', |
| 274 | 280 | $this->token.'-admin-ui', |
| 275 | 281 | array($this, 'adminUi'), |
| 276 | - 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCIgdmlld0JveD0iMCAwIDUwIDUwIiBmaWxsPSJub25lIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEwNDRfNzQ4KSI+CjxwYXRoIGQ9Ik0xNC4yNDg0IDIxLjQyNDdDMTQuNjcxMiAxOC44Nzc2IDE1Ljk4NDMgMTYuNTYzMiAxNy45NTM4IDE0Ljg5MzZDMTkuOTIzNCAxMy4yMjQgMjIuNDIxNiAxMi4zMDc2IDI1LjAwMzUgMTIuMzA3NkMyNy41ODU1IDEyLjMwNzYgMzAuMDgzNyAxMy4yMjQgMzIuMDUzMyAxNC44OTM2QzM0LjAyMjggMTYuNTYzMiAzNS4zMzU5IDE4Ljg3NzYgMzUuNzU4NyAyMS40MjQ3QzM3Ljg1MDMgMjEuNjIyNiAzOS43ODU0IDIyLjYxOCA0MS4xNjI3IDI0LjIwNDZDNDIuNTM5OSAyNS43OTEyIDQzLjI1MzQgMjcuODQ3MSA0My4xNTUzIDI5Ljk0NTdDNDMuMDU3MSAzMi4wNDQzIDQyLjE1NDggMzQuMDI0NiA0MC42MzU1IDM1LjQ3NTdDMzkuMTE2MiAzNi45MjY4IDM3LjA5NjYgMzcuNzM3MyAzNC45OTU3IDM3LjczOTFIMTUuMDExNEMxMi45MTA1IDM3LjczNzMgMTAuODkwOSAzNi45MjY4IDkuMzcxNTkgMzUuNDc1N0M3Ljg1MjMxIDM0LjAyNDYgNi45NDk5OSAzMi4wNDQzIDYuODUxODMgMjkuOTQ1N0M2Ljc1MzY4IDI3Ljg0NzEgNy40NjcyMiAyNS43OTEyIDguODQ0NDMgMjQuMjA0NkMxMC4yMjE2IDIyLjYxOCAxMi4xNTY4IDIxLjYyMjYgMTQuMjQ4NCAyMS40MjQ3WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNMjMuMTg2NyAyOS41NjRDMjMuMTg2NyAzMC42Mzc3IDIyLjk3NTIgMzEuNzAwNyAyMi41NjQ0IDMyLjY5MjZDMjIuMTUzNSAzMy42ODQ1IDIxLjU1MTMgMzQuNTg1OCAyMC43OTIyIDM1LjM0NDlDMjAuMDMzIDM2LjEwNDEgMTkuMTMxOCAzNi43MDYzIDE4LjEzOTkgMzcuMTE3MUMxNy4xNDggMzcuNTI4IDE2LjA4NDkgMzcuNzM5NCAxNS4wMTEzIDM3LjczOTRDMTMuOTM3NyAzNy43Mzk0IDEyLjg3NDYgMzcuNTI4IDExLjg4MjcgMzcuMTE3MUMxMC44OTA4IDM2LjcwNjMgOS45ODk2IDM2LjEwNDEgOS4yMzA0NSAzNS4zNDQ5QzguNDcxMjkgMzQuNTg1OCA3Ljg2OTEgMzMuNjg0NSA3LjQ1ODI1IDMyLjY5MjZDNy4wNDc0IDMxLjcwMDcgNi44MzU5NCAzMC42Mzc3IDYuODM1OTQgMjkuNTY0QzYuODM1OTQgMjcuMzk1OCA3LjY5NzI3IDI1LjMxNjQgOS4yMzA0NSAyMy43ODMyQzEwLjc2MzYgMjIuMjUgMTIuODQzMSAyMS4zODg3IDE1LjAxMTMgMjEuMzg4N0MxNy4xNzk2IDIxLjM4ODcgMTkuMjU5IDIyLjI1IDIwLjc5MjIgMjMuNzgzMkMyMi4zMjUzIDI1LjMxNjQgMjMuMTg2NyAyNy4zOTU4IDIzLjE4NjcgMjkuNTY0WiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzEwNDRfNzQ4KSIgZmlsbC1vcGFjaXR5PSIwLjMiLz4KPHBhdGggZD0iTTI1LjAwMzQgMzQuMTA1N0MyNy4wODMyIDM0LjEwNTUgMjkuMTE5NSAzMy41MTAzIDMwLjg3MiAzMi4zOTA0QzMyLjYyNDUgMzEuMjcwNSAzNC4wMjAxIDI5LjY3MjYgMzQuODk0IDI3Ljc4NTRDMzUuNzY3OCAyNS44OTgxIDM2LjA4MzYgMjMuODAwMiAzNS44MDM5IDIxLjczOTNDMzUuNTI0MiAxOS42Nzg1IDM0LjY2MDggMTcuNzQwNiAzMy4zMTU2IDE2LjE1NDVDMzEuOTcwMyAxNC41Njg0IDMwLjE5OTQgMTMuNDAwMiAyOC4yMTE4IDEyLjc4NzlDMjYuMjI0MiAxMi4xNzU1IDI0LjEwMyAxMi4xNDQ2IDIyLjA5ODMgMTIuNjk4NkMyMC4wOTM3IDEzLjI1MjcgMTguMjg5NSAxNC4zNjg3IDE2Ljg5ODUgMTUuOTE0OUMxNS41MDc2IDE3LjQ2MTEgMTQuNTg4IDE5LjM3MjkgMTQuMjQ4MyAyMS40MjQ4QzE0LjQ5OSAyMS40MDA2IDE0Ljc1MzMgMjEuMzg4NCAxNS4wMTEzIDIxLjM4ODRDMTYuNDUxNyAyMS4zODgyIDE3Ljg2NjYgMjEuNzY4NSAxOS4xMTI3IDIyLjQ5MDhDMjAuMzU4OCAyMy4yMTMyIDIxLjM5MiAyNC4yNTE5IDIyLjEwNzcgMjUuNTAxOUMyMi44MjMzIDI2Ljc1MiAyMy4xOTYgMjguMTY4OCAyMy4xODggMjkuNjA5MkMyMy4xOCAzMS4wNDk1IDIyLjc5MTYgMzIuNDYyMiAyMi4wNjIxIDMzLjcwNDJDMjMuMDE5NyAzMy45NzE1IDI0LjAwOTMgMzQuMTA2NiAyNS4wMDM0IDM0LjEwNTdaIiBmaWxsPSJ1cmwoI3BhaW50Ml9saW5lYXJfMTA0NF83NDgpIiBmaWxsLW9wYWNpdHk9IjAuMyIvPgo8cGF0aCBkPSJNMjUuMDAzNCAzNC4xMDU3QzI3LjA4MzIgMzQuMTA1NSAyOS4xMTk1IDMzLjUxMDMgMzAuODcyIDMyLjM5MDRDMzIuNjI0NSAzMS4yNzA1IDM0LjAyMDEgMjkuNjcyNiAzNC44OTQgMjcuNzg1NEMzNS43Njc4IDI1Ljg5ODEgMzYuMDgzNiAyMy44MDAyIDM1LjgwMzkgMjEuNzM5M0MzNS41MjQyIDE5LjY3ODUgMzQuNjYwOCAxNy43NDA2IDMzLjMxNTYgMTYuMTU0NUMzMS45NzAzIDE0LjU2ODQgMzAuMTk5NCAxMy40MDAyIDI4LjIxMTggMTIuNzg3OUMyNi4yMjQyIDEyLjE3NTUgMjQuMTAzIDEyLjE0NDYgMjIuMDk4MyAxMi42OTg2QzIwLjA5MzcgMTMuMjUyNyAxOC4yODk1IDE0LjM2ODcgMTYuODk4NSAxNS45MTQ5QzE1LjUwNzYgMTcuNDYxMSAxNC41ODggMTkuMzcyOSAxNC4yNDgzIDIxLjQyNDhDMTQuNDk5IDIxLjQwMDYgMTQuNzUzMyAyMS4zODg0IDE1LjAxMTMgMjEuMzg4NEMxNi40NTE3IDIxLjM4ODIgMTcuODY2NiAyMS43Njg1IDE5LjExMjcgMjIuNDkwOEMyMC4zNTg4IDIzLjIxMzIgMjEuMzkyIDI0LjI1MTkgMjIuMTA3NyAyNS41MDE5QzIyLjgyMzMgMjYuNzUyIDIzLjE5NiAyOC4xNjg4IDIzLjE4OCAyOS42MDkyQzIzLjE4IDMxLjA0OTUgMjIuNzkxNiAzMi40NjIyIDIyLjA2MjEgMzMuNzA0MkMyMy4wMTk3IDMzLjk3MTUgMjQuMDA5MyAzNC4xMDY2IDI1LjAwMzQgMzQuMTA1N1oiIGZpbGw9InVybCgjcGFpbnQzX3JhZGlhbF8xMDQ0Xzc0OCkiLz4KPHBhdGggZD0iTTE0LjI0ODQgMjEuNDI0N0MxNC42NzEyIDE4Ljg3NzYgMTUuOTg0MyAxNi41NjMyIDE3Ljk1MzggMTQuODkzNkMxOS45MjM0IDEzLjIyNCAyMi40MjE2IDEyLjMwNzYgMjUuMDAzNSAxMi4zMDc2QzI3LjU4NTUgMTIuMzA3NiAzMC4wODM3IDEzLjIyNCAzMi4wNTMzIDE0Ljg5MzZDMzQuMDIyOCAxNi41NjMyIDM1LjMzNTkgMTguODc3NiAzNS43NTg3IDIxLjQyNDdDMzcuODUwMyAyMS42MjI2IDM5Ljc4NTQgMjIuNjE4IDQxLjE2MjcgMjQuMjA0NkM0Mi41Mzk5IDI1Ljc5MTIgNDMuMjUzNCAyNy44NDcxIDQzLjE1NTMgMjkuOTQ1N0M0My4wNTcxIDMyLjA0NDMgNDIuMTU0OCAzNC4wMjQ2IDQwLjYzNTUgMzUuNDc1N0MzOS4xMTYyIDM2LjkyNjggMzcuMDk2NiAzNy43MzczIDM0Ljk5NTcgMzcuNzM5MUgxNS4wMTE0QzEyLjkxMDUgMzcuNzM3MyAxMC44OTA5IDM2LjkyNjggOS4zNzE1OSAzNS40NzU3QzcuODUyMzEgMzQuMDI0NiA2Ljk0OTk5IDMyLjA0NDMgNi44NTE4MyAyOS45NDU3QzYuNzUzNjggMjcuODQ3MSA3LjQ2NzIyIDI1Ljc5MTIgOC44NDQ0MyAyNC4yMDQ2QzEwLjIyMTYgMjIuNjE4IDEyLjE1NjggMjEuNjIyNiAxNC4yNDg0IDIxLjQyNDdaIiBmaWxsPSJ1cmwoI3BhaW50NF9yYWRpYWxfMTA0NF83NDgpIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9kXzEwNDRfNzQ4KSI+CjxyZWN0IHg9IjM1LjkzNzUiIHk9IjQuNjg3NSIgd2lkdGg9IjkuMzc1IiBoZWlnaHQ9IjkuMzc1IiByeD0iNC42ODc1IiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxwYXRoIGQ9Ik00Mi41ODA5IDEwLjcyQzQyLjM2MTYgMTEuMzY3NSA0MS45Nzg3IDExLjYwODYgNDEuNzc2OCAxMS43MTE3QzQxLjk2MTMgMTEuNzE2MiA0Mi4zMTk4IDExLjc2NTEgNDIuNzI3MSAxMS41MjQyQzQzLjMxMTkgMTEuMTM3OCA0My40MjQ0IDEwLjY0MzYgNDMuNDM3MiAxMC41MTEyQzQzLjQ0NzcgMTAuNDAzNiA0My40MzcyIDEwLjI4MDcgNDMuNDM3MiA5Ljg2MzcxQzQzLjQwNTkgOS43OTQyMSA0My4zNDMyIDkuNTcxMzEgNDMuMDA5IDkuNTcxMzFDNDIuNzQxNyA5LjU3MTMxIDQyLjYxMjIgOS43OTA2MSA0Mi42MTIyIDkuOTA1NDhDNDIuNjEyMiAxMC4xOTc5IDQyLjYyMjcgMTAuNDI3NiA0Mi41ODA5IDEwLjcyWiIgZmlsbD0idXJsKCNwYWludDVfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNNDEuMjIzMyAxMC41ODQzQzQxLjE4MTUgMTEuMTAyMyA0MC43NjczIDExLjU1MiA0MC41NjU0IDExLjcxMjFDNDAuNzQ5OSAxMS43MTkxIDQxLjE5ODIgMTEuNjcwNCA0MS41MTU3IDExLjQxOTdDNDEuOTEyNSAxMS4xMDY0IDQyLjA2NjggMTAuNjk1OSA0Mi4wNzk2IDEwLjQ5MDNDNDIuMDkwMSAxMC4zMjMyIDQyLjA5MDEgOS4yNzg5IDQyLjA5MDEgOC42MzE0M0M0Mi4wNTg3IDguNTIzNTIgNDEuOTI5MiA4LjMwNzY5IDQxLjY2MTkgOC4zMDc2OUM0MS4zOTQ1IDguMzA3NjkgNDEuMjc5IDguNTIzNTIgNDEuMjU0NiA4LjYzMTQzQzQxLjI2MTYgOS4wNjY1NiA0MS4yNjUxIDEwLjA2NjMgNDEuMjIzMyAxMC41ODQzWiIgZmlsbD0idXJsKCNwYWludDZfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNMzkuNzcxNyAxMC4zOTYzVjcuNDkzMTNDMzkuNzcxNyA3LjMyNjA0IDM5Ljg1OTQgNy4wMDAyMiA0MC4yMTAzIDcuMDMzNjRDNDAuNTYxMiA3LjA2NzA1IDQwLjYwMzIgNy4zMjYwNCA0MC42MDcxIDcuNDkzMTNDNDAuNjIxMSA4LjA4ODM5IDQwLjY0MDYgOS41MDIzOCA0MC42MDcxIDEwLjM5NjNDNDAuNDgxOCAxMS4zMDQ5IDM5Ljc1MDggMTEuNjIxNiAzOS4zNTQgMTEuNjkxMkMzOC43Mzc4IDExLjc5OTMgMzcuODcyMiAxMS40MTk3IDM3LjcyNDggMTAuNTczOEMzNy40ODQ3IDkuMTk1MzUgMzguNzc5NiA4Ljc0NjMgMzkuMDcyIDguNzc3NjNDMzkuMzAxOCA4Ljc2ODc5IDM5LjM1MDUgOC44OTI1IDM5LjM1NCA4Ljk1NTE2VjkuNjQ0NDFDMzguOTc4IDkuNTM5OTggMzguNDAzNyA5LjgyMTk0IDM4LjU0OTkgMTAuMzk2M0MzOC43Nzk2IDExLjEwNjQgMzkuNjI1NSAxMC45MzkzIDM5Ljc3MTcgMTAuMzk2M1oiIGZpbGw9InVybCgjcGFpbnQ3X2xpbmVhcl8xMDQ0Xzc0OCkiLz4KPGNpcmNsZSBjeD0iMzQuOTYwOSIgY3k9IjMzLjM5ODQiIHI9IjYuMjk2ODgiIHN0cm9rZT0iIzMxNjRFNCIgc3Ryb2tlLXdpZHRoPSI0Ii8+CjxwYXRoIGQ9Ik0zMy44MTQzIDMwLjU2NTJMMzIuNzE1IDMxLjY1MDVDMzIuNjY4MyAzMS42OTY2IDMyLjYzNjUgMzEuNzU1MyAzMi42MjM2IDMxLjgxOTNDMzIuNjEwNyAzMS44ODMyIDMyLjYxNzMgMzEuOTQ5NSAzMi42NDI2IDMyLjAwOThMMzIuNjUzOSAzMi4wMzM2QzMyLjY4MTkgMzIuMDg3NyAzMi43MjQ1IDMyLjEzMyAzMi43NzY5IDMyLjE2NDdDMzIuODI5MyAzMi4xOTYzIDMyLjg4OTYgMzIuMjEzMSAzMi45NTExIDMyLjIxMzFIMzMuMzgyN0wzMy4zODI1IDM0LjYzMTZDMzMuMzgyNSAzNC43MTkgMzMuNDE3NyAzNC44MDI5IDMzLjQ4MDMgMzQuODY0N0MzMy41NDI5IDM0LjkyNjUgMzMuNjI3OCAzNC45NjEyIDMzLjcxNjQgMzQuOTYxMkgzNC4zODRMMzQuNDA5MSAzNC45NjA0QzM0LjQ5MyAzNC45NTQxIDM0LjU3MTUgMzQuOTE2OCAzNC42Mjg4IDM0Ljg1NThDMzQuNjg2MSAzNC43OTQ5IDM0LjcxNzkgMzQuNzE0OCAzNC43MTc5IDM0LjYzMTZWMzIuMjEzMUgzNS4xNDk3QzM1LjIxNTcgMzIuMjEzMSAzNS4yODAyIDMyLjE5MzggMzUuMzM1MSAzMi4xNTc1QzM1LjM5IDMyLjEyMTMgMzUuNDMyOCAzMi4wNjk5IDM1LjQ1OCAzMi4wMDk2QzM1LjQ4MzMgMzEuOTQ5NCAzNS40ODk5IDMxLjg4MzIgMzUuNDc3IDMxLjgxOTNDMzUuNDY0MSAzMS43NTUzIDM1LjQzMjQgMzEuNjk2NiAzNS4zODU3IDMxLjY1MDVMMzQuMjg2NCAzMC41NjUyQzM0LjIyMzggMzAuNTAzNSAzNC4xMzg5IDMwLjQ2ODggMzQuMDUwNCAzMC40Njg4QzMzLjk2MTggMzAuNDY4OCAzMy44NzY5IDMwLjUwMzUgMzMuODE0MyAzMC41NjUyWiIgZmlsbD0iIzMxNjRFNCIvPgo8cGF0aCBkPSJNMzYuNDM3OSAzNi4zNzMyTDM3LjMzNjkgMzUuNDc0M0MzNy4zNzUxIDM1LjQzNjEgMzcuNDAxMSAzNS4zODc1IDM3LjQxMTYgMzUuMzM0NUMzNy40MjIyIDM1LjI4MTUgMzcuNDE2OCAzNS4yMjY2IDM3LjM5NjEgMzUuMTc2N0wzNy4zODY4IDM1LjE1N0MzNy4zNjM5IDM1LjExMjIgMzcuMzI5MSAzNS4wNzQ3IDM3LjI4NjMgMzUuMDQ4NEMzNy4yNDM0IDM1LjAyMjIgMzcuMTk0MSAzNS4wMDgzIDM3LjE0MzkgMzUuMDA4M0gzNi43OTA5TDM2Ljc5MDkgMzMuNTE4NkMzNi43OTA5IDMzLjQ0NjIgMzYuNzYyMSAzMy4zNzY4IDM2LjcxMSAzMy4zMjU2QzM2LjY1OTggMzMuMjc0NCAzNi41OTAzIDMzLjI0NTcgMzYuNTE3OSAzMy4yNDU3SDM1Ljk3MkwzNS45NTE1IDMzLjI0NjNDMzUuODgyOCAzMy4yNTE1IDM1LjgxODYgMzMuMjgyNCAzNS43NzE4IDMzLjMzMjlDMzUuNzI1IDMzLjM4MzQgMzUuNjk5IDMzLjQ0OTggMzUuNjk5IDMzLjUxODZMMzUuNjk5MSAzNS4wMDgzSDM1LjM0NkMzNS4yOTIxIDM1LjAwODMgMzUuMjM5MyAzNS4wMjQ0IDM1LjE5NDQgMzUuMDU0M0MzNS4xNDk1IDM1LjA4NDMgMzUuMTE0NiAzNS4xMjcgMzUuMDkzOSAzNS4xNzY4QzM1LjA3MzIgMzUuMjI2NyAzNS4wNjc4IDM1LjI4MTYgMzUuMDc4NCAzNS4zMzQ1QzM1LjA4ODkgMzUuMzg3NSAzNS4xMTQ5IDM1LjQzNjEgMzUuMTUzMSAzNS40NzQzTDM2LjA1MiAzNi4zNzMyQzM2LjEwMzIgMzYuNDI0NCAzNi4xNzI2IDM2LjQ1MzEgMzYuMjQ1IDM2LjQ1MzFDMzYuMzE3MyAzNi40NTMxIDM2LjM4NjggMzYuNDI0NCAzNi40Mzc5IDM2LjM3MzJaIiBmaWxsPSIjMzE2NEU0Ii8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF8xMDQ0Xzc0OCIgeD0iMjUuOTM3NSIgeT0iLTUuMzEyNSIgd2lkdGg9IjI5LjM3NSIgaGVpZ2h0PSIyOS4zNzUiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+CjxmZU1vcnBob2xvZ3kgcmFkaXVzPSIyIiBvcGVyYXRvcj0iZGlsYXRlIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93XzEwNDRfNzQ4Ii8+CjxmZU9mZnNldC8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiLz4KPGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0ib3V0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDAgMSAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3dfMTA0NF83NDgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfMTA0NF83NDgiIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8xMDQ0Xzc0OCIgeDE9IjguMTMzMiIgeTE9IjE3LjA3MzYiIHgyPSIyNC40MTMxIiB5Mj0iNDEuMjM2NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwIi8+CjxzdG9wIG9mZnNldD0iMC42OSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzEwNDRfNzQ4IiB4MT0iNi44MzU5NCIgeTE9IjI0LjE5MDEiIHgyPSIxNy44NTgyIiB5Mj0iMzMuOTQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+CjxzdG9wIG9mZnNldD0iMC43ODUiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAuOCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50Ml9saW5lYXJfMTA0NF83NDgiIHgxPSIxOC4wMDE3IiB5MT0iMTMuNTMxIiB4Mj0iMjAuODk1OCIgeTI9IjI4LjU1NzMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agb2Zmc2V0PSIwLjIzNSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQzX3JhZGlhbF8xMDQ0Xzc0OCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgxNS4wOTQ5IDMwLjE1NDMpIHJvdGF0ZSgtMjIuOTg1Nikgc2NhbGUoMTMuMjU5MiAxMS44NzY4KSI+CjxzdG9wIG9mZnNldD0iMC4zOSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPHN0b3Agb2Zmc2V0PSIwLjkzIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjQyIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQ0X3JhZGlhbF8xMDQ0Xzc0OCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgyMy40OTAyIDEwLjcxNSkgcm90YXRlKDYzLjU3NTEpIHNjYWxlKDMxLjQ2ODEgMjI3LjE3NSkiPgo8c3RvcCBvZmZzZXQ9IjAuNDQ1IiBzdG9wLWNvbG9yPSIjMThCQUE3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMThCQUE3Ii8+CjwvcmFkaWFsR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQ1X2xpbmVhcl8xMDQ0Xzc0OCIgeDE9IjM3LjY5NTMiIHkxPSI4Ljk5NzM1IiB4Mj0iNDMuNDQxOSIgeTI9IjguOTk3MzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzM0QkI3QSIvPgo8c3RvcCBvZmZzZXQ9IjAuMjU1MjA4IiBzdG9wLWNvbG9yPSIjMThCQUE3Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzMxNjRFNCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50Nl9saW5lYXJfMTA0NF83NDgiIHgxPSIzNy42OTUzIiB5MT0iOC45OTczNSIgeDI9IjQzLjQ0MTkiIHkyPSI4Ljk5NzM0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMzNEJCN0EiLz4KPHN0b3Agb2Zmc2V0PSIwLjI1NTIwOCIgc3RvcC1jb2xvcj0iIzE4QkFBNyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMTY0RTQiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDdfbGluZWFyXzEwNDRfNzQ4IiB4MT0iMzcuNjk1MyIgeTE9IjguOTk3MzUiIHgyPSI0My40NDE5IiB5Mj0iOC45OTczNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMzRCQjdBIi8+CjxzdG9wIG9mZnNldD0iMC4yNTUyMDgiIHN0b3AtY29sb3I9IiMxOEJBQTciLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzE2NEU0Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMTA0NF83NDgiPgo8cmVjdCB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+', | |
| 282 | + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTczIiBoZWlnaHQ9IjEyMiIgdmlld0JveD0iMCAwIDE3MyAxMjIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xMzkuNTggNzYuMDA4MkMxNDYuNDQxIDc1LjgyMyAxNTEuOTAyIDc4LjgxNTggMTU2LjE3OSA4My44NzkzQzE2MS42OTUgOTAuNDA5OCAxNjEuMzQ5IDk4LjY5MjEgMTU1LjkyMyAxMDUuMzI0QzE1Mi40ODUgMTA5LjUyNiAxNDYuOTI5IDExMC42OTMgMTQyLjIwNyAxMDguMTZDMTM5LjU4OSAxMDYuNzU1IDEzNy45NDIgMTA0LjUxIDEzNy4wMzEgMTAxLjcwMUMxMzYuNzc0IDEwMC45MDYgMTM3LjA3MiAxMDAuNjE1IDEzNy44NSAxMDAuNjMxQzEzOC41OTggMTAwLjY0NyAxMzkuMzQ3IDEwMC42MzUgMTQwLjQ0NCAxMDAuNjM1QzE0MS43MDkgMTAwLjUyMSAxNDMuMTc4IDEwMC44MTggMTQ0LjY3MiAxMDEuNThDMTQ3Ljc2NyAxMDMuMTU5IDE1Mi4xNTcgMTAxLjY1OCAxNTMuOTY1IDk4LjYwNTlDMTU2LjA3OSA5NS4wMzcgMTU1LjQxMSA5MS4wMDY3IDE1Mi4zMjkgODguNzM2N0MxNDguNTkgODUuOTgyOSAxNDQuNDg0IDg2LjQzNzggMTQxLjM0NyA4OS44OTg4QzEzOS41NzUgOTEuODUzNyAxMzcuMzYzIDkzLjAwNDMgMTM0LjcwMiA5My4yMDk0QzEzMC4zNjUgOTMuNTQzNiAxMjcuMzE1IDg5Ljk3OTIgMTI4LjEzMyA4NS41Mzg1QzEyOS4xMjUgODAuMTU4NSAxMzMuOTE2IDc2LjE2MTEgMTM5LjU4IDc2LjAwODJaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQyLjIxNyA5NC4xMzMyQzE0Mi42MjQgOTQuMTMzMiAxNDIuOTU1IDk0LjQ2MzMgMTQyLjk1NSA5NC44NzA1Vjk5LjY3OTFDMTQyLjk1NSAxMDAuMDg2IDE0Mi42MjQgMTAwLjQxNSAxNDIuMjE3IDEwMC40MTVIMTM3LjU1OEMxMzcuMTUxIDEwMC40MTUgMTM2LjgyMSAxMDAuMDg2IDEzNi44MiA5OS42NzkxVjk0Ljg3MDVDMTM2LjgyIDk0LjQ2MzMgMTM3LjE1IDk0LjEzMzIgMTM3LjU1OCA5NC4xMzMySDE0Mi4yMTdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQ5LjE5NyA5NC4xMzQyQzE0OS42MDUgOTQuMTM0MiAxNDkuOTM2IDk0LjQ2NDMgMTQ5LjkzNiA5NC44NzE1Vjk2LjU3NTZDMTQ5LjkzNiA5Ni45ODI4IDE0OS42MDUgOTcuMzEyOSAxNDkuMTk3IDk3LjMxMjlIMTQ3LjU2OUMxNDcuMTYxIDk3LjMxMjkgMTQ2LjgzMSA5Ni45ODI4IDE0Ni44MzEgOTYuNTc1NlY5NC44NzE1QzE0Ni44MzEgOTQuNDY0MyAxNDcuMTYxIDk0LjEzNDIgMTQ3LjU2OSA5NC4xMzQySDE0OS4xOTdaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMTQ1LjMzMiA5NC4xMzMyQzE0NS43MzkgOTQuMTMzNSAxNDYuMDcgOTQuNDYzNSAxNDYuMDcgOTQuODcwNVY5NS44MDUxQzE0Ni4wNyA5Ni4yMTIxIDE0NS43MzkgOTYuNTQyMSAxNDUuMzMyIDk2LjU0MjRIMTQ0LjQ1NEMxNDQuMDQ3IDk2LjU0MjQgMTQzLjcxNyA5Ni4yMTIzIDE0My43MTcgOTUuODA1MVY5NC44NzA1QzE0My43MTcgOTQuNDYzMyAxNDQuMDQ3IDk0LjEzMzIgMTQ0LjQ1NCA5NC4xMzMySDE0NS4zMzJaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3MyA5Mi41MDAxQzE3MyAxMDguMjQgMTYwLjI0IDEyMSAxNDQuNSAxMjFDMTI4Ljc2IDEyMSAxMTYgMTA4LjI0IDExNiA5Mi41MDAxQzExNiA3Ni43NiAxMjguNzYgNjQuMDAwMSAxNDQuNSA2NC4wMDAxQzE2MC4yNCA2NC4wMDAxIDE3MyA3Ni43NiAxNzMgOTIuNTAwMVpNMTQ0LjUgMTE0QzE1Ni4zNzQgMTE0IDE2NiAxMDQuMzc0IDE2NiA5Mi41MDAxQzE2NiA4Ni43MDIyIDE2My43MDUgODEuNDQwMyAxNTkuOTc0IDc3LjU3MzNDMTU2LjA2NCA3My41MjA3IDE1MC41NzYgNzEuMDAwMSAxNDQuNSA3MS4wMDAxQzEzMi42MjYgNzEuMDAwMSAxMjMgODAuNjI2IDEyMyA5Mi41MDAxQzEyMyAxMDAuNTQzIDEyNy40MTYgMTA3LjU1NCAxMzMuOTU2IDExMS4yNDFDMTM3LjA3MSAxMTIuOTk4IDE0MC42NjkgMTE0IDE0NC41IDExNFoiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzUuMjY1OSA0My40MTY4QzM3LjI3OTMgMzEuMjg3IDQzLjUzMjQgMjAuMjY1NSA1Mi45MTE3IDEyLjMxNDdDNjIuMjkxIDQuMzYzOTEgNzQuMTg3NyAwIDg2LjQ4MzUgMEM5OC43NzkzIDAgMTEwLjY3NiA0LjM2MzkxIDEyMC4wNTUgMTIuMzE0N0MxMjkuNDM1IDIwLjI2NTUgMTM1LjY4OCAzMS4yODcgMTM3LjcwMSA0My40MTY4QzE0Ny42NjIgNDQuMzU5IDE1Ni44NzcgNDkuMDk5NiAxNjMuNDM1IDU2LjY1NTFDMTY5Ljk5NCA2NC4yMTA2IDE3My4zOTIgNzQuMDAwOSAxNzIuOTI0IDgzLjk5NDlDMTcyLjQ1NyA5My45ODg5IDE2OC4xNiAxMDMuNDE5IDE2MC45MjUgMTEwLjMzQzE1My42OSAxMTcuMjQgMTQ0LjA3MiAxMjEuMSAxMzQuMDY3IDEyMS4xMDhIMzguODk5NkMyOC44OTQ3IDEyMS4xIDE5LjI3NyAxMTcuMjQgMTIuMDQyIDExMC4zM0M0LjgwNjk1IDEwMy40MTkgMC41MDk5NzUgOTMuOTg4OSAwLjA0MjU0OTUgODMuOTk0OUMtMC40MjQ4NzYgNzQuMDAwOSAyLjk3MzEzIDY0LjIxMDYgOS41MzE1OSA1Ni42NTUxQzE2LjA5IDQ5LjA5OTYgMjUuMzA1NSA0NC4zNTkgMzUuMjY1OSA0My40MTY4Wk00Mi45NzE1IDQ1LjkyNTJDNDQuNjgyNyAzNS42MDkgNDkuOTk3IDI2LjIzNTQgNTcuOTY4MiAxOS40NzM1QzY1LjkzOTQgMTIuNzExNSA3Ni4wNTAxIDkuMDAwMSA4Ni40OTk5IDkuMDAwMUM5Ni45NDk4IDkuMDAwMSAxMDcuMDYgMTIuNzExNSAxMTUuMDMyIDE5LjQ3MzVDMTIzLjAwMyAyNi4yMzU0IDEyOC4zMTcgMzUuNjA5IDEzMC4wMjggNDUuOTI1MkMxMzguNDkzIDQ2LjcyNjUgMTQ2LjMyNSA1MC43NTgzIDE1MS44OTkgNTcuMTg0QzE1Ni44NDUgNjIuODg2MSAxNTkuNjc2IDcwLjA4NDkgMTU5Ljk3NCA3Ny41NzMzQzE2My43MDUgODEuNDQwMyAxNjYgODYuNzAyMiAxNjYgOTIuNTAwMUMxNjYgMTA0LjM3NCAxNTYuMzc0IDExNCAxNDQuNSAxMTRDMTQwLjY2OSAxMTQgMTM3LjA3MSAxMTIuOTk4IDEzMy45NTYgMTExLjI0MUMxMzEuNjY4IDExMS43NCAxMjkuMzE3IDExMS45OTggMTI2Ljk0IDExMkg0Ni4wNTk3QzM3LjU1NjggMTExLjk5MyAyOS4zODI5IDEwOC43MSAyMy4yMzQxIDEwMi44MzNDMTcuMDg1MiA5Ni45NTYxIDEzLjQzMzMgODguOTM1NyAxMy4wMzYxIDgwLjQzNkMxMi42Mzg4IDcxLjkzNjMgMTUuNTI2NyA2My42MDk4IDIxLjEwMDYgNTcuMTg0QzI2LjY3NDQgNTAuNzU4MyAzNC41MDY0IDQ2LjcyNjUgNDIuOTcxNSA0NS45MjUyWiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTkzLjUyMTEgNDEuMTc0OEw3Ny4xNDE3IDE4LjY1MDJDNzYuOTk1MyAxOC40NDk1IDc2LjgwMjUgMTguMjg1OCA3Ni41NzkyIDE4LjE3MjhDNzYuMzU1OSAxOC4wNTk4IDc2LjEwODUgMTguMDAwNiA3NS44NTc0IDE4LjAwMDJINzUuODUzNkM3NS42MDE1IDE4LjAwMDcgNzUuMzUzMiAxOC4wNjA0IDc1LjEyOTMgMTguMTc0M0M3NC45MDU0IDE4LjI4ODIgNzQuNzEyMyAxOC40NTMxIDc0LjU2NjEgMTguNjU1Mkw1OC4yOTI0IDQxLjE3OTdDNTguMTI0IDQxLjQxMjUgNTguMDI0MSA0MS42ODY1IDU4LjAwMzggNDEuOTcxNUM1Ny45ODM1IDQyLjI1NjYgNTguMDQzNSA0Mi41NDE2IDU4LjE3NzMgNDIuNzk1MkM1OC4zMTAzIDQzLjA0OTIgNTguNTExOCA0My4yNjIxIDU4Ljc1OTggNDMuNDEwN0M1OS4wMDc4IDQzLjU1OTIgNTkuMjkyNyA0My42Mzc1IDU5LjU4MyA0My42MzdINjcuMjQxOEw2Ny4yNDEyIDc2LjE0MUM2Ny4yNDExIDc2LjM0NTQgNjcuMjgxOSA3Ni41NDc3IDY3LjM2MTQgNzYuNzM2NUM2Ny40NDA5IDc2LjkyNTMgNjcuNTU3NCA3Ny4wOTY5IDY3LjcwNDMgNzcuMjQxM0M2Ny44NTEyIDc3LjM4NTggNjguMDI1NiA3Ny41MDA0IDY4LjIxNzUgNzcuNTc4NUM2OC40MDk0IDc3LjY1NjYgNjguNjE1MSA3Ny42OTY3IDY4LjgyMjggNzcuNjk2Nkw4Mi45OTMxIDc3LjY5NTlDODMuMjAwOSA3Ny42OTYgODMuNDA2NyA3Ny42NTU4IDgzLjU5ODcgNzcuNTc3NkM4My43OTA2IDc3LjQ5OTQgODMuOTY1MSA3Ny4zODQ3IDg0LjExMiA3Ny4yNDAxQzg0LjI1ODkgNzcuMDk1NSA4NC4zNzUzIDc2LjkyMzkgODQuNDU0OCA3Ni43MzVDODQuNTM0MiA3Ni41NDYxIDg0LjU3NSA3Ni4zNDM2IDg0LjU3NDggNzYuMTM5MlY0My42Mzc2SDkyLjIzNjFDOTIuODI3IDQzLjYzNzYgOTMuMzY5NiA0My4zMDk4IDkzLjY0MjQgNDIuNzkyMUM5My43NzU3IDQyLjUzNzcgOTMuODM0OSA0Mi4yNTIgOTMuODEzNSA0MS45NjY2QzkzLjc5MjEgNDEuNjgxMiA5My42OTA5IDQxLjQwNzEgOTMuNTIxMSA0MS4xNzQ4WiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTgyLjE0NDkgODUuNDcxNUw5Ni44MzM4IDEwMi4xMzZDOTYuOTY1IDEwMi4yODUgOTcuMTM3OSAxMDIuNDA2IDk3LjMzODIgMTAyLjQ5Qzk3LjUzODQgMTAyLjU3MyA5Ny43NjAzIDEwMi42MTcgOTcuOTg1NSAxMDIuNjE3Qzk4LjIxMTYgMTAyLjYxNyA5OC40Mzc3IDEwMi41NzMgOTguNjM4NSAxMDIuNDg4Qzk4LjgzOTMgMTAyLjQwNCA5OS4wMTI0IDEwMi4yODIgOTkuMTQzNSAxMDIuMTMzTDExMy43MzggODUuNDY3OUMxMTMuODg5IDg1LjI5NTYgMTEzLjk3OCA4NS4wOTI5IDExMy45OTYgODQuODgyQzExNC4wMTUgODQuNjcxMSAxMTMuOTYxIDg0LjQ2MDMgMTEzLjg0MSA4NC4yNzI2QzExMy43MjIgODQuMDg0NyAxMTMuNTQxIDgzLjkyNzIgMTEzLjMxOCA4My44MTczQzExMy4wOTYgODMuNzA3NCAxMTIuODQxIDgzLjY0OTUgMTEyLjU4IDgzLjY0OThIMTA1LjcxMkwxMDUuNzEyIDU5LjYwMTZDMTA1LjcxMyA1OS40NTA1IDEwNS42NzYgNTkuMzAwNyAxMDUuNjA1IDU5LjE2MTFDMTA1LjUzMyA1OS4wMjE0IDEwNS40MjkgNTguODk0NSAxMDUuMjk3IDU4Ljc4NzZDMTA1LjE2NSA1OC42ODA3IDEwNS4wMDkgNTguNTk1OSAxMDQuODM3IDU4LjUzODFDMTA0LjY2NSA1OC40ODAzIDEwNC40OCA1OC40NTA3IDEwNC4yOTQgNTguNDUwOEw5MS41ODYyIDU4LjQ1MTJDOTEuMzk5OSA1OC40NTEyIDkxLjIxNTQgNTguNDgwOSA5MS4wNDMyIDU4LjUzODhDOTAuODcxMSA1OC41OTY3IDkwLjcxNDYgNTguNjgxNSA5MC41ODI5IDU4Ljc4ODVDOTAuNDUxMiA1OC44OTU1IDkwLjM0NjcgNTkuMDIyNCA5MC4yNzU1IDU5LjE2MjJDOTAuMjA0MiA1OS4zMDIgOTAuMTY3NyA1OS40NTE4IDkwLjE2NzggNTkuNjAzVjgzLjY0OTRIODMuMjk3MkM4Mi43NjczIDgzLjY0OTQgODIuMjgwOCA4My44OTE5IDgyLjAzNjEgODQuMjc0OUM4MS45MTY2IDg0LjQ2MzEgODEuODYzNSA4NC42NzQ1IDgxLjg4MjcgODQuODg1N0M4MS45MDE5IDg1LjA5NjggODEuOTkyNiA4NS4yOTk2IDgyLjE0NDkgODUuNDcxNVoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=', | |
| 277 | 283 | 999 |
| 278 | 284 | ); |
| 279 | 285 | |
| 280 | 286 | $this->hook_suffix[] = add_submenu_page( |
| @@ -285,9 +291,9 @@ | ||
| 285 | 291 | $this->token . '-admin-ui' , |
| 286 | 292 | array($this, 'adminUi') |
| 287 | 293 | ); |
| 288 | 294 | |
| 289 | - if(Utils::is_service_enabled()) { | |
| 295 | + if(Utils::get_service()) { | |
| 290 | 296 | $this->hook_suffix[] = add_submenu_page( |
| 291 | 297 | $this->token . '-admin-ui', |
| 292 | 298 | esc_html__('Settings', 'media-cloud-sync'), |
| 293 | 299 | esc_html__('Settings', 'media-cloud-sync'), |
| @@ -307,8 +313,32 @@ | ||
| 307 | 313 | } |
| 308 | 314 | } |
| 309 | 315 | |
| 310 | 316 | /** |
| 317 | + * Admin notice when storage credentials are incomplete. | |
| 318 | + * @since 1.3.11 | |
| 319 | + */ | |
| 320 | + public function storage_credentials_admin_notice() { | |
| 321 | + if(!current_user_can('manage_options') || !Utils::get_service() || Utils::is_service_enabled()) { | |
| 322 | + return; | |
| 323 | + } | |
| 324 | + | |
| 325 | + $error = Utils::get_service_configuration_error(); | |
| 326 | + if(empty($error)) { | |
| 327 | + return; | |
| 328 | + } | |
| 329 | + | |
| 330 | + $settings_url = admin_url('admin.php?page=' . $this->token . '-admin-ui#/settings'); | |
| 331 | + $message = esc_html($error) . ' ' . sprintf( | |
| 332 | + '<a href="%1$s">%2$s</a>', | |
| 333 | + esc_url($settings_url), | |
| 334 | + esc_html__('Open Media Cloud Sync settings', 'media-cloud-sync') | |
| 335 | + ); | |
| 336 | + | |
| 337 | + echo wp_kses_post(sprintf('<div class="notice notice-error is-dismissible"><p>%s</p></div>', $message)); | |
| 338 | + } | |
| 339 | + | |
| 340 | + /** | |
| 311 | 341 | * Calling view function for admin page components |
| 312 | 342 | */ |
| 313 | 343 | public function adminUi() { |
| 314 | 344 | echo wp_kses_post(sprintf( |
| @@ -330,8 +360,12 @@ | ||
| 330 | 360 | /** |
| 331 | 361 | * Load the media assets |
| 332 | 362 | */ |
| 333 | 363 | public function load_media_assets() { |
| 364 | + if(!Utils::is_service_enabled()) { | |
| 365 | + return; | |
| 366 | + } | |
| 367 | + | |
| 334 | 368 | /** CSS */ |
| 335 | 369 | wp_enqueue_style($this->token . '-media', esc_url($this->assets_url) . 'css/media.css', array(), $this->version); |
| 336 | 370 | |
| 337 | 371 | /** JS */ |
| @@ -403,9 +437,16 @@ | ||
| 403 | 437 | <textarea name="comments" placeholder="Please specify" rows="3"></textarea> |
| 404 | 438 | <p>Need help? <a href="https://dudlewebs.com/" target="_blank">Use live chat support</a></p> |
| 405 | 439 | </div> |
| 406 | 440 | |
| 407 | - <p id="dw-wpmcs-error" class="dw-wpmcs-error"></p> | |
| 441 | + <p id="dw-wpmcs-error" class="dw-wpmcs-error"> | |
| 442 | + <svg viewBox="0 0 16 16" fill="none" aria-hidden="true"> | |
| 443 | + <path d="M8 2.2L14.6 13.3H1.4L8 2.2Z" stroke="currentColor" stroke-width="1.3" stroke-linejoin="round"/> | |
| 444 | + <path d="M8 6.7V9.7" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/> | |
| 445 | + <circle cx="8" cy="11.4" r="0.85" fill="currentColor"/> | |
| 446 | + </svg> | |
| 447 | + <span id="dw-wpmcs-error-text"></span> | |
| 448 | + </p> | |
| 408 | 449 | <div class="dw-wpmcs-actions"> |
| 409 | 450 | <button type="button" class="dw-button dw-skip" id="dw-wpmcs-skip">Skip & Deactivate</button> |
| 410 | 451 | <button type="button" class="dw-button dw-secondary" id="dw-wpmcs-cancel">Cancel</button> |
| 411 | 452 | <button type="submit" class="dw-button dw-primary" id="dw-wpmcs-deactivate">Submit & Deactivate</button> |