Enable jQuery Migrate Helper - Version 1.2.0

Version Description

Download this release

Release Info

Developer Clorith
Plugin Icon wp plugin Enable jQuery Migrate Helper
Version 1.2.0
Comparing to
See all releases

Code changes from version 1.1.0 to 1.2.0

admin/header.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin page header
4
+ */
5
+
6
+ if ( ! defined( 'ABSPATH' ) ) {
7
+ die( 'Invalid request.' );
8
+ }
9
+
10
+ $page = ( ! empty( $_GET['tab'] ) ? $_GET['tab'] : 'settings' );
11
+
12
+ ?>
13
+
14
+ <h1>jQuery Migrate</h1>
15
+
16
+ <div class="notice notice-info">
17
+ <p>
18
+ <?php _e( 'jQuery is a framework that makes creating interactive elements on your website quick and easy for theme and plugin authors.', 'enable-jquery-migrate-helper' ); ?>
19
+ </p>
20
+
21
+ <p>
22
+ <?php _e( 'Thanks to this versatility, WordPress has included a version of the jQuery library for a long time.', 'enable-jquery-migrate-helper' ); ?>
23
+ </p>
24
+
25
+ <p>
26
+ <?php _e( 'Due to the large amount of plugins and themes using the library, the version has not received any major upgrades to avoid breaking changes. This has unfortunately led to many plugins and themes just using obsolete code (even when WordPress has allowed for more modern code to be used).', 'enable-jquery-migrate-helper' ); ?>
27
+ </p>
28
+
29
+ <p>
30
+ <?php _e( 'When WordPress facilitated for, and is performing, upgrades of the version of jQuery included, some themes and plugins may stop working as expected, because their code was outdated.', 'enable-jquery-migrate-helper' ); ?>
31
+ </p>
32
+ </div>
33
+
34
+ <nav class="nav-tab-wrapper" aria-label="Secondary menu">
35
+ <a class="nav-tab <?php echo ( 'settings' === $page ? 'nav-tab-active' : '' ); ?>" href="<?php echo esc_url( admin_url( 'tools.php?page=jqmh' ) ); ?>"><?php _e( 'Settings', 'enable-jquery-migrate-helper' ); ?></a>
36
+ <a class="nav-tab <?php echo ( 'logs' === $page ? 'nav-tab-active' : '' ); ?>" href="<?php echo esc_url( admin_url( 'tools.php?page=jqmh&tab=logs' ) ); ?>"><?php _e( 'Logged deprecations', 'enable-jquery-migrate-helper' ); ?></a>
37
+ </nav>
38
+
39
+ <?php
40
+ switch ( $page ) {
41
+ case 'logs':
42
+ include_once __DIR__ . '/logs.php';
43
+ break;
44
+ case 'settings':
45
+ default:
46
+ include_once __DIR__ . '/settings.php';
47
+ }
admin/logs.php ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin logs page.
4
+ */
5
+
6
+ if ( ! defined( 'ABSPATH' ) ) {
7
+ die( 'Invalid request.' );
8
+ }
9
+
10
+ if ( ! function_exists( 'get_plugins' ) ) {
11
+ require_once trailingslashit( ABSPATH ) . 'wp-admin/includes/plugin.php';
12
+ }
13
+
14
+ $plugins = array();
15
+
16
+ foreach ( get_plugins() as $slug => $plugin ) {
17
+ $slug = explode( '/', $slug );
18
+ $plugins[ $slug[0] ] = $plugin;
19
+ }
20
+
21
+ $themes = wp_get_themes();
22
+
23
+ $logs = get_option( 'jqmh_logs', array() );
24
+ ?>
25
+
26
+ <h2>Logs</h2>
27
+
28
+ <div class="notice notice-info inline">
29
+ <p>
30
+ <?php _e( 'The following are deprecations logged from the front-end of your site, or while live deprecation notices were disabled in the admin area.', 'enable-jquery-migrate-helper' ); ?>
31
+ </p>
32
+ </div>
33
+
34
+ <div style="text-align:right;">
35
+ <button type="button" class="button jqmh-clear-deprecation-notices button-default"><?php _e( 'Clear logs', 'enable-jquery-migrate-helper' ); ?></button>
36
+ </div>
37
+
38
+ <table class="widefat striped">
39
+ <thead>
40
+ <tr>
41
+ <th><?php _ex( 'Time', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
42
+ <th><?php _ex( 'Notice', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
43
+ <th><?php _ex( 'Plugin or theme', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
44
+ <th><?php _ex( 'File location', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
45
+ <th><?php _ex( 'Triggered on page', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
46
+ </tr>
47
+ </thead>
48
+
49
+ <tbody id="jqmh-logged-notices">
50
+ <?php if ( empty( $logs ) ) : ?>
51
+ <tr>
52
+ <td colspan="5">
53
+ <?php _e( 'No deprecations have been logged', 'enable-jquery-migrate-helper' ); ?>
54
+ </td>
55
+ </tr>
56
+ <?php endif; ?>
57
+
58
+ <?php
59
+ foreach ( $logs as $log ) :
60
+
61
+ preg_match( '/\/plugins\/(?P<slug>.+?)\/.+?: (?P<notice>.+)/', $log['notice'], $plugin );
62
+ preg_match( '/\/themes\/(?P<slug>.+?)\/.+?: (?P<notice>.+)/', $log['notice'], $theme );
63
+
64
+ $notice = $log['notice'];
65
+ $source = __( 'Undetermined', 'enable-jquery-migrate-helper' );
66
+ $file = __( 'Inline code, unknown file location', 'enable-jquery-migrate-helper' );
67
+
68
+ if ( ! empty( $plugin ) ) {
69
+ preg_match( '/(?P<path>https?:\/\/.+?):/', $log['notice'], $file );
70
+ $file = $file['path'];
71
+
72
+ $plugin_link = '#';
73
+
74
+ if ( isset( $plugins[ $plugin['slug'] ] ) ) {
75
+ $plugin_link = ( isset( $plugins[ $plugin['slug'] ]['PluginURI'] ) ? $plugins[ $plugin['slug'] ]['PluginURI'] : $plugins[ $plugin['slug'] ]['AuthorURI'] );
76
+ }
77
+
78
+ $notice = $plugin['notice'];
79
+ $source = sprintf(
80
+ // translators: 1: Linked name of the plugin throwing notices.
81
+ __( 'Plugin: %s', 'enable-jquery-migrate-helper' ),
82
+ sprintf(
83
+ '<a href="%s">%s</a>',
84
+ esc_url( $plugin_link ),
85
+ esc_html( ( isset( $plugins[ $plugin['slug'] ] ) ? $plugins[ $plugin['slug'] ]['Name'] : $plugin['slug'] ) )
86
+ )
87
+ );
88
+ } elseif ( ! empty( $theme ) ) {
89
+ preg_match( '/(?P<path>https?:\/\/.+?):/', $log['notice'], $file );
90
+ $file = $file['path'];
91
+
92
+ $theme_link = '#';
93
+
94
+ if ( isset( $themes[ $theme['slug'] ] ) ) {
95
+ $theme_link = $themes[ $theme['slug'] ]->get( 'ThemeURI' );
96
+ }
97
+
98
+ $notice = $theme['notice'];
99
+ $source = sprintf(
100
+ // translators: 1: Linked name of the theme throwing notices.
101
+ __( 'Theme: %s', 'enable-jquery-migrate-helper' ),
102
+ sprintf(
103
+ '<a href="%s">%s</a>',
104
+ esc_url( $theme_link ),
105
+ esc_html( ( isset( $themes[ $theme['slug'] ] ) ? $themes[ $theme['slug'] ]->get( 'Name' ) : $theme['slug'] ) )
106
+ )
107
+ );
108
+ }
109
+
110
+ ?>
111
+
112
+ <tr>
113
+ <td><?php echo esc_html( $log['registered'] ); ?></td>
114
+ <td><?php echo esc_html( $notice ); ?></td>
115
+ <td><?php echo $source; ?></td>
116
+ <td><?php echo esc_html( $file ); ?></td>
117
+ <td><?php echo esc_html( $log['page'] ); ?></td>
118
+ </tr>
119
+
120
+ <?php endforeach; ?>
121
+ </tbody>
122
+
123
+ <tfoot>
124
+ <tr>
125
+ <th><?php _ex( 'Time', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
126
+ <th><?php _ex( 'Notice', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
127
+ <th><?php _ex( 'Plugin or theme', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
128
+ <th><?php _ex( 'File location', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
129
+ <th><?php _ex( 'Page', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
130
+ </tr>
131
+ </tfoot>
132
+ </table>
133
+
134
+ <div style="text-align:right;">
135
+ <button type="button" class="button jqmh-clear-deprecation-notices button-default"><?php _e( 'Clear logs', 'enable-jquery-migrate-helper' ); ?></button>
136
+ </div>
137
+
138
+ <script type="text/javascript">
139
+ var i = 0,
140
+ clear_nonce = '<?php echo esc_js( wp_create_nonce( 'jquery-migrate-previous-deprecations' ) ); ?>',
141
+ clear_buttons = document.getElementsByClassName( 'jqmh-clear-deprecation-notices' );
142
+
143
+ for ( i = 0; i < clear_buttons.length; i++ ) {
144
+ clear_buttons[ i ].addEventListener( 'click', function() {
145
+ var o,
146
+ xhr = new XMLHttpRequest(),
147
+ displays = document.getElementsByClassName( 'jqmh-deprecations' );
148
+
149
+ xhr.open( 'POST', '<?php echo esc_js( admin_url( 'admin-ajax.php' ) ); ?>' );
150
+ xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
151
+ xhr.onload = function () {};
152
+
153
+ xhr.send( encodeURI( 'action=jquery-migrate-dismiss-notice&notice=jquery-migrate-previous-deprecations&dismiss-notice-nonce=' + clear_nonce ) );
154
+
155
+ for ( o = 0; o < displays.length; o++ ) {
156
+ displays[ o ].parentNode.removeChild( displays[ o ] );
157
+ }
158
+
159
+ document.getElementById( 'jqmh-logged-notices' ).innerText = '';
160
+
161
+ } );
162
+ }
163
+ </script>
admin/settings.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin settings page.
4
+ */
5
+
6
+ if ( ! defined( 'ABSPATH' ) ) {
7
+ die( 'Invalid request.' );
8
+ }
9
+
10
+ $downgraded = get_option( '_jquery_migrate_downgrade_version', 'no' );
11
+ $show_deprecations = jQuery_Migrate_Helper::show_deprecated_scripts_notice();
12
+ $public_deprecations = get_option( '_jquery_migrate_public_deprecation_logging', 'no' );
13
+ $log_modern_deprecations = get_option( '_jquery_migrate_modern_deprecations', 'no' );
14
+ ?>
15
+
16
+ <h2>Settings</h2>
17
+
18
+ <form method="post" action="">
19
+ <input type="hidden" name="jqmh-settings" value="true">
20
+ <?php wp_nonce_field( 'jqmh-settings' ); ?>
21
+
22
+ <table class="form-table" role="presentation">
23
+ <tr>
24
+ <th scope="row">
25
+ <label for="jquery-version">
26
+ <?php _e( 'jQuery Version', 'enable-jquery-migrate-helper' ); ?>
27
+ </label>
28
+ </th>
29
+ <td>
30
+ <select name="jquery-version" id="jquery-version" <?php echo ( ! is_wp_version_compatible( '5.6-alpha' ) ? 'disabled="disabled"' : '' ); ?>>
31
+ <option value="no" <?php echo ( 'no' === $downgraded ? 'selected="selected"' : '' ); ?>><?php _ex( 'Default from WordPress', 'jQuery version', 'enable-jquery-migrate-helper' ); ?></option>
32
+ <option value="yes" <?php echo ( 'yes' === $downgraded ? 'selected="selected"' : '' ); ?>><?php _ex( 'Legacy 1.12.4-wp', 'jQuery version', 'enable-jquery-migrate-helper' ); ?></option>
33
+ </select>
34
+ <?php if ( ! is_wp_version_compatible( '5.6-alpha' ) ) : ?>
35
+ <p class="description">
36
+ <?php _e( 'You can only change jQuery versions in WordPress 5.6 or later', 'enable-jquery-migrate-helper' ); ?>
37
+ </p>
38
+ <?php endif; ?>
39
+ </td>
40
+ </tr>
41
+
42
+ <tr>
43
+ <th scope="row">
44
+ <?php _e( 'Live deprecations', 'enable-jquery-migrate-helper' ); ?>
45
+ </th>
46
+ <td>
47
+ <label>
48
+ <input name="live-deprecations" type="checkbox" <?php checked( $show_deprecations ); ?>>
49
+ <?php _e( 'Show deprecation notices, on each admin page, as they happen', 'enable-jquery-migrate-helper' ); ?>
50
+ </label>
51
+ </td>
52
+ </tr>
53
+
54
+ <?php if ( 'no' === $downgraded && is_wp_version_compatible( '5.6-alpha' ) ) : ?>
55
+ <tr>
56
+ <th scope="row">
57
+ <?php _e( 'Capture modern deprecations', 'enable-jquery-migrate-helper' ); ?>
58
+ </th>
59
+ <td>
60
+ <label>
61
+ <input name="modern-deprecations" type="checkbox" <?php checked( 'yes' === $log_modern_deprecations ); ?>>
62
+ <?php _e( 'Detect and log deprecations in the default WordPress version of jQuery', 'enable-jquery-migrate-helper' ); ?>
63
+ </label>
64
+ <p class="description">
65
+ <?php _e( 'This may report many entries from WordPress it self. This is expected, as WordPress continues to update its own code in the upcoming releases.', 'enable-jquery-migrate-helper' ); ?>
66
+ </p>
67
+ </td>
68
+ </tr>
69
+ <?php endif; ?>
70
+
71
+ <tr>
72
+ <th scope="row">
73
+ <?php _e( 'Public deprecation logging' ); ?>
74
+ </th>
75
+ <td>
76
+ <label>
77
+ <input name="public-deprecation-logging" type="checkbox" <?php checked( 'yes' === $public_deprecations ); ?>>
78
+ <?php _e( 'Log deprecations caused by anonymous users browsing your website', 'enable-jquery-migrate-helper' ); ?>
79
+ </label>
80
+ <p class="description">
81
+ <?php _e( 'Caution: This option may lead to more deprecations being discovered, but will also increase the amount of database entries. Use sparingly and under supervision.', 'enable-jquery-migrate-helper' ); ?>
82
+ </p>
83
+ </td>
84
+ </tr>
85
+ </table>
86
+
87
+ <?php submit_button( __( 'Save settings', 'enable-jquery-migrate-helper' ) ); ?>
88
+ </form>
class-jquery-migrate-helper.php CHANGED
@@ -13,12 +13,21 @@ class jQuery_Migrate_Helper {
13
  private function __construct() {}
14
 
15
  public static function init_actions() {
16
- // To be able to replace the src, scripts should not be concatenated.
17
- if ( ! defined( 'CONCATENATE_SCRIPTS' ) ) {
18
- define( 'CONCATENATE_SCRIPTS', false );
19
- }
20
 
21
- $GLOBALS['concatenate_scripts'] = false;
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
  add_action( 'wp_default_scripts', array( __CLASS__, 'replace_scripts' ), -1 );
24
 
@@ -29,12 +38,278 @@ class jQuery_Migrate_Helper {
29
  add_action( 'admin_print_footer_scripts', array( __CLASS__, 'print_scripts' ), 100 );
30
  add_action( 'wp_enqueue_scripts', array( __CLASS__, 'enqueue_scripts_frontend' ), 100 );
31
 
 
 
 
32
  add_action( 'admin_bar_menu', array( __CLASS__, 'admin_bar_menu' ), 100 );
33
- add_action( 'init', array( __CLASS__, 'maybe_show_admin_notices' ) );
 
34
 
35
  add_action( 'admin_notices', array( __CLASS__, 'admin_notices' ) );
36
  add_action( 'wp_ajax_jquery-migrate-dismiss-notice', array( __CLASS__, 'admin_notices_dismiss' ) );
37
  add_action( 'wp_ajax_jquery-migrate-log-notice', array( __CLASS__, 'log_migrate_notice' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  }
39
 
40
  // Pre-register scripts on 'wp_default_scripts' action, they won't be overwritten by $wp_scripts->add().
@@ -66,31 +341,41 @@ class jQuery_Migrate_Helper {
66
  /*
67
  * Enqueue jQuery migrate, and force it to be the development version.
68
  *
69
- * This will ensure that console errors are generated, and we can surface these to the
70
  * end user in a responsible manner so that they can update their plugins and theme,
71
  * or make a decision to switch to other plugin/theme if no updates are available.
72
  */
73
  public static function replace_scripts( $scripts ) {
74
  $assets_url = plugins_url( 'js/', __FILE__ );
75
 
76
- self::set_script( $scripts, 'jquery-migrate', $assets_url . 'jquery-migrate-1.4.1-wp.js', array(), '1.4.1-wp' );
77
- self::set_script( $scripts, 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.12.4-wp' );
 
 
 
 
 
 
 
 
78
  }
79
 
80
  /**
81
  * Register the deprecation notice capture handler script.
82
  */
83
  public static function register_scripts() {
84
- wp_register_script( 'jquery-migrate-deprecation-notices', plugins_url( 'js/deprecation-notice.js', __FILE__ ), array( 'jquery' ), false, true );
85
 
86
  wp_localize_script(
87
  'jquery-migrate-deprecation-notices',
88
  'JQMH',
89
  array(
90
- 'ajaxurl' => admin_url( 'admin-ajax.php' ),
91
- 'report_nonce' => wp_create_nonce( 'jquery-migrate-report-deprecation' ),
92
- 'backend' => is_admin(),
93
- 'plugin_slug' => dirname( plugin_basename( __FILE__ ) ),
 
 
94
  )
95
  );
96
  }
@@ -103,13 +388,13 @@ class jQuery_Migrate_Helper {
103
  }
104
 
105
  public static function enqueue_scripts_frontend() {
106
- // Only load the asset for users who can act on them.
107
- if ( ! current_user_can( 'manage_options' ) ) {
108
- return;
109
- }
110
 
111
- wp_enqueue_script( 'jquery-migrate-deprecation-notices' );
112
- }
113
 
114
  /**
115
  * HTML for jQuery Migrate deprecated notices.
@@ -125,120 +410,23 @@ class jQuery_Migrate_Helper {
125
  if ( ! self::show_deprecated_scripts_notice() ) {
126
  return;
127
  }
128
- ?>
129
-
130
- <div class="notice notice-error is-dismissible jquery-migrate-dashboard-notice jquery-migrate-deprecation-notice <?php echo ( empty( $logs ) ? 'hidden' : '' ); ?>" data-notice-id="jquery-migrate-deprecation-list">
131
- <h2><?php _ex( 'jQuery Migrate Helper', 'Admin notice header', 'enable-jquery-migrate-helper' ); ?> &mdash; <?php _ex( 'Warnings encountered', 'enable-jquery-migrate-helper' ); ?></h2>
132
- <p><?php _e( 'This page generated the following warnings:', 'enable-jquery-migrate-helper' ); ?></p>
133
-
134
- <ol class="jquery-migrate-deprecation-list"></ol>
135
 
136
- <p>
137
- <?php _e( 'Please make sure you are using the latest version of all of your plugins, and your theme.', 'enable-jquery-migrate-helper' ); ?>
138
- <?php _e( 'If you are, you may want to ask the developers of the code mentioned in the warnings for an update.', 'enable-jquery-migrate-helper' ); ?>
139
- </p>
140
-
141
- <?php wp_nonce_field( 'jquery-migrate-deprecation-list', 'jquery-migrate-deprecation-list-nonce', false ); ?>
142
- </div>
143
-
144
- <?php
145
  }
146
 
147
  public static function show_deprecated_scripts_notice() {
148
  return false === get_option( '_jquery_migrate_deprecations_dismissed_notice', false );
149
  }
150
 
151
- public static function previous_deprecation_notices() {
152
- if ( ! isset( $_GET['show-jqmh-previous-notices'] ) ) {
153
- return;
154
- }
155
-
156
- $logs = get_option( 'jqmh_logs', array() );
157
- ?>
158
- <div class="notice notice-error is-dismissible jquery-migrate-dashboard-notice jquery-migrate-previous-deprecations" data-notice-id="jquery-migrate-previous-deprecations">
159
- <h2><?php _e( 'Previously logged deprecation notices', 'enable-jquery-migrate-helper' ); ?></h2>
160
-
161
- <p>
162
- <?php _e( 'The following are deprecations logged from the front-end of your site, or while the deprecation box was disabled.', 'enable-jquery-migrate-helper' ); ?>
163
- </p>
164
-
165
- <table class="widefat striped">
166
- <thead>
167
- <tr>
168
- <th><?php _ex( 'Time', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
169
- <th><?php _ex( 'Notice', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
170
- <th><?php _ex( 'Page', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
171
- </tr>
172
- </thead>
173
-
174
- <tbody>
175
- <?php if ( empty( $logs ) ) : ?>
176
- <tr>
177
- <td colspan="3">
178
- <?php _e( 'No deprecations have been logged', 'enable-jquery-migrate-helper' ); ?>
179
- </td>
180
- </tr>
181
- <?php endif; ?>
182
-
183
- <?php foreach ( $logs as $log ) : ?>
184
-
185
- <tr>
186
- <td><?php echo esc_html( $log['registered'] ); ?></td>
187
- <td><?php echo esc_html( $log['notice'] ); ?></td>
188
- <td><?php echo esc_html( $log['page'] ); ?></td>
189
- </tr>
190
-
191
- <?php endforeach; ?>
192
- </tbody>
193
-
194
- <tfoot>
195
- <tr>
196
- <th><?php _ex( 'Time', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
197
- <th><?php _ex( 'Notice', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
198
- <th><?php _ex( 'Page', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
199
- </tr>
200
- </tfoot>
201
- </table>
202
-
203
- <?php wp_nonce_field( 'jquery-migrate-previous-deprecations', 'jquery-migrate-previous-deprecations-nonce', false ); ?>
204
-
205
- <p></p>
206
- </div>
207
-
208
- <?php
209
- }
210
-
211
  /**
212
  * HTML for the Dashboard notice.
213
  */
214
  public static function dashboard_notice() {
215
- if ( ! self::show_dashboard_notice() ) {
216
- return;
217
- }
218
- ?>
219
-
220
- <div class="notice notice-warning is-dismissible jquery-migrate-dashboard-notice" data-notice-id="jquery-migrate-notice">
221
- <h2><?php _ex( 'jQuery Migrate Helper', 'Admin notice header', 'enable-jquery-migrate-helper' ); ?></h2>
222
- <p>
223
- <?php _e( 'Right now you are using the Enable jQuery Migrate Helper plugin to enable support for old JavaScript code that uses deprecated functions in the jQuery JavaScript library.', 'enable-jquery-migrate-helper' ); ?>
224
- <br>
225
- <strong>
226
- <?php _e( 'Please note that this is a temporary solution which will only work between WordPress 5.5.0 and 5.6.0 is, and is not meant as a permanent fix for unsupported code.', 'enable-jquery-migrate-helper' ); ?>
227
- </strong>
228
- </p>
229
-
230
- <p>
231
- <?php _e( 'If you get warnings, you should check the theme or plugin that generated them for an update. There will very likely be one you can install.', 'enable-jquery-migrate-helper' ); ?>
232
- <?php _e( 'When you have updated your plugins and themes, and there are no more warnings, please deactivate Enable jQuery Migrate Helper.', 'enable-jquery-migrate-helper' ); ?>
233
- </p>
234
-
235
- <p>
236
- <?php _e( '* A script, a file, or some other piece of code is deprecated when its developers are in the process of replacing it with more modern code or removing it entirely.', 'enable-jquery-migrate-helper' ); ?>
237
- </p>
238
- <?php wp_nonce_field( 'jquery-migrate-notice', 'jquery-migrate-notice-nonce', false ); ?>
239
- </div>
240
 
241
- <?php
242
  }
243
 
244
  public static function show_dashboard_notice() {
@@ -246,6 +434,20 @@ class jQuery_Migrate_Helper {
246
  $is_dismissed = get_option( '_jquery_migrate_dismissed_notice', false );
247
  $recurrence = 1 * WEEK_IN_SECONDS;
248
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
249
  // If the message has been dismissed, and it has been less than two weeks since it was seen,
250
  // then skip showing the admin notice for now.
251
  if ( false !== $is_dismissed && $is_dismissed > ( time() - $recurrence ) ) {
@@ -257,97 +459,63 @@ class jQuery_Migrate_Helper {
257
 
258
  /**
259
  * Display a dashboard notice if no deprecations have been logged in a while.
260
- *
261
- * This encourages users to remove the plugin when no longer needed, this will help gauge the jQuery
262
- * migrations, and also remove the potential false-positive reports of jQuery issues caused by
263
- * an unrelated core bug fixed in WordPress 5.5.1 that inflates the plugin numbers.
264
  */
265
  public static function plugin_obsolete_message() {
266
  $last_log = get_option( 'jqmh_last_log_time', null );
267
  $recurrence = 1 * WEEK_IN_SECONDS;
268
 
269
  /*
270
- * If no log time is recorded, this is likely a recently updated plugin, so set the value to now,
271
- * to give a buffer, and avoid showing the notice when we have no data telling if its needed or not.
272
  */
273
- if ( null === $last_log || self::logged_migration_notice_count() > 0 ) {
274
  update_option( 'jqmh_last_log_time', time() );
275
  return;
276
  }
277
 
278
  if ( $last_log > ( time() - $recurrence ) ) {
279
- return;
280
  }
281
- ?>
282
-
283
- <div class="notice notice-warning is-dismissible jquery-migrate-dashboard-notice" data-notice-id="jquery-migrate-no-deprecations-notice">
284
- <h2><?php _ex( 'jQuery Migrate Helper', 'Admin notice header', 'enable-jquery-migrate-helper' ); ?></h2>
285
-
286
- <p>
287
- <?php _e( 'No deprecations have been logged on this site in a while, you may no longer need this plugins.', 'enable-jquery-migrate-helper' ); ?>
288
- </p>
289
-
290
- <p>
291
- <?php _e( 'Please keep in mind that only notices on the public facing part of yoru site, or if you have disabled the display on the back end, will be logged and accounted for.', 'enable-jquery-migrate-helper' ); ?>
292
- </p>
293
-
294
- <p>
295
- <?php _e( 'This means you should still check that things work as expected after the plugin is disabled, and if you know there have been warnings in the admin pages, you may still need to reach out to the plugin or theme authors affected.', 'enable-jquery-migrate-helper' ); ?>
296
- </p>
297
-
298
- <?php if ( is_wp_version_compatible( '5.5.1' ) ) : ?>
299
 
300
- <p>
301
- <strong>
302
- <?php _e( 'You are using a WordPress version prior to 5.5.1, this plugin also helps with a bug found in WordPress 5.5.0, you should update to version 5.5.1, or later, before the plugin is deactivated.', 'enable-jquery-migarte-helper' ); ?>
303
- </strong>
304
- </p>
305
-
306
- <?php endif; ?>
307
-
308
- <?php wp_nonce_field( 'jquery-migrate-no-deprecations-notice', 'jquery-migrate-no-deprecations-notice-nonce', false ); ?>
309
- </div>
310
-
311
- <?php
312
  }
313
 
314
  public static function admin_notices() {
315
  // Show only to admins.
316
- if ( ! current_user_can( 'update_plugins' ) ) {
317
  return;
318
  }
319
 
320
- if ( get_current_screen()->id === 'dashboard' ) {
321
- self::dashboard_notice();
322
-
323
- self::previous_deprecation_notices();
324
-
325
- self::plugin_obsolete_message();
326
- }
327
 
328
  self::deprecated_scripts_notice();
329
  }
330
 
331
  public static function log_migrate_notice() {
332
- if ( ! current_user_can( 'manage_options' ) ) {
333
  status_header( 403 );
334
  die();
335
  }
336
 
337
  if ( ! wp_verify_nonce( $_POST['nonce'], 'jquery-migrate-report-deprecation' ) ) {
338
- status_header( 406, 'Invalid nonce' );
339
- die();
340
  }
341
 
342
  $required_fields = array(
343
- 'notice',
344
- );
345
 
346
  foreach ( $required_fields as $required_field ) {
347
- if ( ! isset( $_POST[ $required_field ] ) ) {
348
- status_header( 400, 'Missing required fields' );
349
- die();
350
- }
351
  }
352
 
353
  $logs = get_option( 'jqmh_logs', array() );
@@ -360,41 +528,37 @@ class jQuery_Migrate_Helper {
360
  * Creating a hash of the deprecation data lets us ensure it is only reported once, to avoid
361
  * filling the database with duplicates on busy sites.
362
  */
363
- $deprecation_hash = md5( wp_json_encode( $deprecation_data ) );
364
 
365
- if ( ! isset( $logs[ $deprecation_hash ] ) ) {
366
- $logs[ $deprecation_hash ] = array_merge( array(
367
- 'registered' => date_i18n( 'Y-m-d H:i:s' ),
368
- 'page' => ( isset( $_POST['url'] ) ? esc_url_raw( $_POST['url'] ) : '' ),
369
- 'backend' => isset( $_POST['backend'] ) && $_POST['backend'],
370
- ), $deprecation_data );
371
 
372
- update_option( 'jqmh_logs', $logs );
373
- update_option( 'jqmh_last_log_time', time() );
374
- }
375
 
376
- wp_send_json_success();
377
  }
378
 
379
  /**
380
- * Check if any errors have been logged to the database.
381
- *
382
  * @return int|null
383
  */
384
  public static function logged_migration_notice_count() {
385
- if ( ! current_user_can( 'manage_options' ) ) {
386
- return null;
387
- }
388
-
389
- $logs = get_option( 'jqmh_logs', array() );
390
 
391
- return count( $logs );
392
  }
393
 
394
  /**
395
  * Handle ajax requests to dismiss a notice, and remember the dismissal.
396
- *
397
- * @return void
398
  */
399
  public static function admin_notices_dismiss() {
400
  if ( empty( $_POST['dismiss-notice-nonce'] ) || ! current_user_can( 'manage_options' ) ) {
@@ -405,32 +569,32 @@ class jQuery_Migrate_Helper {
405
  return;
406
  }
407
 
408
- switch( $_POST['notice'] ) {
409
- case 'jquery-migrate-deprecation-list':
410
- update_option( '_jquery_migrate_deprecations_dismissed_notice', time() );
411
- break;
412
 
413
- case 'jquery-migrate-previous-deprecations':
414
- delete_option( 'jqmh_logs' );
415
- break;
416
 
417
- case 'jquery-migrate-notice':
418
- update_option( '_jquery_migrate_dismissed_notice', time() );
419
- break;
420
 
421
- case 'jquery-migrate-no-deprecations-notice':
422
- update_option( 'jqmh_last_log_time', time() );
423
- break;
424
  }
425
  }
426
 
427
  /**
428
- * Add this plugin to the admin bar as a menu item.
429
- *
430
- * This entry allows users to re-surface previously hidden notices from the plugin,
431
- * and also allows for alerting of issues detected in the frontend, where injecting
432
- * any notice isn't as elegant.
433
- *
434
  * @param $wp_menu
435
  */
436
  public static function admin_bar_menu( $wp_menu ) {
@@ -445,76 +609,96 @@ class jQuery_Migrate_Helper {
445
  array(
446
  'id' => 'enable-jquery-migrate-helper',
447
  'title' => sprintf(
448
- // translators: %s: Parenthesis with issue count.
449
  __( 'jQuery Migrate %s', 'enable-jquery-migrate-helper' ),
450
- sprintf(
451
- '<span class="count-wrapper" style="' . ( $deprecation_count > 0 ? '' : 'display:none;' ) . '">%s</span>',
452
- sprintf(
453
- // translators: 1: The amount of existing issues. 2: Issues discovered on the currently loaded page.
454
- __( '(Previously known: %1$d Discovered on this page: %2$s)', 'enable-jquery-migrate-helper' ),
455
- $deprecation_count,
456
- sprintf(
457
- '<span class="count">%d</span>',
458
- 0
459
- )
460
- )
461
- )
462
- ),
463
  'href' => '#',
464
  )
465
  );
466
 
467
- if ( ! self::show_deprecated_scripts_notice() ) {
468
- $wp_menu->add_node(
469
- array(
470
- 'id' => 'enable-jquery-migrate-helper-show-deprecations',
471
- 'title' => __( 'Display live deprecation notices', 'enable-jquery-migrate-helper' ),
472
- 'parent' => 'enable-jquery-migrate-helper',
473
- 'href' => get_admin_url( null, '?show-jqmh-deprecations' ),
474
- )
475
- );
476
- }
477
-
478
- if ( ! self::show_dashboard_notice() ) {
479
- $wp_menu->add_node(
480
- array(
481
- 'id' => 'enable-jquery-migrate-helper-show-notices',
482
- 'title' => __( 'Display plugin information notice', 'enable-jquery-migrate-helper' ),
483
- 'parent' => 'enable-jquery-migrate-helper',
484
- 'href' => get_admin_url( null, '?show-jqmh-notice' ),
485
- )
486
- );
487
- }
488
-
489
  $wp_menu->add_node(
490
- array(
491
- 'id' => 'enable-jquery-migrate-helper-show-previous-deprecations',
492
- 'title' => __( 'Show a list of logged deprecations', 'enable-jquery-migrate-helper' ),
493
  'parent' => 'enable-jquery-migrate-helper',
494
- 'href' => get_admin_url( null, '?show-jqmh-previous-notices' ),
495
- )
496
- );
 
 
 
 
 
 
 
 
 
497
  }
498
 
499
- public static function maybe_show_admin_notices() {
500
- if ( ! is_admin() || ! current_user_can( 'manage_options' ) ) {
501
- return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
502
  }
503
 
504
- if ( isset( $_GET['show-jqmh-deprecations'] ) ) {
505
- delete_option( '_jquery_migrate_deprecations_dismissed_notice' );
506
 
507
- add_action( 'admin_notices', function() {
508
- ?>
509
- <div class="notice notice-success is-dismissible">
510
- <?php _e( 'Live deprecation notices for jQuery Migrate have been enabled, they will show up in the admin interface when a notice is discovered.', 'enable-jquery-migrate-helper' ); ?>
511
- </div>
512
- <?php
513
- } );
514
  }
515
 
516
- if ( isset( $_GET['show-jqmh-notice'] ) ) {
517
- delete_option( '_jquery_migrate_dismissed_notice' );
518
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
519
  }
520
  }
13
  private function __construct() {}
14
 
15
  public static function init_actions() {
16
+ $public_deprecations = get_option( '_jquery_migrate_public_deprecation_logging', 'no' );
 
 
 
17
 
18
+ /*
19
+ * To be able to replace the src, scripts should not be concatenated.
20
+ *
21
+ * Concatenation is only forcefully disabled if the user is logged in, or public deprecation logging
22
+ * has been enabled, to reduce the performance impact of the plugin.
23
+ */
24
+ if ( is_user_logged_in() || 'yes' === $public_deprecations ) {
25
+ if ( ! defined( 'CONCATENATE_SCRIPTS' ) ) {
26
+ define( 'CONCATENATE_SCRIPTS', false );
27
+ }
28
+
29
+ $GLOBALS['concatenate_scripts'] = false;
30
+ }
31
 
32
  add_action( 'wp_default_scripts', array( __CLASS__, 'replace_scripts' ), -1 );
33
 
38
  add_action( 'admin_print_footer_scripts', array( __CLASS__, 'print_scripts' ), 100 );
39
  add_action( 'wp_enqueue_scripts', array( __CLASS__, 'enqueue_scripts_frontend' ), 100 );
40
 
41
+ add_action( 'admin_menu', array( __CLASS__, 'admin_menu' ) );
42
+ add_action( '_admin_menu', array( __CLASS__, 'append_tools_menu_counter' ) );
43
+ add_action( '_user_admin_menu', array( __CLASS__, 'append_tools_menu_counter' ) );
44
  add_action( 'admin_bar_menu', array( __CLASS__, 'admin_bar_menu' ), 100 );
45
+
46
+ add_action( 'admin_init', array( __CLASS__, 'admin_settings' ) );
47
 
48
  add_action( 'admin_notices', array( __CLASS__, 'admin_notices' ) );
49
  add_action( 'wp_ajax_jquery-migrate-dismiss-notice', array( __CLASS__, 'admin_notices_dismiss' ) );
50
  add_action( 'wp_ajax_jquery-migrate-log-notice', array( __CLASS__, 'log_migrate_notice' ) );
51
+ add_action( 'wp_ajax_nopriv_jquery-migrate-log-notice', array( __CLASS__, 'log_migrate_notice' ) );
52
+
53
+ add_action( 'wp_ajax_jquery-migrate-downgrade-version', array( __CLASS__, 'downgrade_jquery_version' ) );
54
+
55
+ add_action( 'wp_head', array( __CLASS__, 'fatal_error_handler' ) );
56
+ add_action( 'admin_head', array( __CLASS__, 'fatal_error_handler' ) );
57
+
58
+ add_filter( 'site_status_tests', array( __CLASS__, 'site_health_check' ) );
59
+
60
+ // Set up our scheduled weekly notification.
61
+ if ( ! wp_next_scheduled( 'enable_jquery_migrate_helper_notification' ) && ! wp_installing() ) {
62
+ wp_schedule_event( time() + DAY_IN_SECONDS, 'weekly', 'enable_jquery_migrate_helper_notification' );
63
+ }
64
+ add_action( 'enable_jquery_migrate_helper_notification', array( __CLASS__, 'scheduled_event_handler' ) );
65
+ }
66
+
67
+ /**
68
+ * Run the scheduled event ot send an email summary to the site admin.
69
+ */
70
+ public static function scheduled_event_handler() {
71
+ self::send_message( 'weekly' );
72
+ }
73
+
74
+ /**
75
+ * Appends the count of migration notices to the `Tools` menu item.
76
+ *
77
+ * This is done to indicate that a submenu item has actionable content.
78
+ *
79
+ * @global array $menu
80
+ */
81
+ public static function append_tools_menu_counter() {
82
+ global $menu;
83
+
84
+ $count = self::logged_migration_notice_count();
85
+
86
+ // Don't add extra markup if not needed.
87
+ if ( $count < 1 ) {
88
+ return;
89
+ }
90
+
91
+ // Menu position 75 is the Tools menu.
92
+ $menu[75][0] .= sprintf(
93
+ ' <span class="update-plugins jqmh-deprecations count-%1$d"><span class="plugin-count">%1$d</span></span>',
94
+ self::logged_migration_notice_count()
95
+ );
96
+ }
97
+
98
+ /**
99
+ * Add the jQuery Migrate plugin to the Tools sub-menu.
100
+ */
101
+ public static function admin_menu() {
102
+ add_submenu_page(
103
+ 'tools.php',
104
+ __( 'jQuery Migrate', 'enable-jquery-migrate-helper' ),
105
+ sprintf(
106
+ '%1$s <span class="update-plugins jqmh-deprecations count-%2$d"><span class="plugin-count">%2$d</span></span>',
107
+ __( 'jQuery Migrate', 'enable-jquery-migrate-helper' ),
108
+ self::logged_migration_notice_count()
109
+ ),
110
+ 'manage_options',
111
+ 'jqmh',
112
+ array( __CLASS__, 'admin_page' )
113
+ );
114
+ }
115
+
116
+ /**
117
+ * Render the plugin tools page.
118
+ */
119
+ public static function admin_page() {
120
+ echo '<div class="wrap">';
121
+
122
+ include_once __DIR__ . '/admin/header.php';
123
+
124
+ echo '</div>';
125
+ }
126
+
127
+ /**
128
+ * Settings page save handler.
129
+ */
130
+ public static function admin_settings() {
131
+ if ( ! isset( $_POST['jqmh-settings'] ) || ! current_user_can( 'manage_options' ) ) {
132
+ return;
133
+ }
134
+
135
+ if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'jqmh-settings' ) ) {
136
+ return;
137
+ }
138
+
139
+ $previous_downgrade = get_option( '_jquery_migrate_downgrade_version', 'no' );
140
+
141
+ if ( isset( $_POST['live-deprecations'] ) ) {
142
+ delete_option( '_jquery_migrate_deprecations_dismissed_notice' );
143
+ } else {
144
+ update_option( '_jquery_migrate_deprecations_dismissed_notice', time() );
145
+ }
146
+
147
+ if ( ! empty( $_POST['jquery-version'] ) && 'yes' === $_POST['jquery-version'] ) {
148
+ update_option( '_jquery_migrate_downgrade_version', 'yes' );
149
+ } else {
150
+ update_option( '_jquery_migrate_downgrade_version', 'no' );
151
+
152
+ // Disable logging by default when enabling modern jQuery versions.
153
+ if ( 'yes' === $previous_downgrade ) {
154
+ update_option( '_jquery_migrate_modern_deprecations', 'no' );
155
+ update_option( '_jquery_migrate_deprecations_dismissed_notice', time() );
156
+ }
157
+ }
158
+
159
+ if ( isset( $_POST['public-deprecation-logging'] ) ) {
160
+ update_option( '_jquery_migrate_public_deprecation_logging', 'yes' );
161
+ } else {
162
+ update_option( '_jquery_migrate_public_deprecation_logging', 'no' );
163
+ }
164
+
165
+ if ( isset( $_POST['modern-deprecations'] ) ) {
166
+ update_option( '_jquery_migrate_modern_deprecations', 'yes' );
167
+ } else {
168
+ update_option( '_jquery_migrate_modern_deprecations', 'no' );
169
+ }
170
+ }
171
+
172
+ public static function site_health_check( $tests ) {
173
+ $tests['direct']['enable-jquery-migrate-helper'] = array(
174
+ 'label' => __( 'WordPress jQuery Version', 'enable-jquery-migrate-helper' ),
175
+ 'test' => array( __CLASS__, 'site_health_test' ),
176
+ );
177
+
178
+ return $tests;
179
+ }
180
+
181
+ public static function site_health_test() {
182
+ $result = array(
183
+ 'label' => __( 'WordPress jQuery Version', 'enable-jquery-migrate-helper' ),
184
+ 'status' => 'good',
185
+ 'badge' => array(
186
+ 'label' => __( 'Performance' ),
187
+ 'color' => 'blue',
188
+ ),
189
+ 'description' => sprintf(
190
+ '<p>%s</p>',
191
+ __( 'Your site is using the latest jQuery version that comes with WordPress.', 'enable-jquery-migrate-helper' )
192
+ ),
193
+ 'actions' => '',
194
+ 'test' => 'enable-jquery-migrate-helper',
195
+ );
196
+
197
+ $downgrade_state = get_option( '_jquery_migrate_downgrade_version', 'no' );
198
+
199
+ if ( 'no' !== $downgrade_state ) {
200
+ $result['label'] = __( 'You are using a legacy version of jQuery', 'enable-jquery-migrate-helper' );
201
+ $result['status'] = 'critical';
202
+ $result['description'] = sprintf(
203
+ '<p>%s</p>',
204
+ __( 'Your site is using a legacy version of jQuery, 1.12.4-wp, probably in order to fix problems that were experienced with your plugins or themes after an update of WordPress. Please make sure that your plugins and themes become compatible with WordPress 5.6 by contacting the authors.', 'enable-jquery-migrate-helper' )
205
+ );
206
+ $result['actions'] = sprintf(
207
+ '<a href="%s">%s</a>',
208
+ esc_url( admin_url( 'tools.php?page=jqmh' ) ),
209
+ __( 'Plugin settings', 'enable-jquery-migrate-helper' )
210
+ );
211
+ }
212
+
213
+ return $result;
214
+ }
215
+
216
+ /**
217
+ * Ajax handler for automatic downgrades.
218
+ */
219
+ public static function downgrade_jquery_version() {
220
+ /*
221
+ * Only allow the downgrade to be triggered automatically by site visitors if an admin hasn't
222
+ * changed the option themselves; in that case only an admin should be able to set the version.
223
+ */
224
+ $has_auto_downgraded = get_option( '_jquery_migrate_has_auto_downgraded', 'no' );
225
+ if ( 'no' !== $has_auto_downgraded ) {
226
+ return;
227
+ }
228
+
229
+ if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'jquery-migrate-automatic-downgrade' ) ) {
230
+ return;
231
+ }
232
+
233
+ // An array of functions that may trigger a jQuery Migrate downgrade.
234
+ $deprecated = array(
235
+ 'andSelf',
236
+ 'browser',
237
+ 'live',
238
+ 'boxModel',
239
+ 'support.boxModel',
240
+ 'size',
241
+ 'swap',
242
+ 'clean',
243
+ 'sub',
244
+ );
245
+
246
+ preg_match( '/\)\.(?<function>.+?) is not a function/si', $_POST['msg'], $regex_match );
247
+ $function = ( isset( $regex_match['function'] ) ? $regex_match['function'] : null );
248
+
249
+ // If no function was detected, or it was not an acknowledged deprecated feature, do not downgrade.
250
+ if ( null === $function || ! in_array( $function, $deprecated ) ) {
251
+ return;
252
+ }
253
+
254
+ update_option( '_jquery_migrate_downgrade_version', 'yes' );
255
+ update_option( '_jquery_migrate_has_auto_downgraded', 'yes' );
256
+
257
+ self::send_message( 'automatic-downgrade' );
258
+
259
+ wp_send_json_success( array( 'reload' => true ) );
260
+ }
261
+
262
+ /**
263
+ * Add a fatal error handler for uncaught errors.
264
+ *
265
+ * This will look for deprecated jQuery functions, and send an AJAX call letting the plugin
266
+ * know that it should serve future requests as a downgraded version of jQuery.
267
+ *
268
+ * Vanilla JavaScript is used here to remove all dependencies on libraries, even though they
269
+ * all look very pretty, this ensures that code can run no matter the circumstances.
270
+ */
271
+ public static function fatal_error_handler() {
272
+ // If an auto-downgraded has already been performed, do not output the error handler.
273
+ if ( 'no' !== get_option( '_jquery_migrate_has_auto_downgraded', 'no' ) ) {
274
+ return;
275
+ }
276
+ ?>
277
+
278
+ <script type="text/javascript">
279
+ window.onerror = function( msg, url, line, col, error ) {
280
+ var xhr = new XMLHttpRequest();
281
+ var nonce = '<?php echo esc_js( wp_create_nonce( 'jquery-migrate-automatic-downgrade' ) ); ?>';
282
+
283
+ xhr.open( 'POST', '<?php echo esc_js( admin_url( 'admin-ajax.php' ) ); ?>' );
284
+ xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
285
+ xhr.onload = function () {
286
+ var response,
287
+ reload = false;
288
+
289
+ if ( 200 === xhr.status ) {
290
+ try {
291
+ response = JSON.parse( xhr.response );
292
+
293
+ reload = response.data.reload;
294
+ } catch ( e ) {
295
+ reload = false;
296
+ }
297
+ }
298
+
299
+ // Automatically reload the page if a deprecation caused an automatic downgrade, ensure visitors get the best possible experience.
300
+ if ( reload ) {
301
+ location.reload();
302
+ }
303
+ };
304
+
305
+ xhr.send( encodeURI( 'action=jquery-migrate-downgrade-version&_wpnonce=' + nonce + '&msg=' + msg ) );
306
+
307
+ // Suppress error alerts in older browsers
308
+ return true;
309
+ }
310
+ </script>
311
+
312
+ <?php
313
  }
314
 
315
  // Pre-register scripts on 'wp_default_scripts' action, they won't be overwritten by $wp_scripts->add().
341
  /*
342
  * Enqueue jQuery migrate, and force it to be the development version.
343
  *
344
+ * This will ensure that console errors are generated that we can surface to the
345
  * end user in a responsible manner so that they can update their plugins and theme,
346
  * or make a decision to switch to other plugin/theme if no updates are available.
347
  */
348
  public static function replace_scripts( $scripts ) {
349
  $assets_url = plugins_url( 'js/', __FILE__ );
350
 
351
+ if ( version_compare( $GLOBALS['wp_version'], '5.6-alpha', '<' ) || 'yes' === get_option( '_jquery_migrate_downgrade_version', 'no' ) ) {
352
+ self::set_script( $scripts, 'jquery-migrate', $assets_url . 'jquery-migrate-1.4.1-wp.js', array(), '1.4.1-wp' );
353
+ self::set_script( $scripts, 'jquery-core', $assets_url . 'jquery-1.12.4-wp.js', array(), '1.12.4-wp' );
354
+ self::set_script( $scripts, 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.12.4-wp' );
355
+ } else {
356
+ if ( 'yes' === get_option( '_jquery_migrate_modern_deprecations', 'no' ) ) {
357
+ self::set_script( $scripts, 'jquery-migrate', $assets_url . 'jquery-migrate-3.3.2-wp.js', array(), '3.3.2-wp' );
358
+ self::set_script( $scripts, 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '3.5.1-wp' );
359
+ }
360
+ }
361
  }
362
 
363
  /**
364
  * Register the deprecation notice capture handler script.
365
  */
366
  public static function register_scripts() {
367
+ wp_register_script( 'jquery-migrate-deprecation-notices', plugins_url( 'js/deprecation-notice.js', __FILE__ ), array( 'jquery', 'jquery-migrate' ), false, true );
368
 
369
  wp_localize_script(
370
  'jquery-migrate-deprecation-notices',
371
  'JQMH',
372
  array(
373
+ 'ajaxurl' => admin_url( 'admin-ajax.php' ),
374
+ 'report_nonce' => wp_create_nonce( 'jquery-migrate-report-deprecation' ),
375
+ 'backend' => is_admin(),
376
+ 'plugin_slug' => dirname( plugin_basename( __FILE__ ) ),
377
+ 'capture_deprecations' => ( 'yes' === get_option( '_jquery_migrate_downgrade_version', 'no' ) || 'yes' === get_option( '_jquery_migrate_modern_deprecations', 'no' ) ),
378
+ 'single_instance_log' => ( 'no' === get_option( '_jquery_migrate_downgrade_version', 'no' ) ), // Only show one instance of deprecations in jQuery 3.5
379
  )
380
  );
381
  }
388
  }
389
 
390
  public static function enqueue_scripts_frontend() {
391
+ // Only load the asset for users who can act on them.
392
+ if ( ! current_user_can( 'manage_options' ) && 'no' === get_option( '_jquery_migrate_public_deprecation_logging', 'no' ) ) {
393
+ return;
394
+ }
395
 
396
+ wp_enqueue_script( 'jquery-migrate-deprecation-notices' );
397
+ }
398
 
399
  /**
400
  * HTML for jQuery Migrate deprecated notices.
410
  if ( ! self::show_deprecated_scripts_notice() ) {
411
  return;
412
  }
 
 
 
 
 
 
 
413
 
414
+ include_once __DIR__ . '/templates/admin-notices/deprecated-scripts.php';
 
 
 
 
 
 
 
 
415
  }
416
 
417
  public static function show_deprecated_scripts_notice() {
418
  return false === get_option( '_jquery_migrate_deprecations_dismissed_notice', false );
419
  }
420
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
421
  /**
422
  * HTML for the Dashboard notice.
423
  */
424
  public static function dashboard_notice() {
425
+ if ( ! self::show_dashboard_notice() ) {
426
+ return;
427
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
428
 
429
+ include_once __DIR__ . '/templates/admin-notices/welcome.php';
430
  }
431
 
432
  public static function show_dashboard_notice() {
434
  $is_dismissed = get_option( '_jquery_migrate_dismissed_notice', false );
435
  $recurrence = 1 * WEEK_IN_SECONDS;
436
 
437
+ // Force show the admin notice if using a downgraded jQuery version.
438
+ if ( 'no' !== get_option( '_jquery_migrate_downgrade_version', 'no' ) ) {
439
+ // Do not add this message to the plugins own admin page since it already contains
440
+ // a permanent notice.
441
+ if ( 'tools_page_jqmh' !== get_current_screen()->id) {
442
+ return true;
443
+ }
444
+ }
445
+
446
+ // Normally only show this warning on the dashboard page.
447
+ if ( 'dashboard' !== get_current_screen()->id ) {
448
+ return false;
449
+ }
450
+
451
  // If the message has been dismissed, and it has been less than two weeks since it was seen,
452
  // then skip showing the admin notice for now.
453
  if ( false !== $is_dismissed && $is_dismissed > ( time() - $recurrence ) ) {
459
 
460
  /**
461
  * Display a dashboard notice if no deprecations have been logged in a while.
462
+ *
463
+ * This encourages users to remove the plugin when no longer needed, this will help gauge the jQuery
464
+ * migrations, and also remove the potential false-positive reports of jQuery issues caused by
465
+ * an unrelated core bug fixed in WordPress 5.5.1 that inflates the plugin numbers.
466
  */
467
  public static function plugin_obsolete_message() {
468
  $last_log = get_option( 'jqmh_last_log_time', null );
469
  $recurrence = 1 * WEEK_IN_SECONDS;
470
 
471
  /*
472
+ * If no log time is recorded, this is likely a recently installed or udpated plugin, set value to now,
473
+ * to give a buffer, and avoid showing the notice when we have no data telling if it’s needed or not.
474
  */
475
+ if ( null === $last_log ) {
476
  update_option( 'jqmh_last_log_time', time() );
477
  return;
478
  }
479
 
480
  if ( $last_log > ( time() - $recurrence ) ) {
481
+ return;
482
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
483
 
484
+ include_once __DIR__ . '/templates/admin-notices/no-longer-needed.php';
 
 
 
 
 
 
 
 
 
 
 
485
  }
486
 
487
  public static function admin_notices() {
488
  // Show only to admins.
489
+ if ( ! current_user_can( 'manage_options' ) ) {
490
  return;
491
  }
492
 
493
+ self::dashboard_notice();
494
+ self::plugin_obsolete_message();
 
 
 
 
 
495
 
496
  self::deprecated_scripts_notice();
497
  }
498
 
499
  public static function log_migrate_notice() {
500
+ if ( ! current_user_can( 'manage_options' ) && 'no' === get_option( '_jquery_migrate_public_deprecation_logging', 'no' ) ) {
501
  status_header( 403 );
502
  die();
503
  }
504
 
505
  if ( ! wp_verify_nonce( $_POST['nonce'], 'jquery-migrate-report-deprecation' ) ) {
506
+ status_header( 406, 'Invalid nonce' );
507
+ die();
508
  }
509
 
510
  $required_fields = array(
511
+ 'notice',
512
+ );
513
 
514
  foreach ( $required_fields as $required_field ) {
515
+ if ( ! isset( $_POST[ $required_field ] ) ) {
516
+ status_header( 400, 'Missing required fields' );
517
+ die();
518
+ }
519
  }
520
 
521
  $logs = get_option( 'jqmh_logs', array() );
528
  * Creating a hash of the deprecation data lets us ensure it is only reported once, to avoid
529
  * filling the database with duplicates on busy sites.
530
  */
531
+ $deprecation_hash = md5( wp_json_encode( $deprecation_data ) );
532
 
533
+ if ( ! isset( $logs[ $deprecation_hash ] ) ) {
534
+ $logs[ $deprecation_hash ] = array_merge( array(
535
+ 'registered' => date_i18n( 'Y-m-d H:i:s' ),
536
+ 'page' => ( isset( $_POST['url'] ) ? esc_url_raw( $_POST['url'] ) : '' ),
537
+ 'backend' => isset( $_POST['backend'] ) && $_POST['backend'],
538
+ ), $deprecation_data );
539
 
540
+ update_option( 'jqmh_logs', $logs );
541
+ update_option( 'jqmh_last_log_time', time() );
542
+ }
543
 
544
+ wp_send_json_success();
545
  }
546
 
547
  /**
548
+ * Check if any errors have been logged to the database.
549
+ *
550
  * @return int|null
551
  */
552
  public static function logged_migration_notice_count() {
553
+ $logs = get_option( 'jqmh_logs', array() );
 
 
 
 
554
 
555
+ return count( $logs );
556
  }
557
 
558
  /**
559
  * Handle ajax requests to dismiss a notice, and remember the dismissal.
560
+ *
561
+ * @return void
562
  */
563
  public static function admin_notices_dismiss() {
564
  if ( empty( $_POST['dismiss-notice-nonce'] ) || ! current_user_can( 'manage_options' ) ) {
569
  return;
570
  }
571
 
572
+ switch ( $_POST['notice'] ) {
573
+ case 'jquery-migrate-deprecation-list':
574
+ update_option( '_jquery_migrate_deprecations_dismissed_notice', time() );
575
+ break;
576
 
577
+ case 'jquery-migrate-previous-deprecations':
578
+ delete_option( 'jqmh_logs' );
579
+ break;
580
 
581
+ case 'jquery-migrate-notice':
582
+ update_option( '_jquery_migrate_dismissed_notice', time() );
583
+ break;
584
 
585
+ case 'jquery-migrate-no-deprecations-notice':
586
+ update_option( 'jqmh_last_log_time', time() );
587
+ break;
588
  }
589
  }
590
 
591
  /**
592
+ * Add this plugin to the admin bar as a menu item.
593
+ *
594
+ * This entry allows users to re-surface previously hidden notices from the plugin,
595
+ * and also allows for alerting of issues detected in the frontend, where we avoid
596
+ * notices.
597
+ *
598
  * @param $wp_menu
599
  */
600
  public static function admin_bar_menu( $wp_menu ) {
609
  array(
610
  'id' => 'enable-jquery-migrate-helper',
611
  'title' => sprintf(
612
+ // translators: %s: Parenthesis with issue count.
613
  __( 'jQuery Migrate %s', 'enable-jquery-migrate-helper' ),
614
+ sprintf(
615
+ '<span class="count-wrapper jqmh-deprecations" style="' . ( $deprecation_count > 0 ? '' : 'display:none;' ) . '">%s</span>',
616
+ sprintf(
617
+ // translators: 1: Total number of existing issues. 2: Issues discovered on currently loaded page.
618
+ __( '(Previously known: %1$d Discovered on this page: %2$s)', 'enable-jquery-migrate-helper' ),
619
+ $deprecation_count,
620
+ sprintf(
621
+ '<span class="count">%d</span>',
622
+ 0
623
+ )
624
+ )
625
+ )
626
+ ),
627
  'href' => '#',
628
  )
629
  );
630
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
631
  $wp_menu->add_node(
632
+ array(
633
+ 'id' => 'enable-jquery-migrate-helper-page',
634
+ 'title' => _x( 'Settings Page', 'Admin bar menu link', 'enable-jquery-migrate-helper' ),
635
  'parent' => 'enable-jquery-migrate-helper',
636
+ 'href' => get_admin_url( null, 'tools.php?page=jqmh' ),
637
+ )
638
+ );
639
+
640
+ $wp_menu->add_node(
641
+ array(
642
+ 'id' => 'enable-jquery-migrate-helper-deprecation-logs',
643
+ 'title' => _x( 'Logged deprecations', 'Admin bar menu link', 'enable-jquery-migrate-helper' ),
644
+ 'parent' => 'enable-jquery-migrate-helper',
645
+ 'href' => get_admin_url( null, 'tools.php?page=jqmh&tab=logs' ),
646
+ )
647
+ );
648
  }
649
 
650
+ /**
651
+ * Send a pre-defined email to the site admin.
652
+ *
653
+ * @param string $template The template of the email to be sent.
654
+ * @return bool If the email was sent or not.
655
+ */
656
+ private static function send_message( $template ) {
657
+ $file = null;
658
+
659
+ switch ( $template ) {
660
+ case 'weekly':
661
+ $title = __( 'Weekly jQuery Migrate Status Update', 'enable-jquery-migrate-helper' );
662
+ $file = 'weekly.php';
663
+ break;
664
+ case 'automatic-downgrade':
665
+ $title = __( 'Automatic jQuery version change', 'enable-jquery-migrate-helper' );
666
+ $file = 'automatic-downgrade.php';
667
+ break;
668
  }
669
 
670
+ $file_path = __DIR__ . '/templates/email/' . $file;
 
671
 
672
+ if ( ! $file || ! file_exists( $file_path ) ) {
673
+ return false;
 
 
 
 
 
674
  }
675
 
676
+ $recipient = get_bloginfo( 'admin_email' );
677
+
678
+ ob_start();
679
+ include $file_path;
680
+ $message = ob_get_clean();
681
+
682
+ /**
683
+ * Filter the contents of the notification email.
684
+ *
685
+ * If an empty value is returned, the email notice will not be sent.
686
+ *
687
+ * @since 1.2.0
688
+ *
689
+ * @param string $message The message that will be sent ot the site admin.
690
+ * @param string $template The currently invoked email template.
691
+ */
692
+ $message = apply_filters( 'jqmh_email_message', $message, $template );
693
+
694
+ if ( empty( $message ) ) {
695
+ return false;
696
+ }
697
+
698
+ add_filter( 'wp_mail_content_type', function() {
699
+ return 'text/html';
700
+ } );
701
+
702
+ return wp_mail( $recipient, $title, $message );
703
  }
704
  }
enable-jquery-migrate-helper.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Enable jQuery Migrate Helper
4
  Plugin URI: https://wordpress.org/plugins/enable-jquery-migrate-helper
5
  Description: Enable support for old and outdated plugins and themes during a jQuery update transitional phase.
6
- Version: 1.1.0
7
  Requires at least: 5.4
8
  Tested up to: 5.5
9
  Requires PHP: 5.6
@@ -19,7 +19,7 @@ if ( ! defined( 'ABSPATH' ) ) {
19
  die( 'Invalid request.' );
20
  }
21
 
22
- if ( version_compare( $GLOBALS['wp_version'], '5.6-alpha', '<' ) && ! class_exists( 'jQuery_Migrate_Helper' ) ) {
23
  include_once __DIR__ . '/class-jquery-migrate-helper.php';
24
  add_action( 'plugins_loaded', array( 'jQuery_Migrate_Helper', 'init_actions' ) );
25
  }
3
  Plugin Name: Enable jQuery Migrate Helper
4
  Plugin URI: https://wordpress.org/plugins/enable-jquery-migrate-helper
5
  Description: Enable support for old and outdated plugins and themes during a jQuery update transitional phase.
6
+ Version: 1.2.0
7
  Requires at least: 5.4
8
  Tested up to: 5.5
9
  Requires PHP: 5.6
19
  die( 'Invalid request.' );
20
  }
21
 
22
+ if ( ! class_exists( 'jQuery_Migrate_Helper' ) ) {
23
  include_once __DIR__ . '/class-jquery-migrate-helper.php';
24
  add_action( 'plugins_loaded', array( 'jQuery_Migrate_Helper', 'init_actions' ) );
25
  }
js/deprecation-notice.js CHANGED
@@ -3,14 +3,16 @@
3
  */
4
  jQuery( document ).ready( function( $ ) {
5
  const notice = $( '.notice.jquery-migrate-deprecation-notice' );
6
- const warnings = jQuery.migrateWarnings;
7
  const adminbar = $( '#wp-admin-bar-enable-jquery-migrate-helper' );
8
  const countWrapper = $( '.count-wrapper', adminbar );
9
 
 
 
10
  /**
11
  * Filter the trace, return the first URI that is to a plugin or theme script.
12
  */
13
- function getPluginSlugFromTrace( trace ) {
14
  let traceLines = trace.split( '\n' ),
15
  match = null;
16
 
@@ -28,7 +30,7 @@ jQuery( document ).ready( function( $ ) {
28
  if (
29
  ! match &&
30
  line.indexOf( '/' + JQMH.plugin_slug + '/js' ) === -1 &&
31
- ( line.indexOf( '/plugins/' ) > -1 || line.indexOf( '/themes/' ) > -1 )
32
  ) {
33
  match = line.replace( /.*?http/, 'http' );
34
  }
@@ -48,6 +50,11 @@ jQuery( document ).ready( function( $ ) {
48
  return;
49
  }
50
 
 
 
 
 
 
51
  if ( ! countWrapper.is( ':visible' ) ) {
52
  countWrapper.show();
53
 
@@ -84,6 +91,15 @@ jQuery( document ).ready( function( $ ) {
84
  return;
85
  }
86
 
 
 
 
 
 
 
 
 
 
87
  if ( ! notice.is( ':visible' ) ) {
88
  notice.show();
89
  }
@@ -97,11 +113,15 @@ jQuery( document ).ready( function( $ ) {
97
  * @param message
98
  */
99
  function reportDeprecation( message ) {
100
- // Do not write to the logfile if this is the backend, and the notices are written to the screen.
101
  if ( JQMH.backend && notice.length ) {
102
  return;
103
  }
104
 
 
 
 
 
105
  let data = {
106
  action: 'jquery-migrate-log-notice',
107
  notice: message,
@@ -118,9 +138,14 @@ jQuery( document ).ready( function( $ ) {
118
 
119
  if ( warnings.length ) {
120
  warnings.forEach( function( entry ) {
121
- const trace = getPluginSlugFromTrace( entry.trace );
122
  let message = trace ? trace + ': ' : '';
123
 
 
 
 
 
 
124
  message += entry.warning;
125
 
126
  appendNoticeDisplay( message );
3
  */
4
  jQuery( document ).ready( function( $ ) {
5
  const notice = $( '.notice.jquery-migrate-deprecation-notice' );
6
+ const warnings = jQuery.migrateWarnings || [];
7
  const adminbar = $( '#wp-admin-bar-enable-jquery-migrate-helper' );
8
  const countWrapper = $( '.count-wrapper', adminbar );
9
 
10
+ var previousDeprecations = [];
11
+
12
  /**
13
  * Filter the trace, return the first URI that is to a plugin or theme script.
14
  */
15
+ function getSlugFromTrace( trace ) {
16
  let traceLines = trace.split( '\n' ),
17
  match = null;
18
 
30
  if (
31
  ! match &&
32
  line.indexOf( '/' + JQMH.plugin_slug + '/js' ) === -1 &&
33
+ ( line.indexOf( '/plugins/' ) > -1 || line.indexOf( '/themes/' ) > -1 || line.indexOf( '/wp-admin/js/' ) > -1 )
34
  ) {
35
  match = line.replace( /.*?http/, 'http' );
36
  }
50
  return;
51
  }
52
 
53
+ // The live counter may be disabled if jQuery 3 is used during WordPress 5.6
54
+ if ( ! JQMH.capture_deprecations ) {
55
+ return;
56
+ }
57
+
58
  if ( ! countWrapper.is( ':visible' ) ) {
59
  countWrapper.show();
60
 
91
  return;
92
  }
93
 
94
+ // Only list one case of the same error per file.
95
+ if ( JQMH.single_instance_log ) {
96
+ if ( previousDeprecations.indexOf( message ) > -1 ) {
97
+ return;
98
+ }
99
+
100
+ previousDeprecations.push( message );
101
+ }
102
+
103
  if ( ! notice.is( ':visible' ) ) {
104
  notice.show();
105
  }
113
  * @param message
114
  */
115
  function reportDeprecation( message ) {
116
+ // Do not write to the logfile if this is the backend and the notices are written to the screen.
117
  if ( JQMH.backend && notice.length ) {
118
  return;
119
  }
120
 
121
+ if ( ! JQMH.capture_deprecations ) {
122
+ return;
123
+ }
124
+
125
  let data = {
126
  action: 'jquery-migrate-log-notice',
127
  notice: message,
138
 
139
  if ( warnings.length ) {
140
  warnings.forEach( function( entry ) {
141
+ const trace = getSlugFromTrace( entry.trace ? entry.trace : "" );
142
  let message = trace ? trace + ': ' : '';
143
 
144
+ // Traces some times get a null value, skip these.
145
+ if ( '' === message ) {
146
+ return;
147
+ }
148
+
149
  message += entry.warning;
150
 
151
  appendNoticeDisplay( message );
js/jquery-1.12.4-wp.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ /*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license | WordPress 2019-05-16 */
2
+ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?a<0?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],"__proto__"!==d&&g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;d<c;d++)if(!1===b.call(a[d],d,a[d]))break}else for(d in a)if(!1===b.call(a[d],d,a[d]))break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?c<0?Math.max(0,d+c):c:0;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(d<c)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)(d=!b(a[f],f))!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;g<d;g++)null!=(e=b(a[g],g,c))&&h.push(e);else for(g in a)null!=(e=b(a[g],g,c))&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;if("string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a))return c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"!==c&&!n.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=fa(),z=fa(),A=fa(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(xa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ea(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+pa(r[h]);s=r.join(","),w=_.test(a)&&na(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function fa(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ga(a){return a[u]=!0,a}function ha(a){var b=n.createElement("div");try{return!!a(b)}catch(xa){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ia(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ja(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ka(a){return function(b){return"input"===b.nodeName.toLowerCase()&&b.type===a}}function la(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ma(a){return ga(function(b){return b=+b,ga(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function na(a){return a&&void 0!==a.getElementsByTagName&&a}c=ea.support={},f=ea.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ea.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ha(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ha(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ha(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(void 0!==b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c=void 0!==a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return void 0!==b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if(void 0!==b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ha(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ha(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ha(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d||(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ja(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ja(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ea.matches=function(a,b){return ea(a,null,null,b)},ea.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(xa){}return ea(b,n,null,[a]).length>0},ea.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ea.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ea.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ea.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ea.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ea.selectors={cacheLength:50,createPseudo:ga,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ea.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ea.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||void 0!==a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ea.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),!1===t)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return(t-=e)===d||t%d==0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ea.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ga(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ga(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ga(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ga(function(a){return function(b){return ea(a,b).length>0}}),contains:ga(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ga(function(a){return V.test(a||"")||ea.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do{if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return(c=c.toLowerCase())===a||0===c.indexOf(a+"-")}while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return!1===a.disabled},disabled:function(a){return!0===a.disabled},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,!0===a.selected},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ma(function(){return[0]}),last:ma(function(a,b){return[b-1]}),eq:ma(function(a,b,c){return[c<0?c+b:c]}),even:ma(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:ma(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:ma(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:ma(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ka(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=la(b);function oa(){}oa.prototype=d.filters=d.pseudos,d.setFilters=new oa,g=ea.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ea.error(a):z(a,i).slice(0)};function pa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function qa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function ra(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sa(a,b,c){for(var d=0,e=b.length;d<e;d++)ea(a,b[d],c);return c}function ta(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function ua(a,b,c,d,e,f){return d&&!d[u]&&(d=ua(d)),e&&!e[u]&&(e=ua(e,f)),ga(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||sa(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ta(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ta(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ta(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function va(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=qa(function(a){return a===b},h,!0),l=qa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[qa(ra(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return ua(i>1&&ra(m),i>1&&pa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,i<e&&va(a.slice(i,e)),e<f&&va(a=a.slice(e)),e<f&&pa(a))}m.push(c)}return ra(m)}function wa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ta(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ea.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ga(f):f}return h=ea.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=va(b[c]),f[u]?d.push(f):e.push(f);f=A(a,wa(e,d)),f.selector=a}return f},i=ea.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(!(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0]))return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&na(b.parentNode)||b))){if(j.splice(i,1),!(a=f.length&&pa(j)))return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&na(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ha(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ha(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ia("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ha(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ia("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ha(function(a){return null==a.getAttribute("disabled")})||ia(K,function(a,b,c){var d;if(!c)return!0===a[b]?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ea}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;b<e;b++)if(n.contains(d[b],this))return!0}));for(b=0;b<e;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/;(n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(!(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a))||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if((f=d.getElementById(e[2]))&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))}).prototype=n.fn,A=n(d);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do{a=a[b]}while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.uniqueSort(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g;function G(a){var b={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)!1===f[h].apply(c[0],c[1])&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function b(c){n.each(c,function(c,d){n.isFunction(d)?a.unique&&j.has(d)||f.push(d):d&&d.length&&"string"!==n.type(d)&&b(d)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);b<d;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(!0===a?--n.readyWait:n.isReady)||(n.isReady=!0,!0!==a&&--n.readyWait>0||(H.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function I(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J)):(d.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(I(),n.ready())}n.ready.promise=function(b){if(!H)if(H=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J);else{d.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&function b(){if(!n.isReady){try{c.doScroll("left")}catch(e){return a.setTimeout(b,50)}I(),n.ready()}}()}return H.promise(b)},n.ready.promise();var K;for(K in n(l))break;l.ownFirst="0"===K,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;(c=d.getElementsByTagName("body")[0])&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),void 0!==b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var L=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return(1===c||9===c)&&(!b||!0!==b&&a.getAttribute("classid")===b)},M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if("string"==typeof(c=a.getAttribute(d))){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:M.test(c)?n.parseJSON(c):c)}catch(e){}n.data(a,b,c)}else c=void 0}return c}function P(a){var b
3
+ ;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(L(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?null==(f=g[b])&&(f=g[n.camelCase(b)]):f=g,f}}function R(a,b,c){if(L(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return!!(a=a.nodeType?n.cache[a[n.expando]]:a[n.expando])&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),O(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?O(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)(c=n._data(f[g],a+"queueHooks"))&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return(c=d.getElementsByTagName("body")[0])&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),void 0!==b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function W(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&T.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do{f=f||".5",k/=f,n.style(a,b,k+j)}while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var X=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)X(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Y=/^(?:checkbox|radio)$/i,Z=/<([\w:-]+)/,$=/^$|\/(?:java|ecma)script/i,_=/^\s+/,aa="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ba(a){var b=aa.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var ca={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};ca.optgroup=ca.option,ca.tbody=ca.tfoot=ca.colgroup=ca.caption=ca.thead,ca.th=ca.td;function da(a,b){var c,d,e=0,f=void 0!==a.getElementsByTagName?a.getElementsByTagName(b||"*"):void 0!==a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,da(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function ea(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var fa=/<|&#?\w+;/,ga=/<tbody/i;function ha(a){Y.test(a.type)&&(a.defaultChecked=a.checked)}function ia(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ba(b),q=[],r=0;r<o;r++)if((g=a[r])||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(fa.test(g)){i=i||p.appendChild(b.createElement("div")),j=(Z.exec(g)||["",""])[1].toLowerCase(),m=ca[j]||ca._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&_.test(g)&&q.push(b.createTextNode(_.exec(g)[0])),!l.tbody){g="table"!==j||ga.test(g)?"<table>"!==m[1]||ga.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(da(q,"input"),ha),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=da(p.appendChild(g),"script"),h&&ea(i),c){f=0;while(g=i[f++])$.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=!1===e.attributes[c].expando);e=null}();var ja=/^(?:input|select|textarea)$/i,ka=/^key/,la=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ma=/^(?:focusinfocus|focusoutblur)$/,na=/^([^.]*)(?:\.(.+)|)/;function oa(){return!0}function pa(){return!1}function qa(){try{return d.activeElement}catch(a){}}function ra(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ra(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),!1===e)e=pa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return void 0===n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=na.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&!1!==j.setup.call(a,d,p,k)||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=na.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&!1!==l.teardown.call(a,p,r.handle)||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!ma.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||!1!==l.trigger.apply(e,c))){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,ma.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),(g=h&&i[h])&&g.apply&&L(i)&&(b.result=g.apply(i,c),!1===b.result&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||!1===l._default.apply(p.pop(),c))&&L(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||!1!==k.preDispatch.call(this,a)){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,void 0!==(d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i))&&!1===(a.result=d)&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(!0!==i.disabled||"click"!==a.type)){for(d=[],c=0;c<h;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=la.test(f)?this.mouseHooks:ka.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==qa()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){if(this===qa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(n.nodeName(this,"input")&&"checkbox"===this.type&&this.click)return this.click(),!1},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&(void 0===a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){if(!(this instanceof n.Event))return new n.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&!1===a.returnValue?oa:pa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),this[n.expando]=!0},n.Event.prototype={constructor:n.Event,isDefaultPrevented:pa,isPropagationStopped:pa,isImmediatePropagationStopped:pa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=oa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=oa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=oa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){if(n.nodeName(this,"form"))return!1;n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){if(n.nodeName(this,"form"))return!1;n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){if(ja.test(this.nodeName))return"checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1;n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ja.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type)return a.handleObj.handler.apply(this,arguments)},teardown:function(){return n.event.remove(this,"._change"),!ja.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return ra(this,a,b,c,d)},one:function(a,b,c,d){return ra(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return!1!==b&&"function"!=typeof b||(c=b,b=void 0),!1===c&&(c=pa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return n.event.trigger(a,b,c,!0)}});var sa=/ jQuery\d+="(?:null|\d+)"/g,ta=new RegExp("<(?:"+aa+")[\\s/>]","i"),ua=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,va=/<script|<style|<link/i,wa=/checked\s*(?:[^=]|=\s*.checked.)/i,xa=/^true\/(.*)/,ya=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,za=ba(d),Aa=za.appendChild(d.createElement("div"));function Ba(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Ca(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Da(a){var b=xa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ea(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Fa(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Ca(b).text=a.text,Da(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Y.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ga(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&wa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ga(f,b,c,d)});if(o&&(k=ia(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(da(k,"script"),Ca),h=i.length;m<o;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,da(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Da),m=0;m<h;m++)g=i[m],$.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(ya,"")));k=e=null}return a}function Ha(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(da(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&ea(da(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ua,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ta.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Aa.innerHTML=a.outerHTML,Aa.removeChild(f=Aa.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=da(f),h=da(a),g=0;null!=(e=h[g]);++g)d[g]&&Fa(e,d[g]);if(b)if(c)for(h=h||da(a),d=d||da(f),g=0;null!=(e=h[g]);g++)Ea(e,d[g]);else Ea(a,f);return d=da(f,"script"),d.length>0&&ea(d,!i&&da(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||L(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||void 0===d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ga,detach:function(a){return Ha(this,a,!0)},remove:function(a){return Ha(this,a)},text:function(a){return X(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ga(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){Ba(this,a).appendChild(a)}})},prepend:function(){return Ga(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ba(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ga(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ga(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(da(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return X(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(sa,""):void 0;if("string"==typeof a&&!va.test(a)&&(l.htmlSerialize||!ta.test(a))&&(l.leadingWhitespace||!_.test(a))&&!ca[(Z.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(da(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ga(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(da(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;d<=h;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ia,Ja={HTML:"block",BODY:"block"};function Ka(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function La(a){var b=d,c=Ja[a];return c||(c=Ka(a,b),"none"!==c&&c||(Ia=(Ia||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ia[0].contentWindow||Ia[0].contentDocument).document,b.write(),b.close(),c=Ka(a,b),Ia.detach()),Ja[a]=c),c}var Ma=/^margin/,Na=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Oa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Pa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",(f=0===k[0].offsetHeight)&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}j.style&&(j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}}))}();var Qa,Ra,Sa=/^(top|right|bottom|left)$/;a.getComputedStyle?(Qa=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Ra=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Qa(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Na.test(g)&&Ma.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Pa.currentStyle&&(Qa=function(a){return a.currentStyle},Ra=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Qa(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Na.test(g)&&!Sa.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ta(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Ua=/alpha\([^)]*\)/i,Va=/opacity\s*=\s*([^)]*)/i,Wa=/^(none|table(?!-c[ea]).+)/,Xa=new RegExp("^("+S+")(.*)$","i"),Ya={position:"absolute",visibility:"hidden",display:"block"},Za={letterSpacing:"0",fontWeight:"400"},$a=["Webkit","O","Moz","ms"],_a=d.createElement("div").style;function ab(a){if(a in _a)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=$a.length;while(c--)if((a=$a[c]+b)in _a)return a}function bb(a,b){for(var c,d,e,f=[],g=0,h=a.length;g<h;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=n._data(d,"olddisplay",La(d.nodeName)))):(e=V(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;g<h;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function cb(a,b,c){var d=Xa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function db(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function eb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Qa(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(e<=0||null==e){if(e=Ra(a,b,f),(e<0||null==e)&&(e=a.style[b]),Na.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+db(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ra(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{float:l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=ab(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=T.exec(c))&&e[1]&&(c=W(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=ab(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ra(a,b,d)),"normal"===f&&b in Za&&(f=Za[b]),""===c||c?(e=parseFloat(f),!0===c||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){if(c)return Wa.test(n.css(a,"display"))&&0===a.offsetWidth?Oa(a,Ya,function(){return eb(a,b,d)}):eb(a,b,d)},set:function(a,c,d){var e=d&&Qa(a);return cb(a,c,d?db(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Va.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Ua,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ua.test(f)?f.replace(Ua,e):f+" "+e)}}),n.cssHooks.marginRight=Ta(l.reliableMarginRight,function(a,b){if(b)return Oa(a,{display:"inline-block"},Ra,[a,"marginRight"])}),n.cssHooks.marginLeft=Ta(l.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Ra(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Oa(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px"}),n.each({
4
+ margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Ma.test(a)||(n.cssHooks[a+b].set=cb)}),n.fn.extend({css:function(a,b){return X(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Qa(a),e=b.length;g<e;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return bb(this,!0)},hide:function(){return bb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function fb(a,b,c,d,e){return new fb.prototype.init(a,b,c,d,e)}n.Tween=fb,fb.prototype={constructor:fb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=fb.propHooks[this.prop];return a&&a.get?a.get(this):fb.propHooks._default.get(this)},run:function(a){var b,c=fb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):fb.propHooks._default.set(this),this}},fb.prototype.init.prototype=fb.prototype,fb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},fb.propHooks.scrollTop=fb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=fb.prototype.init,n.fx.step={};var gb,hb,ib=/^(?:toggle|show|hide)$/,jb=/queueHooks$/;function kb(){return a.setTimeout(function(){gb=void 0}),gb=n.now()}function lb(a,b){var c,d={height:a},e=0;for(b=b?1:0;e<4;e+=2-b)c=U[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function mb(a,b,c){for(var d,e=(pb.tweeners[b]||[]).concat(pb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function nb(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&V(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),"inline"===(k="none"===j?n._data(a,"olddisplay")||La(a.nodeName):j)&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==La(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ib.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?La(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=mb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function ob(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),(g=n.cssHooks[d])&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function pb(a,b,c){var d,e,f=0,g=pb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=gb||kb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:gb||kb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(ob(k,j.opts.specialEasing);f<g;f++)if(d=pb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,mb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(pb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return W(c.elem,a,T.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(F);for(var c,d=0,e=a.length;d<e;d++)c=a[d],pb.tweeners[c]=pb.tweeners[c]||[],pb.tweeners[c].unshift(b)},prefilters:[nb],prefilter:function(a,b){b?pb.prefilters.unshift(a):pb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&!0!==d.queue||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=pb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||!1===f.queue?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&!1!==a&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&jb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(lb(b,!0),a,d,e)}}),n.each({slideDown:lb("show"),slideUp:lb("hide"),slideToggle:lb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(gb=n.now();c<b.length;c++)(a=b[c])()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),gb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){hb||(hb=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(hb),hb=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var qb=/\r/g,rb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),(b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()])&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return(b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()])&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(qb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(rb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||e<0,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i<h;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){if(n.isArray(b))return a.checked=n.inArray(n(a).val(),b)>-1}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb,tb,ub=n.expr.attrHandle,vb=/^(?:checked|selected)$/i,wb=l.getSetAttribute,xb=l.input;n.fn.extend({attr:function(a,b){return X(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return void 0===a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?tb:sb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(F);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?xb&&wb||!vb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(wb?c:d)}}),tb={set:function(a,b,c){return!1===b?n.removeAttr(a,c):xb&&wb||!vb.test(c)?a.setAttribute(!wb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ub[b]||n.find.attr;xb&&wb||!vb.test(b)?ub[b]=function(a,b,d){var e,f;return d||(f=ub[b],ub[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ub[b]=f),e}:ub[b]=function(a,b,c){if(!c)return a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),xb&&wb||(n.attrHooks.value={set:function(a,b,c){if(!n.nodeName(a,"input"))return sb&&sb.set(a,b,c);a.defaultValue=b}}),wb||(sb={set:function(a,b,c){var d=a.getAttributeNode(c);if(d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c))return b}},ub.id=ub.name=ub.coords=function(a,b,c){var d;if(!c)return(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);if(c&&c.specified)return c.value},set:sb.set},n.attrHooks.contenteditable={set:function(a,b,c){sb.set(a,""!==b&&b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){if(""===c)return a.setAttribute(b,"auto"),c}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var yb=/^(?:input|select|textarea|button|object)$/i,zb=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return X(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):yb.test(a.nodeName)||zb.test(a.nodeName)&&a.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Ab=/[\t\r\n\f]/g;function Bb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Bb(this)))});if("string"==typeof a&&a){b=a.match(F)||[];while(c=this[i++])if(e=Bb(c),d=1===c.nodeType&&(" "+e+" ").replace(Ab," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Bb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(F)||[];while(c=this[i++])if(e=Bb(c),d=1===c.nodeType&&(" "+e+" ").replace(Ab," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Bb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(F)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Bb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||!1===a?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Bb(c)+" ").replace(Ab," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Cb=a.location,Db=n.now(),Eb=/\?/,Fb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Fb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Gb=/#.*$/,Hb=/([?&])_=[^&]*/,Ib=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Jb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Kb=/^(?:GET|HEAD)$/,Lb=/^\/\//,Mb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Nb={},Ob={},Pb="*/".concat("*"),Qb=Cb.href,Rb=Mb.exec(Qb.toLowerCase())||[];function Sb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(F)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Tb(a,b,c,d){var e={},f=a===Ob;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ub(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Vb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Wb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(!(g=j[i+" "+f]||j["* "+f]))for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){!0===g?g=j[e]:!0!==j[e]&&(f=h[0],k.unshift(h[1]));break}if(!0!==g)if(g&&a.throws)b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Qb,type:"GET",isLocal:Jb.test(Rb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Pb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ub(Ub(a,n.ajaxSettings),b):Ub(n.ajaxSettings,a)},ajaxPrefilter:Sb(Nb),ajaxTransport:Sb(Ob),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Ib.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(u<2)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),x(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Qb)+"").replace(Gb,"").replace(Lb,Rb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(F)||[""],null==l.crossDomain&&(d=Mb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Rb[1]&&d[2]===Rb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Rb[3]||("http:"===Rb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Tb(Nb,l,c,w),2===u)return w;i=n.event&&l.global,i&&0==n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Kb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Eb.test(f)?"&":"?")+l.data,delete l.data),!1===l.cache&&(l.url=Hb.test(f)?f.replace(Hb,"$1_="+Db++):f+(Eb.test(f)?"&":"?")+"_="+Db++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&!1!==l.contentType||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Pb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(!1===l.beforeSend.call(m,w,l)||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Tb(Ob,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,x)}catch(y){if(!(u<2))throw y;x(-1,y)}}else x(-1,"No Transport");function x(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&b<300||304===b,d&&(v=Vb(l,w,d)),v=Wb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),(x=w.getResponseHeader("etag"))&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",b<0&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Xb(a){return a.style&&a.style.display||n.css(a,"display")}function Yb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Xb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Yb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var Zb=/%20/g,$b=/\[\]$/,_b=/\r?\n/g,ac=/^(?:submit|button|image|reset|file)$/i,bc=/^(?:input|select|textarea|keygen)/i;function cc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||$b.test(a)?d(a,e):cc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)cc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)cc(c,a[c],b,e);return d.join("&").replace(Zb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&bc.test(this.nodeName)&&!ac.test(a)&&(this.checked||!Y.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(_b,"\r\n")}}):{name:b.name,value:c.replace(_b,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?hc():d.documentMode>8?gc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&gc()||hc()}:gc;var dc=0,ec={},fc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in ec)ec[a](void 0,!0)}),l.cors=!!fc&&"withCredentials"in fc,(fc=l.ajax=!!fc)&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++dc;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete ec[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=ec[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function gc(){try{return new a.XMLHttpRequest}catch(b){}}function hc(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var ic=[],jc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ic.pop()||n.expando+"_"+Db++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=!1!==b.jsonp&&(jc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&jc.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(jc,"$1"+e):!1!==b.jsonp&&(b.url+=(Eb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ic.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ia([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var kc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&kc)return kc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function lc(a){return n.isWindow(a)?a:9===a.nodeType&&(a.defaultView||a.parentWindow)}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?(void 0!==e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=lc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Pa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return X(this,function(a,d,e){var f=lc(a);if(void 0===e)return f?b in f?f[b]:f.document.documentElement[d]:a[d];f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ta(l.pixelPosition,function(a,c){if(c)return c=Ra(a,b),Na.test(c)?n(a).position()[b]+"px":c})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(!0===d||!0===e?"margin":"border")
5
+ ;return X(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var mc=a.jQuery,nc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=nc),b&&a.jQuery===n&&(a.jQuery=mc),n},b||(a.jQuery=a.$=n),n});
js/jquery-migrate-3.3.2-wp.js ADDED
@@ -0,0 +1,870 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * jQuery Migrate - v3.3.2 - 2020-11-18T08:29Z
3
+ * Copyright OpenJS Foundation and other contributors
4
+ */
5
+ ( function( factory ) {
6
+ "use strict";
7
+
8
+ if ( typeof define === "function" && define.amd ) {
9
+
10
+ // AMD. Register as an anonymous module.
11
+ define( [ "jquery" ], function( jQuery ) {
12
+ return factory( jQuery, window );
13
+ } );
14
+ } else if ( typeof module === "object" && module.exports ) {
15
+
16
+ // Node/CommonJS
17
+ // eslint-disable-next-line no-undef
18
+ module.exports = factory( require( "jquery" ), window );
19
+ } else {
20
+
21
+ // Browser globals
22
+ factory( jQuery, window );
23
+ }
24
+ } )( function( jQuery, window ) {
25
+ "use strict";
26
+
27
+ jQuery.migrateVersion = "3.3.2";
28
+
29
+ // Returns 0 if v1 == v2, -1 if v1 < v2, 1 if v1 > v2
30
+ function compareVersions( v1, v2 ) {
31
+ var i,
32
+ rVersionParts = /^(\d+)\.(\d+)\.(\d+)/,
33
+ v1p = rVersionParts.exec( v1 ) || [ ],
34
+ v2p = rVersionParts.exec( v2 ) || [ ];
35
+
36
+ for ( i = 1; i <= 3; i++ ) {
37
+ if ( +v1p[ i ] > +v2p[ i ] ) {
38
+ return 1;
39
+ }
40
+ if ( +v1p[ i ] < +v2p[ i ] ) {
41
+ return -1;
42
+ }
43
+ }
44
+ return 0;
45
+ }
46
+
47
+ function jQueryVersionSince( version ) {
48
+ return compareVersions( jQuery.fn.jquery, version ) >= 0;
49
+ }
50
+
51
+ ( function() {
52
+
53
+ // Support: IE9 only
54
+ // IE9 only creates console object when dev tools are first opened
55
+ // IE9 console is a host object, callable but doesn't have .apply()
56
+ if ( !window.console || !window.console.log ) {
57
+ return;
58
+ }
59
+
60
+ // Need jQuery 3.0.0+ and no older Migrate loaded
61
+ if ( !jQuery || !jQueryVersionSince( "3.0.0" ) ) {
62
+ window.console.log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" );
63
+ }
64
+ if ( jQuery.migrateWarnings ) {
65
+ window.console.log( "JQMIGRATE: Migrate plugin loaded multiple times" );
66
+ }
67
+
68
+ // Show a message on the console so devs know we're active
69
+ window.console.log( "JQMIGRATE: Migrate is installed" +
70
+ ( jQuery.migrateMute ? "" : " with logging active" ) +
71
+ ", version " + jQuery.migrateVersion );
72
+
73
+ } )();
74
+
75
+ var warnedAbout = {};
76
+
77
+ // By default each warning is only reported once.
78
+ jQuery.migrateDeduplicateWarnings = true;
79
+
80
+ // List of warnings already given; public read only
81
+ jQuery.migrateWarnings = [];
82
+
83
+ // Set to false to disable traces that appear with warnings
84
+ if ( jQuery.migrateTrace === undefined ) {
85
+ jQuery.migrateTrace = true;
86
+ }
87
+
88
+ // Forget any warnings we've already given; public
89
+ jQuery.migrateReset = function() {
90
+ warnedAbout = {};
91
+ jQuery.migrateWarnings.length = 0;
92
+ };
93
+
94
+ function migrateWarn( msg ) {
95
+ var console = window.console;
96
+ var error = new Error();
97
+
98
+ // WP: Add all warnings to jQuery.migrateWarnings.
99
+ var tracedError = {
100
+ warning: msg,
101
+ trace: error.stack || error
102
+ };
103
+
104
+ jQuery.migrateWarnings.push( tracedError );
105
+ // WP: end.
106
+
107
+ if ( !jQuery.migrateDeduplicateWarnings || !warnedAbout[ msg ] ) {
108
+ warnedAbout[ msg ] = true;
109
+ jQuery.migrateWarnings.push( msg );
110
+ if ( console && console.warn && !jQuery.migrateMute ) {
111
+ console.warn( "JQMIGRATE: " + msg );
112
+ if ( jQuery.migrateTrace && console.trace ) {
113
+ console.trace();
114
+ }
115
+ }
116
+ }
117
+ }
118
+
119
+ function migrateWarnProp( obj, prop, value, msg ) {
120
+ Object.defineProperty( obj, prop, {
121
+ configurable: true,
122
+ enumerable: true,
123
+ get: function() {
124
+ migrateWarn( msg );
125
+ return value;
126
+ },
127
+ set: function( newValue ) {
128
+ migrateWarn( msg );
129
+ value = newValue;
130
+ }
131
+ } );
132
+ }
133
+
134
+ function migrateWarnFunc( obj, prop, newFunc, msg ) {
135
+ obj[ prop ] = function() {
136
+ migrateWarn( msg );
137
+ return newFunc.apply( this, arguments );
138
+ };
139
+ }
140
+
141
+ if ( window.document.compatMode === "BackCompat" ) {
142
+
143
+ // JQuery has never supported or tested Quirks Mode
144
+ migrateWarn( "jQuery is not compatible with Quirks Mode" );
145
+ }
146
+
147
+ var findProp,
148
+ class2type = {},
149
+ oldInit = jQuery.fn.init,
150
+ oldFind = jQuery.find,
151
+
152
+ rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
153
+ rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
154
+
155
+ // Support: Android <=4.0 only
156
+ // Make sure we trim BOM and NBSP
157
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
158
+
159
+ jQuery.fn.init = function( arg1 ) {
160
+ var args = Array.prototype.slice.call( arguments );
161
+
162
+ if ( typeof arg1 === "string" && arg1 === "#" ) {
163
+
164
+ // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
165
+ migrateWarn( "jQuery( '#' ) is not a valid selector" );
166
+ args[ 0 ] = [];
167
+ }
168
+
169
+ return oldInit.apply( this, args );
170
+ };
171
+ jQuery.fn.init.prototype = jQuery.fn;
172
+
173
+ jQuery.find = function( selector ) {
174
+ var args = Array.prototype.slice.call( arguments );
175
+
176
+ // Support: PhantomJS 1.x
177
+ // String#match fails to match when used with a //g RegExp, only on some strings
178
+ if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
179
+
180
+ // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
181
+ // First see if qS thinks it's a valid selector, if so avoid a false positive
182
+ try {
183
+ window.document.querySelector( selector );
184
+ } catch ( err1 ) {
185
+
186
+ // Didn't *look* valid to qSA, warn and try quoting what we think is the value
187
+ selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
188
+ return "[" + attr + op + "\"" + value + "\"]";
189
+ } );
190
+
191
+ // If the regexp *may* have created an invalid selector, don't update it
192
+ // Note that there may be false alarms if selector uses jQuery extensions
193
+ try {
194
+ window.document.querySelector( selector );
195
+ migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] );
196
+ args[ 0 ] = selector;
197
+ } catch ( err2 ) {
198
+ migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] );
199
+ }
200
+ }
201
+ }
202
+
203
+ return oldFind.apply( this, args );
204
+ };
205
+
206
+ // Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
207
+ for ( findProp in oldFind ) {
208
+ if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
209
+ jQuery.find[ findProp ] = oldFind[ findProp ];
210
+ }
211
+ }
212
+
213
+ // The number of elements contained in the matched element set
214
+ migrateWarnFunc( jQuery.fn, "size", function() {
215
+ return this.length;
216
+ },
217
+ "jQuery.fn.size() is deprecated and removed; use the .length property" );
218
+
219
+ migrateWarnFunc( jQuery, "parseJSON", function() {
220
+ return JSON.parse.apply( null, arguments );
221
+ },
222
+ "jQuery.parseJSON is deprecated; use JSON.parse" );
223
+
224
+ migrateWarnFunc( jQuery, "holdReady", jQuery.holdReady,
225
+ "jQuery.holdReady is deprecated" );
226
+
227
+ migrateWarnFunc( jQuery, "unique", jQuery.uniqueSort,
228
+ "jQuery.unique is deprecated; use jQuery.uniqueSort" );
229
+
230
+ // Now jQuery.expr.pseudos is the standard incantation
231
+ migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos,
232
+ "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" );
233
+ migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos,
234
+ "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos" );
235
+
236
+ // Prior to jQuery 3.1.1 there were internal refs so we don't warn there
237
+ if ( jQueryVersionSince( "3.1.1" ) ) {
238
+ migrateWarnFunc( jQuery, "trim", function( text ) {
239
+ return text == null ?
240
+ "" :
241
+ ( text + "" ).replace( rtrim, "" );
242
+ },
243
+ "jQuery.trim is deprecated; use String.prototype.trim" );
244
+ }
245
+
246
+ // Prior to jQuery 3.2 there were internal refs so we don't warn there
247
+ if ( jQueryVersionSince( "3.2.0" ) ) {
248
+ migrateWarnFunc( jQuery, "nodeName", function( elem, name ) {
249
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
250
+ },
251
+ "jQuery.nodeName is deprecated" );
252
+
253
+ migrateWarnFunc( jQuery, "isArray", Array.isArray,
254
+ "jQuery.isArray is deprecated; use Array.isArray"
255
+ );
256
+ }
257
+
258
+ if ( jQueryVersionSince( "3.3.0" ) ) {
259
+
260
+ migrateWarnFunc( jQuery, "isNumeric", function( obj ) {
261
+
262
+ // As of jQuery 3.0, isNumeric is limited to
263
+ // strings and numbers (primitives or objects)
264
+ // that can be coerced to finite numbers (gh-2662)
265
+ var type = typeof obj;
266
+ return ( type === "number" || type === "string" ) &&
267
+
268
+ // parseFloat NaNs numeric-cast false positives ("")
269
+ // ...but misinterprets leading-number strings, e.g. hex literals ("0x...")
270
+ // subtraction forces infinities to NaN
271
+ !isNaN( obj - parseFloat( obj ) );
272
+ },
273
+ "jQuery.isNumeric() is deprecated"
274
+ );
275
+
276
+ // Populate the class2type map
277
+ jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".
278
+ split( " " ),
279
+ function( _, name ) {
280
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
281
+ } );
282
+
283
+ migrateWarnFunc( jQuery, "type", function( obj ) {
284
+ if ( obj == null ) {
285
+ return obj + "";
286
+ }
287
+
288
+ // Support: Android <=2.3 only (functionish RegExp)
289
+ return typeof obj === "object" || typeof obj === "function" ?
290
+ class2type[ Object.prototype.toString.call( obj ) ] || "object" :
291
+ typeof obj;
292
+ },
293
+ "jQuery.type is deprecated" );
294
+
295
+ migrateWarnFunc( jQuery, "isFunction",
296
+ function( obj ) {
297
+ return typeof obj === "function";
298
+ },
299
+ "jQuery.isFunction() is deprecated" );
300
+
301
+ migrateWarnFunc( jQuery, "isWindow",
302
+ function( obj ) {
303
+ return obj != null && obj === obj.window;
304
+ },
305
+ "jQuery.isWindow() is deprecated"
306
+ );
307
+ }
308
+
309
+ // Support jQuery slim which excludes the ajax module
310
+ if ( jQuery.ajax ) {
311
+
312
+ var oldAjax = jQuery.ajax,
313
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
314
+
315
+ jQuery.ajax = function( ) {
316
+ var jQXHR = oldAjax.apply( this, arguments );
317
+
318
+ // Be sure we got a jQXHR (e.g., not sync)
319
+ if ( jQXHR.promise ) {
320
+ migrateWarnFunc( jQXHR, "success", jQXHR.done,
321
+ "jQXHR.success is deprecated and removed" );
322
+ migrateWarnFunc( jQXHR, "error", jQXHR.fail,
323
+ "jQXHR.error is deprecated and removed" );
324
+ migrateWarnFunc( jQXHR, "complete", jQXHR.always,
325
+ "jQXHR.complete is deprecated and removed" );
326
+ }
327
+
328
+ return jQXHR;
329
+ };
330
+
331
+ // Only trigger the logic in jQuery <4 as the JSON-to-JSONP auto-promotion
332
+ // behavior is gone in jQuery 4.0 and as it has security implications, we don't
333
+ // want to restore the legacy behavior.
334
+ if ( !jQueryVersionSince( "4.0.0" ) ) {
335
+
336
+ // Register this prefilter before the jQuery one. Otherwise, a promoted
337
+ // request is transformed into one with the script dataType and we can't
338
+ // catch it anymore.
339
+ jQuery.ajaxPrefilter( "+json", function( s ) {
340
+
341
+ // Warn if JSON-to-JSONP auto-promotion happens.
342
+ if ( s.jsonp !== false && ( rjsonp.test( s.url ) ||
343
+ typeof s.data === "string" &&
344
+ ( s.contentType || "" )
345
+ .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
346
+ rjsonp.test( s.data )
347
+ ) ) {
348
+ migrateWarn( "JSON-to-JSONP auto-promotion is deprecated" );
349
+ }
350
+ } );
351
+ }
352
+
353
+ }
354
+
355
+ var oldRemoveAttr = jQuery.fn.removeAttr,
356
+ oldToggleClass = jQuery.fn.toggleClass,
357
+ rmatchNonSpace = /\S+/g;
358
+
359
+ jQuery.fn.removeAttr = function( name ) {
360
+ var self = this;
361
+
362
+ jQuery.each( name.match( rmatchNonSpace ), function( _i, attr ) {
363
+ if ( jQuery.expr.match.bool.test( attr ) ) {
364
+ migrateWarn( "jQuery.fn.removeAttr no longer sets boolean properties: " + attr );
365
+ self.prop( attr, false );
366
+ }
367
+ } );
368
+
369
+ return oldRemoveAttr.apply( this, arguments );
370
+ };
371
+
372
+ jQuery.fn.toggleClass = function( state ) {
373
+
374
+ // Only deprecating no-args or single boolean arg
375
+ if ( state !== undefined && typeof state !== "boolean" ) {
376
+ return oldToggleClass.apply( this, arguments );
377
+ }
378
+
379
+ migrateWarn( "jQuery.fn.toggleClass( boolean ) is deprecated" );
380
+
381
+ // Toggle entire class name of each element
382
+ return this.each( function() {
383
+ var className = this.getAttribute && this.getAttribute( "class" ) || "";
384
+
385
+ if ( className ) {
386
+ jQuery.data( this, "__className__", className );
387
+ }
388
+
389
+ // If the element has a class name or if we're passed `false`,
390
+ // then remove the whole classname (if there was one, the above saved it).
391
+ // Otherwise bring back whatever was previously saved (if anything),
392
+ // falling back to the empty string if nothing was stored.
393
+ if ( this.setAttribute ) {
394
+ this.setAttribute( "class",
395
+ className || state === false ?
396
+ "" :
397
+ jQuery.data( this, "__className__" ) || ""
398
+ );
399
+ }
400
+ } );
401
+ };
402
+
403
+ function camelCase( string ) {
404
+ return string.replace( /-([a-z])/g, function( _, letter ) {
405
+ return letter.toUpperCase();
406
+ } );
407
+ }
408
+
409
+ var oldFnCss,
410
+ internalSwapCall = false,
411
+ ralphaStart = /^[a-z]/,
412
+
413
+ // The regex visualized:
414
+ //
415
+ // /----------\
416
+ // | | /-------\
417
+ // | / Top \ | | |
418
+ // /--- Border ---+-| Right |-+---+- Width -+---\
419
+ // | | Bottom | |
420
+ // | \ Left / |
421
+ // | |
422
+ // | /----------\ |
423
+ // | /-------------\ | | |- END
424
+ // | | | | / Top \ | |
425
+ // | | / Margin \ | | | Right | | |
426
+ // |---------+-| |-+---+-| Bottom |-+----|
427
+ // | \ Padding / \ Left / |
428
+ // BEGIN -| |
429
+ // | /---------\ |
430
+ // | | | |
431
+ // | | / Min \ | / Width \ |
432
+ // \--------------+-| |-+---| |---/
433
+ // \ Max / \ Height /
434
+ rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;
435
+
436
+ // If this version of jQuery has .swap(), don't false-alarm on internal uses
437
+ if ( jQuery.swap ) {
438
+ jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
439
+ var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
440
+
441
+ if ( oldHook ) {
442
+ jQuery.cssHooks[ name ].get = function() {
443
+ var ret;
444
+
445
+ internalSwapCall = true;
446
+ ret = oldHook.apply( this, arguments );
447
+ internalSwapCall = false;
448
+ return ret;
449
+ };
450
+ }
451
+ } );
452
+ }
453
+
454
+ jQuery.swap = function( elem, options, callback, args ) {
455
+ var ret, name,
456
+ old = {};
457
+
458
+ if ( !internalSwapCall ) {
459
+ migrateWarn( "jQuery.swap() is undocumented and deprecated" );
460
+ }
461
+
462
+ // Remember the old values, and insert the new ones
463
+ for ( name in options ) {
464
+ old[ name ] = elem.style[ name ];
465
+ elem.style[ name ] = options[ name ];
466
+ }
467
+
468
+ ret = callback.apply( elem, args || [] );
469
+
470
+ // Revert the old values
471
+ for ( name in options ) {
472
+ elem.style[ name ] = old[ name ];
473
+ }
474
+
475
+ return ret;
476
+ };
477
+
478
+ if ( jQueryVersionSince( "3.4.0" ) && typeof Proxy !== "undefined" ) {
479
+
480
+ jQuery.cssProps = new Proxy( jQuery.cssProps || {}, {
481
+ set: function() {
482
+ migrateWarn( "JQMIGRATE: jQuery.cssProps is deprecated" );
483
+ return Reflect.set.apply( this, arguments );
484
+ }
485
+ } );
486
+ }
487
+
488
+ // Create a dummy jQuery.cssNumber if missing. It won't be used by jQuery but
489
+ // it will prevent code adding new keys to it unconditionally from crashing.
490
+ if ( !jQuery.cssNumber ) {
491
+ jQuery.cssNumber = {};
492
+ }
493
+
494
+ function isAutoPx( prop ) {
495
+
496
+ // The first test is used to ensure that:
497
+ // 1. The prop starts with a lowercase letter (as we uppercase it for the second regex).
498
+ // 2. The prop is not empty.
499
+ return ralphaStart.test( prop ) &&
500
+ rautoPx.test( prop[ 0 ].toUpperCase() + prop.slice( 1 ) );
501
+ }
502
+
503
+ oldFnCss = jQuery.fn.css;
504
+
505
+ jQuery.fn.css = function( name, value ) {
506
+ var camelName,
507
+ origThis = this;
508
+ if ( name && typeof name === "object" && !Array.isArray( name ) ) {
509
+ jQuery.each( name, function( n, v ) {
510
+ jQuery.fn.css.call( origThis, n, v );
511
+ } );
512
+ return this;
513
+ }
514
+ if ( typeof value === "number" ) {
515
+ camelName = camelCase( name );
516
+ if ( !isAutoPx( camelName ) && !jQuery.cssNumber[ camelName ] ) {
517
+ migrateWarn( "Number-typed values are deprecated for jQuery.fn.css( \"" +
518
+ name + "\", value )" );
519
+ }
520
+ }
521
+
522
+ return oldFnCss.apply( this, arguments );
523
+ };
524
+
525
+ var oldData = jQuery.data;
526
+
527
+ jQuery.data = function( elem, name, value ) {
528
+ var curData, sameKeys, key;
529
+
530
+ // Name can be an object, and each entry in the object is meant to be set as data
531
+ if ( name && typeof name === "object" && arguments.length === 2 ) {
532
+ curData = jQuery.hasData( elem ) && oldData.call( this, elem );
533
+ sameKeys = {};
534
+ for ( key in name ) {
535
+ if ( key !== camelCase( key ) ) {
536
+ migrateWarn( "jQuery.data() always sets/gets camelCased names: " + key );
537
+ curData[ key ] = name[ key ];
538
+ } else {
539
+ sameKeys[ key ] = name[ key ];
540
+ }
541
+ }
542
+
543
+ oldData.call( this, elem, sameKeys );
544
+
545
+ return name;
546
+ }
547
+
548
+ // If the name is transformed, look for the un-transformed name in the data object
549
+ if ( name && typeof name === "string" && name !== camelCase( name ) ) {
550
+ curData = jQuery.hasData( elem ) && oldData.call( this, elem );
551
+ if ( curData && name in curData ) {
552
+ migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name );
553
+ if ( arguments.length > 2 ) {
554
+ curData[ name ] = value;
555
+ }
556
+ return curData[ name ];
557
+ }
558
+ }
559
+
560
+ return oldData.apply( this, arguments );
561
+ };
562
+
563
+ // Support jQuery slim which excludes the effects module
564
+ if ( jQuery.fx ) {
565
+
566
+ var intervalValue, intervalMsg,
567
+ oldTweenRun = jQuery.Tween.prototype.run,
568
+ linearEasing = function( pct ) {
569
+ return pct;
570
+ };
571
+
572
+ jQuery.Tween.prototype.run = function( ) {
573
+ if ( jQuery.easing[ this.easing ].length > 1 ) {
574
+ migrateWarn(
575
+ "'jQuery.easing." + this.easing.toString() + "' should use only one argument"
576
+ );
577
+
578
+ jQuery.easing[ this.easing ] = linearEasing;
579
+ }
580
+
581
+ oldTweenRun.apply( this, arguments );
582
+ };
583
+
584
+ intervalValue = jQuery.fx.interval || 13;
585
+ intervalMsg = "jQuery.fx.interval is deprecated";
586
+
587
+ // Support: IE9, Android <=4.4
588
+ // Avoid false positives on browsers that lack rAF
589
+ // Don't warn if document is hidden, jQuery uses setTimeout (#292)
590
+ if ( window.requestAnimationFrame ) {
591
+ Object.defineProperty( jQuery.fx, "interval", {
592
+ configurable: true,
593
+ enumerable: true,
594
+ get: function() {
595
+ if ( !window.document.hidden ) {
596
+ migrateWarn( intervalMsg );
597
+ }
598
+ return intervalValue;
599
+ },
600
+ set: function( newValue ) {
601
+ migrateWarn( intervalMsg );
602
+ intervalValue = newValue;
603
+ }
604
+ } );
605
+ }
606
+
607
+ }
608
+
609
+ var oldLoad = jQuery.fn.load,
610
+ oldEventAdd = jQuery.event.add,
611
+ originalFix = jQuery.event.fix;
612
+
613
+ jQuery.event.props = [];
614
+ jQuery.event.fixHooks = {};
615
+
616
+ migrateWarnProp( jQuery.event.props, "concat", jQuery.event.props.concat,
617
+ "jQuery.event.props.concat() is deprecated and removed" );
618
+
619
+ jQuery.event.fix = function( originalEvent ) {
620
+ var event,
621
+ type = originalEvent.type,
622
+ fixHook = this.fixHooks[ type ],
623
+ props = jQuery.event.props;
624
+
625
+ if ( props.length ) {
626
+ migrateWarn( "jQuery.event.props are deprecated and removed: " + props.join() );
627
+ while ( props.length ) {
628
+ jQuery.event.addProp( props.pop() );
629
+ }
630
+ }
631
+
632
+ if ( fixHook && !fixHook._migrated_ ) {
633
+ fixHook._migrated_ = true;
634
+ migrateWarn( "jQuery.event.fixHooks are deprecated and removed: " + type );
635
+ if ( ( props = fixHook.props ) && props.length ) {
636
+ while ( props.length ) {
637
+ jQuery.event.addProp( props.pop() );
638
+ }
639
+ }
640
+ }
641
+
642
+ event = originalFix.call( this, originalEvent );
643
+
644
+ return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
645
+ };
646
+
647
+ jQuery.event.add = function( elem, types ) {
648
+
649
+ // This misses the multiple-types case but that seems awfully rare
650
+ if ( elem === window && types === "load" && window.document.readyState === "complete" ) {
651
+ migrateWarn( "jQuery(window).on('load'...) called after load event occurred" );
652
+ }
653
+ return oldEventAdd.apply( this, arguments );
654
+ };
655
+
656
+ jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
657
+
658
+ jQuery.fn[ name ] = function() {
659
+ var args = Array.prototype.slice.call( arguments, 0 );
660
+
661
+ // If this is an ajax load() the first arg should be the string URL;
662
+ // technically this could also be the "Anything" arg of the event .load()
663
+ // which just goes to show why this dumb signature has been deprecated!
664
+ // jQuery custom builds that exclude the Ajax module justifiably die here.
665
+ if ( name === "load" && typeof args[ 0 ] === "string" ) {
666
+ return oldLoad.apply( this, args );
667
+ }
668
+
669
+ migrateWarn( "jQuery.fn." + name + "() is deprecated" );
670
+
671
+ args.splice( 0, 0, name );
672
+ if ( arguments.length ) {
673
+ return this.on.apply( this, args );
674
+ }
675
+
676
+ // Use .triggerHandler here because:
677
+ // - load and unload events don't need to bubble, only applied to window or image
678
+ // - error event should not bubble to window, although it does pre-1.7
679
+ // See http://bugs.jquery.com/ticket/11820
680
+ this.triggerHandler.apply( this, args );
681
+ return this;
682
+ };
683
+
684
+ } );
685
+
686
+ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
687
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
688
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
689
+ function( _i, name ) {
690
+
691
+ // Handle event binding
692
+ jQuery.fn[ name ] = function( data, fn ) {
693
+ migrateWarn( "jQuery.fn." + name + "() event shorthand is deprecated" );
694
+ return arguments.length > 0 ?
695
+ this.on( name, null, data, fn ) :
696
+ this.trigger( name );
697
+ };
698
+ } );
699
+
700
+ // Trigger "ready" event only once, on document ready
701
+ jQuery( function() {
702
+ jQuery( window.document ).triggerHandler( "ready" );
703
+ } );
704
+
705
+ jQuery.event.special.ready = {
706
+ setup: function() {
707
+ if ( this === window.document ) {
708
+ migrateWarn( "'ready' event is deprecated" );
709
+ }
710
+ }
711
+ };
712
+
713
+ jQuery.fn.extend( {
714
+
715
+ bind: function( types, data, fn ) {
716
+ migrateWarn( "jQuery.fn.bind() is deprecated" );
717
+ return this.on( types, null, data, fn );
718
+ },
719
+ unbind: function( types, fn ) {
720
+ migrateWarn( "jQuery.fn.unbind() is deprecated" );
721
+ return this.off( types, null, fn );
722
+ },
723
+ delegate: function( selector, types, data, fn ) {
724
+ migrateWarn( "jQuery.fn.delegate() is deprecated" );
725
+ return this.on( types, selector, data, fn );
726
+ },
727
+ undelegate: function( selector, types, fn ) {
728
+ migrateWarn( "jQuery.fn.undelegate() is deprecated" );
729
+ return arguments.length === 1 ?
730
+ this.off( selector, "**" ) :
731
+ this.off( types, selector || "**", fn );
732
+ },
733
+ hover: function( fnOver, fnOut ) {
734
+ migrateWarn( "jQuery.fn.hover() is deprecated" );
735
+ return this.on( "mouseenter", fnOver ).on( "mouseleave", fnOut || fnOver );
736
+ }
737
+ } );
738
+
739
+ var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
740
+ origHtmlPrefilter = jQuery.htmlPrefilter,
741
+ makeMarkup = function( html ) {
742
+ var doc = window.document.implementation.createHTMLDocument( "" );
743
+ doc.body.innerHTML = html;
744
+ return doc.body && doc.body.innerHTML;
745
+ },
746
+ warnIfChanged = function( html ) {
747
+ var changed = html.replace( rxhtmlTag, "<$1></$2>" );
748
+ if ( changed !== html && makeMarkup( html ) !== makeMarkup( changed ) ) {
749
+ migrateWarn( "HTML tags must be properly nested and closed: " + html );
750
+ }
751
+ };
752
+
753
+ jQuery.UNSAFE_restoreLegacyHtmlPrefilter = function() {
754
+ jQuery.htmlPrefilter = function( html ) {
755
+ warnIfChanged( html );
756
+ return html.replace( rxhtmlTag, "<$1></$2>" );
757
+ };
758
+ };
759
+
760
+ jQuery.htmlPrefilter = function( html ) {
761
+ warnIfChanged( html );
762
+ return origHtmlPrefilter( html );
763
+ };
764
+
765
+ var oldOffset = jQuery.fn.offset;
766
+
767
+ jQuery.fn.offset = function() {
768
+ var elem = this[ 0 ];
769
+
770
+ if ( elem && ( !elem.nodeType || !elem.getBoundingClientRect ) ) {
771
+ migrateWarn( "jQuery.fn.offset() requires a valid DOM element" );
772
+ return arguments.length ? this : undefined;
773
+ }
774
+
775
+ return oldOffset.apply( this, arguments );
776
+ };
777
+
778
+ // Support jQuery slim which excludes the ajax module
779
+ // The jQuery.param patch is about respecting `jQuery.ajaxSettings.traditional`
780
+ // so it doesn't make sense for the slim build.
781
+ if ( jQuery.ajax ) {
782
+
783
+ var oldParam = jQuery.param;
784
+
785
+ jQuery.param = function( data, traditional ) {
786
+ var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
787
+
788
+ if ( traditional === undefined && ajaxTraditional ) {
789
+
790
+ migrateWarn( "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" );
791
+ traditional = ajaxTraditional;
792
+ }
793
+
794
+ return oldParam.call( this, data, traditional );
795
+ };
796
+
797
+ }
798
+
799
+ var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
800
+
801
+ jQuery.fn.andSelf = function() {
802
+ migrateWarn( "jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()" );
803
+ return oldSelf.apply( this, arguments );
804
+ };
805
+
806
+ // Support jQuery slim which excludes the deferred module in jQuery 4.0+
807
+ if ( jQuery.Deferred ) {
808
+
809
+ var oldDeferred = jQuery.Deferred,
810
+ tuples = [
811
+
812
+ // Action, add listener, callbacks, .then handlers, final state
813
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
814
+ jQuery.Callbacks( "once memory" ), "resolved" ],
815
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
816
+ jQuery.Callbacks( "once memory" ), "rejected" ],
817
+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
818
+ jQuery.Callbacks( "memory" ) ]
819
+ ];
820
+
821
+ jQuery.Deferred = function( func ) {
822
+ var deferred = oldDeferred(),
823
+ promise = deferred.promise();
824
+
825
+ deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
826
+ var fns = arguments;
827
+
828
+ migrateWarn( "deferred.pipe() is deprecated" );
829
+
830
+ return jQuery.Deferred( function( newDefer ) {
831
+ jQuery.each( tuples, function( i, tuple ) {
832
+ var fn = typeof fns[ i ] === "function" && fns[ i ];
833
+
834
+ // Deferred.done(function() { bind to newDefer or newDefer.resolve })
835
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
836
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
837
+ deferred[ tuple[ 1 ] ]( function() {
838
+ var returned = fn && fn.apply( this, arguments );
839
+ if ( returned && typeof returned.promise === "function" ) {
840
+ returned.promise()
841
+ .done( newDefer.resolve )
842
+ .fail( newDefer.reject )
843
+ .progress( newDefer.notify );
844
+ } else {
845
+ newDefer[ tuple[ 0 ] + "With" ](
846
+ this === promise ? newDefer.promise() : this,
847
+ fn ? [ returned ] : arguments
848
+ );
849
+ }
850
+ } );
851
+ } );
852
+ fns = null;
853
+ } ).promise();
854
+
855
+ };
856
+
857
+ if ( func ) {
858
+ func.call( deferred, deferred );
859
+ }
860
+
861
+ return deferred;
862
+ };
863
+
864
+ // Preserve handler of uncaught exceptions in promise chains
865
+ jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook;
866
+
867
+ }
868
+
869
+ return jQuery;
870
+ } );
readme.txt CHANGED
@@ -1,26 +1,49 @@
1
  === Enable jQuery Migrate Helper ===
2
  Contributors: wordpressdotorg, clorith, azaozz
 
3
  Requires at least: 5.4
4
- Tested up to: 5.5
5
- Stable tag: 1.1.0
6
  Requires PHP: 5.6
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
 
 
10
  == Description ==
11
 
12
- With the update to WordPress 5.5, a migration tool known as `jquery-migrate` will no longer be enabled by default. This may lead to unexpected behaviors in some themes or plugins who run older code.
13
 
14
  This plugin serves as a temporary solution, enabling the migration script for your site to give your plugin and theme authors some more time to update, and test, their code.
15
 
 
 
 
 
 
 
 
 
16
  == Frequently Asked Questions ==
17
 
18
- = What does it mean that something is "deprecated" =
19
  A script, a file, or some other piece of code is deprecated when its developers are in the process of replacing it with more modern code or removing it entirely.
20
 
 
 
 
 
21
  = How do I find and use the browser console =
22
  WordPress.org has an article about [using the browsers console log to diagnose JavaScript errors](https://wordpress.org/support/article/using-your-browser-to-diagnose-javascript-errors/).
23
 
 
 
 
 
 
 
 
 
24
  == Installation ==
25
 
26
  1. Upload to your plugins folder, usually `wp-content/plugins/`.
@@ -29,6 +52,20 @@ WordPress.org has an article about [using the browsers console log to diagnose J
29
 
30
  == Changelog ==
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  = v 1.1.0 =
33
  * Added option to dismiss deprecation notices in backend
34
  * Added logging of deprecation notices in the front end
1
  === Enable jQuery Migrate Helper ===
2
  Contributors: wordpressdotorg, clorith, azaozz
3
+ Tags: jquery, javascript, update
4
  Requires at least: 5.4
5
+ Tested up to: 5.6
6
+ Stable tag: 1.2.0
7
  Requires PHP: 5.6
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
11
+ Get information about calls to deprecated jQuery features in plugins or themes.
12
+
13
  == Description ==
14
 
15
+ With the update to WordPress 5.5, a migration tool known as `jquery-migrate` was no longer enabled by default. This may lead to lacking functionality or unexpected behavior in some themes or plugins that run older code.
16
 
17
  This plugin serves as a temporary solution, enabling the migration script for your site to give your plugin and theme authors some more time to update, and test, their code.
18
 
19
+ ---
20
+
21
+ With the update to WordPress 5.6, the included version of jQuery is also upgraded. This means that old code that previously caused warnings now may instead may cause errors or stop working entirely.
22
+
23
+ Some of the features no longer working will just stop working behind the scenes without any apparent problem.
24
+
25
+ The plugin will let you downgrade to a previous version of jQuery for a period, but as a site administrator you are encouraged to get the underlying issue fixed.
26
+
27
  == Frequently Asked Questions ==
28
 
29
+ = What does it mean that something is deprecated =
30
  A script, a file, or some other piece of code is deprecated when its developers are in the process of replacing it with more modern code or removing it entirely.
31
 
32
+ = What happens after WordPress 5.6 =
33
+ With the release of WordPress 5.6, the jQuery version also gets updated. This means that plugins or themes that previously caused deprecation warnings now instead will cause errors.
34
+ This plugin will allow you to, temporarily, return to the previous version of jQuery if this happens (it will also try to do so automatically for website visitors the first time an error happens) allowing you to fix the code, or replace it.
35
+
36
  = How do I find and use the browser console =
37
  WordPress.org has an article about [using the browsers console log to diagnose JavaScript errors](https://wordpress.org/support/article/using-your-browser-to-diagnose-javascript-errors/).
38
 
39
+ = How do I know if I need this plugin, or not=
40
+ If something isn’t working correctly on your site after you upgraded WordPress, then you can simply try installing and activating this plugin. If this helps, then you leave this plugin activated and follow the instructions in the plugin. The plugin will tell you when you don’t need it any more.
41
+
42
+ = There are a lot of deprecation warnings when using jQuery version 3 =
43
+ As jQuery version 3 is very new to WordPress, this is expected.
44
+
45
+ Deprecated notices means that the Migration tool is in place making sure these features still continue working while the related code is updated.
46
+
47
  == Installation ==
48
 
49
  1. Upload to your plugins folder, usually `wp-content/plugins/`.
52
 
53
  == Changelog ==
54
 
55
+ = v 1.2.0 =
56
+ * Added settings page
57
+ * Added option for downgrading to legacy jQuery
58
+ * Added automatic downgrades
59
+ * Added option to log deprecations in modern jQuery
60
+ * Added e-mail notifications
61
+ * Added weekly email digest of deprecations
62
+ * Added option to allow logging deprecations from anonymous site visitors
63
+ * Changed the handling of inline JavaScript code causing deprecation notices
64
+ * Changed the admin bar to be two fixed links to avoid ever changing contexts
65
+ * Changed the admin notices to be persistent when using legacy jQuery after upgrading to WordPress 5.6
66
+ * Changed how concatenation is disabled, to address public-facing performance concerns
67
+ * Fixed recommendation to remove plugin when not logging any deprecations having the wrong logic and not being displayed.
68
+
69
  = v 1.1.0 =
70
  * Added option to dismiss deprecation notices in backend
71
  * Added logging of deprecation notices in the front end
templates/admin-notices/deprecated-scripts.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin notice template showing live deprecation notices.
4
+ */
5
+
6
+ if ( ! defined( 'ABSPATH' ) ) {
7
+ die( 'Invalid request.' );
8
+ }
9
+
10
+ ?>
11
+ <div class="notice notice-error is-dismissible jquery-migrate-dashboard-notice jquery-migrate-deprecation-notice hidden" data-notice-id="jquery-migrate-deprecation-list">
12
+ <h2><?php _ex( 'jQuery Migrate Helper', 'Admin notice header', 'enable-jquery-migrate-helper' ); ?> &mdash; <?php _ex( 'Warnings encountered', 'enable-jquery-migrate-helper' ); ?></h2>
13
+ <p><?php _e( 'This page generated the following warnings:', 'enable-jquery-migrate-helper' ); ?></p>
14
+
15
+ <ol class="jquery-migrate-deprecation-list"></ol>
16
+
17
+ <p>
18
+ <?php _e( 'Please make sure you are using the latest version of all of your plugins, and your theme. If that is the case, then you may want to ask the developers of the code mentioned in your warnings to update it.', 'enable-jquery-migrate-helper' ); ?>
19
+ </p>
20
+
21
+ <?php wp_nonce_field( 'jquery-migrate-deprecation-list', 'jquery-migrate-deprecation-list-nonce', false ); ?>
22
+ </div>
templates/admin-notices/no-longer-needed.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin notice template encouraging removal of this plugin when it may no longer be needed.
4
+ */
5
+
6
+ if ( ! defined( 'ABSPATH' ) ) {
7
+ die( 'Invalid request.' );
8
+ }
9
+
10
+ ?>
11
+ <div class="notice notice-warning is-dismissible jquery-migrate-dashboard-notice" data-notice-id="jquery-migrate-no-deprecations-notice">
12
+ <h2><?php _ex( 'jQuery Migrate Helper', 'Admin notice header', 'enable-jquery-migrate-helper' ); ?></h2>
13
+
14
+ <p>
15
+ <?php _e( 'No deprecations have been logged on this site in a while, you may no longer need this plugin.', 'enable-jquery-migrate-helper' ); ?>
16
+ </p>
17
+
18
+ <p>
19
+ <?php _e( 'Please note that not all jQuery deprecation notices are recorded in the log. Deprecation notices that occur on public pages (front end) are recorded. Notices from the admin pages (back end) are only recorded if the immediate deprecation notices in the admin bar are turned off. Also keep in mind that under WordPress 5.6 logging of deprecation notices are only logged if logging is specifically enabled by the user.', 'enable-jquery-migrate-helper' ); ?>
20
+ </p>
21
+
22
+ <p>
23
+ <?php _e( 'This means you should still check that things work as expected after you have disabled the plugin, and if you know there have been warnings in the admin pages, you may still need to reach out to the authors of the affected plugin or theme.', 'enable-jquery-migrate-helper' ); ?>
24
+ </p>
25
+
26
+ <?php if ( ! is_wp_version_compatible( '5.5.1' ) ) : ?>
27
+
28
+ <p>
29
+ <strong>
30
+ <?php _e( 'You are using a WordPress version prior to 5.5.1. This plugin also helps with a bug found in WordPress 5.5.0. Please update WordPress to version 5.5.1, or later, before deactivating this plugin.', 'enable-jquery-migrate-helper' ); ?>
31
+ </strong>
32
+ </p>
33
+
34
+ <?php endif; ?>
35
+
36
+ <?php wp_nonce_field( 'jquery-migrate-no-deprecations-notice', 'jquery-migrate-no-deprecations-notice-nonce', false ); ?>
37
+ </div>
templates/admin-notices/welcome.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin notice template for the plugins welcome message.
4
+ */
5
+
6
+ if ( ! defined( 'ABSPATH' ) ) {
7
+ die( 'Invalid request.' );
8
+ }
9
+
10
+ ?>
11
+ <div class="notice <?php echo ( 'no' !== get_option( '_jquery_migrate_downgrade_version', 'no' ) ? 'notice-error' : 'notice-warning is-dismissible' ); ?> jquery-migrate-dashboard-notice" data-notice-id="jquery-migrate-notice">
12
+ <h2><?php _ex( 'jQuery Migrate Helper', 'Admin notice header', 'enable-jquery-migrate-helper' ); ?></h2>
13
+ <p>
14
+ <?php _e( 'Right now, you are using a plugin to support some old code in this website’s jQuery JavaScript library. That code is deprecated, meaning it is basically obsolete and is losing the support of your themes and plugins and WordPress itself.', 'enable-jquery-migrate-helper' ); ?>
15
+ <br>
16
+ <strong>
17
+ <?php _e( 'This plugin, called Enable jQuery Migrate Helper, is not a fix. It is a temporary solution to give your plugin and theme authors time to update.', 'enable-jquery-migrate-helper' ); ?>
18
+ </strong>
19
+ </p>
20
+
21
+ <p>
22
+ <?php _e( 'If you get warnings, please check for updated versions of the plugin or theme that generated the warning. There will very likely be one you can install. When you have updated your plugins and themes, and there are no more warnings, please deactivate Enable jQuery Migrate Helper.', 'enable-jquery-migrate-helper' ); ?>
23
+ </p>
24
+
25
+ <?php if ( 'no' !== get_option( '_jquery_migrate_downgrade_version', 'no' ) ) : ?>
26
+ <p>
27
+ <strong>
28
+ <?php _e( 'You are currently using a legacy version of jQuery. It has no support and doesn’t receive security updates. Please upgrade as soon as possible.', 'enable-jquery-migrate-helper' ); ?>
29
+ </strong>
30
+ </p>
31
+ <?php endif; ?>
32
+
33
+ <p>
34
+ <a href="<?php echo esc_url( admin_url( 'tools.php?page=jqmh' ) ); ?>"><?php _e( 'Plugin settings', 'enable-jquery-migrate-helper' ); ?></a> | <a href="<?php echo esc_url( admin_url( 'tools.php?page=jqmh&tab=logs' ) ); ?>"><?php _e( 'Logged deprecations', 'enable-jquery-migrate-helper' ); ?></a>
35
+ </p>
36
+
37
+ <?php wp_nonce_field( 'jquery-migrate-notice', 'jquery-migrate-notice-nonce', false ); ?>
38
+ </div>
templates/email/automatic-downgrade.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Template for automatic downgrade email.
4
+ */
5
+
6
+ if ( ! defined( 'ABSPATH' ) ) {
7
+ die( 'Invalid request.' );
8
+ }
9
+
10
+ ?>
11
+
12
+ <p>
13
+ <?php _e( 'Greetings!', 'enable-jquery-migrate-helper' ); ?>
14
+ </p>
15
+
16
+ <p>
17
+ <?php _e( 'This is a one-time, automated, message to inform you that the jQuery version on your site has been automatically downgraded to the legacy 1.12.4-wp version.', 'enable-jquery-migrate-helper' ); ?>
18
+ </p>
19
+
20
+ <p>
21
+ <?php _e( 'This happened because you, or a visitor to your site, viewed a page that was using one or more deprecated jQuery features which are no longer in use. As the feature being used is no longer maintained, this caused an error. In order to maintain the expected user experience, this automatic downgrade was performed.', 'enable-jquery-migrate-helper' ); ?>
22
+ </p>
23
+
24
+ <p>
25
+ <?php
26
+ printf(
27
+ // translators: 1: Link to deprecation log page.
28
+ __( 'You can view captured and logged deprecations at %s', 'enable-jquery-migrate-helper' ),
29
+ admin_url( 'tools.php?page=jqmh&tab=logs' )
30
+ );
31
+ ?>
32
+ </p>
33
+
34
+ <p>
35
+ <span style="font-style: italic;">
36
+ <?php _e( 'This email was automatically generated by the Enable jQuery Migrate Helper plugin', 'enable-jquery-migrate-helper' ); ?>
37
+ </span>
38
+ </p>
templates/email/weekly.php ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Template for weekly scheduled email.
4
+ */
5
+
6
+ if ( ! defined( 'ABSPATH' ) ) {
7
+ die( 'Invalid request.' );
8
+ }
9
+
10
+ if ( ! function_exists( 'get_plugins' ) ) {
11
+ require_once trailingslashit( ABSPATH ) . 'wp-admin/includes/plugin.php';
12
+ }
13
+
14
+ $plugins = array();
15
+
16
+ foreach ( get_plugins() as $slug => $plugin ) {
17
+ $slug = explode( '/', $slug );
18
+ $plugins[ $slug[0] ] = $plugin;
19
+ }
20
+
21
+ $themes = wp_get_themes();
22
+
23
+ $logs = get_option( 'jqmh_logs', array() );
24
+ ?>
25
+
26
+ <p>
27
+ <?php _e( 'Greetings!', 'enable-jquery-migrate-helper' ); ?>
28
+ </p>
29
+
30
+ <p>
31
+ <?php _e( 'This is a weekly summary of the warnings still present on your site, relating to the jQuery library. These errors should be addressed as soon as possible.', 'enable-jquery-migrate-helper' ); ?>
32
+ </p>
33
+
34
+ <?php if ( 'yes' === get_option( '_jquery_migrate_downgrade_version', 'no' ) ) : ?>
35
+
36
+ <p>
37
+ <strong>
38
+ <?php _e( 'Your site is running a legacy version of jQuery, modern functionality is currently not available to your plugins, themes or WordPress itself.', 'enable-jquery-migrate-helper' ); ?>
39
+ </strong>
40
+ </p>
41
+
42
+ <?php endif; ?>
43
+
44
+ <?php if ( jQuery_Migrate_Helper::logged_migration_notice_count() < 1 ) : ?>
45
+
46
+ <p>
47
+ <?php _e( 'There have been no reported deprecations logged in the past week, maybe you no longer need this plugin?', 'enable-jquery-migrate-helper' ); ?>
48
+ </p>
49
+
50
+ <?php else : ?>
51
+
52
+ <p>
53
+ <?php _e( 'The following deprecations have been logged from the front-end of your site, or from your admin area while live deprecation notices were disabled.', 'enable-jquery-migrate-helper' ); ?>
54
+ </p>
55
+
56
+ <table style="background: #fff; border: 1px solid #ccd0d4;">
57
+ <thead>
58
+ <tr>
59
+ <th style="border-bottom: 1px solid #ccd0d4; text-align: left; padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php _ex( 'Time', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
60
+ <th style="border-bottom: 1px solid #ccd0d4; text-align: left; padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php _ex( 'Notice', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
61
+ <th style="border-bottom: 1px solid #ccd0d4; text-align: left; padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php _ex( 'Plugin or theme', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
62
+ <th style="border-bottom: 1px solid #ccd0d4; text-align: left; padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php _ex( 'File location', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
63
+ <th style="border-bottom: 1px solid #ccd0d4; text-align: left; padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php _ex( 'Triggered on page', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
64
+ </tr>
65
+ </thead>
66
+
67
+ <?php
68
+ $odd = true;
69
+ foreach ( $logs as $log ) :
70
+
71
+ preg_match( '/\/plugins\/(?P<slug>.+?)\/.+?: (?P<notice>.+)/', $log['notice'], $plugin );
72
+ preg_match( '/\/themes\/(?P<slug>.+?)\/.+?: (?P<notice>.+)/', $log['notice'], $theme );
73
+
74
+ $notice = $log['notice'];
75
+ // Translators: Undetermined source
76
+ $source = __( 'Undetermined', 'enable-jquery-migrate-helper' );
77
+ $file = __( 'Inline code, unknown file location', 'enable-jquery-migrate-helper' );
78
+
79
+ if ( ! empty( $plugin ) ) {
80
+ preg_match( '/(?P<path>https?:\/\/.+?):/', $log['notice'], $file );
81
+ $file = $file['path'];
82
+
83
+ $plugin_link = '#';
84
+
85
+ if ( isset( $plugins[ $plugin['slug'] ] ) ) {
86
+ $plugin_link = ( isset( $plugins[ $plugin['slug'] ]['PluginURI'] ) ? $plugins[ $plugin['slug'] ]['PluginURI'] : $plugins[ $plugin['slug'] ]['AuthorURI'] );
87
+ }
88
+
89
+ $notice = $plugin['notice'];
90
+ $source = sprintf(
91
+ // translators: 1: Linked name of the plugin throwing notices.
92
+ __( 'Plugin: %s', 'enable-jquery-migrate-helper' ),
93
+ sprintf(
94
+ '<a href="%s">%s</a>',
95
+ esc_url( $plugin_link ),
96
+ esc_html( ( isset( $plugins[ $plugin['slug'] ] ) ? $plugins[ $plugin['slug'] ]['Name'] : $plugin['slug'] ) )
97
+ )
98
+ );
99
+ } elseif ( ! empty( $theme ) ) {
100
+ preg_match( '/(?P<path>https?:\/\/.+?):/', $log['notice'], $file );
101
+ $file = $file['path'];
102
+
103
+ $theme_link = '#';
104
+
105
+ if ( isset( $themes[ $theme['slug'] ] ) ) {
106
+ $theme_link = $themes[ $theme['slug'] ]->get( 'ThemeURI' );
107
+ }
108
+
109
+ $notice = $theme['notice'];
110
+ $source = sprintf(
111
+ // translators: 1: Linked name of the theme throwing notices.
112
+ __( 'Theme: %s', 'enable-jquery-migrate-helper' ),
113
+ sprintf(
114
+ '<a href="%s">%s</a>',
115
+ esc_url( $theme_link ),
116
+ esc_html( ( isset( $themes[ $theme['slug'] ] ) ? $themes[ $theme['slug'] ]->get( 'Name' ) : $theme['slug'] ) )
117
+ )
118
+ );
119
+ }
120
+
121
+ ?>
122
+
123
+ <tr style="<?php echo ( $odd ? 'background-color: #f9f9f9;' : '' ); ?>">
124
+ <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php echo esc_html( $log['registered'] ); ?></td>
125
+ <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php echo esc_html( $notice ); ?></td>
126
+ <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php echo $source; ?></td>
127
+ <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php echo esc_html( $file ); ?></td>
128
+ <td style="padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php echo esc_html( $log['page'] ); ?></td>
129
+ </tr>
130
+
131
+ <?php if ( $odd ) { $odd = false; } else { $odd = true; } ?>
132
+
133
+ <?php endforeach; ?>
134
+ </tbody>
135
+
136
+ <tfoot>
137
+ <tr>
138
+ <th style="border-top: 1px solid #ccd0d4; text-align: left; padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php _ex( 'Time', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
139
+ <th style="border-top: 1px solid #ccd0d4; text-align: left; padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php _ex( 'Notice', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
140
+ <th style="border-top: 1px solid #ccd0d4; text-align: left; padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php _ex( 'Plugin or theme', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
141
+ <th style="border-top: 1px solid #ccd0d4; text-align: left; padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php _ex( 'File location', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
142
+ <th style="border-top: 1px solid #ccd0d4; text-align: left; padding-top: 8px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px;"><?php _ex( 'Page', 'Admin deprecation notices', 'enable-jquery-migrate-helper' ); ?></th>
143
+ </tr>
144
+ </tfoot>
145
+ </table>
146
+
147
+ <p>
148
+ <?php
149
+ printf(
150
+ // translators: 1: Link to deprecation log page.
151
+ __( 'You can view captured and logged deprecations at %s', 'enable-jquery-migrate-helper' ),
152
+ admin_url( 'tools.php?page=jqmh&tab=logs' )
153
+ );
154
+ ?>
155
+ </p>
156
+
157
+ <?php endif; ?>
158
+
159
+ <p>
160
+ &nbsp;
161
+ </p>
162
+
163
+ <p>
164
+ <span style="font-style: italic;">
165
+ <?php _e( 'This email was automatically generated by the Enable jQuery Migrate Helper plugin', 'enable-jquery-migrate-helper' ); ?>
166
+ </span>
167
+ </p>
uninstall.php CHANGED
@@ -11,5 +11,13 @@ if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
11
  delete_option( 'jqmh_logs' );
12
  delete_option( 'jqmh_last_log_time' );
13
  delete_option( '_jquery_migrate_dismissed_notice' );
 
 
 
14
  delete_option( '_jquery_migrate_deprecations_dismissed_notice' );
15
  delete_option( '_jquery_migrate_previous_deprecations_dismissed_notice' );
 
 
 
 
 
11
  delete_option( 'jqmh_logs' );
12
  delete_option( 'jqmh_last_log_time' );
13
  delete_option( '_jquery_migrate_dismissed_notice' );
14
+ delete_option( '_jquery_migrate_downgrade_version' );
15
+ delete_option( '_jquery_migrate_modern_deprecations' );
16
+ delete_option( '_jquery_migrate_public_deprecation_logging' );
17
  delete_option( '_jquery_migrate_deprecations_dismissed_notice' );
18
  delete_option( '_jquery_migrate_previous_deprecations_dismissed_notice' );
19
+ delete_option( '_jquery_migrate_has_auto_downgraded' );
20
+
21
+ if ( wp_next_scheduled( 'enable_jquery_migrate_helper_notification' ) ) {
22
+ wp_clear_scheduled_hook( 'enable_jquery_migrate_helper_notification' );
23
+ }