Version Description
(20.10.2021) = * Added: Compatibility with Wordpress 5.8 * Fixed: Minor bugs
Download this release
Release Info
Developer | alexkovalevv |
Plugin | Simple Google Analytics |
Version | 3.2.2 |
Comparing to | |
See all releases |
Code changes from version 3.1.1 to 3.2.2
- admin/activation.php +46 -46
- admin/boot.php +273 -273
- admin/options.php +174 -139
- admin/pages/class-pages-general-settings.php +97 -97
- admin/pages/class-pages-more-features.php +21 -21
- cache/local-ga.js +0 -74
- clearfy.php +56 -51
- includes/3rd-party/class-clearfy-plugin.php +99 -89
- includes/class-plugin.php +130 -121
- includes/classes/class-abstract-cache.php +562 -0
- includes/classes/class-configurate-ga.php +207 -161
- includes/classes/class-facebook-cache.php +1061 -0
- includes/classes/class-facebook-sdk.php +555 -0
- includes/classes/class-google-analytics-cache.php +162 -0
- includes/classes/class-google-tag-manager-cache.php +156 -0
- includes/classes/class-scheduler.php +210 -0
- includes/classes/class-yandex-metrika-cache.php +162 -0
- includes/update-local-ga.php +92 -77
- languages/simple-google-analytics-es_ES.po +233 -233
- languages/simple-google-analytics-nl_BE.po +242 -242
- languages/simple-google-analytics-pt_BR.po +246 -246
- languages/simple-google-analytics-ru_RU.po +198 -198
- libs/factory/adverts/boot.php +50 -50
- libs/factory/adverts/includes/class-base.php +319 -319
- libs/factory/adverts/includes/class-dashboard-widget.php +125 -125
- libs/factory/adverts/includes/class-rest-request.php +217 -197
- libs/factory/adverts/includes/index.php +2 -2
- libs/factory/adverts/index.php +2 -2
- libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.mo → wbcr_factory_adverts_124-ru_RU.mo} +0 -0
- libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.po → wbcr_factory_adverts_124-ru_RU.po} +83 -83
- libs/factory/bootstrap/assets/css-min/bootstrap.accordion.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/bootstrap.blue.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/bootstrap.coffee.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css +25 -25
- libs/factory/bootstrap/assets/css-min/bootstrap.datepicker.min.css +16 -16
- libs/factory/bootstrap/assets/css-min/bootstrap.ectoplasm.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/bootstrap.form-group.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/bootstrap.light.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/bootstrap.midnight.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/bootstrap.ocean.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/bootstrap.separator.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/bootstrap.sunrise.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/control.checkbox.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/control.dropdown.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/control.multiple-textbox.min.css +11 -11
- libs/factory/bootstrap/assets/css-min/holder.more-link.min.css +11 -11
- libs/factory/bootstrap/assets/js-min/bootstrap.dropdown.min.js +10 -10
- libs/factory/bootstrap/assets/js-min/bootstrap.tooltip.min.js +9 -9
- libs/factory/bootstrap/assets/js-min/control.checkbox.min.js +10 -10
- libs/factory/bootstrap/assets/js-min/control.dropdown.min.js +10 -10
- libs/factory/bootstrap/assets/js-min/control.list.min.js +10 -10
- libs/factory/bootstrap/assets/js-min/control.multiple-textbox.min.js +10 -10
- libs/factory/bootstrap/boot.php +46 -46
- libs/factory/bootstrap/includes/functions.php +236 -286
- libs/factory/bootstrap/includes/index.php +1 -1
- libs/factory/bootstrap/index.php +1 -1
- libs/factory/bootstrap/package-lock.json +1810 -0
- libs/factory/clearfy/assets/css/clearfy-base.css +0 -181
- libs/factory/clearfy/assets/js/globals.js +0 -203
- libs/factory/clearfy/boot.php +0 -49
- libs/factory/clearfy/includes/ajax-handlers.php +0 -92
- libs/factory/clearfy/includes/class-configurate.php +0 -116
- libs/factory/clearfy/includes/class-helpers.php +0 -362
- libs/factory/clearfy/pages/class-page-license.php +0 -365
- libs/factory/clearfy/pages/class-page-more-features.php +0 -170
- libs/factory/clearfy/pages/class-pages.php +0 -440
- libs/factory/core/README.md +3 -3
- libs/factory/core/ajax/install-addons.php +228 -0
- libs/factory/core/assets/js/core-components.js +227 -0
- libs/factory/core/assets/js/core-general.js +99 -0
- libs/factory/core/boot.php +73 -62
- libs/factory/core/includes/activation/class-factory-activator.php +43 -43
- libs/factory/core/includes/activation/class-factory-update.php +39 -39
- libs/factory/core/includes/activation/index.php +1 -1
- libs/factory/core/includes/assets-managment/class-factory-assets-list.php +126 -126
- libs/factory/core/includes/assets-managment/class-factory-script-list.php +167 -166
- libs/factory/core/includes/assets-managment/class-factory-style-list.php +86 -86
- libs/factory/core/includes/assets-managment/index.php +1 -1
- libs/factory/core/includes/class-check-compatibility.php +121 -121
- libs/factory/core/includes/class-factory-migrations.php +541 -541
- libs/factory/core/includes/class-factory-notices.php +296 -291
- libs/factory/core/includes/class-factory-options.php +204 -432
admin/activation.php
CHANGED
@@ -1,46 +1,46 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Activator for the GA cache
|
5 |
-
*
|
6 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
7 |
-
* @copyright (c) 09.09.2017, Webcraftic
|
8 |
-
* @see
|
9 |
-
* @version 1.0
|
10 |
-
*/
|
11 |
-
|
12 |
-
// Exit if accessed directly
|
13 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
-
exit;
|
15 |
-
}
|
16 |
-
|
17 |
-
class WGA_Activation extends
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Runs activation actions.
|
21 |
-
*
|
22 |
-
* @since 1.0.0
|
23 |
-
*/
|
24 |
-
public function activate() {
|
25 |
-
$ga_cache = WGA_Plugin::app()->getPopulateOption( 'ga_cache' );
|
26 |
-
|
27 |
-
if ( $ga_cache ) {
|
28 |
-
wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
|
29 |
-
|
30 |
-
if ( ! wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
|
31 |
-
wp_schedule_event( time(), 'daily', 'wbcr/gac/update_analytic_library' );
|
32 |
-
}
|
33 |
-
}
|
34 |
-
}
|
35 |
-
|
36 |
-
/**
|
37 |
-
* Runs activation actions.
|
38 |
-
*
|
39 |
-
* @since 1.0.0
|
40 |
-
*/
|
41 |
-
public function deactivate() {
|
42 |
-
if ( wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
|
43 |
-
wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
|
44 |
-
}
|
45 |
-
}
|
46 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Activator for the GA cache
|
5 |
+
*
|
6 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
7 |
+
* @copyright (c) 09.09.2017, Webcraftic
|
8 |
+
* @see Factory446_Activator
|
9 |
+
* @version 1.0
|
10 |
+
*/
|
11 |
+
|
12 |
+
// Exit if accessed directly
|
13 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
class WGA_Activation extends Wbcr_Factory446_Activator {
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Runs activation actions.
|
21 |
+
*
|
22 |
+
* @since 1.0.0
|
23 |
+
*/
|
24 |
+
public function activate() {
|
25 |
+
$ga_cache = WGA_Plugin::app()->getPopulateOption( 'ga_cache' );
|
26 |
+
|
27 |
+
if ( $ga_cache ) {
|
28 |
+
wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
|
29 |
+
|
30 |
+
if ( ! wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
|
31 |
+
wp_schedule_event( time(), 'daily', 'wbcr/gac/update_analytic_library' );
|
32 |
+
}
|
33 |
+
}
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Runs activation actions.
|
38 |
+
*
|
39 |
+
* @since 1.0.0
|
40 |
+
*/
|
41 |
+
public function deactivate() {
|
42 |
+
if ( wp_next_scheduled( 'wbcr/gac/update_analytic_library' ) ) {
|
43 |
+
wp_clear_scheduled_hook( 'wbcr/gac/update_analytic_library' );
|
44 |
+
}
|
45 |
+
}
|
46 |
+
}
|
admin/boot.php
CHANGED
@@ -1,274 +1,274 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* The boot file is needed to connect backend files, as well as register hooks.
|
4 |
-
* Some hooks are so small that it does not make sense to put them into a file
|
5 |
-
* or put them into a specific group of code.
|
6 |
-
*
|
7 |
-
* I usually register administrator notifications, create handlers before saving
|
8 |
-
* plugin settings or after, register options in the Clearfy plugin.
|
9 |
-
*
|
10 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
11 |
-
* @copyright Webcraftic
|
12 |
-
*/
|
13 |
-
|
14 |
-
// Exit if accessed directly
|
15 |
-
if
|
16 |
-
exit;
|
17 |
-
}
|
18 |
-
|
19 |
-
/**
|
20 |
-
*
|
21 |
-
*
|
22 |
-
*
|
23 |
-
*
|
24 |
-
* @param
|
25 |
-
*
|
26 |
-
* @param
|
27 |
-
*
|
28 |
-
* @return
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
$
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
'
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
$
|
72 |
-
$
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
}
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
*
|
133 |
-
*
|
134 |
-
*
|
135 |
-
*
|
136 |
-
*
|
137 |
-
*
|
138 |
-
*
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
*
|
161 |
-
*
|
162 |
-
* @param string $
|
163 |
-
*
|
164 |
-
*
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
*
|
177 |
-
*
|
178 |
-
* - Виджет с
|
179 |
-
* - Виджет с
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
unset(
|
185 |
-
unset(
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
*
|
194 |
-
*
|
195 |
-
*
|
196 |
-
* @since 3.0.1
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
$plugin
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
*
|
209 |
-
*
|
210 |
-
*
|
211 |
-
* @since 3.0.1
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
$plugin
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
*
|
224 |
-
*
|
225 |
-
*
|
226 |
-
*
|
227 |
-
*
|
228 |
-
*
|
229 |
-
*
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
$options[] = [
|
234 |
-
'name'
|
235 |
-
'title' => __(
|
236 |
-
'tags'
|
237 |
-
];
|
238 |
-
|
239 |
-
$options[] = [
|
240 |
-
'name'
|
241 |
-
'title' => __(
|
242 |
-
'tags'
|
243 |
-
];
|
244 |
-
$options[] = [
|
245 |
-
'name'
|
246 |
-
'title' => __(
|
247 |
-
'tags'
|
248 |
-
];
|
249 |
-
$options[] = [
|
250 |
-
'name'
|
251 |
-
'title' => __(
|
252 |
-
'tags'
|
253 |
-
];
|
254 |
-
$options[] = [
|
255 |
-
'name'
|
256 |
-
'title' => __(
|
257 |
-
'tags'
|
258 |
-
];
|
259 |
-
$options[] = [
|
260 |
-
'name'
|
261 |
-
'title' => __(
|
262 |
-
'tags'
|
263 |
-
];
|
264 |
-
$options[] = [
|
265 |
-
'name'
|
266 |
-
'title' => __(
|
267 |
-
'tags'
|
268 |
-
];
|
269 |
-
|
270 |
-
return $options;
|
271 |
-
}
|
272 |
-
|
273 |
-
add_filter(
|
274 |
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* The boot file is needed to connect backend files, as well as register hooks.
|
4 |
+
* Some hooks are so small that it does not make sense to put them into a file
|
5 |
+
* or put them into a specific group of code.
|
6 |
+
*
|
7 |
+
* I usually register administrator notifications, create handlers before saving
|
8 |
+
* plugin settings or after, register options in the Clearfy plugin.
|
9 |
+
*
|
10 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
11 |
+
* @copyright Webcraftic
|
12 |
+
*/
|
13 |
+
|
14 |
+
// Exit if accessed directly
|
15 |
+
if( !defined('ABSPATH') ) {
|
16 |
+
exit;
|
17 |
+
}
|
18 |
+
|
19 |
+
/**
|
20 |
+
* After saving the settings in the plugin, we check whether the
|
21 |
+
* options for analytic caching are enabled or not. If enabled,
|
22 |
+
* add cron task.
|
23 |
+
*
|
24 |
+
* @param Wbcr_FactoryPages445_ImpressiveThemplate $page
|
25 |
+
*
|
26 |
+
* @param Wbcr_Factory446_Plugin $plugin
|
27 |
+
*
|
28 |
+
* @return void
|
29 |
+
* @since 3.0.1
|
30 |
+
*
|
31 |
+
*/
|
32 |
+
add_action('wbcr/factory/pages/impressive/after_form_save', function ($plugin, $page) {
|
33 |
+
if( WGA_Plugin::app()->getPluginName() != $plugin->getPluginName() ) {
|
34 |
+
return;
|
35 |
+
}
|
36 |
+
|
37 |
+
$ga_cache = WGA_Plugin::app()->getPopulateOption('ga_cache');
|
38 |
+
|
39 |
+
if( $ga_cache ) {
|
40 |
+
if( !wp_next_scheduled('wbcr/gac/update_analytic_library') ) {
|
41 |
+
wp_schedule_event(time(), 'daily', 'wbcr/gac/update_analytic_library');
|
42 |
+
}
|
43 |
+
} else {
|
44 |
+
if( wp_next_scheduled('wbcr/gac/update_analytic_library') ) {
|
45 |
+
wp_clear_scheduled_hook('wbcr/gac/update_analytic_library');
|
46 |
+
}
|
47 |
+
}
|
48 |
+
}, 10, 2);
|
49 |
+
|
50 |
+
if( !defined('LOADING_GA_CACHE_AS_ADDON') ) {
|
51 |
+
/**
|
52 |
+
* Notice that the plugin has been seriously updated!
|
53 |
+
*
|
54 |
+
* @param string $plugin_name
|
55 |
+
*
|
56 |
+
* @param array $notices all registered notices
|
57 |
+
*
|
58 |
+
* @return array all notices
|
59 |
+
* @since 3.0.1
|
60 |
+
*
|
61 |
+
*/
|
62 |
+
function wbcr_ga_admin_conflict_notices_error($notices, $plugin_name)
|
63 |
+
{
|
64 |
+
if( $plugin_name != WGA_Plugin::app()->getPluginName() ) {
|
65 |
+
return $notices;
|
66 |
+
}
|
67 |
+
|
68 |
+
$text = '<p>' . __('The <b>Simple Google Analytics</b> plugin has some major changes!', 'simple-google-analytics') . '</p>';
|
69 |
+
$text .= '<p>' . __('Unfortunately, the old version of the plugin (2.2.2) is no longer supported, but you still can download it from the WordPress repository in case if the new release doesn’t work for you.', 'simple-google-analytics') . '</p>';
|
70 |
+
$text .= '<p>' . __('We’ve updated the code and fixed the compatibility issue for the latest WordPress and PHP versions. We’ve also added additional feature of the Local Google Analytics – this way your website will load faster. The plugin’s name has been changed to Local Google Analytics, but all features remained the same.', 'simple-google-analytics') . '</p>';
|
71 |
+
$text .= '<p>' . sprintf(__('Please, check <a href="%s">plugin settings</a> and its performance on your website. We do care about you and want to avoid any problems with the new version.', 'simple-google-analytics') . '</p>', admin_url('options-general.php?page=ga_cache-' . WGA_Plugin::app()->getPluginName())) . '</p>';
|
72 |
+
$text .= '<p>' . sprintf(__('We are aimed to pay more attention to the speed and security aspects of your website. That’s why you should definitely try our basic WordPress optimization plugin as well. Clearfy includes functionality of this plugin and has many additional features for the website optimization:
|
73 |
+
<a href="%s">Donwload Clearfy for free</a>', 'simple-google-analytics'), 'https://clearfy.pro?utm_source=wordpress.org&utm_campaign=' . WGA_Plugin::app()->getPluginName()) . '</p>';
|
74 |
+
|
75 |
+
$notices[] = [
|
76 |
+
'id' => 'ga_plugin_upgrade_notice1',
|
77 |
+
'type' => 'warning',
|
78 |
+
'dismissible' => true,
|
79 |
+
'dismiss_expires' => 0,
|
80 |
+
'text' => $text
|
81 |
+
];
|
82 |
+
|
83 |
+
return $notices;
|
84 |
+
}
|
85 |
+
|
86 |
+
add_filter('wbcr/factory/admin_notices', 'wbcr_ga_admin_conflict_notices_error', 10, 2);
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Migrate settings from the old plugin to the new one.
|
90 |
+
*
|
91 |
+
* @return void
|
92 |
+
* @since 3.0.1
|
93 |
+
*/
|
94 |
+
add_action('init', function () {
|
95 |
+
global $wpdb;
|
96 |
+
|
97 |
+
if( defined('LOADING_GA_CACHE_AS_ADDON') ) {
|
98 |
+
return;
|
99 |
+
}
|
100 |
+
|
101 |
+
$is_migrate_up_to_230 = WGA_Plugin::app()->getPopulateOption('is_migrate_up_to_230', false);
|
102 |
+
|
103 |
+
if( !$is_migrate_up_to_230 ) {
|
104 |
+
$old_plugin_tracking_id = get_option('sga_analytics_id');
|
105 |
+
$old_plugin_code_location = get_option('sga_code_location');
|
106 |
+
$old_plugin_demographic_and_interest = (int)get_option('sga_demographic_and_interest');
|
107 |
+
$old_plugin_sga_render_when_loggedin = (int)get_option('sga_render_when_loggedin');
|
108 |
+
|
109 |
+
if( !empty($old_plugin_tracking_id) ) {
|
110 |
+
WGA_Plugin::app()->updatePopulateOption('ga_cache', 1);
|
111 |
+
WGA_Plugin::app()->updatePopulateOption('ga_tracking_id', $old_plugin_tracking_id);
|
112 |
+
|
113 |
+
$script_position = 'footer';
|
114 |
+
|
115 |
+
if( $old_plugin_code_location == 'head' ) {
|
116 |
+
$script_position = 'header';
|
117 |
+
}
|
118 |
+
|
119 |
+
WGA_Plugin::app()->updatePopulateOption('ga_script_position', $script_position);
|
120 |
+
WGA_Plugin::app()->updatePopulateOption('ga_anonymize_ip', $old_plugin_demographic_and_interest);
|
121 |
+
WGA_Plugin::app()->updatePopulateOption('ga_track_admin', $old_plugin_sga_render_when_loggedin);
|
122 |
+
|
123 |
+
$wpdb->query("DELETE FROM {$wpdb->prefix}options WHERE option_name LIKE 'sga_%';");
|
124 |
+
}
|
125 |
+
|
126 |
+
WGA_Plugin::app()->updatePopulateOption('is_migrate_up_to_230', 1);
|
127 |
+
}
|
128 |
+
});
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Add a link to plugin meta. You can find this link in admin panel on
|
132 |
+
* the page plugins.php. Look under plugin short description.
|
133 |
+
*
|
134 |
+
* @param array $links An array of the plugin's metadata, including the version,
|
135 |
+
* author, author URI, and plugin URI.
|
136 |
+
* @param string $file path to the plugin file, relative to the plugins directory.
|
137 |
+
*
|
138 |
+
* @return array
|
139 |
+
*/
|
140 |
+
|
141 |
+
add_filter('plugin_row_meta', function ($links, $file) {
|
142 |
+
if( $file == WGA_PLUGIN_BASE ) {
|
143 |
+
|
144 |
+
$url = 'https://clearfy.pro';
|
145 |
+
|
146 |
+
if( get_locale() == 'ru_RU' ) {
|
147 |
+
$url = 'https://ru.clearfy.pro';
|
148 |
+
}
|
149 |
+
|
150 |
+
$url .= '?utm_source=wordpress.org&utm_campaign=' . WGA_Plugin::app()->getPluginName();
|
151 |
+
|
152 |
+
$links[] = '<a href="' . $url . '" style="color: #FF5722;font-weight: bold;" target="_blank">' . __('Get ultimate plugin free', 'simple-google-analytics') . '</a>';
|
153 |
+
}
|
154 |
+
|
155 |
+
return $links;
|
156 |
+
}, 10, 2);
|
157 |
+
|
158 |
+
/**
|
159 |
+
* Rating widget url
|
160 |
+
*
|
161 |
+
* @param string $page_url
|
162 |
+
* @param string $plugin_name
|
163 |
+
*
|
164 |
+
* @return string
|
165 |
+
*/
|
166 |
+
add_filter('wbcr_factory_imppage_rating_widget_url', function ($page_url, $plugin_name) {
|
167 |
+
if( $plugin_name == WGA_Plugin::app()->getPluginName() ) {
|
168 |
+
return 'https://wordpress.org/support/plugin/simple-google-analytics/reviews/#new-post';
|
169 |
+
}
|
170 |
+
|
171 |
+
return $page_url;
|
172 |
+
}, 10, 2);
|
173 |
+
|
174 |
+
/**
|
175 |
+
* Удаляем лишние виджеты из правого сайдбара в интерфейсе плагина
|
176 |
+
*
|
177 |
+
* - Виджет с премиум рекламой
|
178 |
+
* - Виджет с рейтингом
|
179 |
+
* - Виджет с маркерами информации
|
180 |
+
*/
|
181 |
+
add_filter('wbcr/factory/pages/impressive/widgets', function ($widgets, $position, $plugin) {
|
182 |
+
if( WGA_Plugin::app()->getPluginName() == $plugin->getPluginName() && 'right' == $position ) {
|
183 |
+
unset($widgets['business_suggetion']);
|
184 |
+
unset($widgets['rating_widget']);
|
185 |
+
unset($widgets['info_widget']);
|
186 |
+
}
|
187 |
+
|
188 |
+
return $widgets;
|
189 |
+
}, 20, 3);
|
190 |
+
} else {
|
191 |
+
/**
|
192 |
+
* This action is executed when the component of the Clearfy plugin
|
193 |
+
* is activate and if this component is name ga_cache
|
194 |
+
*
|
195 |
+
* @return void
|
196 |
+
* @since 3.0.1
|
197 |
+
*/
|
198 |
+
add_action('wbcr/clearfy/activated_component', function ($component_name) {
|
199 |
+
if( $component_name == 'ga_cache' ) {
|
200 |
+
require_once WGA_PLUGIN_DIR . '/admin/activation.php';
|
201 |
+
$plugin = new WGA_Activation(WGA_Plugin::app());
|
202 |
+
$plugin->activate();
|
203 |
+
}
|
204 |
+
});
|
205 |
+
|
206 |
+
/**
|
207 |
+
* This action is executed when the component of the Clearfy plugin
|
208 |
+
* is deactivated and if this component is name ga_cache
|
209 |
+
*
|
210 |
+
* @return void
|
211 |
+
* @since 3.0.1
|
212 |
+
*/
|
213 |
+
add_action('wbcr_clearfy_pre_deactivate_component', function ($component_name) {
|
214 |
+
if( $component_name == 'ga_cache' ) {
|
215 |
+
require_once WGA_PLUGIN_DIR . '/admin/activation.php';
|
216 |
+
$plugin = new WGA_Activation(WGA_Plugin::app());
|
217 |
+
$plugin->deactivate();
|
218 |
+
}
|
219 |
+
});
|
220 |
+
|
221 |
+
/**
|
222 |
+
* We register options of this plugin in global Clearfy options. Clearfy later can automatically
|
223 |
+
* set default values for this options or completely delete it from site database.
|
224 |
+
*
|
225 |
+
* In more detail you can read about it here: wp-plugin-clearfy\admin\includes\options.php
|
226 |
+
*
|
227 |
+
* @param array $options all available component options plugin clearfy
|
228 |
+
*
|
229 |
+
* @return array
|
230 |
+
*/
|
231 |
+
function wbcr_ga_group_options($options)
|
232 |
+
{
|
233 |
+
$options[] = [
|
234 |
+
'name' => 'ga_cache',
|
235 |
+
'title' => __('Google Analytics Cache', 'simple-google-analytics'),
|
236 |
+
'tags' => []
|
237 |
+
];
|
238 |
+
|
239 |
+
$options[] = [
|
240 |
+
'name' => 'ga_tracking_id',
|
241 |
+
'title' => __('Google analytic Code', 'clearfy'),
|
242 |
+
'tags' => []
|
243 |
+
];
|
244 |
+
$options[] = [
|
245 |
+
'name' => 'ga_adjusted_bounce_rate',
|
246 |
+
'title' => __('Use adjusted bounce rate?', 'clearfy'),
|
247 |
+
'tags' => []
|
248 |
+
];
|
249 |
+
$options[] = [
|
250 |
+
'name' => 'ga_enqueue_order',
|
251 |
+
'title' => __('Change enqueue order?', 'clearfy'),
|
252 |
+
'tags' => []
|
253 |
+
];
|
254 |
+
$options[] = [
|
255 |
+
'name' => 'ga_disable_display_features',
|
256 |
+
'title' => __('Disable all display features functionality?', 'clearfy'),
|
257 |
+
'tags' => []
|
258 |
+
];
|
259 |
+
$options[] = [
|
260 |
+
'name' => 'ga_anonymize_ip',
|
261 |
+
'title' => __('Use Anonymize IP? (Required by law for some countries)', 'clearfy'),
|
262 |
+
'tags' => []
|
263 |
+
];
|
264 |
+
$options[] = [
|
265 |
+
'name' => 'ga_track_admin',
|
266 |
+
'title' => __('Track logged in Administrators?', 'clearfy'),
|
267 |
+
'tags' => []
|
268 |
+
];
|
269 |
+
|
270 |
+
return $options;
|
271 |
+
}
|
272 |
+
|
273 |
+
add_filter("wbcr_clearfy_group_options", 'wbcr_ga_group_options');
|
274 |
}
|
admin/options.php
CHANGED
@@ -1,139 +1,174 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Options for additionally form
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
6 |
-
* @copyright (c) 21.01.2018, Webcraftic
|
7 |
-
* @version 1.0
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if
|
12 |
-
exit;
|
13 |
-
}
|
14 |
-
|
15 |
-
/**
|
16 |
-
* @return array
|
17 |
-
*/
|
18 |
-
function wbcr_ga_get_plugin_options()
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
'
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
'
|
29 |
-
'
|
30 |
-
'
|
31 |
-
'
|
32 |
-
'
|
33 |
-
'
|
34 |
-
'
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
'
|
44 |
-
'
|
45 |
-
'
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
'
|
82 |
-
'
|
83 |
-
'
|
84 |
-
|
85 |
-
|
86 |
-
'
|
87 |
-
'
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
'
|
92 |
-
'
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
'
|
98 |
-
'
|
99 |
-
|
100 |
-
'
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
'
|
105 |
-
'
|
106 |
-
'
|
107 |
-
'
|
108 |
-
'
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Options for additionally form
|
4 |
+
*
|
5 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
6 |
+
* @copyright (c) 21.01.2018, Webcraftic
|
7 |
+
* @version 1.0
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if( !defined('ABSPATH') ) {
|
12 |
+
exit;
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* @return array
|
17 |
+
*/
|
18 |
+
function wbcr_ga_get_plugin_options()
|
19 |
+
{
|
20 |
+
$options = [];
|
21 |
+
|
22 |
+
$options[] = [
|
23 |
+
'type' => 'html',
|
24 |
+
'html' => '<div class="wbcr-factory-page-group-header">' . __('<strong>Improve browser caching for 3rd-party services</strong>.', 'simple-google-analytics') . '<p>' . __('To improve Google Page Speed indicators Analytics caching is needed. However, it can also slightly increase your website loading speed, because Analytics js files will load locally. The second case that you might need these settings is the usual Google Analytics connection to your website. You do not need to do this with other plugins or insert the tracking code into your theme.', 'simple-google-analytics') . '</p></div>'
|
25 |
+
];
|
26 |
+
|
27 |
+
$options[] = [
|
28 |
+
'type' => 'checkbox',
|
29 |
+
'way' => 'buttons',
|
30 |
+
'name' => 'facebook_cache',
|
31 |
+
'title' => __('Improve browser caching for Facebook Pixel', 'simple-google-analytics'),
|
32 |
+
'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
|
33 |
+
'hint' => __('Clearfy will host these Facebook Pixels locally on your server to help satisfy the PageSpeed recommendation for Leverage browser caching.', 'simple-google-analytics') . '<br>--<br><span class="wbcr-factory-light-orange-color">' . __('ATTENTION! Before using this option, remove the previously installed Google Analytics code inside your theme or plugins associated with this feature!', 'simple-google-analytics') . '</span>',
|
34 |
+
'default' => false
|
35 |
+
];
|
36 |
+
|
37 |
+
$options[] = [
|
38 |
+
'type' => 'checkbox',
|
39 |
+
'way' => 'buttons',
|
40 |
+
'name' => 'google_analytics_cache',
|
41 |
+
'title' => __('Improve browser caching for Google Analytics', 'simple-google-analytics'),
|
42 |
+
'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
|
43 |
+
'hint' => __('Clearfy will host these Google scripts locally on your server to help satisfy the PageSpeed recommendation for Leverage browser caching.', 'simple-google-analytics') . (WGA_Plugin::app()->getPopulateOption('ga_cache') ? '<br>--<br><span class="wbcr-factory-light-orange-color">' . __('ATTENTION! Before using this option, please disable the option "Add Google Analytics code and Cache"!', 'simple-google-analytics') . '</span>' : ''),
|
44 |
+
'cssClass' => WGA_Plugin::app()->getPopulateOption('ga_cache') ? ['factory-checkbox-disabled'] : [],
|
45 |
+
'default' => false
|
46 |
+
];
|
47 |
+
|
48 |
+
$options[] = [
|
49 |
+
'type' => 'checkbox',
|
50 |
+
'way' => 'buttons',
|
51 |
+
'name' => 'yandex_metrika_cache',
|
52 |
+
'title' => __('Improve browser caching for Yandex metrika', 'simple-google-analytics'),
|
53 |
+
'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
|
54 |
+
'hint' => __('Clearfy will host these Yandex metrika scripts locally on your server to help satisfy the PageSpeed recommendation for Leverage browser caching..', 'simple-google-analytics') . (WGA_Plugin::app()->getPopulateOption('ga_cache') ? '<br>--<br><span class="wbcr-factory-light-orange-color">' . __('ATTENTION! Before using this option, please disable the option "Add Google Analytics code and Cache"!', 'simple-google-analytics') . '</span>' : ''),
|
55 |
+
'default' => false
|
56 |
+
];
|
57 |
+
|
58 |
+
$options[] = [
|
59 |
+
'type' => 'checkbox',
|
60 |
+
'way' => 'buttons',
|
61 |
+
'name' => 'ga_cache',
|
62 |
+
'title' => __('Add Google Analytics code and Cache', 'simple-google-analytics'),
|
63 |
+
//'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
|
64 |
+
'hint' => __('If you enable this option, the plugin will begin to save a local copy of Google Analytics to speed up the loading of your website and improve Google Page Speed.', 'simple-google-analytics') . '<br>--<br><span class="wbcr-factory-red-color">' . __('ATTENTION! This option is deprecated and cannot be used since plugin version 1.9.0! Use the new option "Improve browser caching for Google Analytics", you will have to insert the google analytics code yourself without the Clearfy plugin.', 'simple-google-analytics') . '</span>',
|
65 |
+
'default' => false,
|
66 |
+
'cssClass' => !WGA_Plugin::app()->getPopulateOption('ga_cache') ? ['factory-checkbox-disabled'] : [],
|
67 |
+
'eventsOn' => [
|
68 |
+
'show' => '#wbcr-clearfy-performance-ga-block'
|
69 |
+
],
|
70 |
+
'eventsOff' => [
|
71 |
+
'hide' => '#wbcr-clearfy-performance-ga-block'
|
72 |
+
]
|
73 |
+
|
74 |
+
];
|
75 |
+
|
76 |
+
$options[] = [
|
77 |
+
'type' => 'div',
|
78 |
+
'id' => 'wbcr-clearfy-performance-ga-block',
|
79 |
+
'items' => [
|
80 |
+
[
|
81 |
+
'type' => 'textbox',
|
82 |
+
'way' => 'buttons',
|
83 |
+
'name' => 'ga_tracking_id',
|
84 |
+
'title' => __('Google analytic Code', 'simple-google-analytics'),
|
85 |
+
'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
|
86 |
+
'hint' => __('Set the Google Analytics tracking code.', 'simple-google-analytics'),
|
87 |
+
'placeholder' => 'UA-XXXXX-Y'
|
88 |
+
],
|
89 |
+
[
|
90 |
+
'type' => 'dropdown',
|
91 |
+
'way' => 'buttons',
|
92 |
+
'name' => 'ga_script_position',
|
93 |
+
'data' => [
|
94 |
+
['header', 'Header'],
|
95 |
+
['footer', 'Footer'],
|
96 |
+
],
|
97 |
+
'title' => __('Save GA in', 'simple-google-analytics'),
|
98 |
+
'hint' => __('Select location for the Google Analytics code.', 'simple-google-analytics'),
|
99 |
+
'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
|
100 |
+
'default' => 'footer'
|
101 |
+
],
|
102 |
+
[
|
103 |
+
'type' => 'integer',
|
104 |
+
'name' => 'ga_adjusted_bounce_rate',
|
105 |
+
'title' => __('Use adjusted bounce rate?', 'simple-google-analytics'),
|
106 |
+
'default' => 0,
|
107 |
+
'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
|
108 |
+
'hint' => __('Essentially, you set up an event which is triggered after a user spends a certain amount of time on the landing page, telling Google Analytics not to count these users as bounces. A user may come to your website, find all of the information they need (a phone number, for example) and then leave the site without visiting another page. Without adjusted bounce rate, such a user would be considered a bounce, even though they had a successful experience. By defining a time limit after which you can consider a user to be "engaged," that user would no longer count as a bounce, and you\'d get a more accurate idea of whether they found what they were looking for.', 'simple-google-analytics')
|
109 |
+
],
|
110 |
+
[
|
111 |
+
'type' => 'integer',
|
112 |
+
'way' => 'buttons',
|
113 |
+
'name' => 'ga_enqueue_order',
|
114 |
+
'title' => __('Change enqueue order?', 'simple-google-analytics'),
|
115 |
+
'default' => 0,
|
116 |
+
'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
|
117 |
+
'hint' => __('By default, Google Analytics code is loaded before other scripts and javasscript code, but if you set the value to 100, the GA code will be loaded after all other scripts. By changing the priority, you can set code position on the page.', 'simple-google-analytics')
|
118 |
+
],
|
119 |
+
[
|
120 |
+
'type' => 'checkbox',
|
121 |
+
'way' => 'buttons',
|
122 |
+
'name' => 'ga_disable_display_features',
|
123 |
+
'title' => __('Disable all display features functionality?', 'simple-google-analytics'),
|
124 |
+
//'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
125 |
+
'hint' => sprintf(__('Disable all <a href="%s">display features functionality?</a>', 'simple-google-analytics'), 'https://developers.google.com/analytics/devguides/collection/analyticsjs/display-features'),
|
126 |
+
'default' => false
|
127 |
+
],
|
128 |
+
[
|
129 |
+
'type' => 'checkbox',
|
130 |
+
'way' => 'buttons',
|
131 |
+
'name' => 'ga_anonymize_ip',
|
132 |
+
'title' => __('Use Anonymize IP? (Required by law for some countries)', 'simple-google-analytics'),
|
133 |
+
//'layout' => array('hint-type' => 'icon', 'hint-icon-color' => 'grey'),
|
134 |
+
'hint' => sprintf(__('Use <a href="%s">Anonymize IP?</a> (Required by law for some countries)', 'simple-google-analytics'), 'https://support.google.com/analytics/answer/2763052'),
|
135 |
+
'default' => false
|
136 |
+
],
|
137 |
+
[
|
138 |
+
'type' => 'checkbox',
|
139 |
+
'way' => 'buttons',
|
140 |
+
'name' => 'ga_track_admin',
|
141 |
+
'title' => __('Track logged in Administrators?', 'simple-google-analytics'),
|
142 |
+
'layout' => ['hint-type' => 'icon', 'hint-icon-color' => 'grey'],
|
143 |
+
'hint' => __('Track logged in Administrators?', 'simple-google-analytics'),
|
144 |
+
'default' => false
|
145 |
+
]
|
146 |
+
]
|
147 |
+
];
|
148 |
+
|
149 |
+
return $options;
|
150 |
+
}
|
151 |
+
|
152 |
+
/**
|
153 |
+
* @param $form
|
154 |
+
* @param $page Wbcr_FactoryPages445_ImpressiveThemplate
|
155 |
+
*
|
156 |
+
* @return mixed
|
157 |
+
*/
|
158 |
+
function wbcr_ga_additionally_form_options($form, $page)
|
159 |
+
{
|
160 |
+
if( empty($form) ) {
|
161 |
+
return $form;
|
162 |
+
}
|
163 |
+
|
164 |
+
$options = wbcr_ga_get_plugin_options();
|
165 |
+
|
166 |
+
foreach($options as $option) {
|
167 |
+
$form[0]['items'][] = $option;
|
168 |
+
}
|
169 |
+
|
170 |
+
return $form;
|
171 |
+
}
|
172 |
+
|
173 |
+
add_filter('wbcr_clr_code_clean_form_options', 'wbcr_ga_additionally_form_options', 10, 2);
|
174 |
+
|
admin/pages/class-pages-general-settings.php
CHANGED
@@ -1,97 +1,97 @@
|
|
1 |
-
<?php
|
2 |
-
// Exit if accessed directly
|
3 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
-
exit;
|
5 |
-
}
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Страница общих настроек для этого плагина.
|
9 |
-
*
|
10 |
-
* Может быть использована только, если этот плагин используется как отдельный плагин, а не как аддон
|
11 |
-
* дя плагина Clearfy. Если плагин загружен, как аддон для Clearfy, эта страница не будет подключена.
|
12 |
-
*
|
13 |
-
* Поддерживает режим работы с мультисаймами. Вы можете увидеть эту страницу в панели настройки сети.
|
14 |
-
*
|
15 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
16 |
-
* @copyright (c) 2018 Webraftic Ltd
|
17 |
-
* @version 1.0
|
18 |
-
*/
|
19 |
-
class WGA_CachePage extends
|
20 |
-
|
21 |
-
/**
|
22 |
-
* {@inheritDoc}
|
23 |
-
*
|
24 |
-
* @var string
|
25 |
-
*/
|
26 |
-
public $id = "ga_cache";
|
27 |
-
|
28 |
-
/**
|
29 |
-
* {@inheritDoc}
|
30 |
-
*
|
31 |
-
* @var string
|
32 |
-
*/
|
33 |
-
public $page_menu_dashicon = 'dashicons-testimonial';
|
34 |
-
|
35 |
-
/**
|
36 |
-
* {@inheritDoc}
|
37 |
-
*
|
38 |
-
* @var bool
|
39 |
-
*/
|
40 |
-
public $available_for_multisite = true;
|
41 |
-
|
42 |
-
/**
|
43 |
-
* {@inheritDoc}
|
44 |
-
*
|
45 |
-
* @since 1.1.0
|
46 |
-
* @var bool
|
47 |
-
*/
|
48 |
-
public $show_right_sidebar_in_options = true;
|
49 |
-
|
50 |
-
/**
|
51 |
-
* @param
|
52 |
-
*/
|
53 |
-
public function __construct(
|
54 |
-
$this->menu_title = __( 'Local Google Analytics', 'simple-google-analytics' );
|
55 |
-
|
56 |
-
if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
|
57 |
-
$this->internal = false;
|
58 |
-
$this->menu_target = 'options-general.php';
|
59 |
-
$this->add_link_to_plugin_actions = true;
|
60 |
-
}
|
61 |
-
|
62 |
-
parent::__construct( $plugin );
|
63 |
-
|
64 |
-
$this->plugin = $plugin;
|
65 |
-
}
|
66 |
-
|
67 |
-
/**
|
68 |
-
* {@inheritDoc}
|
69 |
-
*
|
70 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
71 |
-
* @since 3.1.0
|
72 |
-
* @return string|void
|
73 |
-
*/
|
74 |
-
public function getPageTitle() {
|
75 |
-
return __( 'General', 'simple-google-analytics' );
|
76 |
-
}
|
77 |
-
|
78 |
-
/**
|
79 |
-
* Permalinks options.
|
80 |
-
*
|
81 |
-
* @since 1.0.0
|
82 |
-
* @return mixed[]
|
83 |
-
*/
|
84 |
-
public function getPageOptions() {
|
85 |
-
$options = wbcr_ga_get_plugin_options();
|
86 |
-
|
87 |
-
$formOptions = [];
|
88 |
-
|
89 |
-
$formOptions[] = [
|
90 |
-
'type' => 'form-group',
|
91 |
-
'items' => $options,
|
92 |
-
//'cssClass' => 'postbox'
|
93 |
-
];
|
94 |
-
|
95 |
-
return apply_filters( 'wbcr_ga_notices_form_options', $formOptions, $this );
|
96 |
-
}
|
97 |
-
}
|
1 |
+
<?php
|
2 |
+
// Exit if accessed directly
|
3 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
+
exit;
|
5 |
+
}
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Страница общих настроек для этого плагина.
|
9 |
+
*
|
10 |
+
* Может быть использована только, если этот плагин используется как отдельный плагин, а не как аддон
|
11 |
+
* дя плагина Clearfy. Если плагин загружен, как аддон для Clearfy, эта страница не будет подключена.
|
12 |
+
*
|
13 |
+
* Поддерживает режим работы с мультисаймами. Вы можете увидеть эту страницу в панели настройки сети.
|
14 |
+
*
|
15 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
16 |
+
* @copyright (c) 2018 Webraftic Ltd
|
17 |
+
* @version 1.0
|
18 |
+
*/
|
19 |
+
class WGA_CachePage extends WBCR\Factory_Templates_103\Pages\PageBase {
|
20 |
+
|
21 |
+
/**
|
22 |
+
* {@inheritDoc}
|
23 |
+
*
|
24 |
+
* @var string
|
25 |
+
*/
|
26 |
+
public $id = "ga_cache";
|
27 |
+
|
28 |
+
/**
|
29 |
+
* {@inheritDoc}
|
30 |
+
*
|
31 |
+
* @var string
|
32 |
+
*/
|
33 |
+
public $page_menu_dashicon = 'dashicons-testimonial';
|
34 |
+
|
35 |
+
/**
|
36 |
+
* {@inheritDoc}
|
37 |
+
*
|
38 |
+
* @var bool
|
39 |
+
*/
|
40 |
+
public $available_for_multisite = true;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* {@inheritDoc}
|
44 |
+
*
|
45 |
+
* @since 1.1.0
|
46 |
+
* @var bool
|
47 |
+
*/
|
48 |
+
public $show_right_sidebar_in_options = true;
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @param Wbcr_Factory446_Plugin $plugin
|
52 |
+
*/
|
53 |
+
public function __construct( Wbcr_Factory446_Plugin $plugin ) {
|
54 |
+
$this->menu_title = __( 'Local Google Analytics', 'simple-google-analytics' );
|
55 |
+
|
56 |
+
if ( ! defined( 'LOADING_GA_CACHE_AS_ADDON' ) ) {
|
57 |
+
$this->internal = false;
|
58 |
+
$this->menu_target = 'options-general.php';
|
59 |
+
$this->add_link_to_plugin_actions = true;
|
60 |
+
}
|
61 |
+
|
62 |
+
parent::__construct( $plugin );
|
63 |
+
|
64 |
+
$this->plugin = $plugin;
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* {@inheritDoc}
|
69 |
+
*
|
70 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
71 |
+
* @since 3.1.0
|
72 |
+
* @return string|void
|
73 |
+
*/
|
74 |
+
public function getPageTitle() {
|
75 |
+
return __( 'General', 'simple-google-analytics' );
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Permalinks options.
|
80 |
+
*
|
81 |
+
* @since 1.0.0
|
82 |
+
* @return mixed[]
|
83 |
+
*/
|
84 |
+
public function getPageOptions() {
|
85 |
+
$options = wbcr_ga_get_plugin_options();
|
86 |
+
|
87 |
+
$formOptions = [];
|
88 |
+
|
89 |
+
$formOptions[] = [
|
90 |
+
'type' => 'form-group',
|
91 |
+
'items' => $options,
|
92 |
+
//'cssClass' => 'postbox'
|
93 |
+
];
|
94 |
+
|
95 |
+
return apply_filters( 'wbcr_ga_notices_form_options', $formOptions, $this );
|
96 |
+
}
|
97 |
+
}
|
admin/pages/class-pages-more-features.php
CHANGED
@@ -1,21 +1,21 @@
|
|
1 |
-
<?php
|
2 |
-
// Exit if accessed directly
|
3 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
-
exit;
|
5 |
-
}
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Рекламная страница.
|
9 |
-
*
|
10 |
-
* Используется для рекламы плагина Clearfy. Пользователь может изучить все возможности плагина Clearfy
|
11 |
-
* и перейти на лендинг плагина, чтобы скачать и попробовать его.
|
12 |
-
*
|
13 |
-
* Может быть использована только, если этот плагин используется как отдельный плагин, а не как аддон
|
14 |
-
* для плагина Clearfy. Если плагин загружен, как аддон для Clearfy, эта страница не будет подключена.
|
15 |
-
*
|
16 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
17 |
-
* @copyright (c) 2018 Webraftic Ltd
|
18 |
-
*/
|
19 |
-
class WGA_MoreFeaturesPage extends
|
20 |
-
|
21 |
-
}
|
1 |
+
<?php
|
2 |
+
// Exit if accessed directly
|
3 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
+
exit;
|
5 |
+
}
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Рекламная страница.
|
9 |
+
*
|
10 |
+
* Используется для рекламы плагина Clearfy. Пользователь может изучить все возможности плагина Clearfy
|
11 |
+
* и перейти на лендинг плагина, чтобы скачать и попробовать его.
|
12 |
+
*
|
13 |
+
* Может быть использована только, если этот плагин используется как отдельный плагин, а не как аддон
|
14 |
+
* для плагина Clearfy. Если плагин загружен, как аддон для Clearfy, эта страница не будет подключена.
|
15 |
+
*
|
16 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
17 |
+
* @copyright (c) 2018 Webraftic Ltd
|
18 |
+
*/
|
19 |
+
class WGA_MoreFeaturesPage extends \WBCR\Factory_Templates_103\Pages\MoreFeatures {
|
20 |
+
|
21 |
+
}
|
cache/local-ga.js
DELETED
@@ -1,74 +0,0 @@
|
|
1 |
-
(function(){var k=this||self,l=function(a,b){a=a.split(".");var c=k;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b};var n=function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])},p=function(a){for(var b in a)if(a.hasOwnProperty(b))return!0;return!1};var q=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;var r=window,u=document,v=function(a,b){u.addEventListener?u.addEventListener(a,b,!1):u.attachEvent&&u.attachEvent("on"+a,b)};var w={},x=function(){w.TAGGING=w.TAGGING||[];w.TAGGING[1]=!0};var y=/:[0-9]+$/,A=function(a,b){b&&(b=String(b).toLowerCase());if("protocol"===b||"port"===b)a.protocol=z(a.protocol)||z(r.location.protocol);"port"===b?a.port=String(Number(a.hostname?a.port:r.location.port)||("http"==a.protocol?80:"https"==a.protocol?443:"")):"host"===b&&(a.hostname=(a.hostname||r.location.hostname).replace(y,"").toLowerCase());var c=z(a.protocol);b&&(b=String(b).toLowerCase());switch(b){case "url_no_fragment":b="";a&&a.href&&(b=a.href.indexOf("#"),b=0>b?a.href:a.href.substr(0,
|
2 |
-
b));a=b;break;case "protocol":a=c;break;case "host":a=a.hostname.replace(y,"").toLowerCase();break;case "port":a=String(Number(a.port)||("http"==c?80:"https"==c?443:""));break;case "path":a.pathname||a.hostname||x();a="/"==a.pathname.substr(0,1)?a.pathname:"/"+a.pathname;a=a.split("/");a:if(b=a[a.length-1],c=[],Array.prototype.indexOf)b=c.indexOf(b),b="number"==typeof b?b:-1;else{for(var d=0;d<c.length;d++)if(c[d]===b){b=d;break a}b=-1}0<=b&&(a[a.length-1]="");a=a.join("/");break;case "query":a=a.search.replace("?",
|
3 |
-
"");break;case "extension":a=a.pathname.split(".");a=1<a.length?a[a.length-1]:"";a=a.split("/")[0];break;case "fragment":a=a.hash.replace("#","");break;default:a=a&&a.href}return a},z=function(a){return a?a.replace(":","").toLowerCase():""},B=function(a){var b=u.createElement("a");a&&(b.href=a);var c=b.pathname;"/"!==c[0]&&(a||x(),c="/"+c);a=b.hostname.replace(y,"");return{href:b.href,protocol:b.protocol,host:b.host,hostname:a,pathname:c,search:b.search,hash:b.hash,port:b.port}};function C(){for(var a=D,b={},c=0;c<a.length;++c)b[a[c]]=c;return b}function E(){var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ";a+=a.toLowerCase()+"0123456789-_";return a+"."}
|
4 |
-
var D,F,G=function(a){D=D||E();F=F||C();for(var b=[],c=0;c<a.length;c+=3){var d=c+1<a.length,e=c+2<a.length,g=a.charCodeAt(c),f=d?a.charCodeAt(c+1):0,h=e?a.charCodeAt(c+2):0,m=g>>2;g=(g&3)<<4|f>>4;f=(f&15)<<2|h>>6;h&=63;e||(h=64,d||(f=64));b.push(D[m],D[g],D[f],D[h])}return b.join("")},H=function(a){function b(m){for(;d<a.length;){var t=a.charAt(d++),L=F[t];if(null!=L)return L;if(!/^[\s\xa0]*$/.test(t))throw Error("Unknown base64 encoding at char: "+t);}return m}D=D||E();F=F||C();for(var c="",d=0;;){var e=
|
5 |
-
b(-1),g=b(0),f=b(64),h=b(64);if(64===h&&-1===e)return c;c+=String.fromCharCode(e<<2|g>>4);64!=f&&(c+=String.fromCharCode(g<<4&240|f>>2),64!=h&&(c+=String.fromCharCode(f<<6&192|h)))}};var I;function J(a,b){if(!a||b===u.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}
|
6 |
-
var O=function(){var a=K,b=M,c=N(),d=function(f){a(f.target||f.srcElement||{})},e=function(f){b(f.target||f.srcElement||{})};if(!c.init){v("mousedown",d);v("keyup",d);v("submit",e);var g=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){b(this);g.call(this)};c.init=!0}},N=function(){var a={};var b=r.google_tag_data;r.google_tag_data=void 0===b?a:b;a=r.google_tag_data;b=a.gl;b&&b.decorators||(b={decorators:[]},a.gl=b);return b};var P=/(.*?)\*(.*?)\*(.*)/,Q=/([^?#]+)(\?[^#]*)?(#.*)?/,R=/(.*?)(^|&)_gl=([^&]*)&?(.*)/,T=function(a){var b=[],c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];void 0!==d&&d===d&&null!==d&&"[object Object]"!==d.toString()&&(b.push(c),b.push(G(String(d))))}a=b.join("*");return["1",S(a),a].join("*")},S=function(a,b){a=[window.navigator.userAgent,(new Date).getTimezoneOffset(),window.navigator.userLanguage||window.navigator.language,Math.floor((new Date).getTime()/60/1E3)-(void 0===b?0:b),a].join("*");
|
7 |
-
if(!(b=I)){b=Array(256);for(var c=0;256>c;c++){for(var d=c,e=0;8>e;e++)d=d&1?d>>>1^3988292384:d>>>1;b[c]=d}}I=b;b=4294967295;for(c=0;c<a.length;c++)b=b>>>8^I[(b^a.charCodeAt(c))&255];return((b^-1)>>>0).toString(36)},ba=function(a){return function(b){var c=B(r.location.href),d=c.search.replace("?","");a:{var e=d.split("&");for(var g=0;g<e.length;g++){var f=e[g].split("=");if("_gl"===decodeURIComponent(f[0]).replace(/\+/g," ")){e=f.slice(1).join("=");break a}}e=void 0}b.query=U(e||"")||{};e=A(c,"fragment");
|
8 |
-
g=e.match(R);b.fragment=U(g&&g[3]||"")||{};a&&aa(c,d,e)}};function V(a){var b=R.exec(a);if(b){var c=b[2],d=b[4];a=b[1];d&&(a=a+c+d)}return a}
|
9 |
-
var aa=function(a,b,c){function d(e,g){e=V(e);e.length&&(e=g+e);return e}r.history&&r.history.replaceState&&(R.test(b)||R.test(c))&&(a=A(a,"path"),b=d(b,"?"),c=d(c,"#"),r.history.replaceState({},void 0,""+a+b+c))},U=function(a){var b=void 0===b?3:b;try{if(a){a:{for(var c=0;3>c;++c){var d=P.exec(a);if(d){var e=d;break a}a=decodeURIComponent(a)}e=void 0}if(e&&"1"===e[1]){var g=e[2],f=e[3];a:{for(e=0;e<b;++e)if(g===S(f,e)){var h=!0;break a}h=!1}if(h){b={};var m=f?f.split("*"):[];for(f=0;f<m.length;f+=
|
10 |
-
2)b[m[f]]=H(m[f+1]);return b}}}}catch(t){}};function W(a,b,c){function d(h){h=V(h);var m=h.charAt(h.length-1);h&&"&"!==m&&(h+="&");return h+f}c=void 0===c?!1:c;var e=Q.exec(b);if(!e)return"";b=e[1];var g=e[2]||"";e=e[3]||"";var f="_gl="+a;c?e="#"+d(e.substring(1)):g="?"+d(g.substring(1));return""+b+g+e}
|
11 |
-
function X(a,b,c){for(var d={},e={},g=N().decorators,f=0;f<g.length;++f){var h=g[f];(!c||h.forms)&&J(h.domains,b)&&(h.fragment?n(e,h.callback()):n(d,h.callback()))}p(d)&&(b=T(d),c?Y(b,a):Z(b,a,!1));!c&&p(e)&&(c=T(e),Z(c,a,!0))}function Z(a,b,c){b.href&&(a=W(a,b.href,void 0===c?!1:c),q.test(a)&&(b.href=a))}
|
12 |
-
function Y(a,b){if(b&&b.action){var c=(b.method||"").toLowerCase();if("get"===c){c=b.childNodes||[];for(var d=!1,e=0;e<c.length;e++){var g=c[e];if("_gl"===g.name){g.setAttribute("value",a);d=!0;break}}d||(c=u.createElement("input"),c.setAttribute("type","hidden"),c.setAttribute("name","_gl"),c.setAttribute("value",a),b.appendChild(c))}else"post"===c&&(a=W(a,b.action),q.test(a)&&(b.action=a))}}
|
13 |
-
var K=function(a){try{a:{for(var b=100;a&&0<b;){if(a.href&&a.nodeName.match(/^a(?:rea)?$/i)){var c=a;break a}a=a.parentNode;b--}c=null}if(c){var d=c.protocol;"http:"!==d&&"https:"!==d||X(c,c.hostname,!1)}}catch(e){}},M=function(a){try{if(a.action){var b=A(B(a.action),"host");X(a,b,!0)}}catch(c){}};l("google_tag_data.glBridge.auto",function(a,b,c,d){O();a={callback:a,domains:b,fragment:"fragment"===c,forms:!!d};N().decorators.push(a)});l("google_tag_data.glBridge.decorate",function(a,b,c){c=!!c;a=T(a);if(b.tagName){if("a"==b.tagName.toLowerCase())return Z(a,b,c);if("form"==b.tagName.toLowerCase())return Y(a,b)}if("string"==typeof b)return W(a,b,c)});l("google_tag_data.glBridge.generate",T);
|
14 |
-
l("google_tag_data.glBridge.get",function(a,b){var c=ba(!!b);b=N();b.data||(b.data={query:{},fragment:{}},c(b.data));c={};if(b=b.data)n(c,b.query),a&&n(c,b.fragment);return c});})(window);
|
15 |
-
(function(){function La(a){var b=1,c;if(a)for(b=0,c=a.length-1;0<=c;c--){var d=a.charCodeAt(c);b=(b<<6&268435455)+d+(d<<14);d=b&266338304;b=0!=d?b^d>>21:b}return b};var $c=function(a){this.w=a||[]};$c.prototype.set=function(a){this.w[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b<this.w.length;b++)this.w[b]&&(a[Math.floor(b/6)]^=1<<b%6);for(b=0;b<a.length;b++)a[b]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[b]||0);return a.join("")+"~"};var ha=window.GoogleAnalyticsObject,wa;if(wa=void 0!=ha)wa=-1<(ha.constructor+"").indexOf("String");var Za;if(Za=wa){var Qa=window.GoogleAnalyticsObject;Za=Qa?Qa.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""}var gb=Za||"ga",jd=/^(?:utma\.)?\d+\.\d+$/,kd=/^amp-[\w.-]{22,64}$/,Ba=!1;var vd=new $c;function J(a){vd.set(a)}var Td=function(a){a=Dd(a);a=new $c(a);for(var b=vd.w.slice(),c=0;c<a.w.length;c++)b[c]=b[c]||a.w[c];return(new $c(b)).encode()},Dd=function(a){a=a.get(Gd);ka(a)||(a=[]);return a};var ea=function(a){return"function"==typeof a},ka=function(a){return"[object Array]"==Object.prototype.toString.call(Object(a))},qa=function(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")},D=function(a,b){return 0==a.indexOf(b)},sa=function(a){return a?a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""},ra=function(){for(var a=O.navigator.userAgent+(M.cookie?M.cookie:"")+(M.referrer?M.referrer:""),b=a.length,c=O.history.length;0<c;)a+=c--^b++;return[hd()^La(a)&2147483647,Math.round((new Date).getTime()/
|
16 |
-
1E3)].join(".")},ta=function(a){var b=M.createElement("img");b.width=1;b.height=1;b.src=a;return b},ua=function(){},K=function(a){if(encodeURIComponent instanceof Function)return encodeURIComponent(a);J(28);return a},L=function(a,b,c,d){try{a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)}catch(e){J(27)}},f=/^[\w\-:/.?=&%!\[\]]+$/,Nd=/^[\w+/_-]+[=]{0,2}$/,be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+
|
17 |
-
K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c=a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a||""==a||":"==a)return!0;return!1},ya=function(a,b){var c=M.referrer;if(/^(https?|android-app):\/\//i.test(c)){if(a)return c;a="//"+M.location.hostname;if(!de(c,a))return b&&(b=a.replace(/\./g,"-")+".cdn.ampproject.org",de(c,b))?void 0:
|
18 |
-
c}},za=function(a,b){if(1==b.length&&null!=b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;e<d;e++)if("object"===typeof b[e]){for(var g in b[e])b[e].hasOwnProperty(g)&&(c[g]=b[e][g]);break}else e<a.length&&(c[a[e]]=b[e]);return c};var ee=function(){this.keys=[];this.values={};this.m={}};ee.prototype.set=function(a,b,c){this.keys.push(a);c?this.m[":"+a]=b:this.values[":"+a]=b};ee.prototype.get=function(a){return this.m.hasOwnProperty(":"+a)?this.m[":"+a]:this.values[":"+a]};ee.prototype.map=function(a){for(var b=0;b<this.keys.length;b++){var c=this.keys[b],d=this.get(c);d&&a(c,d)}};var O=window,M=document,va=function(a,b){return setTimeout(a,b)};var F=window,Ea=document,G=function(a){var b=F._gaUserPrefs;if(b&&b.ioo&&b.ioo()||a&&!0===F["ga-disable-"+a])return!0;try{var c=F.external;if(c&&c._gaUserPrefs&&"oo"==c._gaUserPrefs)return!0}catch(g){}a=[];b=String(Ea.cookie||document.cookie).split(";");for(c=0;c<b.length;c++){var d=b[c].split("="),e=d[0].replace(/^\s*|\s*$/g,"");e&&"AMP_TOKEN"==e&&((d=d.slice(1).join("=").replace(/^\s*|\s*$/g,""))&&(d=decodeURIComponent(d)),a.push(d))}for(b=0;b<a.length;b++)if("$OPT_OUT"==a[b])return!0;return Ea.getElementById("__gaOptOutExtension")?
|
19 |
-
!0:!1};var Ca=function(a){var b=[],c=M.cookie.split(";");a=new RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$");for(var d=0;d<c.length;d++){var e=c[d].match(a);e&&b.push(e[1])}return b},zc=function(a,b,c,d,e,g){e=G(e)?!1:eb.test(M.location.hostname)||"/"==c&&vc.test(d)?!1:!0;if(!e)return!1;b&&1200<b.length&&(b=b.substring(0,1200));c=a+"="+b+"; path="+c+"; ";g&&(c+="expires="+(new Date((new Date).getTime()+g)).toGMTString()+"; ");d&&"none"!==d&&(c+="domain="+d+";");d=M.cookie;M.cookie=c;if(!(d=d!=M.cookie))a:{a=Ca(a);
|
20 |
-
for(d=0;d<a.length;d++)if(b==a[d]){d=!0;break a}d=!1}return d},Cc=function(a){return encodeURIComponent?encodeURIComponent(a).replace(/\(/g,"%28").replace(/\)/g,"%29"):a},vc=/^(www\.)?google(\.com?)?(\.[a-z]{2})?$/,eb=/(^|\.)doubleclick\.net$/i;var oc,Id=/^.*Version\/?(\d+)[^\d].*$/i,ne=function(){if(void 0!==O.__ga4__)return O.__ga4__;if(void 0===oc){var a=O.navigator.userAgent;if(a){var b=a;try{b=decodeURIComponent(a)}catch(c){}if(a=!(0<=b.indexOf("Chrome"))&&!(0<=b.indexOf("CriOS"))&&(0<=b.indexOf("Safari/")||0<=b.indexOf("Safari,")))b=Id.exec(b),a=11<=(b?Number(b[1]):-1);oc=a}else oc=!1}return oc};var Fa,Ga,fb,Ab,ja=/^https?:\/\/[^/]*cdn\.ampproject\.org\//,Ue=/^(?:www\.|m\.|amp\.)+/,Ub=[],da=function(a){if(ye(a[Kd])){if(void 0===Ab){var b;if(b=(b=De.get())&&b._ga||void 0)Ab=b,J(81)}if(void 0!==Ab)return a[Q]||(a[Q]=Ab),!1}if(a[Kd]){J(67);if(a[ac]&&"cookie"!=a[ac])return!1;if(void 0!==Ab)a[Q]||(a[Q]=Ab);else{a:{b=String(a[W]||xa());var c=String(a[Yb]||"/"),d=Ca(String(a[U]||"_ga"));b=na(d,b,c);if(!b||jd.test(b))b=!0;else if(b=Ca("AMP_TOKEN"),0==b.length)b=!0;else{if(1==b.length&&(b=decodeURIComponent(b[0]),
|
21 |
-
"$RETRIEVING"==b||"$OPT_OUT"==b||"$ERROR"==b||"$NOT_FOUND"==b)){b=!0;break a}b=!1}}if(b&&tc(ic,String(a[Na])))return!0}}return!1},ic=function(){Z.D([ua])},tc=function(a,b){var c=Ca("AMP_TOKEN");if(1<c.length)return J(55),!1;c=decodeURIComponent(c[0]||"");if("$OPT_OUT"==c||"$ERROR"==c||G(b))return J(62),!1;if(!ja.test(M.referrer)&&"$NOT_FOUND"==c)return J(68),!1;if(void 0!==Ab)return J(56),va(function(){a(Ab)},0),!0;if(Fa)return Ub.push(a),!0;if("$RETRIEVING"==c)return J(57),va(function(){tc(a,b)},
|
22 |
-
1E4),!0;Fa=!0;c&&"$"!=c[0]||(xc("$RETRIEVING",3E4),setTimeout(Mc,3E4),c="");return Pc(c,b)?(Ub.push(a),!0):!1},Pc=function(a,b,c){if(!window.JSON)return J(58),!1;var d=O.XMLHttpRequest;if(!d)return J(59),!1;var e=new d;if(!("withCredentials"in e))return J(60),!1;e.open("POST",(c||"https://ampcid.google.com/v1/publisher:getClientId")+"?key=AIzaSyA65lEHUEizIsNtlbNo-l2K18dT680nsaM",!0);e.withCredentials=!0;e.setRequestHeader("Content-Type","text/plain");e.onload=function(){Fa=!1;if(4==e.readyState){try{200!=
|
23 |
-
e.status&&(J(61),Qc("","$ERROR",3E4));var g=JSON.parse(e.responseText);g.optOut?(J(63),Qc("","$OPT_OUT",31536E6)):g.clientId?Qc(g.clientId,g.securityToken,31536E6):!c&&g.alternateUrl?(Ga&&clearTimeout(Ga),Fa=!0,Pc(a,b,g.alternateUrl)):(J(64),Qc("","$NOT_FOUND",36E5))}catch(ca){J(65),Qc("","$ERROR",3E4)}e=null}};d={originScope:"AMP_ECID_GOOGLE"};a&&(d.securityToken=a);e.send(JSON.stringify(d));Ga=va(function(){J(66);Qc("","$ERROR",3E4)},1E4);return!0},Mc=function(){Fa=!1},xc=function(a,b){if(void 0===
|
24 |
-
fb){fb="";for(var c=id(),d=0;d<c.length;d++){var e=c[d];if(zc("AMP_TOKEN",encodeURIComponent(a),"/",e,"",b)){fb=e;return}}}zc("AMP_TOKEN",encodeURIComponent(a),"/",fb,"",b)},Qc=function(a,b,c){Ga&&clearTimeout(Ga);b&&xc(b,c);Ab=a;b=Ub;Ub=[];for(c=0;c<b.length;c++)b[c](a)},ye=function(a){a:{if(ja.test(M.referrer)){var b=M.location.hostname.replace(Ue,"");b:{var c=M.referrer;c=c.replace(/^https?:\/\//,"");var d=c.replace(/^[^/]+/,"").split("/"),e=d[2];d=(d="s"==e?d[3]:e)?decodeURIComponent(d):d;if(!d){if(0==
|
25 |
-
c.indexOf("xn--")){c="";break b}(c=c.match(/(.*)\.cdn\.ampproject\.org\/?$/))&&2==c.length&&(d=c[1].replace(/-/g,".").replace(/\.\./g,"-"))}c=d?d.replace(Ue,""):""}if(b==c){b=!0;break a}else J(78)}b=!1}return b&&!1!==a};var bd=function(a){return(a?"https:":Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com"},Da=function(a){this.name="len";this.message=a+"-8192"},ba=function(a,b,c){c=c||ua;if(2036>=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},pe=function(a,b,c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c,
|
26 |
-
d){var e=O.XMLHttpRequest;if(!e)return!1;var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d)try{var ca=g.responseText;if(1>ca.length)ge("xhr","ver","0"),c();else if("1"!=ca.charAt(0))ge("xhr","ver",String(ca.length)),c();else if(3<d.count++)ge("xhr","tmr",""+d.count),c();else if(1==ca.length)c();else{var l=ca.charAt(1);if("d"==
|
27 |
-
l)pe("https://stats.g.doubleclick.net/j/collect",d.U,d,c);else if("g"==l){wc("https://www.google.%/ads/ga-audiences".replace("%","com"),d.google,c);var k=ca.substring(2);k&&(/^[a-z.]{1,6}$/.test(k)?wc("https://www.google.%/ads/ga-audiences".replace("%",k),d.google,ua):ge("tld","bcc",k))}else ge("xhr","brc",l),c()}}catch(w){ge("xhr","rsp"),c()}else c();g=null}};g.send(b);return!0},x=function(a,b,c){return O.navigator.sendBeacon?O.navigator.sendBeacon(a,b)?(c(),!0):!1:!1},ge=function(a,b,c){1<=100*
|
28 |
-
Math.random()||G("?")||(a=["t=error","_e="+a,"_v=j78","sr=1"],b&&a.push("_f="+b),c&&a.push("_m="+K(c.substring(0,100))),a.push("aip=1"),a.push("z="+hd()),wc(bd(!0)+"/u/d",a.join("&"),ua))};var h=function(a){var b=O.gaData=O.gaData||{};return b[a]=b[a]||{}};var Ha=function(){this.M=[]};Ha.prototype.add=function(a){this.M.push(a)};Ha.prototype.D=function(a){try{for(var b=0;b<this.M.length;b++){var c=a.get(this.M[b]);c&&ea(c)&&c.call(O,a)}}catch(d){}b=a.get(Ia);b!=ua&&ea(b)&&(a.set(Ia,ua,!0),setTimeout(b,10))};function Ja(a){if(100!=a.get(Ka)&&La(P(a,Q))%1E4>=100*R(a,Ka))throw"abort";}function Ma(a){if(G(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";}
|
29 |
-
function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];ue.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});b.push("z="+Bd());a.set(Ra,b.join("&"),!0)}
|
30 |
-
function Sa(a){var b=P(a,fa);!b&&a.get(Vd)&&(b="beacon");var c=P(a,gd),d=P(a,oe),e=c||(d?d+"/3":bd(!1)+"/collect");switch(P(a,ad)){case "d":e=c||(d?d+"/32":bd(!1)+"/j/collect");b=a.get(qe)||void 0;pe(e,P(a,Ra),b,a.Z(Ia));break;case "b":e=c||(d?d+"/31":bd(!1)+"/r/collect");default:b?(c=P(a,Ra),d=(d=a.Z(Ia))||ua,"image"==b?wc(e,c,d):"xhr"==b&&wd(e,c,d)||"beacon"==b&&x(e,c,d)||ba(e,c,d)):ba(e,P(a,Ra),a.Z(Ia))}e=P(a,Na);e=h(e);b=e.hitcount;e.hitcount=b?b+1:1;e=P(a,Na);delete h(e).pending_experiments;
|
31 |
-
a.set(Ia,ua,!0)}function Hc(a){(O.gaData=O.gaData||{}).expId&&a.set(Nc,(O.gaData=O.gaData||{}).expId);(O.gaData=O.gaData||{}).expVar&&a.set(Oc,(O.gaData=O.gaData||{}).expVar);var b=P(a,Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&a.set(m,d,!0)}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";}
|
32 |
-
function yd(a){var b=O.gaDevIds;ka(b)&&0!=b.length&&a.set("&did",b.join(","),!0)}function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){c=R(a,Wa);var d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0<e&&(c=Math.min(c+e,20),a.set(Xa,d));if(0>=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee};Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:Number(a)};Ya.prototype.Z=function(a){return(a=this.get(a))&&ea(a)?a:ua};
|
33 |
-
Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)};var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)};var ue=new ee,ve=[],bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=ue.get(a);if(!b)for(var c=0;c<ve.length;c++){var d=ve[c],e=d[0].exec(a);if(e){b=d[1](e);ue.set(b.name,b);break}}return b},yc=function(a){var b;ue.map(function(c,d){d.F==a&&(b=d)});return b&&b.name},S=function(a,b,c,d,e){a=new bb(a,b,c,d,e);ue.set(a.name,a);return a.name},cb=function(a,b){ve.push([new RegExp("^"+a+"$"),b])},T=function(a,b,c){return S(a,b,c,void 0,db)},db=function(){};var hb=T("apiVersion","v"),ib=T("clientVersion","_v");S("anonymizeIp","aip");var jb=S("adSenseId","a"),Va=S("hitType","t"),Ia=S("hitCallback"),Ra=S("hitPayload");S("nonInteraction","ni");S("currencyCode","cu");S("dataSource","ds");var Vd=S("useBeacon",void 0,!1),fa=S("transport");S("sessionControl","sc","");S("sessionGroup","sg");S("queueTime","qt");var Ac=S("_s","_s");S("screenName","cd");var kb=S("location","dl",""),lb=S("referrer","dr"),mb=S("page","dp","");S("hostname","dh");
|
34 |
-
var nb=S("language","ul"),ob=S("encoding","de");S("title","dt",function(){return M.title||void 0});cb("contentGroup([0-9]+)",function(a){return new bb(a[0],"cg"+a[1])});var pb=S("screenColors","sd"),qb=S("screenResolution","sr"),rb=S("viewportSize","vp"),sb=S("javaEnabled","je"),tb=S("flashVersion","fl");S("campaignId","ci");S("campaignName","cn");S("campaignSource","cs");S("campaignMedium","cm");S("campaignKeyword","ck");S("campaignContent","cc");
|
35 |
-
var ub=S("eventCategory","ec"),xb=S("eventAction","ea"),yb=S("eventLabel","el"),zb=S("eventValue","ev"),Bb=S("socialNetwork","sn"),Cb=S("socialAction","sa"),Db=S("socialTarget","st"),Eb=S("l1","plt"),Fb=S("l2","pdt"),Gb=S("l3","dns"),Hb=S("l4","rrt"),Ib=S("l5","srt"),Jb=S("l6","tcp"),Kb=S("l7","dit"),Lb=S("l8","clt"),Ve=S("l9","_gst"),We=S("l10","_gbt"),Xe=S("l11","_cst"),Ye=S("l12","_cbt"),Mb=S("timingCategory","utc"),Nb=S("timingVar","utv"),Ob=S("timingLabel","utl"),Pb=S("timingValue","utt");
|
36 |
-
S("appName","an");S("appVersion","av","");S("appId","aid","");S("appInstallerId","aiid","");S("exDescription","exd");S("exFatal","exf");var Nc=S("expId","xid"),Oc=S("expVar","xvar"),m=S("exp","exp"),Rc=S("_utma","_utma"),Sc=S("_utmz","_utmz"),Tc=S("_utmht","_utmht"),Ua=S("_hc",void 0,0),Xa=S("_ti",void 0,0),Wa=S("_to",void 0,20);cb("dimension([0-9]+)",function(a){return new bb(a[0],"cd"+a[1])});cb("metric([0-9]+)",function(a){return new bb(a[0],"cm"+a[1])});S("linkerParam",void 0,void 0,Bc,db);
|
37 |
-
var Ze=T("_cd2l",void 0,!1),ld=S("usage","_u"),Gd=S("_um");S("forceSSL",void 0,void 0,function(){return Ba},function(a,b,c){J(34);Ba=!!c});var ed=S("_j1","jid"),ia=S("_j2","gjid");cb("\\&(.*)",function(a){var b=new bb(a[0],a[1]),c=yc(a[0].substring(1));c&&(b.Z=function(d){return d.get(c)},b.o=function(d,e,g,ca){d.set(c,g,ca)},b.F=void 0);return b});
|
38 |
-
var Qb=T("_oot"),dd=S("previewTask"),Rb=S("checkProtocolTask"),md=S("validationTask"),Sb=S("checkStorageTask"),Uc=S("historyImportTask"),Tb=S("samplerTask"),Vb=S("_rlt"),Wb=S("buildHitTask"),Xb=S("sendHitTask"),Vc=S("ceTask"),zd=S("devIdTask"),Cd=S("timingTask"),Ld=S("displayFeaturesTask"),oa=S("customTask"),V=T("name"),Q=T("clientId","cid"),n=T("clientIdTime"),xd=T("storedClientId"),Ad=S("userId","uid"),Na=T("trackingId","tid"),U=T("cookieName",void 0,"_ga"),W=T("cookieDomain"),Yb=T("cookiePath",
|
39 |
-
void 0,"/"),Zb=T("cookieExpires",void 0,63072E3),Hd=T("cookieUpdate",void 0,!0),$b=T("legacyCookieDomain"),Wc=T("legacyHistoryImport",void 0,!0),ac=T("storage",void 0,"cookie"),bc=T("allowLinker",void 0,!1),cc=T("allowAnchor",void 0,!0),Ka=T("sampleRate","sf",100),dc=T("siteSpeedSampleRate",void 0,1),ec=T("alwaysSendReferrer",void 0,!1),I=T("_gid","_gid"),la=T("_gcn"),Kd=T("useAmpClientId"),ce=T("_gclid"),fe=T("_gt"),he=T("_ge",void 0,7776E6),ie=T("_gclsrc"),je=T("storeGac",void 0,!0),oe=S("_x_19"),
|
40 |
-
gd=S("transportUrl"),Md=S("_r","_r"),qe=S("_dp"),ad=S("_jt",void 0,"n"),Ud=S("allowAdFeatures",void 0,!0);function X(a,b,c,d){b[a]=function(){try{return d&&J(d),c.apply(this,arguments)}catch(e){throw ge("exc",a,e&&e.name),e;}}};var Od=function(){this.V=100;this.$=this.fa=!1;this.oa="detourexp";this.groups=1},Ed=function(a){var b=new Od,c;if(b.fa&&b.$)return 0;b.$=!0;if(a){if(b.oa&&void 0!==a.get(b.oa))return R(a,b.oa);if(0==a.get(dc))return 0}if(0==b.V)return 0;void 0===c&&(c=Bd());return 0==c%b.V?Math.floor(c/b.V)%b.groups+1:0};function fc(){var a,b;if((b=(b=O.navigator)?b.plugins:null)&&b.length)for(var c=0;c<b.length&&!a;c++){var d=b[c];-1<d.name.indexOf("Shockwave Flash")&&(a=d.description)}if(!a)try{var e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),a="WIN 6,0,21,0",e.AllowScriptAccess="always",a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),a=e.GetVariable("$version")}catch(g){}a&&
|
41 |
-
(e=a.match(/[\d]+/g))&&3<=e.length&&(a=e[0]+"."+e[1]+" r"+e[2]);return a||void 0};var aa=function(a){var b=Math.min(R(a,dc),100);return La(P(a,Q))%100>=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0<c?(Y(b,Gb),Y(b,Jb),Y(b,Ib),Y(b,Fb),Y(b,Hb),Y(b,Kb),Y(b,Lb),Y(b,Ve),Y(b,We),Y(b,Xe),Y(b,Ye),va(function(){a(b)},10)):L(O,"load",function(){gc(a)},!1))}},Ec=function(a){var b=O.performance||O.webkitPerformance;b=b&&b.timing;if(!b)return!1;var c=b.navigationStart;if(0==c)return!1;a[Eb]=b.loadEventStart-c;a[Gb]=b.domainLookupEnd-b.domainLookupStart;
|
42 |
-
a[Jb]=b.connectEnd-b.connectStart;a[Ib]=b.responseStart-b.requestStart;a[Fb]=b.responseEnd-b.responseStart;a[Hb]=b.fetchStart-c;a[Kb]=b.domInteractive-c;a[Lb]=b.domContentLoadedEventStart-c;a[Ve]=N.L-c;a[We]=N.ya-c;O.google_tag_manager&&O.google_tag_manager._li&&(b=O.google_tag_manager._li,a[Xe]=b.cst,a[Ye]=b.cbt);return!0},Fc=function(a){if(O.top!=O)return!1;var b=O.external,c=b&&b.onloadT;b&&!b.isValidLoadTime&&(c=void 0);2147483648<c&&(c=void 0);0<c&&b.setPageReadyTime();if(void 0==c)return!1;
|
43 |
-
a[Eb]=c;return!0},Y=function(a,b){var c=a[b];if(isNaN(c)||Infinity==c||0>c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&&!a.I){a.I=!0;var c=aa(b),d=0<E(P(b,kb),"gclid").length;(c||d)&&gc(function(e){c&&a.send("timing",e);d&&a.send("adtiming",e)})}}};var hc=!1,mc=function(a){if("cookie"==P(a,ac)){if(a.get(Hd)||P(a,xd)!=P(a,Q)){var b=1E3*R(a,Zb);ma(a,Q,U,b)}ma(a,I,la,864E5);if(a.get(je)){var c=P(a,ce);if(c){var d=Math.min(R(a,he),1E3*R(a,Zb));d=Math.min(d,1E3*R(a,fe)+d-(new Date).getTime());a.data.set(he,d);b={};var e=P(a,fe),g=P(a,ie),ca=kc(P(a,Yb)),l=lc(P(a,W));a=P(a,Na);g&&"aw.ds"!=g?b&&(b.ua=!0):(c=["1",e,Cc(c)].join("."),0<d&&(b&&(b.ta=!0),zc("_gac_"+Cc(a),c,ca,l,a,d)));le(b)}}else J(75)}},ma=function(a,b,c,d){var e=nd(a,b);if(e){c=P(a,c);
|
44 |
-
var g=kc(P(a,Yb)),ca=lc(P(a,W)),l=P(a,Na);if("auto"!=ca)zc(c,e,g,ca,l,d)&&(hc=!0);else{J(32);for(var k=id(),w=0;w<k.length;w++)if(ca=k[w],a.data.set(W,ca),e=nd(a,b),zc(c,e,g,ca,l,d)){hc=!0;return}a.data.set(W,"auto")}}},nc=function(a){if("cookie"==P(a,ac)&&!hc&&(mc(a),!hc))throw"abort";},Yc=function(a){if(a.get(Wc)){var b=P(a,W),c=P(a,$b)||xa(),d=Xc("__utma",c,b);d&&(J(19),a.set(Tc,(new Date).getTime(),!0),a.set(Rc,d.R),(b=Xc("__utmz",c,b))&&d.hash==b.hash&&a.set(Sc,b.R))}},nd=function(a,b){b=Cc(P(a,
|
45 |
-
b));var c=lc(P(a,W)).split(".").length;a=jc(P(a,Yb));1<a&&(c+="-"+a);return b?["GA1",c,b].join("."):""},Xd=function(a,b){return na(b,P(a,W),P(a,Yb))},na=function(a,b,c){if(!a||1>a.length)J(12);else{for(var d=[],e=0;e<a.length;e++){var g=a[e];var ca=g.split(".");var l=ca.shift();("GA1"==l||"1"==l)&&1<ca.length?(g=ca.shift().split("-"),1==g.length&&(g[1]="1"),g[0]*=1,g[1]*=1,ca={H:g,s:ca.join(".")}):ca=kd.test(g)?{H:[0,0],s:g}:void 0;ca&&d.push(ca)}if(1==d.length)return J(13),d[0].s;if(0==d.length)J(12);
|
46 |
-
else{J(14);d=Gc(d,lc(b).split(".").length,0);if(1==d.length)return d[0].s;d=Gc(d,jc(c),1);1<d.length&&J(41);return d[0]&&d[0].s}}},Gc=function(a,b,c){for(var d=[],e=[],g,ca=0;ca<a.length;ca++){var l=a[ca];l.H[c]==b?d.push(l):void 0==g||l.H[c]<g?(e=[l],g=l.H[c]):l.H[c]==g&&e.push(l)}return 0<d.length?d:e},lc=function(a){return 0==a.indexOf(".")?a.substr(1):a},id=function(){var a=[],b=xa().split(".");if(4==b.length){var c=b[b.length-1];if(parseInt(c,10)==c)return["none"]}for(c=b.length-2;0<=c;c--)a.push(b.slice(c).join("."));
|
47 |
-
b=M.location.hostname;eb.test(b)||vc.test(b)||a.push("none");return a},kc=function(a){if(!a)return"/";1<a.length&&a.lastIndexOf("/")==a.length-1&&(a=a.substr(0,a.length-1));0!=a.indexOf("/")&&(a="/"+a);return a},jc=function(a){a=kc(a);return"/"==a?1:a.split("/").length},le=function(a){a.ta&&J(77);a.na&&J(74);a.pa&&J(73);a.ua&&J(69)};function Xc(a,b,c){"none"==b&&(b="");var d=[],e=Ca(a);a="__utma"==a?6:2;for(var g=0;g<e.length;g++){var ca=(""+e[g]).split(".");ca.length>=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;d<b.length;d++)if(b[d].hash==c||b[d].hash==a)return b[d]};var od=new RegExp(/^https?:\/\/([^\/:]+)/),De=O.google_tag_data.glBridge,pd=/(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/,me=/(.*)([?&#])(?:_gac=[^&#]*)(?:&?)(.*)/;function Bc(a){if(a.get(Ze))return J(35),De.generate($e(a));var b=P(a,Q),c=P(a,I)||"";b="_ga=2."+K(pa(c+b,0)+"."+c+"-"+b);(a=af(a))?(J(44),a="&_gac=1."+K([pa(a.qa,0),a.timestamp,a.qa].join("."))):a="";return b+a}
|
48 |
-
function Ic(a,b){var c=new Date,d=O.navigator,e=d.plugins||[];a=[a,d.userAgent,c.getTimezoneOffset(),c.getYear(),c.getDate(),c.getHours(),c.getMinutes()+b];for(b=0;b<e.length;++b)a.push(e[b].description);return La(a.join("."))}function pa(a,b){var c=new Date,d=O.navigator,e=c.getHours()+Math.floor((c.getMinutes()+b)/60);return La([a,d.userAgent,d.language||"",c.getTimezoneOffset(),c.getYear(),c.getDate()+Math.floor(e/24),(24+e)%24,(60+c.getMinutes()+b)%60].join("."))}
|
49 |
-
var Dc=function(a){J(48);this.target=a;this.T=!1};Dc.prototype.ca=function(a,b){if(a){if(this.target.get(Ze))return De.decorate($e(this.target),a,b);if(a.tagName){if("a"==a.tagName.toLowerCase()){a.href&&(a.href=qd(this,a.href,b));return}if("form"==a.tagName.toLowerCase())return rd(this,a)}if("string"==typeof a)return qd(this,a,b)}};
|
50 |
-
var qd=function(a,b,c){var d=pd.exec(b);d&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));(d=me.exec(b))&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));a=a.target.get("linkerParam");var e=b.indexOf("?");d=b.indexOf("#");c?b+=(-1==d?"#":"&")+a:(c=-1==e?"?":"&",b=-1==d?b+(c+a):b.substring(0,d)+c+a+b.substring(d));b=b.replace(/&+_ga=/,"&_ga=");return b=b.replace(/&+_gac=/,"&_gac=")},rd=function(a,b){if(b&&b.action)if("get"==b.method.toLowerCase()){a=a.target.get("linkerParam").split("&");for(var c=0;c<a.length;c++){var d=
|
51 |
-
a[c].split("="),e=d[1];d=d[0];for(var g=b.childNodes||[],ca=!1,l=0;l<g.length;l++)if(g[l].name==d){g[l].setAttribute("value",e);ca=!0;break}ca||(g=M.createElement("input"),g.setAttribute("type","hidden"),g.setAttribute("name",d),g.setAttribute("value",e),b.appendChild(g))}}else"post"==b.method.toLowerCase()&&(b.action=qd(a,b.action))};
|
52 |
-
Dc.prototype.S=function(a,b,c){function d(g){try{g=g||O.event;a:{var ca=g.target||g.srcElement;for(g=100;ca&&0<g;){if(ca.href&&ca.nodeName.match(/^a(?:rea)?$/i)){var l=ca;break a}ca=ca.parentNode;g--}l={}}("http:"==l.protocol||"https:"==l.protocol)&&sd(a,l.hostname||"")&&l.href&&(l.href=qd(e,l.href,b))}catch(k){J(26)}}var e=this;this.target.get(Ze)?De.auto(function(){return $e(e.target)},a,b?"fragment":"",c):(this.T||(this.T=!0,L(M,"mousedown",d,!1),L(M,"keyup",d,!1)),c&&L(M,"submit",function(g){g=
|
53 |
-
g||O.event;if((g=g.target||g.srcElement)&&g.action){var ca=g.action.match(od);ca&&sd(a,ca[1])&&rd(e,g)}}))};function sd(a,b){if(b==M.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}function ke(a,b){return b!=Ic(a,0)&&b!=Ic(a,-1)&&b!=Ic(a,-2)&&b!=pa(a,0)&&b!=pa(a,-1)&&b!=pa(a,-2)}function $e(a){var b=af(a);return{_ga:a.get(Q),_gid:a.get(I)||void 0,_gac:b?[b.qa,b.timestamp].join("."):void 0}}
|
54 |
-
function af(a){function b(e){return void 0==e||""===e?0:Number(e)}var c=a.get(ce);if(c&&a.get(je)){var d=b(a.get(fe));if(1E3*d+b(a.get(he))<=(new Date).getTime())J(76);else return{timestamp:d,qa:c}}};var p=/^(GTM|OPT)-[A-Z0-9]+$/,q=/;_gaexp=[^;]*/g,r=/;((__utma=)|([^;=]+=GAX?\d+\.))[^;]*/g,Aa=/^https?:\/\/[\w\-.]+\.google.com(:\d+)?\/optimize\/opt-launch\.html\?.*$/,t=function(a){function b(d,e){e&&(c+="&"+d+"="+K(e))}var c="https://www.google-analytics.com/gtm/js?id="+K(a.id);"dataLayer"!=a.B&&b("l",a.B);b("t",a.target);b("cid",a.clientId);b("cidt",a.ka);b("gac",a.la);b("aip",a.ia);a.sync&&b("m","sync");b("cycle",a.G);a.qa&&b("gclid",a.qa);Aa.test(M.referrer)&&b("cb",String(hd()));return c};var Jd=function(a,b,c){this.aa=b;(b=c)||(b=(b=P(a,V))&&"t0"!=b?Wd.test(b)?"_gat_"+Cc(P(a,Na)):"_gat_"+Cc(b):"_gat");this.Y=b;this.ra=null},Rd=function(a,b){var c=b.get(Wb);b.set(Wb,function(e){Pd(a,e,ed);Pd(a,e,ia);var g=c(e);Qd(a,e);return g});var d=b.get(Xb);b.set(Xb,function(e){var g=d(e);if(se(e)){if(ne()!==H(a,e)){J(80);var ca={U:re(a,e,1),google:re(a,e,2),count:0};pe("https://stats.g.doubleclick.net/j/collect",ca.U,ca)}else ta(re(a,e,0));e.set(ed,"",!0)}return g})},Pd=function(a,b,c){!1===b.get(Ud)||
|
55 |
-
b.get(c)||("1"==Ca(a.Y)[0]?b.set(c,"",!0):b.set(c,""+hd(),!0))},Qd=function(a,b){se(b)&&zc(a.Y,"1",P(b,Yb),P(b,W),P(b,Na),6E4)},se=function(a){return!!a.get(ed)&&!1!==a.get(Ud)},re=function(a,b,c){var d=new ee,e=function(ca){$a(ca).F&&d.set($a(ca).F,b.get(ca))};e(hb);e(ib);e(Na);e(Q);e(ed);if(0==c||1==c)e(Ad),e(ia),e(I);d.set($a(ld).F,Td(b));var g="";d.map(function(ca,l){g+=K(ca)+"=";g+=K(""+l)+"&"});g+="z="+hd();0==c?g=a.aa+g:1==c?g="t=dc&aip=1&_r=3&"+g:2==c&&(g="t=sr&aip=1&_r=4&slf_rd=1&"+g);return g},
|
56 |
-
H=function(a,b){null===a.ra&&(a.ra=1===Ed(b),a.ra&&J(33));return a.ra},Wd=/^gtm\d+$/;var fd=function(a,b){a=a.b;if(!a.get("dcLoaded")){var c=new $c(Dd(a));c.set(29);a.set(Gd,c.w);b=b||{};var d;b[U]&&(d=Cc(b[U]));b=new Jd(a,"https://stats.g.doubleclick.net/r/collect?t=dc&aip=1&_r=3&",d);Rd(b,a);a.set("dcLoaded",!0)}};var Sd=function(a){if(!a.get("dcLoaded")&&"cookie"==a.get(ac)){var b=new Jd(a);Pd(b,a,ed);Pd(b,a,ia);Qd(b,a);if(se(a)){var c=ne()!==H(b,a);a.set(Md,1,!0);c?(J(79),a.set(ad,"d",!0),a.set(qe,{U:re(b,a,1),google:re(b,a,2),count:0},!0)):a.set(ad,"b",!0)}}};var Lc=function(){var a=O.gaGlobal=O.gaGlobal||{};return a.hid=a.hid||hd()};var wb=/^(UA|YT|MO|GP)-(\d+)-(\d+)$/,pc=function(a){function b(e,g){d.b.data.set(e,g)}function c(e,g){b(e,g);d.filters.add(e)}var d=this;this.b=new Ya;this.filters=new Ha;b(V,a[V]);b(Na,sa(a[Na]));b(U,a[U]);b(W,a[W]||xa());b(Yb,a[Yb]);b(Zb,a[Zb]);b(Hd,a[Hd]);b($b,a[$b]);b(Wc,a[Wc]);b(bc,a[bc]);b(cc,a[cc]);b(Ka,a[Ka]);b(dc,a[dc]);b(ec,a[ec]);b(ac,a[ac]);b(Ad,a[Ad]);b(n,a[n]);b(Kd,a[Kd]);b(je,a[je]);b(Ze,a[Ze]);b(oe,a[oe]);b(hb,1);b(ib,"j78");c(Qb,Ma);c(oa,ua);c(dd,cd);c(Rb,Oa);c(md,vb);c(Sb,nc);c(Uc,
|
57 |
-
Yc);c(Tb,Ja);c(Vb,Ta);c(Vc,Hc);c(zd,yd);c(Ld,Sd);c(Wb,Pa);c(Xb,Sa);c(Cd,Fd(this));Kc(this.b);Jc(this.b,a[Q]);this.b.set(jb,Lc())},Jc=function(a,b){var c=P(a,U);a.data.set(la,"_ga"==c?"_gid":c+"_gid");if("cookie"==P(a,ac)){hc=!1;c=Ca(P(a,U));c=Xd(a,c);if(!c){c=P(a,W);var d=P(a,$b)||xa();c=Xc("__utma",d,c);void 0!=c?(J(10),c=c.O[1]+"."+c.O[2]):c=void 0}c&&(hc=!0);if(d=c&&!a.get(Hd))if(d=c.split("."),2!=d.length)d=!1;else if(d=Number(d[1])){var e=R(a,Zb);d=d+e<(new Date).getTime()/1E3}else d=!1;d&&(c=
|
58 |
-
void 0);c&&(a.data.set(xd,c),a.data.set(Q,c),c=Ca(P(a,la)),(c=Xd(a,c))&&a.data.set(I,c));if(a.get(je)&&(c=a.get(ce),d=a.get(ie),!c||d&&"aw.ds"!=d)){c={};if(M){d=[];e=M.cookie.split(";");for(var g=/^\s*_gac_(UA-\d+-\d+)=\s*(.+?)\s*$/,ca=0;ca<e.length;ca++){var l=e[ca].match(g);l&&d.push({ja:l[1],value:l[2]})}e={};if(d&&d.length)for(g=0;g<d.length;g++)(ca=d[g].value.split("."),"1"!=ca[0]||3!=ca.length)?c&&(c.na=!0):ca[1]&&(e[d[g].ja]?c&&(c.pa=!0):e[d[g].ja]=[],e[d[g].ja].push({timestamp:ca[1],qa:ca[2]}));
|
59 |
-
d=e}else d={};d=d[P(a,Na)];le(c);d&&0!=d.length&&(c=d[0],a.data.set(fe,c.timestamp),a.data.set(ce,c.qa))}}if(a.get(Hd)&&(c=be("_ga",!!a.get(cc)),g=be("_gl",!!a.get(cc)),d=De.get(a.get(cc)),e=d._ga,g&&0<g.indexOf("_ga*")&&!e&&J(30),g=d.gclid,ca=d._gac,c||e||g||ca))if(c&&e&&J(36),a.get(bc)||ye(a.get(Kd))){if(e&&(J(38),a.data.set(Q,e),d._gid&&(J(51),a.data.set(I,d._gid))),g?(J(82),a.data.set(ce,g),d.gclsrc&&a.data.set(ie,d.gclsrc)):ca&&(d=ca.split("."))&&2===d.length&&(J(37),a.data.set(ce,d[0]),a.data.set(fe,
|
60 |
-
d[1])),c)b:if(d=c.indexOf("."),-1==d)J(22);else{e=c.substring(0,d);g=c.substring(d+1);d=g.indexOf(".");c=g.substring(0,d);g=g.substring(d+1);if("1"==e){if(d=g,ke(d,c)){J(23);break b}}else if("2"==e){d=g.indexOf("-");e="";0<d?(e=g.substring(0,d),d=g.substring(d+1)):d=g.substring(1);if(ke(e+d,c)){J(53);break b}e&&(J(2),a.data.set(I,e))}else{J(22);break b}J(11);a.data.set(Q,d);if(c=be("_gac",!!a.get(cc)))c=c.split("."),"1"!=c[0]||4!=c.length?J(72):ke(c[3],c[1])?J(71):(a.data.set(ce,c[3]),a.data.set(fe,
|
61 |
-
c[2]),J(70))}}else J(21);b&&(J(9),a.data.set(Q,K(b)));a.get(Q)||((b=(b=O.gaGlobal&&O.gaGlobal.vid)&&-1!=b.search(jd)?b:void 0)?(J(17),a.data.set(Q,b)):(J(8),a.data.set(Q,ra())));a.get(I)||(J(3),a.data.set(I,ra()));mc(a)},Kc=function(a){var b=O.navigator,c=O.screen,d=M.location;a.set(lb,ya(!!a.get(ec),!!a.get(Kd)));if(d){var e=d.pathname||"";"/"!=e.charAt(0)&&(J(31),e="/"+e);a.set(kb,d.protocol+"//"+d.hostname+e+d.search)}c&&a.set(qb,c.width+"x"+c.height);c&&a.set(pb,c.colorDepth+"-bit");c=M.documentElement;
|
62 |
-
var g=(e=M.body)&&e.clientWidth&&e.clientHeight,ca=[];c&&c.clientWidth&&c.clientHeight&&("CSS1Compat"===M.compatMode||!g)?ca=[c.clientWidth,c.clientHeight]:g&&(ca=[e.clientWidth,e.clientHeight]);c=0>=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&&"function"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb,(b&&(b.language||b.browserLanguage)||"").toLowerCase());a.data.set(ce,be("gclid",!0));a.data.set(ie,be("gclsrc",!0));a.data.set(fe,
|
63 |
-
Math.round((new Date).getTime()/1E3));if(d&&a.get(cc)&&(b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(c=0;c<b.length;++c)(D(b[c],"utm_id")||D(b[c],"utm_campaign")||D(b[c],"utm_source")||D(b[c],"utm_medium")||D(b[c],"utm_term")||D(b[c],"utm_content")||D(b[c],"gclid")||D(b[c],"dclid")||D(b[c],"gclsrc"))&&d.push(b[c]);0<d.length&&(b="#"+d.join("&"),a.set(kb,a.get(kb)+b))}};pc.prototype.get=function(a){return this.b.get(a)};pc.prototype.set=function(a,b){this.b.set(a,b)};
|
64 |
-
var qc={pageview:[mb],event:[ub,xb,yb,zb],social:[Bb,Cb,Db],timing:[Mb,Nb,Pb,Ob]};pc.prototype.send=function(a){if(!(1>arguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(qc[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b.data.m={})}};pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0},z=function(a){if(!rc(a)){J(16);var b=!1,c=function(){if(!b&&rc(a)){b=!0;var d=c,e=M;e.removeEventListener?e.removeEventListener("visibilitychange",d,!1):e.detachEvent&&e.detachEvent("onvisibilitychange",d)}};L(M,"visibilitychange",c)}};var td=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=td.exec(a[0]);null!=b&&4==b.length&&(this.c=b[1]||"t0",this.K=b[2]||"",this.C=b[3],this.a=[].slice.call(a,1),this.K||(this.A="create"==this.C,this.i="require"==this.C,this.g="provide"==this.C,this.ba="remove"==this.C),this.i&&(3<=this.a.length?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.C)throw"abort";if(this.i&&(!qa(b)||""==b))throw"abort";
|
65 |
-
if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.c)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.c)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d,A;Yd=new ee;$d=new ee;A=new ee;Zd={ec:45,ecommerce:46,linkid:47};
|
66 |
-
var u=function(a,b,c){b==N||b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new ee;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},y=function(a,b,c,d,e){if(!ea(Yd.get(b))&&!$d.get(b)){Zd.hasOwnProperty(b)&&J(Zd[b]);a=N.j(a);if(p.test(b)){J(52);if(!a)return!0;c=d||{};d={id:b,B:c.dataLayer||"dataLayer",ia:!!a.get("anonymizeIp"),sync:e,G:!1};a.get(">m")==b&&(d.G=!0);var g=String(a.get("name"));"t0"!=g&&(d.target=g);G(String(a.get("trackingId")))||(d.clientId=
|
67 |
-
String(a.get(Q)),d.ka=Number(a.get(n)),c=c.palindrome?r:q,c=(c=M.cookie.replace(/^|(; +)/g,";").match(c))?c.sort().join("").substring(1):void 0,d.la=c,d.qa=E(a.b.get(kb)||"","gclid"));c=d.B;g=(new Date).getTime();O[c]=O[c]||[];g={"gtm.start":g};e||(g.event="gtm.js");O[c].push(g);c=t(d)}!c&&Zd.hasOwnProperty(b)?(J(39),c=b+".js"):J(43);if(c){if(a){var ca=a.get(oe);qa(ca)||(ca=void 0)}c&&0<=c.indexOf("/")||(c=(ca?ca+"/34":bd(!1)+"/plugins/ua/")+c);ca=ae(c);a=ca.protocol;d=M.location.protocol;if(("https:"==
|
68 |
-
a||a==d||("http:"!=a?0:"http:"==d))&&B(ca)){if(ca=ca.url)a=(a=M.querySelector&&M.querySelector("script[nonce]")||null)?a.nonce||a.getAttribute&&a.getAttribute("nonce")||"":"",e?(e="",a&&Nd.test(a)&&(e=' nonce="'+a+'"'),f.test(ca)&&M.write("<script"+e+' src="'+ca+'">\x3c/script>')):(e=M.createElement("script"),e.type="text/javascript",e.async=!0,e.src=ca,a&&e.setAttribute("nonce",a),ca=M.getElementsByTagName("script")[0],ca.parentNode.insertBefore(e,ca));$d.set(b,!0)}}}},v=function(a,b){var c=A.get(a)||
|
69 |
-
[];c.push(b);A.set(a,c)},C=function(a,b){Yd.set(a,b);b=A.get(a)||[];for(var c=0;c<b.length;c++)b[c]();A.set(a,[])},B=function(a){var b=ae(M.location.href);if(D(a.url,"https://www.google-analytics.com/gtm/js?id="))return!0;if(a.query||0<=a.url.indexOf("?")||0<=a.path.indexOf("://"))return!1;if(a.host==b.host&&a.port==b.port)return!0;b="http:"==a.protocol?80:443;return"www.google-analytics.com"==a.host&&(a.port||b)==b&&D(a.path,"/plugins/")?!0:!1},ae=function(a){function b(l){var k=l.hostname||"",w=
|
70 |
-
0<=k.indexOf("]");k=k.split(w?"]":":")[0].toLowerCase();w&&(k+="]");w=(l.protocol||"").toLowerCase();w=1*l.port||("http:"==w?80:"https:"==w?443:"");l=l.pathname||"";D(l,"/")||(l="/"+l);return[k,""+w,l]}var c=M.createElement("a");c.href=M.location.href;var d=(c.protocol||"").toLowerCase(),e=b(c),g=c.search||"",ca=d+"//"+e[0]+(e[1]?":"+e[1]:"");D(a,"//")?a=d+a:D(a,"/")?a=ca+a:!a||D(a,"?")?a=ca+e[2]+(a||g):0>a.split("/")[0].indexOf(":")&&(a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+"/"+a);c.href=a;
|
71 |
-
d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.f.concat(b);for(Z.f=[];0<b.length&&!Z.v(b[0])&&!(b.shift(),0<Z.f.length););Z.f=Z.f.concat(b)};Z.J=function(a){for(var b=[],c=0;c<arguments.length;c++)try{var d=new sc(arguments[c]);d.g?C(d.a[0],d.a[1]):(d.i&&(d.ha=y(d.c,d.a[0],d.X,d.W)),b.push(d))}catch(e){}return b};
|
72 |
-
Z.v=function(a){try{if(a.u)a.u.call(O,N.j("t0"));else{var b=a.c==gb?N:N.j(a.c);if(a.A){if("t0"==a.c&&(b=N.create.apply(N,a.a),null===b))return!0}else if(a.ba)N.remove(a.c);else if(b)if(a.i){if(a.ha&&(a.ha=y(a.c,a.a[0],a.X,a.W)),!u(a.a[0],b,a.W))return!0}else if(a.K){var c=a.C,d=a.a,e=b.plugins_.get(a.K);e[c].apply(e,d)}else b[a.C].apply(b,a.a)}}catch(g){}};var N=function(a){J(1);Z.D.apply(Z,[arguments])};N.h={};N.P=[];N.L=0;N.ya=0;N.answer=42;var uc=[Na,W,V];N.create=function(a){var b=za(uc,[].slice.call(arguments));b[V]||(b[V]="t0");var c=""+b[V];if(N.h[c])return N.h[c];if(da(b))return null;b=new pc(b);N.h[c]=b;N.P.push(b);return b};N.remove=function(a){for(var b=0;b<N.P.length;b++)if(N.P[b].get(V)==a){N.P.splice(b,1);N.h[a]=null;break}};N.j=function(a){return N.h[a]};N.getAll=function(){return N.P.slice(0)};
|
73 |
-
N.N=function(){"ga"!=gb&&J(49);var a=O[gb];if(!a||42!=a.answer){N.L=a&&a.l;N.ya=1*new Date;N.loaded=!0;var b=O[gb]=N;X("create",b,b.create);X("remove",b,b.remove);X("getByName",b,b.j,5);X("getAll",b,b.getAll,6);b=pc.prototype;X("get",b,b.get,7);X("set",b,b.set,4);X("send",b,b.send);X("requireSync",b,b.ma);b=Ya.prototype;X("get",b,b.get);X("set",b,b.set);if("https:"!=M.location.protocol&&!Ba){a:{b=M.getElementsByTagName("script");for(var c=0;c<b.length&&100>c;c++){var d=b[c].src;if(d&&0==d.indexOf(bd(!0)+
|
74 |
-
"/analytics")){b=!0;break a}}b=!1}b&&(Ba=!0)}(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};N.da=function(){for(var a=N.getAll(),b=0;b<a.length;b++)a[b].get(V)};var te=N.N,we=O[gb];we&&we.r?te():z(te);z(function(){Z.D(["provide","render",ua])});})(window);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clearfy.php
CHANGED
@@ -1,51 +1,56 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Этот файл инициализирует этот плагин, как аддон для плагина Clearfy.
|
4 |
-
*
|
5 |
-
* Файл будет подключен только в плагине Clearfy, используя особый вариант загрузки. Это более простое решение
|
6 |
-
* пришло на смену встроенной системы подключения аддонов в фреймворке.
|
7 |
-
*
|
8 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
9 |
-
* @copyright (c) 2018 Webraftic Ltd
|
10 |
-
*/
|
11 |
-
|
12 |
-
// Exit if accessed directly
|
13 |
-
if
|
14 |
-
exit;
|
15 |
-
}
|
16 |
-
|
17 |
-
if
|
18 |
-
define(
|
19 |
-
define(
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
}
|
50 |
-
|
51 |
-
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Этот файл инициализирует этот плагин, как аддон для плагина Clearfy.
|
4 |
+
*
|
5 |
+
* Файл будет подключен только в плагине Clearfy, используя особый вариант загрузки. Это более простое решение
|
6 |
+
* пришло на смену встроенной системы подключения аддонов в фреймворке.
|
7 |
+
*
|
8 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
9 |
+
* @copyright (c) 2018 Webraftic Ltd
|
10 |
+
*/
|
11 |
+
|
12 |
+
// Exit if accessed directly
|
13 |
+
if( !defined('ABSPATH') ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
if( !defined('WGA_PLUGIN_ACTIVE') ) {
|
18 |
+
define('WGA_PLUGIN_VERSION', '3.2.2');
|
19 |
+
define('WGA_TEXT_DOMAIN', 'simple-google-analytics');
|
20 |
+
define('WGA_PLUGIN_ACTIVE', true);
|
21 |
+
|
22 |
+
// Этот плагин загружен, как аддон для плагина Clearfy
|
23 |
+
define('LOADING_GA_CACHE_AS_ADDON', true);
|
24 |
+
|
25 |
+
if( !defined('WGA_PLUGIN_DIR') ) {
|
26 |
+
define('WGA_PLUGIN_DIR', dirname(__FILE__));
|
27 |
+
}
|
28 |
+
|
29 |
+
if( !defined('WGA_PLUGIN_BASE') ) {
|
30 |
+
define('WGA_PLUGIN_BASE', plugin_basename(__FILE__));
|
31 |
+
}
|
32 |
+
|
33 |
+
if( !defined('WGA_PLUGIN_URL') ) {
|
34 |
+
define('WGA_PLUGIN_URL', plugins_url(null, __FILE__));
|
35 |
+
}
|
36 |
+
|
37 |
+
if( !defined('WGA_PLUGIN_CACHE_FOLDER') ) {
|
38 |
+
define('WGA_PLUGIN_CACHE_FOLDER', 'wga-cache');
|
39 |
+
}
|
40 |
+
|
41 |
+
try {
|
42 |
+
// Global scripts
|
43 |
+
require_once(WGA_PLUGIN_DIR . '/includes/3rd-party/class-clearfy-plugin.php');
|
44 |
+
new WGA_Plugin();
|
45 |
+
} catch( Exception $e ) {
|
46 |
+
$wga_plugin_error_func = function () use ($e) {
|
47 |
+
$error = sprintf("The %s plugin has stopped. <b>Error:</b> %s Code: %s", 'Webcraftic Local Google Analytic', $e->getMessage(), $e->getCode());
|
48 |
+
echo '<div class="notice notice-error"><p>' . $error . '</p></div>';
|
49 |
+
};
|
50 |
+
|
51 |
+
add_action('admin_notices', $wga_plugin_error_func);
|
52 |
+
add_action('network_admin_notices', $wga_plugin_error_func);
|
53 |
+
}
|
54 |
+
}
|
55 |
+
|
56 |
+
|
includes/3rd-party/class-clearfy-plugin.php
CHANGED
@@ -1,90 +1,100 @@
|
|
1 |
-
<?php
|
2 |
-
// Exit if accessed directly
|
3 |
-
if
|
4 |
-
exit;
|
5 |
-
}
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Local Google Analytic
|
9 |
-
*
|
10 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
11 |
-
* @copyright (c) 2018 Webraftic Ltd
|
12 |
-
* @version 1.0
|
13 |
-
*/
|
14 |
-
class WGA_Plugin {
|
15 |
-
|
16 |
-
/**
|
17 |
-
* @see self::app()
|
18 |
-
* @var WCL_Plugin
|
19 |
-
*/
|
20 |
-
private static $app;
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Конструктор
|
24 |
-
*
|
25 |
-
* Применяет конструктор родительского класса и записывает экземпляр текущего класса в свойство $app.
|
26 |
-
* Подробнее о свойстве $app см. self::app()
|
27 |
-
*
|
28 |
-
* @param string $plugin_path
|
29 |
-
* @param array
|
30 |
-
*
|
31 |
-
* @throws Exception
|
32 |
-
*/
|
33 |
-
public function __construct()
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
$this->
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
*
|
51 |
-
*
|
52 |
-
*
|
53 |
-
*
|
54 |
-
*
|
55 |
-
*
|
56 |
-
*
|
57 |
-
*
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
}
|
1 |
+
<?php
|
2 |
+
// Exit if accessed directly
|
3 |
+
if( !defined('ABSPATH') ) {
|
4 |
+
exit;
|
5 |
+
}
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Local Google Analytic
|
9 |
+
*
|
10 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
11 |
+
* @copyright (c) 2018 Webraftic Ltd
|
12 |
+
* @version 1.0
|
13 |
+
*/
|
14 |
+
class WGA_Plugin {
|
15 |
+
|
16 |
+
/**
|
17 |
+
* @see self::app()
|
18 |
+
* @var WCL_Plugin
|
19 |
+
*/
|
20 |
+
private static $app;
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Конструктор
|
24 |
+
*
|
25 |
+
* Применяет конструктор родительского класса и записывает экземпляр текущего класса в свойство $app.
|
26 |
+
* Подробнее о свойстве $app см. self::app()
|
27 |
+
*
|
28 |
+
* @param string $plugin_path
|
29 |
+
* @param array $data
|
30 |
+
*
|
31 |
+
* @throws Exception
|
32 |
+
*/
|
33 |
+
public function __construct()
|
34 |
+
{
|
35 |
+
if( !class_exists('WCL_Plugin') ) {
|
36 |
+
throw new Exception('Plugin Clearfy is not installed!');
|
37 |
+
}
|
38 |
+
|
39 |
+
self::$app = WCL_Plugin::app();
|
40 |
+
|
41 |
+
$this->global_scripts();
|
42 |
+
|
43 |
+
if( is_admin() ) {
|
44 |
+
$this->init_activation();
|
45 |
+
$this->admin_scripts();
|
46 |
+
}
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Статический метод для быстрого доступа к интерфейсу плагина.
|
51 |
+
*
|
52 |
+
* Позволяет разработчику глобально получить доступ к экземпляру класса плагина в любом месте
|
53 |
+
* плагина, но при этом разработчик не может вносить изменения в основной класс плагина.
|
54 |
+
*
|
55 |
+
* Используется для получения настроек плагина, информации о плагине, для доступа к вспомогательным
|
56 |
+
* классам.
|
57 |
+
*
|
58 |
+
* @return WCL_Plugin
|
59 |
+
*/
|
60 |
+
public static function app()
|
61 |
+
{
|
62 |
+
return self::$app;
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
67 |
+
* @since 3.0.0
|
68 |
+
*/
|
69 |
+
private function init_activation()
|
70 |
+
{
|
71 |
+
require_once(WGA_PLUGIN_DIR . '/admin/activation.php');
|
72 |
+
self::app()->registerActivation('WGA_Activation');
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* @throws \Exception
|
77 |
+
* @since 3.0.0
|
78 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
79 |
+
*/
|
80 |
+
private function admin_scripts()
|
81 |
+
{
|
82 |
+
require(WGA_PLUGIN_DIR . '/admin/options.php');
|
83 |
+
require(WGA_PLUGIN_DIR . '/admin/boot.php');
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
88 |
+
* @since 3.0.0
|
89 |
+
*/
|
90 |
+
private function global_scripts()
|
91 |
+
{
|
92 |
+
require(WGA_PLUGIN_DIR . '/includes/classes/class-configurate-ga.php');
|
93 |
+
new WGA_ConfigGACache(self::$app);
|
94 |
+
|
95 |
+
add_action('plugins_loaded', function () {
|
96 |
+
require(WGA_PLUGIN_DIR . '/includes/classes/class-scheduler.php');
|
97 |
+
new \WGA\Busting\Sheduller();
|
98 |
+
});
|
99 |
+
}
|
100 |
}
|
includes/class-plugin.php
CHANGED
@@ -1,121 +1,130 @@
|
|
1 |
-
<?php
|
2 |
-
// Exit if accessed directly
|
3 |
-
if
|
4 |
-
exit;
|
5 |
-
}
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Plugin class
|
9 |
-
*
|
10 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
11 |
-
* @copyright (c) 19.02.2018, Webcraftic
|
12 |
-
*/
|
13 |
-
class WGA_Plugin extends
|
14 |
-
|
15 |
-
/**
|
16 |
-
* @see self::app()
|
17 |
-
* @var
|
18 |
-
*/
|
19 |
-
private static $app;
|
20 |
-
|
21 |
-
/**
|
22 |
-
* @since 3.1.0
|
23 |
-
* @var array
|
24 |
-
*/
|
25 |
-
private $plugin_data;
|
26 |
-
|
27 |
-
/**
|
28 |
-
* Конструктор
|
29 |
-
*
|
30 |
-
* Применяет конструктор родительского класса и записывает экземпляр текущего класса в свойство $app.
|
31 |
-
* Подробнее о свойстве $app см. self::app()
|
32 |
-
*
|
33 |
-
* @param string $plugin_path
|
34 |
-
* @param array
|
35 |
-
*
|
36 |
-
* @throws Exception
|
37 |
-
*/
|
38 |
-
public function __construct(
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
$this->
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
*
|
55 |
-
*
|
56 |
-
*
|
57 |
-
*
|
58 |
-
*
|
59 |
-
*
|
60 |
-
*
|
61 |
-
*
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
*
|
81 |
-
*
|
82 |
-
*
|
83 |
-
*
|
84 |
-
*
|
85 |
-
*
|
86 |
-
*
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
if
|
94 |
-
return;
|
95 |
-
}
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
// Exit if accessed directly
|
3 |
+
if( !defined('ABSPATH') ) {
|
4 |
+
exit;
|
5 |
+
}
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Plugin class
|
9 |
+
*
|
10 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
11 |
+
* @copyright (c) 19.02.2018, Webcraftic
|
12 |
+
*/
|
13 |
+
class WGA_Plugin extends Wbcr_Factory446_Plugin {
|
14 |
+
|
15 |
+
/**
|
16 |
+
* @see self::app()
|
17 |
+
* @var Wbcr_Factory446_Plugin
|
18 |
+
*/
|
19 |
+
private static $app;
|
20 |
+
|
21 |
+
/**
|
22 |
+
* @since 3.1.0
|
23 |
+
* @var array
|
24 |
+
*/
|
25 |
+
private $plugin_data;
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Конструктор
|
29 |
+
*
|
30 |
+
* Применяет конструктор родительского класса и записывает экземпляр текущего класса в свойство $app.
|
31 |
+
* Подробнее о свойстве $app см. self::app()
|
32 |
+
*
|
33 |
+
* @param string $plugin_path
|
34 |
+
* @param array $data
|
35 |
+
*
|
36 |
+
* @throws Exception
|
37 |
+
*/
|
38 |
+
public function __construct($plugin_path, $data)
|
39 |
+
{
|
40 |
+
parent::__construct($plugin_path, $data);
|
41 |
+
|
42 |
+
self::$app = $this;
|
43 |
+
$this->plugin_data = $data;
|
44 |
+
|
45 |
+
$this->global_scripts();
|
46 |
+
|
47 |
+
if( is_admin() ) {
|
48 |
+
$this->init_activation();
|
49 |
+
$this->admin_scripts();
|
50 |
+
}
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Статический метод для быстрого доступа к интерфейсу плагина.
|
55 |
+
*
|
56 |
+
* Позволяет разработчику глобально получить доступ к экземпляру класса плагина в любом месте
|
57 |
+
* плагина, но при этом разработчик не может вносить изменения в основной класс плагина.
|
58 |
+
*
|
59 |
+
* Используется для получения настроек плагина, информации о плагине, для доступа к вспомогательным
|
60 |
+
* классам.
|
61 |
+
*
|
62 |
+
* @return \Wbcr_Factory446_Plugin|\WGA_Plugin
|
63 |
+
*/
|
64 |
+
public static function app()
|
65 |
+
{
|
66 |
+
return self::$app;
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
71 |
+
* @since 3.0.0
|
72 |
+
*/
|
73 |
+
private function init_activation()
|
74 |
+
{
|
75 |
+
require_once(WGA_PLUGIN_DIR . '/admin/activation.php');
|
76 |
+
self::app()->registerActivation('WGA_Activation');
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Регистрирует классы страниц в плагине
|
81 |
+
*
|
82 |
+
* Мы указываем плагину, где найти файлы страниц и какое имя у их класса. Чтобы плагин
|
83 |
+
* выполнил подключение классов страниц. После регистрации, страницы будут доступные по url
|
84 |
+
* и в меню боковой панели администратора. Регистрируемые страницы будут связаны с текущим плагином
|
85 |
+
* все операции выполняемые внутри классов страниц, имеют отношение только текущему плагину.
|
86 |
+
*
|
87 |
+
* @throws \Exception
|
88 |
+
* @since 3.0.0
|
89 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
90 |
+
*/
|
91 |
+
private function register_pages()
|
92 |
+
{
|
93 |
+
if( $this->as_addon ) {
|
94 |
+
return;
|
95 |
+
}
|
96 |
+
|
97 |
+
if( $this->isNetworkActive() and !is_network_admin() ) {
|
98 |
+
return;
|
99 |
+
}
|
100 |
+
self::app()->registerPage('WGA_CachePage', WGA_PLUGIN_DIR . '/admin/pages/class-pages-general-settings.php');
|
101 |
+
self::app()->registerPage('WGA_MoreFeaturesPage', WGA_PLUGIN_DIR . '/admin/pages/class-pages-more-features.php');
|
102 |
+
}
|
103 |
+
|
104 |
+
/**
|
105 |
+
* @throws \Exception
|
106 |
+
* @since 3.1.0
|
107 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
108 |
+
*/
|
109 |
+
private function admin_scripts()
|
110 |
+
{
|
111 |
+
require(WGA_PLUGIN_DIR . '/admin/options.php');
|
112 |
+
require(WGA_PLUGIN_DIR . '/admin/boot.php');
|
113 |
+
|
114 |
+
$this->register_pages();
|
115 |
+
}
|
116 |
+
|
117 |
+
/**
|
118 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
119 |
+
* @since 3.0.0
|
120 |
+
*/
|
121 |
+
private function global_scripts()
|
122 |
+
{
|
123 |
+
require(WGA_PLUGIN_DIR . '/includes/classes/class-configurate-ga.php');
|
124 |
+
new WGA_ConfigGACache(self::$app);
|
125 |
+
|
126 |
+
require(WGA_PLUGIN_DIR . '/includes/classes/class-scheduler.php');
|
127 |
+
new \WGA\Busting\Sheduller();
|
128 |
+
}
|
129 |
+
}
|
130 |
+
|
includes/classes/class-abstract-cache.php
ADDED
@@ -0,0 +1,562 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WGA\Busting;
|
4 |
+
|
5 |
+
use FilesystemIterator;
|
6 |
+
use IteratorIterator;
|
7 |
+
use RegexIterator;
|
8 |
+
|
9 |
+
/**
|
10 |
+
* This class configures the google analytics cache
|
11 |
+
*
|
12 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
13 |
+
* @copyright (c) 2020 CreativeMotion Ltd
|
14 |
+
* @version 1.0
|
15 |
+
*/
|
16 |
+
|
17 |
+
// Exit if accessed directly
|
18 |
+
if( !defined('ABSPATH') ) {
|
19 |
+
exit;
|
20 |
+
}
|
21 |
+
|
22 |
+
abstract class Abstract_Cache {
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Cache busting files base path
|
26 |
+
*
|
27 |
+
* @var string
|
28 |
+
*/
|
29 |
+
protected $busting_path;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Cache busting base URL
|
33 |
+
*
|
34 |
+
* @var string
|
35 |
+
*/
|
36 |
+
protected $busting_url;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Filename for the cache busting file.
|
40 |
+
*
|
41 |
+
* @var string
|
42 |
+
*/
|
43 |
+
protected $filename;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Filesystem object.
|
47 |
+
*
|
48 |
+
* @var object
|
49 |
+
* @since 3.2.0
|
50 |
+
*/
|
51 |
+
protected $filesystem = false;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Constructor.
|
55 |
+
*
|
56 |
+
* @param string $busting_path Path to the busting directory.
|
57 |
+
* @param string $busting_url URL of the busting directory.
|
58 |
+
* @since 3.2.0
|
59 |
+
*/
|
60 |
+
public function __construct($busting_path, $busting_url)
|
61 |
+
{
|
62 |
+
/*
|
63 |
+
* Define the timeouts for the connections. Only available after the constructor is called
|
64 |
+
* to allow for per-transport overriding of the default.
|
65 |
+
*/
|
66 |
+
if( !defined('FS_CONNECT_TIMEOUT') ) {
|
67 |
+
define('FS_CONNECT_TIMEOUT', 30);
|
68 |
+
}
|
69 |
+
if( !defined('FS_TIMEOUT') ) {
|
70 |
+
define('FS_TIMEOUT', 30);
|
71 |
+
}
|
72 |
+
|
73 |
+
// Set the permission constants if not already set.
|
74 |
+
if( !defined('FS_CHMOD_DIR') ) {
|
75 |
+
define('FS_CHMOD_DIR', (fileperms(ABSPATH) & 0777 | 0755));
|
76 |
+
}
|
77 |
+
if( !defined('FS_CHMOD_FILE') ) {
|
78 |
+
define('FS_CHMOD_FILE', (fileperms(ABSPATH . 'index.php') & 0777 | 0644));
|
79 |
+
}
|
80 |
+
|
81 |
+
require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php';
|
82 |
+
require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php';
|
83 |
+
$this->filesystem = new \WP_Filesystem_Direct(new \StdClass());
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Tell if the cache busting should happen.
|
88 |
+
*
|
89 |
+
* @return bool
|
90 |
+
* @since 3.2.0
|
91 |
+
*
|
92 |
+
*/
|
93 |
+
private function is_allowed()
|
94 |
+
{
|
95 |
+
//if( defined('DONOTROCKETOPTIMIZE') && DONOTROCKETOPTIMIZE ) {
|
96 |
+
//return false;
|
97 |
+
//}
|
98 |
+
|
99 |
+
return true;
|
100 |
+
}
|
101 |
+
|
102 |
+
/**
|
103 |
+
* Saves the content of the URL to bust to the busting file.
|
104 |
+
*
|
105 |
+
* @param string $url URL to get the content from.
|
106 |
+
* @return bool
|
107 |
+
* @since 3.2.0
|
108 |
+
*/
|
109 |
+
public function refresh_save($url)
|
110 |
+
{
|
111 |
+
// Before doing anything, make sure the busting file can be created.
|
112 |
+
if( !$this->is_busting_dir_writable() ) {
|
113 |
+
return false;
|
114 |
+
}
|
115 |
+
|
116 |
+
// Get remote content.
|
117 |
+
$content = $this->get_remote_contents($url);
|
118 |
+
|
119 |
+
if( !$content ) {
|
120 |
+
// Could not get the remote contents.
|
121 |
+
return false;
|
122 |
+
}
|
123 |
+
|
124 |
+
$version = md5($content);
|
125 |
+
$path = $this->get_busting_file_path($version);
|
126 |
+
|
127 |
+
return $this->update_file_contents($path, $content);
|
128 |
+
}
|
129 |
+
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Performs the replacement process.
|
133 |
+
*
|
134 |
+
* @param string $html HTML content.
|
135 |
+
* @return string
|
136 |
+
* @since 3.2.0
|
137 |
+
*/
|
138 |
+
abstract public function replace_url($html);
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Searches for element(s) in the DOM
|
142 |
+
*
|
143 |
+
* @param string $pattern Pattern to match.
|
144 |
+
* @param string $html HTML content.
|
145 |
+
* @return string
|
146 |
+
* @since 3.2.0
|
147 |
+
*/
|
148 |
+
abstract protected function find($pattern, $html);
|
149 |
+
|
150 |
+
/**
|
151 |
+
* Saves the content of the URL to bust to the busting file if it doesn't exist yet.
|
152 |
+
*
|
153 |
+
* @param string $url URL to get the content from.
|
154 |
+
* @return bool
|
155 |
+
* @since 3.2.0
|
156 |
+
*/
|
157 |
+
public function save($url)
|
158 |
+
{
|
159 |
+
if( $this->get_busting_version() ) {
|
160 |
+
// We have a local copy.
|
161 |
+
\WGA_Plugin::app()->logger->info('Found local file. Busting path ' . $this->get_busting_path());
|
162 |
+
|
163 |
+
return true;
|
164 |
+
}
|
165 |
+
|
166 |
+
if( $this->refresh_save($url) ) {
|
167 |
+
// We downloaded a fresh copy.
|
168 |
+
\WGA_Plugin::app()->logger->info('New copy downloaded. Busting path ' . $this->get_busting_path());
|
169 |
+
|
170 |
+
return true;
|
171 |
+
}
|
172 |
+
|
173 |
+
return false;
|
174 |
+
}
|
175 |
+
|
176 |
+
/**
|
177 |
+
* Deletes the busting file.
|
178 |
+
*
|
179 |
+
* @return bool True on success. False on failure.
|
180 |
+
* @since 3.2.0
|
181 |
+
*/
|
182 |
+
public function delete()
|
183 |
+
{
|
184 |
+
$files = $this->get_all_files();
|
185 |
+
|
186 |
+
if( false === $files ) {
|
187 |
+
// Error.
|
188 |
+
return false;
|
189 |
+
}
|
190 |
+
|
191 |
+
$this->file_version = null;
|
192 |
+
|
193 |
+
if( !$files ) {
|
194 |
+
// No local files yet.
|
195 |
+
return true;
|
196 |
+
}
|
197 |
+
|
198 |
+
return $this->delete_files(array_keys($files));
|
199 |
+
}
|
200 |
+
|
201 |
+
/**
|
202 |
+
* Get the version of the current busting file.
|
203 |
+
*
|
204 |
+
* @return string|bool Version of the file. False if the file does not exist.
|
205 |
+
*
|
206 |
+
*
|
207 |
+
* @since 3.2.0
|
208 |
+
*/
|
209 |
+
protected function get_busting_version()
|
210 |
+
{
|
211 |
+
if( !empty($this->file_version) ) {
|
212 |
+
return $this->file_version;
|
213 |
+
}
|
214 |
+
|
215 |
+
$files = $this->get_all_files();
|
216 |
+
|
217 |
+
if( !$files ) {
|
218 |
+
return false;
|
219 |
+
}
|
220 |
+
|
221 |
+
$this->file_version = reset($files);
|
222 |
+
|
223 |
+
return $this->file_version;
|
224 |
+
}
|
225 |
+
|
226 |
+
/**
|
227 |
+
* Get all cached files in the directory.
|
228 |
+
* In a perfect world, there should be only one.
|
229 |
+
*
|
230 |
+
* @return bool|array A list of file names (as array keys) and versions (as array values). False on failure.
|
231 |
+
* @since 3.2.0
|
232 |
+
* @access private
|
233 |
+
*
|
234 |
+
*/
|
235 |
+
private function get_all_files()
|
236 |
+
{
|
237 |
+
$dir_path = rtrim($this->busting_path, '\\/');
|
238 |
+
|
239 |
+
if( !$this->filesystem->exists($dir_path) ) {
|
240 |
+
return [];
|
241 |
+
}
|
242 |
+
|
243 |
+
if( !$this->filesystem->is_readable($dir_path) ) {
|
244 |
+
\WGA_Plugin::app()->logger->error('Directory is not readable. Path ' . $dir_path);
|
245 |
+
|
246 |
+
return false;
|
247 |
+
}
|
248 |
+
|
249 |
+
$pattern = '/' . sprintf($this->escape_file_name($this->filename_pattern), '([a-f0-9]{32}|local)') . '/';
|
250 |
+
|
251 |
+
$entries = $this->get_dir_files_by_regex($dir_path, $pattern);
|
252 |
+
|
253 |
+
$list = [];
|
254 |
+
foreach($entries as $entry) {
|
255 |
+
$filename = $entry->getFilename();
|
256 |
+
|
257 |
+
preg_match($pattern, $filename, $file_details_match);
|
258 |
+
if( !empty($file_details_match[1]) ) {
|
259 |
+
$list[$filename] = $file_details_match[1];
|
260 |
+
}
|
261 |
+
}
|
262 |
+
|
263 |
+
return $list;
|
264 |
+
}
|
265 |
+
|
266 |
+
/**
|
267 |
+
* Get the final URL for the current cache busting file.
|
268 |
+
*
|
269 |
+
* @return string|bool URL of the file. False if the file does not exist.
|
270 |
+
* @since 3.2.0
|
271 |
+
* @access protected
|
272 |
+
*
|
273 |
+
*/
|
274 |
+
public function get_busting_url()
|
275 |
+
{
|
276 |
+
return $this->get_busting_file_url($this->get_busting_version());
|
277 |
+
}
|
278 |
+
|
279 |
+
/**
|
280 |
+
* Get the path to the current cache busting file.
|
281 |
+
*
|
282 |
+
* @return string|bool URL of the file. False if the file does not exist.
|
283 |
+
*
|
284 |
+
*
|
285 |
+
* @since 3.2.0
|
286 |
+
* @access protected
|
287 |
+
*/
|
288 |
+
protected function get_busting_path()
|
289 |
+
{
|
290 |
+
return $this->get_busting_file_path($this->get_busting_version());
|
291 |
+
}
|
292 |
+
|
293 |
+
/**
|
294 |
+
* Get the final URL for a cache busting file.
|
295 |
+
*
|
296 |
+
* @param string $version The file version.
|
297 |
+
* @return string|bool URL of the file with this version. False if no versions are provided.
|
298 |
+
* @since 3.2.0
|
299 |
+
* @access private
|
300 |
+
*
|
301 |
+
*
|
302 |
+
*/
|
303 |
+
private function get_busting_file_url($version)
|
304 |
+
{
|
305 |
+
if( !$version ) {
|
306 |
+
return false;
|
307 |
+
}
|
308 |
+
|
309 |
+
$filename = $this->get_busting_file_name($version);
|
310 |
+
|
311 |
+
return $this->busting_url . $filename;
|
312 |
+
}
|
313 |
+
|
314 |
+
/**
|
315 |
+
* Get the local file name.
|
316 |
+
*
|
317 |
+
* @param string $version The file version.
|
318 |
+
* @return string|bool The name of the file with this version. False if no versions are provided.
|
319 |
+
* @since 3.2.0
|
320 |
+
* @access private
|
321 |
+
*/
|
322 |
+
private function get_busting_file_name($version)
|
323 |
+
{
|
324 |
+
if( !$version ) {
|
325 |
+
return false;
|
326 |
+
}
|
327 |
+
|
328 |
+
return sprintf($this->filename_pattern, $version);
|
329 |
+
}
|
330 |
+
|
331 |
+
/**
|
332 |
+
* Get the local file path.
|
333 |
+
*
|
334 |
+
* @param string $version The file version.
|
335 |
+
* @return string|bool Path to the file with this version. False if no versions are provided.
|
336 |
+
* @since 3.2.0
|
337 |
+
* @access private
|
338 |
+
*/
|
339 |
+
private function get_busting_file_path($version)
|
340 |
+
{
|
341 |
+
if( !$version ) {
|
342 |
+
return false;
|
343 |
+
}
|
344 |
+
|
345 |
+
return $this->busting_path . $this->get_busting_file_name($version);
|
346 |
+
}
|
347 |
+
|
348 |
+
/**
|
349 |
+
* Escape a file name, to be used in a regex pattern (delimiter is `/`).
|
350 |
+
* `%s` conversion specifications are protected.
|
351 |
+
*
|
352 |
+
* @param string $filename_pattern The file name.
|
353 |
+
* @return string
|
354 |
+
* @since 3.2.0
|
355 |
+
* @access private
|
356 |
+
*
|
357 |
+
*/
|
358 |
+
private function escape_file_name($filename_pattern)
|
359 |
+
{
|
360 |
+
return preg_quote($filename_pattern, '/');
|
361 |
+
}
|
362 |
+
|
363 |
+
/**
|
364 |
+
* Delete busting files.
|
365 |
+
*
|
366 |
+
* @param array $files A list of file names.
|
367 |
+
* @return bool True if files have been deleted (or no files have been provided). False on failure.
|
368 |
+
* @since 3.2.0
|
369 |
+
*/
|
370 |
+
private function delete_files($files)
|
371 |
+
{
|
372 |
+
if( !$files ) {
|
373 |
+
return true;
|
374 |
+
}
|
375 |
+
|
376 |
+
$has_deleted = false;
|
377 |
+
$error_paths = [];
|
378 |
+
|
379 |
+
foreach($files as $file_name) {
|
380 |
+
if( !$this->filesystem->delete($this->busting_path . $file_name, false, 'f') ) {
|
381 |
+
$error_paths[] = $this->busting_path . $file_name;
|
382 |
+
} else {
|
383 |
+
$has_deleted = true;
|
384 |
+
}
|
385 |
+
}
|
386 |
+
|
387 |
+
if( $error_paths ) {
|
388 |
+
\WGA_Plugin::app()->logger->error('Local file(s) could not be deleted. Path ' . $error_paths);
|
389 |
+
}
|
390 |
+
|
391 |
+
return $has_deleted;
|
392 |
+
}
|
393 |
+
|
394 |
+
/**
|
395 |
+
* Add new contents to a file. If the file doesn't exist, it is created.
|
396 |
+
*
|
397 |
+
* @param string $file_path Path to the file to update.
|
398 |
+
* @param string $file_contents New contents.
|
399 |
+
* @return string|bool The file contents on success. False on failure.
|
400 |
+
*
|
401 |
+
*
|
402 |
+
* @since 3.2.0
|
403 |
+
* @access private
|
404 |
+
*/
|
405 |
+
private function update_file_contents($file_path, $file_contents)
|
406 |
+
{
|
407 |
+
if( !$this->is_busting_dir_writable() ) {
|
408 |
+
return false;
|
409 |
+
}
|
410 |
+
|
411 |
+
if( !$this->filesystem->put_contents($file_path, $file_contents) ) {
|
412 |
+
\WGA_Plugin::app()->logger->error('Contents could not be written into file. Path ' . $file_path);
|
413 |
+
|
414 |
+
return false;
|
415 |
+
}
|
416 |
+
|
417 |
+
return $file_contents;
|
418 |
+
}
|
419 |
+
|
420 |
+
/**
|
421 |
+
* Tell if the directory containing the busting file is writable.
|
422 |
+
*
|
423 |
+
* @return bool
|
424 |
+
*
|
425 |
+
*
|
426 |
+
* @since 3.2
|
427 |
+
* @access private
|
428 |
+
*/
|
429 |
+
private function is_busting_dir_writable()
|
430 |
+
{
|
431 |
+
if( !$this->filesystem->exists($this->busting_path) ) {
|
432 |
+
wp_mkdir_p($this->busting_path);
|
433 |
+
}
|
434 |
+
|
435 |
+
if( !$this->filesystem->is_writable($this->busting_path) ) {
|
436 |
+
\WGA_Plugin::app()->logger->error('Directory is not writable. Paths ' . $this->busting_path);
|
437 |
+
|
438 |
+
return false;
|
439 |
+
}
|
440 |
+
|
441 |
+
return true;
|
442 |
+
}
|
443 |
+
|
444 |
+
/** ----------------------------------------------------------------------------------------- */
|
445 |
+
/** GET LOCAL/REMOTE CONTENTS =============================================================== */
|
446 |
+
/** ----------------------------------------------------------------------------------------- */
|
447 |
+
|
448 |
+
/**
|
449 |
+
* Get a file contents. If the file doesn't exist, new contents are fetched remotely.
|
450 |
+
*
|
451 |
+
* @param string $file_path Path to the file.
|
452 |
+
* @param string $file_url URL to the remote file.
|
453 |
+
* @return string|bool The contents on success, false on failure.
|
454 |
+
*
|
455 |
+
* @since 3.2.0
|
456 |
+
*/
|
457 |
+
private function get_file_or_remote_contents($file_path, $file_url)
|
458 |
+
{
|
459 |
+
$content = $this->get_file_contents($file_path);
|
460 |
+
|
461 |
+
if( $content ) {
|
462 |
+
// We have a local file.
|
463 |
+
return $content;
|
464 |
+
}
|
465 |
+
|
466 |
+
return $this->get_remote_contents($file_url);
|
467 |
+
}
|
468 |
+
|
469 |
+
/**
|
470 |
+
* Get a file contents.
|
471 |
+
*
|
472 |
+
* @param string $file_path Path to the file.
|
473 |
+
* @return string|bool The contents on success, false on failure.
|
474 |
+
* @since 3.2.0
|
475 |
+
* @access private
|
476 |
+
*
|
477 |
+
*
|
478 |
+
*/
|
479 |
+
private function get_file_contents($file_path)
|
480 |
+
{
|
481 |
+
if( !$this->filesystem->exists($file_path) ) {
|
482 |
+
\WGA_Plugin::app()->logger->error('Local file does not exist. Path ' . $file_path);
|
483 |
+
|
484 |
+
return false;
|
485 |
+
}
|
486 |
+
|
487 |
+
if( !$this->filesystem->is_readable($file_path) ) {
|
488 |
+
\WGA_Plugin::app()->logger->error('Local file is not readable. Path' . $file_path);
|
489 |
+
|
490 |
+
return false;
|
491 |
+
}
|
492 |
+
|
493 |
+
$content = $this->filesystem->get_contents($file_path);
|
494 |
+
|
495 |
+
if( !$content ) {
|
496 |
+
\WGA_Plugin::app()->logger->error('Local file is empty. Path' . $file_path);
|
497 |
+
|
498 |
+
return false;
|
499 |
+
}
|
500 |
+
|
501 |
+
return $content;
|
502 |
+
}
|
503 |
+
|
504 |
+
/**
|
505 |
+
* Get the contents of a URL.
|
506 |
+
*
|
507 |
+
* @param string $url The URL to request.
|
508 |
+
* @return string|bool The contents on success. False on failure.
|
509 |
+
* @since 3.2.0
|
510 |
+
* @access private
|
511 |
+
*
|
512 |
+
*
|
513 |
+
*/
|
514 |
+
private function get_remote_contents($url)
|
515 |
+
{
|
516 |
+
try {
|
517 |
+
$response = wp_remote_get($url);
|
518 |
+
} catch( \Exception $e ) {
|
519 |
+
\WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $e->getMessage());
|
520 |
+
|
521 |
+
return false;
|
522 |
+
}
|
523 |
+
|
524 |
+
if( is_wp_error($response) ) {
|
525 |
+
\WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
|
526 |
+
|
527 |
+
return false;
|
528 |
+
}
|
529 |
+
|
530 |
+
$contents = wp_remote_retrieve_body($response);
|
531 |
+
|
532 |
+
if( !$contents ) {
|
533 |
+
\WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
|
534 |
+
|
535 |
+
return false;
|
536 |
+
}
|
537 |
+
|
538 |
+
return $contents;
|
539 |
+
}
|
540 |
+
|
541 |
+
/**
|
542 |
+
* Gets Directory files matches regex.
|
543 |
+
*
|
544 |
+
* @param string $dir Directory to search for files inside it.
|
545 |
+
* @param string $regex Regular expression for files need to be searched for.
|
546 |
+
*
|
547 |
+
* @return array|RegexIterator List of files matches this regular expression.
|
548 |
+
* @since 3.6.3
|
549 |
+
* @access private
|
550 |
+
*
|
551 |
+
*/
|
552 |
+
function get_dir_files_by_regex($dir, $regex)
|
553 |
+
{ // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedFunctionFound
|
554 |
+
try {
|
555 |
+
$iterator = new IteratorIterator(new FilesystemIterator($dir));
|
556 |
+
|
557 |
+
return new RegexIterator($iterator, $regex);
|
558 |
+
} catch( \Exception $e ) {
|
559 |
+
return [];
|
560 |
+
}
|
561 |
+
}
|
562 |
+
}
|
includes/classes/class-configurate-ga.php
CHANGED
@@ -1,161 +1,207 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* This class configures the google analytics cache
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
6 |
-
* @copyright (c) 2017 Webraftic Ltd
|
7 |
-
* @version 1.0
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
-
exit;
|
13 |
-
}
|
14 |
-
|
15 |
-
class WGA_ConfigGACache extends
|
16 |
-
|
17 |
-
|
18 |
-
public function registerActionsAndFilters() {
|
19 |
-
|
20 |
-
if ( $this->getPopulateOption( 'ga_cache' ) ) {
|
21 |
-
add_filter( 'cron_schedules', [ $this, 'cron_additions' ] );
|
22 |
-
|
23 |
-
// Load update script to schedule in wp_cron.
|
24 |
-
add_action( 'wbcr/gac/update_analytic_library', [ $this, 'update_local_analytic' ] );
|
25 |
-
|
26 |
-
if ( ! is_admin() ) {
|
27 |
-
$this->add_google_analitics_script();
|
28 |
-
}
|
29 |
-
}
|
30 |
-
}
|
31 |
-
|
32 |
-
/**
|
33 |
-
* Extends the recurrence interval of cron tasks. In the core,
|
34 |
-
* the number of recurrence intervals for cron tasks is limited.
|
35 |
-
* Therefore, we create 3 additional recurrences weekly,
|
36 |
-
* twicemonthly, monthly.
|
37 |
-
*
|
38 |
-
* @param array $schedules an array of already recorded recurrences
|
39 |
-
*
|
40 |
-
* @return mixed
|
41 |
-
*/
|
42 |
-
public function cron_additions( $schedules ) {
|
43 |
-
$schedules['weekly'] = [
|
44 |
-
'interval' => DAY_IN_SECONDS * 7,
|
45 |
-
'display' => __( 'Once Weekly' ),
|
46 |
-
];
|
47 |
-
|
48 |
-
$schedules['twicemonthly'] = [
|
49 |
-
'interval' => DAY_IN_SECONDS * 14,
|
50 |
-
'display' => __( 'Twice Monthly' ),
|
51 |
-
];
|
52 |
-
|
53 |
-
$schedules['monthly'] = [
|
54 |
-
'interval' => DAY_IN_SECONDS * 30,
|
55 |
-
'display' => __( 'Once Monthly' ),
|
56 |
-
];
|
57 |
-
|
58 |
-
return $schedules;
|
59 |
-
}
|
60 |
-
|
61 |
-
/**
|
62 |
-
* Enables update-local-ga.php, which creates and updates
|
63 |
-
* the Google analytics library locally on the user's site.
|
64 |
-
* This method performs via cron and manually if the library
|
65 |
-
* file has not yet been created.
|
66 |
-
*
|
67 |
-
* @since 3.0.1
|
68 |
-
* @return void
|
69 |
-
*/
|
70 |
-
public function update_local_analytic() {
|
71 |
-
include( WGA_PLUGIN_DIR . '/includes/update-local-ga.php' );
|
72 |
-
}
|
73 |
-
|
74 |
-
/**
|
75 |
-
* Generates tracking code based on the user options set. Then it just
|
76 |
-
* prints this code on the page. The code can be printed to the header
|
77 |
-
* or footer, depending on which action called this method.
|
78 |
-
*
|
79 |
-
* @since 3.0.1
|
80 |
-
* @return void
|
81 |
-
*/
|
82 |
-
public function print_google_analytics() {
|
83 |
-
|
84 |
-
$tracking_id = $this->getPopulateOption( 'ga_tracking_id' );
|
85 |
-
$track_admin = $this->getPopulateOption( 'ga_track_admin' );
|
86 |
-
|
87 |
-
// If user is admin we don't want to render the tracking code, when option is disabled.
|
88 |
-
if ( empty( $tracking_id ) || ( current_user_can( 'manage_options' ) && ( ! $track_admin ) ) ) {
|
89 |
-
return;
|
90 |
-
}
|
91 |
-
|
92 |
-
$adjusted_bounce_rate = $this->getPopulateOption( 'ga_adjusted_bounce_rate', 0 );
|
93 |
-
$anonymize_ip = $this->getPopulateOption( 'ga_anonymize_ip',
|
94 |
-
$disable_display_features = $this->getPopulateOption( 'ga_disable_display_features',
|
95 |
-
|
96 |
-
echo "<!-- Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
|
97 |
-
|
98 |
-
echo "<script>" . PHP_EOL;
|
99 |
-
echo "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
100 |
-
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
101 |
-
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
102 |
-
})(window,document,'script','" .
|
103 |
-
|
104 |
-
/**
|
105 |
-
* Allows you to complement the current configuration analytics.
|
106 |
-
* For example, one of the users wanted to add google adwords ID
|
107 |
-
* to this code.
|
108 |
-
*
|
109 |
-
* When using this action, you must enter only javascript code,
|
110 |
-
* without opening and closing tags.
|
111 |
-
*
|
112 |
-
* @since 3.0.1
|
113 |
-
*/
|
114 |
-
do_action( 'wbcr/gac/print_analytic_options', [
|
115 |
-
'tracking_id' => $tracking_id,
|
116 |
-
'track_admin' => $track_admin,
|
117 |
-
'adjusted_bounce_rate' => $adjusted_bounce_rate,
|
118 |
-
'anonymize_ip' => $anonymize_ip,
|
119 |
-
'disable_display_features' => $disable_display_features
|
120 |
-
] );
|
121 |
-
|
122 |
-
echo "ga('create', '" . $tracking_id . "', 'auto');" . PHP_EOL;
|
123 |
-
echo $disable_display_features ? "ga('set', 'displayFeaturesTask', null);" . PHP_EOL : '';
|
124 |
-
echo $anonymize_ip ? "ga('set', 'anonymizeIp', true);" . PHP_EOL : '';
|
125 |
-
echo "ga('send', 'pageview');";
|
126 |
-
echo $adjusted_bounce_rate ? PHP_EOL . 'setTimeout("ga(' . "'send','event','adjusted bounce rate','" . $adjusted_bounce_rate . " seconds')" . '"' . ',' . $adjusted_bounce_rate * 1000 . ');' : '';
|
127 |
-
echo PHP_EOL . '</script>' . PHP_EOL;
|
128 |
-
|
129 |
-
echo "<!-- end Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
|
130 |
-
}
|
131 |
-
|
132 |
-
/**
|
133 |
-
* Inserts tracking code in header and footer. Before insertion,
|
134 |
-
* it executes the wbcr_ga_update_local_script action to update
|
135 |
-
* Google local analytics library.
|
136 |
-
*
|
137 |
-
* @since 3.0.1
|
138 |
-
* @return void
|
139 |
-
*/
|
140 |
-
private function add_google_analitics_script() {
|
141 |
-
$tracking_id = $this->getPopulateOption( 'ga_tracking_id' );
|
142 |
-
|
143 |
-
if ( ! empty( $tracking_id ) ) {
|
144 |
-
$local_ga_file =
|
145 |
-
// If file is not created yet, create now!
|
146 |
-
if ( ! file_exists( $local_ga_file ) ) {
|
147 |
-
ob_start();
|
148 |
-
|
149 |
-
ob_end_clean();
|
150 |
-
}
|
151 |
-
|
152 |
-
$enqueue_order = $this->getPopulateOption( 'ga_enqueue_order', 0 );
|
153 |
-
|
154 |
-
if ( $this->getPopulateOption( 'ga_script_position', 'footer' ) == 'header' ) {
|
155 |
-
add_action( 'wp_head', [ $this, 'print_google_analytics' ], $enqueue_order );
|
156 |
-
} else {
|
157 |
-
add_action( 'wp_footer', [ $this, 'print_google_analytics' ], $enqueue_order );
|
158 |
-
}
|
159 |
-
}
|
160 |
-
}
|
161 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* This class configures the google analytics cache
|
4 |
+
*
|
5 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
6 |
+
* @copyright (c) 2017 Webraftic Ltd
|
7 |
+
* @version 1.0
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
+
exit;
|
13 |
+
}
|
14 |
+
|
15 |
+
class WGA_ConfigGACache extends WBCR\Factory_Templates_103\Configurate {
|
16 |
+
|
17 |
+
|
18 |
+
public function registerActionsAndFilters() {
|
19 |
+
|
20 |
+
if ( $this->getPopulateOption( 'ga_cache' ) ) {
|
21 |
+
add_filter( 'cron_schedules', [ $this, 'cron_additions' ] );
|
22 |
+
|
23 |
+
// Load update script to schedule in wp_cron.
|
24 |
+
add_action( 'wbcr/gac/update_analytic_library', [ $this, 'update_local_analytic' ] );
|
25 |
+
|
26 |
+
if ( ! is_admin() ) {
|
27 |
+
$this->add_google_analitics_script();
|
28 |
+
}
|
29 |
+
}
|
30 |
+
}
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Extends the recurrence interval of cron tasks. In the core,
|
34 |
+
* the number of recurrence intervals for cron tasks is limited.
|
35 |
+
* Therefore, we create 3 additional recurrences weekly,
|
36 |
+
* twicemonthly, monthly.
|
37 |
+
*
|
38 |
+
* @param array $schedules an array of already recorded recurrences
|
39 |
+
*
|
40 |
+
* @return mixed
|
41 |
+
*/
|
42 |
+
public function cron_additions( $schedules ) {
|
43 |
+
$schedules['weekly'] = [
|
44 |
+
'interval' => DAY_IN_SECONDS * 7,
|
45 |
+
'display' => __( 'Once Weekly' ),
|
46 |
+
];
|
47 |
+
|
48 |
+
$schedules['twicemonthly'] = [
|
49 |
+
'interval' => DAY_IN_SECONDS * 14,
|
50 |
+
'display' => __( 'Twice Monthly' ),
|
51 |
+
];
|
52 |
+
|
53 |
+
$schedules['monthly'] = [
|
54 |
+
'interval' => DAY_IN_SECONDS * 30,
|
55 |
+
'display' => __( 'Once Monthly' ),
|
56 |
+
];
|
57 |
+
|
58 |
+
return $schedules;
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Enables update-local-ga.php, which creates and updates
|
63 |
+
* the Google analytics library locally on the user's site.
|
64 |
+
* This method performs via cron and manually if the library
|
65 |
+
* file has not yet been created.
|
66 |
+
*
|
67 |
+
* @since 3.0.1
|
68 |
+
* @return void
|
69 |
+
*/
|
70 |
+
public function update_local_analytic() {
|
71 |
+
include( WGA_PLUGIN_DIR . '/includes/update-local-ga.php' );
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Generates tracking code based on the user options set. Then it just
|
76 |
+
* prints this code on the page. The code can be printed to the header
|
77 |
+
* or footer, depending on which action called this method.
|
78 |
+
*
|
79 |
+
* @since 3.0.1
|
80 |
+
* @return void
|
81 |
+
*/
|
82 |
+
public function print_google_analytics() {
|
83 |
+
|
84 |
+
$tracking_id = $this->getPopulateOption( 'ga_tracking_id' );
|
85 |
+
$track_admin = (int) $this->getPopulateOption( 'ga_track_admin' );
|
86 |
+
|
87 |
+
// If user is admin we don't want to render the tracking code, when option is disabled.
|
88 |
+
if ( empty( $tracking_id ) || ( current_user_can( 'manage_options' ) && ( ! $track_admin ) ) ) {
|
89 |
+
return;
|
90 |
+
}
|
91 |
+
|
92 |
+
$adjusted_bounce_rate = (int) $this->getPopulateOption( 'ga_adjusted_bounce_rate', 0 );
|
93 |
+
$anonymize_ip = (int) $this->getPopulateOption( 'ga_anonymize_ip', 0 );
|
94 |
+
$disable_display_features = (int) $this->getPopulateOption( 'ga_disable_display_features', 0 );
|
95 |
+
|
96 |
+
echo "<!-- Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
|
97 |
+
|
98 |
+
echo "<script>" . PHP_EOL;
|
99 |
+
echo "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
100 |
+
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
101 |
+
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
102 |
+
})(window,document,'script','" . esc_url( $this->get_local_analytic_file_url() ) . "','ga');" . PHP_EOL;
|
103 |
+
|
104 |
+
/**
|
105 |
+
* Allows you to complement the current configuration analytics.
|
106 |
+
* For example, one of the users wanted to add google adwords ID
|
107 |
+
* to this code.
|
108 |
+
*
|
109 |
+
* When using this action, you must enter only javascript code,
|
110 |
+
* without opening and closing tags.
|
111 |
+
*
|
112 |
+
* @since 3.0.1
|
113 |
+
*/
|
114 |
+
do_action( 'wbcr/gac/print_analytic_options', [
|
115 |
+
'tracking_id' => $tracking_id,
|
116 |
+
'track_admin' => $track_admin,
|
117 |
+
'adjusted_bounce_rate' => $adjusted_bounce_rate,
|
118 |
+
'anonymize_ip' => $anonymize_ip,
|
119 |
+
'disable_display_features' => $disable_display_features
|
120 |
+
] );
|
121 |
+
|
122 |
+
echo "ga('create', '" . esc_attr( $tracking_id ) . "', 'auto');" . PHP_EOL;
|
123 |
+
echo $disable_display_features ? "ga('set', 'displayFeaturesTask', null);" . PHP_EOL : '';
|
124 |
+
echo $anonymize_ip ? "ga('set', 'anonymizeIp', true);" . PHP_EOL : '';
|
125 |
+
echo "ga('send', 'pageview');";
|
126 |
+
echo $adjusted_bounce_rate ? PHP_EOL . 'setTimeout("ga(' . "'send','event','adjusted bounce rate','" . $adjusted_bounce_rate . " seconds')" . '"' . ',' . $adjusted_bounce_rate * 1000 . ');' : '';
|
127 |
+
echo PHP_EOL . '</script>' . PHP_EOL;
|
128 |
+
|
129 |
+
echo "<!-- end Google Analytics Local by " . $this->plugin->getPluginTitle() . " -->" . PHP_EOL;
|
130 |
+
}
|
131 |
+
|
132 |
+
/**
|
133 |
+
* Inserts tracking code in header and footer. Before insertion,
|
134 |
+
* it executes the wbcr_ga_update_local_script action to update
|
135 |
+
* Google local analytics library.
|
136 |
+
*
|
137 |
+
* @since 3.0.1
|
138 |
+
* @return void
|
139 |
+
*/
|
140 |
+
private function add_google_analitics_script() {
|
141 |
+
$tracking_id = $this->getPopulateOption( 'ga_tracking_id' );
|
142 |
+
|
143 |
+
if ( ! empty( $tracking_id ) ) {
|
144 |
+
$local_ga_file = $this->get_local_analytic_file_path();
|
145 |
+
// If file is not created yet, create now!
|
146 |
+
if ( $local_ga_file && ! file_exists( $local_ga_file ) ) {
|
147 |
+
ob_start();
|
148 |
+
$this->update_local_analytic();
|
149 |
+
ob_end_clean();
|
150 |
+
}
|
151 |
+
|
152 |
+
$enqueue_order = $this->getPopulateOption( 'ga_enqueue_order', 0 );
|
153 |
+
|
154 |
+
if ( $this->getPopulateOption( 'ga_script_position', 'footer' ) == 'header' ) {
|
155 |
+
add_action( 'wp_head', [ $this, 'print_google_analytics' ], $enqueue_order );
|
156 |
+
} else {
|
157 |
+
add_action( 'wp_footer', [ $this, 'print_google_analytics' ], $enqueue_order );
|
158 |
+
}
|
159 |
+
}
|
160 |
+
}
|
161 |
+
|
162 |
+
/**
|
163 |
+
* Get uploads dir
|
164 |
+
*
|
165 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
166 |
+
* @since 3.1.1
|
167 |
+
*/
|
168 |
+
private function get_uploads_dir() {
|
169 |
+
$upload_dir = wp_upload_dir();
|
170 |
+
|
171 |
+
if ( true === $upload_dir['error'] ) {
|
172 |
+
return null;
|
173 |
+
}
|
174 |
+
|
175 |
+
return (object) $upload_dir;
|
176 |
+
}
|
177 |
+
|
178 |
+
/**
|
179 |
+
* Get the path to an encrypted google analytics file
|
180 |
+
*
|
181 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
182 |
+
* @since 3.1.1
|
183 |
+
* @return string|null
|
184 |
+
*/
|
185 |
+
private function get_local_analytic_file_url() {
|
186 |
+
if ( $this->get_uploads_dir() ) {
|
187 |
+
return untrailingslashit( $this->get_uploads_dir()->baseurl ) . '/wga-cache/local-ga.js';
|
188 |
+
}
|
189 |
+
|
190 |
+
return null;
|
191 |
+
}
|
192 |
+
|
193 |
+
/**
|
194 |
+
* Get the url to an encrypted google analytics file
|
195 |
+
*
|
196 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
197 |
+
* @since 3.1.1
|
198 |
+
* @return string|null
|
199 |
+
*/
|
200 |
+
private function get_local_analytic_file_path() {
|
201 |
+
if ( $this->get_uploads_dir() ) {
|
202 |
+
return untrailingslashit( $this->get_uploads_dir()->basedir ) . '/wga-cache/local-ga.js';
|
203 |
+
}
|
204 |
+
|
205 |
+
return null;
|
206 |
+
}
|
207 |
+
}
|
includes/classes/class-facebook-cache.php
ADDED
@@ -0,0 +1,1061 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WGA\Busting;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* This class configures the google analytics cache
|
7 |
+
*
|
8 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
9 |
+
* @copyright (c) 2017 Webraftic Ltd
|
10 |
+
* @version 1.0
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if( !defined('ABSPATH') ) {
|
15 |
+
exit;
|
16 |
+
}
|
17 |
+
|
18 |
+
class Facebook_Pixel_Cache {
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Regex pattern to capture a locale.
|
22 |
+
*
|
23 |
+
* @var string
|
24 |
+
* @since 3.2
|
25 |
+
*/
|
26 |
+
const LOCALE_CAPTURE = '(?<locale>[a-zA-Z_-]+)';
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Regex pattern to capture a version.
|
30 |
+
*
|
31 |
+
* @var string
|
32 |
+
* @since 3.2
|
33 |
+
*/
|
34 |
+
const VERSION_CAPTURE = '(?<version>[\d\.]+)';
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Regex pattern to capture an app ID.
|
38 |
+
*
|
39 |
+
* @var string
|
40 |
+
* @since 3.2
|
41 |
+
*/
|
42 |
+
const APP_ID_CAPTURE = '(?<app_id>\d+)';
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Cache busting files base path.
|
46 |
+
*
|
47 |
+
* @var string
|
48 |
+
* @since 3.2
|
49 |
+
*/
|
50 |
+
private $busting_path;
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Cache busting base URL.
|
54 |
+
*
|
55 |
+
* @var string
|
56 |
+
* @since 3.2
|
57 |
+
*/
|
58 |
+
private $busting_url;
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Main file URL (remote).
|
62 |
+
* %s is a locale like "en_US".
|
63 |
+
*
|
64 |
+
* @var string
|
65 |
+
* @since 3.2
|
66 |
+
*/
|
67 |
+
private $main_file_url = 'https://connect.facebook.net/%s/fbevents.js';
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Main file name (local).
|
71 |
+
* %s is like "{{locale}}-{{version}}".
|
72 |
+
*
|
73 |
+
* @var string
|
74 |
+
* @since 3.2
|
75 |
+
*/
|
76 |
+
private $main_file_name = 'fbpix-events-%s.js';
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Config file URL (remote).
|
80 |
+
* %d is an app ID (a number), %s is a version like "2.8.30".
|
81 |
+
* The "r" argument is the release segment: it is considered "stable".
|
82 |
+
*
|
83 |
+
* @var string
|
84 |
+
* @since 3.2
|
85 |
+
*/
|
86 |
+
private $config_file_url = 'https://connect.facebook.net/signals/config/%s?v=%s&r=stable';
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Config file name (local).
|
90 |
+
* %s is like "{{app_id}}-{{version}}".
|
91 |
+
*
|
92 |
+
* @var string
|
93 |
+
* @since 3.2
|
94 |
+
*/
|
95 |
+
private $config_file_name = 'fbpix-config-%s.js';
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Plugins file URL (remote).
|
99 |
+
* 1st %s is a plugin name like "identity", 2nd %s is a version like "2.8.30".
|
100 |
+
*
|
101 |
+
* @var string
|
102 |
+
* @since 3.2
|
103 |
+
*/
|
104 |
+
private $plugins_file_url = 'https://connect.facebook.net/signals/plugins/%s?v=%s';
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Plugins file name (local).
|
108 |
+
* %s is like "{{plugin_name}}-{{version}}".
|
109 |
+
*
|
110 |
+
* @var string
|
111 |
+
* @since 3.2
|
112 |
+
*/
|
113 |
+
private $plugins_file_name = 'fbpix-plugin-%s.js';
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Flag to track the replacement.
|
117 |
+
*
|
118 |
+
* @var bool
|
119 |
+
* @since 3.2
|
120 |
+
*/
|
121 |
+
private $is_replaced = false;
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Filesystem object.
|
125 |
+
*
|
126 |
+
* @var object
|
127 |
+
* @since 3.2.0
|
128 |
+
*/
|
129 |
+
protected $filesystem = false;
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Constructor.
|
133 |
+
*
|
134 |
+
* @param string $busting_path Path to the busting directory.
|
135 |
+
* @param string $busting_url URL of the busting directory.
|
136 |
+
* @since 3.2
|
137 |
+
*
|
138 |
+
*/
|
139 |
+
public function __construct($busting_path, $busting_url)
|
140 |
+
{
|
141 |
+
/** Warning: all file names and script URLs are dynamic, and must be run through sprintf(). */
|
142 |
+
$this->busting_path = $busting_path . 'facebook-tracking/';
|
143 |
+
$this->busting_url = $busting_url . 'facebook-tracking/';
|
144 |
+
|
145 |
+
/*
|
146 |
+
* Define the timeouts for the connections. Only available after the constructor is called
|
147 |
+
* to allow for per-transport overriding of the default.
|
148 |
+
*/
|
149 |
+
if( !defined('FS_CONNECT_TIMEOUT') ) {
|
150 |
+
define('FS_CONNECT_TIMEOUT', 30);
|
151 |
+
}
|
152 |
+
if( !defined('FS_TIMEOUT') ) {
|
153 |
+
define('FS_TIMEOUT', 30);
|
154 |
+
}
|
155 |
+
|
156 |
+
// Set the permission constants if not already set.
|
157 |
+
if( !defined('FS_CHMOD_DIR') ) {
|
158 |
+
define('FS_CHMOD_DIR', (fileperms(ABSPATH) & 0777 | 0755));
|
159 |
+
}
|
160 |
+
if( !defined('FS_CHMOD_FILE') ) {
|
161 |
+
define('FS_CHMOD_FILE', (fileperms(ABSPATH . 'index.php') & 0777 | 0644));
|
162 |
+
}
|
163 |
+
|
164 |
+
require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php';
|
165 |
+
require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php';
|
166 |
+
$this->filesystem = new \WP_Filesystem_Direct(new \StdClass());
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Perform the URL replacement process.
|
171 |
+
*
|
172 |
+
* @param string $html HTML contents.
|
173 |
+
* @return string HTML contents.
|
174 |
+
* @since 3.2
|
175 |
+
*
|
176 |
+
*/
|
177 |
+
public function replace_url($html)
|
178 |
+
{
|
179 |
+
$this->is_replaced = false;
|
180 |
+
|
181 |
+
$tags = $this->find_tags($html);
|
182 |
+
|
183 |
+
if( !$tags ) {
|
184 |
+
return $html;
|
185 |
+
}
|
186 |
+
|
187 |
+
\WGA_Plugin::app()->logger->info('FACEBOOK PIXEL CACHING PROCESS STARTED. Tag ' . $tags['tag_to_search']);
|
188 |
+
|
189 |
+
$all_files = [];
|
190 |
+
|
191 |
+
/**
|
192 |
+
* Fetch the main file: https://connect.facebook.net/{{locale}}/fbevents.js.
|
193 |
+
*/
|
194 |
+
$version = $this->get_most_recent_local_version();
|
195 |
+
$locale = $this->get_locale_from_url($tags['tag_to_search']);
|
196 |
+
$main_file_url = $this->get_main_file_url($locale);
|
197 |
+
|
198 |
+
if( $version ) {
|
199 |
+
// At least 1 main file exists locally (but maybe not in the right locale).
|
200 |
+
$main_file_path = $this->get_busting_file_path($locale, $version);
|
201 |
+
$main_file_contents = $this->get_file_contents($main_file_path, $main_file_url);
|
202 |
+
} else {
|
203 |
+
// No cached files yet.
|
204 |
+
$main_file_contents = $this->get_remote_contents($main_file_url);
|
205 |
+
}
|
206 |
+
|
207 |
+
if( !$main_file_contents ) {
|
208 |
+
return $html;
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* Grab some data from the main file and the inline tag: app_id and version.
|
213 |
+
*/
|
214 |
+
$variables = $this->get_variables($main_file_contents, $tags['tag_to_search']);
|
215 |
+
|
216 |
+
if( !$variables ) {
|
217 |
+
return $html;
|
218 |
+
}
|
219 |
+
|
220 |
+
if( !$version ) {
|
221 |
+
// The local file doesn't exist yet, so we couldn't get its version (and so, can't know its path yet) until we fetch a fresh copy.
|
222 |
+
$main_file_path = $this->get_busting_file_path($locale, $variables['version']);
|
223 |
+
}
|
224 |
+
|
225 |
+
$all_files[] = $main_file_path;
|
226 |
+
unset($version);
|
227 |
+
|
228 |
+
/**
|
229 |
+
* Fetch the config file: https://connect.facebook.net/signals/config/{{app_id}}?v={{version}}&r={{release_segment}}.
|
230 |
+
*/
|
231 |
+
$config_file_path = $this->get_config_file_path($variables);
|
232 |
+
|
233 |
+
if( !$config_file_path ) {
|
234 |
+
return $html;
|
235 |
+
}
|
236 |
+
|
237 |
+
$all_files[] = $config_file_path;
|
238 |
+
|
239 |
+
/**
|
240 |
+
* Fetch all plugin files: https://connect.facebook.net/signals/plugins/{{pluginName}}.js?v={{version}}.
|
241 |
+
*/
|
242 |
+
$plugin_file_paths = $this->get_plugin_file_paths($variables);
|
243 |
+
|
244 |
+
if( !$plugin_file_paths ) {
|
245 |
+
return $html;
|
246 |
+
}
|
247 |
+
|
248 |
+
$all_files = array_merge($all_files, $plugin_file_paths);
|
249 |
+
|
250 |
+
/**
|
251 |
+
* Modify the main file contents.
|
252 |
+
*/
|
253 |
+
$busting_file_url = $this->get_busting_file_url($locale, $variables['version']);
|
254 |
+
$busting_dir_url = dirname($busting_file_url) . '/';
|
255 |
+
$main_file_contents = $this->replace_main_file_contents($main_file_contents, $busting_dir_url);
|
256 |
+
|
257 |
+
if( !$main_file_contents ) {
|
258 |
+
return $html;
|
259 |
+
}
|
260 |
+
|
261 |
+
/**
|
262 |
+
* Save all the changes to the main file.
|
263 |
+
*/
|
264 |
+
$updated = $this->update_file_contents($main_file_path, $main_file_contents);
|
265 |
+
|
266 |
+
if( !$updated ) {
|
267 |
+
return $html;
|
268 |
+
}
|
269 |
+
|
270 |
+
/**
|
271 |
+
* Finally, replace the main file URL by the local one in the inline script tag.
|
272 |
+
*/
|
273 |
+
$replace_tag = preg_replace('@(?:https?:)?//connect\.facebook\.net/[a-zA-Z_-]+/fbevents\.js@i', $busting_file_url, $tags['tag_to_replace'], -1, $count);
|
274 |
+
|
275 |
+
if( !$count || false === strpos($html, $tags['tag_to_replace']) ) {
|
276 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: The local file URL could not be replaced in the page contents.');
|
277 |
+
|
278 |
+
return $html;
|
279 |
+
}
|
280 |
+
|
281 |
+
$html = str_replace($tags['tag_to_replace'], $replace_tag, $html);
|
282 |
+
|
283 |
+
$this->is_replaced = true;
|
284 |
+
|
285 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: Facebook pixel caching process succeeded. Files ' . $all_files);
|
286 |
+
|
287 |
+
return $html;
|
288 |
+
}
|
289 |
+
|
290 |
+
/**
|
291 |
+
* Tell if the replacement was sucessful or not.
|
292 |
+
*
|
293 |
+
* @return bool
|
294 |
+
* @since 3.2
|
295 |
+
* @access public
|
296 |
+
*
|
297 |
+
*/
|
298 |
+
public function is_replaced()
|
299 |
+
{
|
300 |
+
return $this->is_replaced;
|
301 |
+
}
|
302 |
+
|
303 |
+
/**
|
304 |
+
* Search for elements in the DOM.
|
305 |
+
*
|
306 |
+
* @param string $html HTML contents.
|
307 |
+
* @return array|bool {
|
308 |
+
* An array on success, described as below. False if nothing is found.
|
309 |
+
*
|
310 |
+
* @type string $tag_to_replace The script tag that contains the facebook.net URL: this is the tag that will be replaced in the page HTML.
|
311 |
+
* @type string $tag_to_search It contains both app ID and facebook.net URL: this is what will be searched in for this data.
|
312 |
+
*
|
313 |
+
* When the app ID and the URL are in the same tag, $tag_to_replace and $tag_to_search are the same.
|
314 |
+
* }
|
315 |
+
* @since 3.2
|
316 |
+
*
|
317 |
+
*/
|
318 |
+
private function find_tags($html)
|
319 |
+
{
|
320 |
+
preg_match_all('@<script[^>]*?>(.*)</script>@Umsi', $html, $matches, PREG_SET_ORDER);
|
321 |
+
|
322 |
+
if( empty($matches) ) {
|
323 |
+
return false;
|
324 |
+
}
|
325 |
+
|
326 |
+
$tags = [
|
327 |
+
'app_id' => [],
|
328 |
+
'url' => [],
|
329 |
+
'both' => [],
|
330 |
+
];
|
331 |
+
|
332 |
+
foreach($matches as $match) {
|
333 |
+
list($tag, $script) = $match;
|
334 |
+
|
335 |
+
if( !trim($script) ) {
|
336 |
+
continue;
|
337 |
+
}
|
338 |
+
|
339 |
+
$has_app_id = false;
|
340 |
+
$has_url = false;
|
341 |
+
|
342 |
+
if( preg_match('@fbq\s*\(\s*["\']init["\']\s*,\s*["\']' . self::APP_ID_CAPTURE . '["\']@', $script, $matches_init) ) {
|
343 |
+
if( (int)$matches_init['app_id'] > 0 ) {
|
344 |
+
$has_app_id = true;
|
345 |
+
}
|
346 |
+
}
|
347 |
+
|
348 |
+
$has_url = (bool)$this->get_locale_from_url($script);
|
349 |
+
|
350 |
+
if( $has_app_id && $has_url ) {
|
351 |
+
// OK we have both.
|
352 |
+
$tags['both'] = $tag;
|
353 |
+
break;
|
354 |
+
}
|
355 |
+
|
356 |
+
if( $has_app_id ) {
|
357 |
+
$tags['app_id'] = $tag;
|
358 |
+
|
359 |
+
if( $tags['url'] ) {
|
360 |
+
// OK we have both.
|
361 |
+
break;
|
362 |
+
}
|
363 |
+
} elseif( $has_url ) {
|
364 |
+
$tags['url'] = $tag;
|
365 |
+
|
366 |
+
if( $tags['app_id'] ) {
|
367 |
+
// OK we have both.
|
368 |
+
break;
|
369 |
+
}
|
370 |
+
}
|
371 |
+
}
|
372 |
+
|
373 |
+
if( !empty($tags['both']) ) {
|
374 |
+
return [
|
375 |
+
'tag_to_replace' => $tags['both'],
|
376 |
+
'tag_to_search' => $tags['both'],
|
377 |
+
];
|
378 |
+
}
|
379 |
+
|
380 |
+
if( !empty($tags['app_id']) && !empty($tags['url']) ) {
|
381 |
+
return [
|
382 |
+
'tag_to_replace' => $tags['url'],
|
383 |
+
'tag_to_search' => $tags['url'] . $tags['app_id'],
|
384 |
+
];
|
385 |
+
}
|
386 |
+
|
387 |
+
return false;
|
388 |
+
}
|
389 |
+
|
390 |
+
/**
|
391 |
+
* Get some values from the main file and the inline script contents.
|
392 |
+
*
|
393 |
+
* @param string $main_file_contents Main file contents.
|
394 |
+
* @param string $tag_contents Inline script contents.
|
395 |
+
* @return array|bool {
|
396 |
+
* An array of values. False on failure.
|
397 |
+
*
|
398 |
+
* @type string $app_id The app ID.
|
399 |
+
* @type string $version The file version.
|
400 |
+
* }
|
401 |
+
* @since 3.2
|
402 |
+
*
|
403 |
+
*/
|
404 |
+
private function get_variables($main_file_contents = null, $tag_contents = null)
|
405 |
+
{
|
406 |
+
$variables = [];
|
407 |
+
|
408 |
+
if( isset($tag_contents) ) {
|
409 |
+
// Retrieve the app ID from the tag contents.
|
410 |
+
preg_match('@fbq\s*\(\s*["\']init["\']\s*,\s*["\']' . self::APP_ID_CAPTURE . '["\']@', $tag_contents, $matches);
|
411 |
+
|
412 |
+
if( empty($matches['app_id']) ) {
|
413 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: The app ID could not be retrieved from the inline script contents.');
|
414 |
+
|
415 |
+
return false;
|
416 |
+
}
|
417 |
+
|
418 |
+
$variables['app_id'] = $matches['app_id'];
|
419 |
+
}
|
420 |
+
|
421 |
+
if( isset($main_file_contents) ) {
|
422 |
+
// Retrieve the version from the main file contents.
|
423 |
+
preg_match('@fbq\.version\s*=\s*["\']' . self::VERSION_CAPTURE . '["\']\s*;@', $main_file_contents, $matches);
|
424 |
+
|
425 |
+
if( empty($matches['version']) ) {
|
426 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: The version could not be retrieved from the main file contents.');
|
427 |
+
|
428 |
+
return false;
|
429 |
+
}
|
430 |
+
|
431 |
+
$variables['version'] = $matches['version'];
|
432 |
+
}
|
433 |
+
|
434 |
+
return $variables;
|
435 |
+
}
|
436 |
+
|
437 |
+
/**
|
438 |
+
* Perform some replacements in the main file contents. Will be replaced:
|
439 |
+
* - the CDN_BASE_URL value,
|
440 |
+
* - the config file URL,
|
441 |
+
* - the plugins file URL.
|
442 |
+
*
|
443 |
+
* @param string $main_file_contents The file contents.
|
444 |
+
* @param string $busting_dir_url URL of the folder containing the files.
|
445 |
+
* @return string|bool The new contents on success. False on failure.
|
446 |
+
* @since 3.2
|
447 |
+
*
|
448 |
+
*/
|
449 |
+
private function replace_main_file_contents($main_file_contents, $busting_dir_url)
|
450 |
+
{
|
451 |
+
/**
|
452 |
+
* Replace the CDN_BASE_URL value.
|
453 |
+
* From: CDN_BASE_URL:"https://connect.facebook.net/"
|
454 |
+
* To: CDN_BASE_URL:"https://example.com/wp-content/cache/busting/facebook-tracking/"
|
455 |
+
*/
|
456 |
+
$replacement = 'CDN_BASE_URL:"' . $busting_dir_url . '"';
|
457 |
+
|
458 |
+
if( !strpos($main_file_contents, $replacement) ) {
|
459 |
+
$main_file_contents = preg_replace('@CDN_BASE_URL\s*:\s*["\'][^"\']+["\']@', $replacement, $main_file_contents, -1, $count);
|
460 |
+
|
461 |
+
if( !$count ) {
|
462 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: The CDN_BASE_URL could not be replaced in the main file contents.');
|
463 |
+
|
464 |
+
return false;
|
465 |
+
}
|
466 |
+
}
|
467 |
+
|
468 |
+
/**
|
469 |
+
* Replace the config file URL (https://connect.facebook.net/signals/config/{{app_id}}?v={{version}}&r={{release_segment}}).
|
470 |
+
* From: CDN_BASE_URL+"signals/config/"+a+"?v="+b+"&r="+c
|
471 |
+
* To: CDN_BASE_URL+"fbpix-config-"+a+"-"+b+".js" (the release segment is not taken into account, we consider it "stable")
|
472 |
+
*/
|
473 |
+
$replacement_pattern = $this->escape_file_name($this->config_file_name);
|
474 |
+
$replacement_pattern = sprintf($replacement_pattern, '"\+[a-zA-Z._]+\+"\-"\+[a-zA-Z._]+\+"');
|
475 |
+
$replacement_pattern = 'CDN_BASE_URL\+"' . $replacement_pattern . '"';
|
476 |
+
|
477 |
+
if( !preg_match('/' . $replacement_pattern . '/', $main_file_contents) ) {
|
478 |
+
$pattern = '@CDN_BASE_URL\s*\+\s*["\']signals/config/["\']\s*\+\s*([a-zA-Z._]+)\s*\+\s*["\']\?v=["\']\s*\+\s*([a-zA-Z._]+)\s*\+\s*["\']&r=["\']\s*\+\s*[a-zA-Z._]+@';
|
479 |
+
$replacement = 'CDN_BASE_URL+"' . sprintf($this->config_file_name, '"+$1+"-"+$2+"') . '"';
|
480 |
+
$main_file_contents = preg_replace($pattern, $replacement, $main_file_contents, -1, $count);
|
481 |
+
|
482 |
+
if( !$count ) {
|
483 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: The config file URL could not be replaced in the main file contents.');
|
484 |
+
|
485 |
+
return false;
|
486 |
+
}
|
487 |
+
}
|
488 |
+
|
489 |
+
/**
|
490 |
+
* Replace the plugins file URL (https://connect.facebook.net/signals/plugins/{{plugin_name}}.js?v={{version}}).
|
491 |
+
* From: CDN_BASE_URL+"signals/plugins/"+b+".js?v="+a.version
|
492 |
+
* To : CDN_BASE_URL+"fbpix-plugin-"+b+"-"+a.version+".js"
|
493 |
+
*/
|
494 |
+
$replacement_pattern = $this->escape_file_name($this->plugins_file_name);
|
495 |
+
$replacement_pattern = sprintf($replacement_pattern, '"\+[a-zA-Z._]+\+"-"\+[a-zA-Z._]+\+"');
|
496 |
+
$replacement_pattern = 'CDN_BASE_URL\+"' . $replacement_pattern . '"';
|
497 |
+
|
498 |
+
if( !preg_match('/' . $replacement_pattern . '/', $main_file_contents) ) {
|
499 |
+
$pattern = '@CDN_BASE_URL\s*\+\s*["\']signals/plugins/["\']\s*\+\s*([a-zA-Z._]+)\s*\+\s*["\']\.js\?v=["\']\s*\+\s*([a-zA-Z._]+)@';
|
500 |
+
$replacement = 'CDN_BASE_URL+"' . sprintf($this->plugins_file_name, '"+$1+"-"+$2+"') . '"';
|
501 |
+
$main_file_contents = preg_replace($pattern, $replacement, $main_file_contents, -1, $count);
|
502 |
+
|
503 |
+
if( !$count ) {
|
504 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: The plugins file URL could not be replaced in the main file contents.');
|
505 |
+
|
506 |
+
return false;
|
507 |
+
}
|
508 |
+
}
|
509 |
+
|
510 |
+
return $main_file_contents;
|
511 |
+
}
|
512 |
+
|
513 |
+
/**
|
514 |
+
* Save the contents of a URL into a local file if it doesn't exist yet.
|
515 |
+
*
|
516 |
+
* @param string $url URL to get the contents from.
|
517 |
+
* @param string $path Path to the file that will store the URL contents.
|
518 |
+
* @return bool True on success. False on failure.
|
519 |
+
* @since 3.2
|
520 |
+
*
|
521 |
+
*/
|
522 |
+
private function maybe_save($url, $path)
|
523 |
+
{
|
524 |
+
$filesystem = $this->filesystem;
|
525 |
+
|
526 |
+
if( $filesystem->exists($path) ) {
|
527 |
+
// If a previous version is present, keep it.
|
528 |
+
return true;
|
529 |
+
}
|
530 |
+
|
531 |
+
return (bool)$this->save($url, $path);
|
532 |
+
}
|
533 |
+
|
534 |
+
/**
|
535 |
+
* Save the contents of a URL into a local file.
|
536 |
+
*
|
537 |
+
* @param string $url URL to get the contents from.
|
538 |
+
* @param string $path Path to the file that will store the URL contents.
|
539 |
+
* @return string|bool The file contents on success. False on failure.
|
540 |
+
* @since 3.2
|
541 |
+
*
|
542 |
+
*/
|
543 |
+
private function save($url, $path)
|
544 |
+
{
|
545 |
+
$contents = $this->get_remote_contents($url);
|
546 |
+
|
547 |
+
if( !$contents ) {
|
548 |
+
// Error, we couldn't fetch the file contents.
|
549 |
+
return false;
|
550 |
+
}
|
551 |
+
|
552 |
+
return $this->update_file_contents($path, $contents);
|
553 |
+
}
|
554 |
+
|
555 |
+
/**
|
556 |
+
* Add new contents to a file. If the file doesn't exist, it is created.
|
557 |
+
*
|
558 |
+
* @param string $file_path Path to the file to update.
|
559 |
+
* @param string $file_contents New contents.
|
560 |
+
* @return string|bool The file contents on success. False on failure.
|
561 |
+
* @since 3.2
|
562 |
+
*
|
563 |
+
*/
|
564 |
+
private function update_file_contents($file_path, $file_contents)
|
565 |
+
{
|
566 |
+
if( !$this->filesystem->exists($this->busting_path) ) {
|
567 |
+
wp_mkdir_p($this->busting_path);
|
568 |
+
}
|
569 |
+
|
570 |
+
if( !$this->filesystem->put_contents($file_path, $file_contents) ) {
|
571 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: Contents could not be written into file. Paths ' . $file_path);
|
572 |
+
|
573 |
+
return false;
|
574 |
+
}
|
575 |
+
|
576 |
+
return $file_contents;
|
577 |
+
}
|
578 |
+
|
579 |
+
/**
|
580 |
+
* Look for existing local files and update their contents if there's a new version available.
|
581 |
+
* Actually, if a more recent version exists on the FB side, it will delete all local files and hit the home page to recreate them.
|
582 |
+
*
|
583 |
+
* @return bool True on success. False on failure.
|
584 |
+
* @since 3.2
|
585 |
+
*
|
586 |
+
*/
|
587 |
+
public function refresh_all()
|
588 |
+
{
|
589 |
+
// Get all local main files.
|
590 |
+
$main_files = $this->get_all_main_files();
|
591 |
+
|
592 |
+
if( !$main_files ) {
|
593 |
+
// No files (or there's an error).
|
594 |
+
return false !== $main_files;
|
595 |
+
}
|
596 |
+
|
597 |
+
$updated = false;
|
598 |
+
|
599 |
+
foreach($main_files as $local_main_file) {
|
600 |
+
$remote_file_contents = $this->get_remote_contents($this->get_main_file_url($local_main_file['locale']));
|
601 |
+
|
602 |
+
if( !$remote_file_contents ) {
|
603 |
+
continue;
|
604 |
+
}
|
605 |
+
|
606 |
+
$variables = $this->get_variables($remote_file_contents);
|
607 |
+
|
608 |
+
if( !$variables ) {
|
609 |
+
unset($remote_file_contents, $variables);
|
610 |
+
continue;
|
611 |
+
}
|
612 |
+
|
613 |
+
if( version_compare($local_main_file['version'], $variables['version']) >= 0 ) {
|
614 |
+
unset($remote_file_contents, $variables);
|
615 |
+
continue;
|
616 |
+
}
|
617 |
+
|
618 |
+
unset($remote_file_contents);
|
619 |
+
$updated = true;
|
620 |
+
break;
|
621 |
+
}
|
622 |
+
|
623 |
+
if( !$updated ) {
|
624 |
+
return true;
|
625 |
+
}
|
626 |
+
|
627 |
+
// Delete all local files.
|
628 |
+
$this->delete_all();
|
629 |
+
|
630 |
+
return true;
|
631 |
+
}
|
632 |
+
|
633 |
+
/**
|
634 |
+
* Delete all Facebook Pixel busting files.
|
635 |
+
*
|
636 |
+
* @return bool True on success. False on failure.
|
637 |
+
* @since 3.2
|
638 |
+
* @access public
|
639 |
+
*
|
640 |
+
*/
|
641 |
+
public function delete_all()
|
642 |
+
{
|
643 |
+
$filesystem = $this->filesystem;
|
644 |
+
$files = $this->get_all_files();
|
645 |
+
|
646 |
+
if( !$files ) {
|
647 |
+
// No files (or there's an error).
|
648 |
+
return false !== $files;
|
649 |
+
}
|
650 |
+
|
651 |
+
$error_paths = [];
|
652 |
+
|
653 |
+
foreach($files as $file_name) {
|
654 |
+
if( !$filesystem->delete($this->busting_path . $file_name, false, 'f') ) {
|
655 |
+
$error_paths[] = $this->busting_path . $file_name;
|
656 |
+
}
|
657 |
+
}
|
658 |
+
|
659 |
+
if( $error_paths ) {
|
660 |
+
\WGA_Plugin::app()->logger->error('Local file(s) could not be deleted. Paths ' . $error_paths);
|
661 |
+
}
|
662 |
+
|
663 |
+
return !$error_paths;
|
664 |
+
}
|
665 |
+
|
666 |
+
/**
|
667 |
+
* Get all cached files in the directory.
|
668 |
+
*
|
669 |
+
* @return array|bool A list of file names. False on failure.
|
670 |
+
* @since 3.2
|
671 |
+
*
|
672 |
+
*/
|
673 |
+
private function get_all_files()
|
674 |
+
{
|
675 |
+
$filesystem = $this->filesystem;
|
676 |
+
$dir_path = rtrim($this->busting_path, '\\/');
|
677 |
+
|
678 |
+
if( !$filesystem->exists($dir_path) ) {
|
679 |
+
return [];
|
680 |
+
}
|
681 |
+
|
682 |
+
if( !$filesystem->is_writable($dir_path) ) {
|
683 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: Directory is not writable. Path ' . $dir_path);
|
684 |
+
|
685 |
+
return false;
|
686 |
+
}
|
687 |
+
|
688 |
+
$dir = $filesystem->dirlist($dir_path);
|
689 |
+
|
690 |
+
if( false === $dir ) {
|
691 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: could not get the directory contents. Path ' . $dir_path);
|
692 |
+
|
693 |
+
return false;
|
694 |
+
}
|
695 |
+
|
696 |
+
if( !$dir ) {
|
697 |
+
return [];
|
698 |
+
}
|
699 |
+
|
700 |
+
$list = [];
|
701 |
+
|
702 |
+
foreach($dir as $entry) {
|
703 |
+
if( 'f' !== $entry['type'] ) {
|
704 |
+
continue;
|
705 |
+
}
|
706 |
+
if( preg_match('@^fbpix-(?:config|events|plugin)-.+\.js$@', $entry['name'], $matches) ) {
|
707 |
+
$list[$entry['name']] = $entry['name'];
|
708 |
+
}
|
709 |
+
}
|
710 |
+
|
711 |
+
return $list;
|
712 |
+
}
|
713 |
+
|
714 |
+
/**
|
715 |
+
* Get all main files in the directory.
|
716 |
+
*
|
717 |
+
* @return array|bool {
|
718 |
+
* An array of file names (array keys) with following data as values. False on failure.
|
719 |
+
*
|
720 |
+
* @type string $locale The locale, like "en_US".
|
721 |
+
* @type string $version The file version.
|
722 |
+
* }
|
723 |
+
* @since 3.2
|
724 |
+
*
|
725 |
+
*/
|
726 |
+
private function get_all_main_files()
|
727 |
+
{
|
728 |
+
$filesystem = $this->filesystem;
|
729 |
+
$dir_path = rtrim($this->busting_path, '\\/');
|
730 |
+
|
731 |
+
if( !$filesystem->exists($dir_path) ) {
|
732 |
+
return [];
|
733 |
+
}
|
734 |
+
|
735 |
+
if( !$filesystem->is_writable($dir_path) ) {
|
736 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: Directory is not writable. Path ' . $dir_path);
|
737 |
+
|
738 |
+
return false;
|
739 |
+
}
|
740 |
+
|
741 |
+
$dir = $filesystem->dirlist($dir_path);
|
742 |
+
|
743 |
+
if( false === $dir ) {
|
744 |
+
\WGA_Plugin::app()->logger->error('Fb pixel: could not get the directory contents. Path ' . $dir_path);
|
745 |
+
|
746 |
+
return false;
|
747 |
+
}
|
748 |
+
|
749 |
+
if( !$dir ) {
|
750 |
+
return [];
|
751 |
+
}
|
752 |
+
|
753 |
+
$list = [];
|
754 |
+
$pattern = $this->escape_file_name($this->main_file_name);
|
755 |
+
$pattern = sprintf($pattern, self::LOCALE_CAPTURE . '-' . self::VERSION_CAPTURE);
|
756 |
+
|
757 |
+
foreach($dir as $entry) {
|
758 |
+
if( 'f' !== $entry['type'] ) {
|
759 |
+
continue;
|
760 |
+
}
|
761 |
+
if( preg_match('@^' . $pattern . '$@', $entry['name'], $matches) ) {
|
762 |
+
unset($matches[0]);
|
763 |
+
$list[$entry['name']] = $matches;
|
764 |
+
}
|
765 |
+
}
|
766 |
+
|
767 |
+
return $list;
|
768 |
+
}
|
769 |
+
|
770 |
+
/**
|
771 |
+
* Get the most recent "version" of the main file cached locally.
|
772 |
+
*
|
773 |
+
* @return string|bool The version on success. False on failure.
|
774 |
+
* @since 3.2
|
775 |
+
*
|
776 |
+
*/
|
777 |
+
private function get_most_recent_local_version()
|
778 |
+
{
|
779 |
+
$main_files = $this->get_all_main_files();
|
780 |
+
|
781 |
+
if( !$main_files ) {
|
782 |
+
return false;
|
783 |
+
}
|
784 |
+
|
785 |
+
$version = false;
|
786 |
+
|
787 |
+
foreach($main_files as $file_name => $data) {
|
788 |
+
if( !$version || version_compare($data['version'], $version) > 0 ) {
|
789 |
+
$version = $data['version'];
|
790 |
+
}
|
791 |
+
}
|
792 |
+
|
793 |
+
return $version;
|
794 |
+
}
|
795 |
+
|
796 |
+
/**
|
797 |
+
* Get the oldest "version" of the main file cached locally.
|
798 |
+
*
|
799 |
+
* @return string|bool The version on success. False on failure.
|
800 |
+
* @since 3.2
|
801 |
+
*
|
802 |
+
*/
|
803 |
+
private function get_oldest_local_version()
|
804 |
+
{
|
805 |
+
$main_files = $this->get_all_main_files();
|
806 |
+
|
807 |
+
if( !$main_files ) {
|
808 |
+
return false;
|
809 |
+
}
|
810 |
+
|
811 |
+
$version = false;
|
812 |
+
|
813 |
+
foreach($main_files as $file_name => $data) {
|
814 |
+
if( !$version || version_compare($data['version'], $version) < 0 ) {
|
815 |
+
$version = $data['version'];
|
816 |
+
}
|
817 |
+
}
|
818 |
+
|
819 |
+
return $version;
|
820 |
+
}
|
821 |
+
|
822 |
+
/**
|
823 |
+
* Get the remote Facebook Pixel URL.
|
824 |
+
*
|
825 |
+
* @param string $locale A locale string, like 'en_US'.
|
826 |
+
* @return string
|
827 |
+
* @since 3.2
|
828 |
+
*
|
829 |
+
*/
|
830 |
+
public function get_main_file_url($locale)
|
831 |
+
{
|
832 |
+
return sprintf($this->main_file_url, $locale);
|
833 |
+
}
|
834 |
+
|
835 |
+
/**
|
836 |
+
* Extract the locale from a URL to bust.
|
837 |
+
*
|
838 |
+
* @param string $url Any string containing the URL to bust.
|
839 |
+
* @return string|bool The locale on success. False on failure.
|
840 |
+
* @since 3.2
|
841 |
+
*
|
842 |
+
*/
|
843 |
+
private function get_locale_from_url($url)
|
844 |
+
{
|
845 |
+
$pattern = '@//connect\.facebook\.net/' . self::LOCALE_CAPTURE . '/fbevents\.js@i';
|
846 |
+
|
847 |
+
if( !preg_match($pattern, $url, $matches) ) {
|
848 |
+
return false;
|
849 |
+
}
|
850 |
+
|
851 |
+
return $matches['locale'];
|
852 |
+
}
|
853 |
+
|
854 |
+
/** ----------------------------------------------------------------------------------------- */
|
855 |
+
/** BUSTING FILE (aka: cached copy of the main file) ======================================== */
|
856 |
+
/** ----------------------------------------------------------------------------------------- */
|
857 |
+
|
858 |
+
/**
|
859 |
+
* Get the local Facebook Pixel URL (the "main" file).
|
860 |
+
*
|
861 |
+
* @param string $locale A locale string, like 'en_US'.
|
862 |
+
* @param string $version The script version.
|
863 |
+
* @return string
|
864 |
+
* @since 3.2
|
865 |
+
*
|
866 |
+
*/
|
867 |
+
private function get_busting_file_url($locale, $version)
|
868 |
+
{
|
869 |
+
$filename = $this->get_busting_file_name($locale, $version);
|
870 |
+
|
871 |
+
// This filter is documented in inc/functions/minify.php.
|
872 |
+
return $this->busting_url . $filename;
|
873 |
+
}
|
874 |
+
|
875 |
+
/**
|
876 |
+
* Get the local Facebook Pixel file name.
|
877 |
+
*
|
878 |
+
* @param string $locale A locale string, like 'en_US'.
|
879 |
+
* @param string $version The script version.
|
880 |
+
* @return string
|
881 |
+
* @since 3.2
|
882 |
+
*
|
883 |
+
*/
|
884 |
+
private function get_busting_file_name($locale, $version)
|
885 |
+
{
|
886 |
+
return sprintf($this->main_file_name, $locale . '-' . $version);
|
887 |
+
}
|
888 |
+
|
889 |
+
/**
|
890 |
+
* Get the local Facebook Pixel file path.
|
891 |
+
*
|
892 |
+
* @param string $locale A locale string, like 'en_US'.
|
893 |
+
* @param string $version The script version.
|
894 |
+
* @return string
|
895 |
+
* @since 3.2
|
896 |
+
*
|
897 |
+
*/
|
898 |
+
private function get_busting_file_path($locale, $version)
|
899 |
+
{
|
900 |
+
return $this->busting_path . $this->get_busting_file_name($locale, $version);
|
901 |
+
}
|
902 |
+
|
903 |
+
/** ----------------------------------------------------------------------------------------- */
|
904 |
+
/** CONFIG FILE ============================================================================= */
|
905 |
+
/** ----------------------------------------------------------------------------------------- */
|
906 |
+
|
907 |
+
/**
|
908 |
+
* Get the path to the local "config" file. If the file doesn't exist, it is created by fetching its contents remotely, then saved locally.
|
909 |
+
*
|
910 |
+
* @param array $variables {
|
911 |
+
* An array of variable values.
|
912 |
+
*
|
913 |
+
* @type int $app_id The app ID.
|
914 |
+
* @type string $version The file version.
|
915 |
+
* }
|
916 |
+
* @return string|bool The file path on success. False on failure.
|
917 |
+
* @since 3.2
|
918 |
+
* @access private
|
919 |
+
* @see $this->get_variables()
|
920 |
+
*
|
921 |
+
*/
|
922 |
+
private function get_config_file_path($variables)
|
923 |
+
{
|
924 |
+
$config_file_url = sprintf($this->config_file_url, $variables['app_id'], $variables['version']);
|
925 |
+
$config_file_name = sprintf($this->config_file_name, $variables['app_id'] . '-' . $variables['version']);
|
926 |
+
$config_file_path = $this->busting_path . $config_file_name;
|
927 |
+
|
928 |
+
if( !$this->maybe_save($config_file_url, $config_file_path) ) {
|
929 |
+
return false;
|
930 |
+
}
|
931 |
+
|
932 |
+
return $config_file_path;
|
933 |
+
}
|
934 |
+
|
935 |
+
/**
|
936 |
+
* Get the paths to all local "plugin" files. If the files don't exist, they are created by fetching their contents remotely, then saved locally.
|
937 |
+
*
|
938 |
+
* @param array $variables {
|
939 |
+
* An array of variable values.
|
940 |
+
*
|
941 |
+
* @type string $app_id The app ID.
|
942 |
+
* @type string $version The file version.
|
943 |
+
* }
|
944 |
+
* @return array|bool An array of file paths on success. False on failure.
|
945 |
+
* @since 3.2
|
946 |
+
* @see $this->get_variables()
|
947 |
+
*
|
948 |
+
*/
|
949 |
+
private function get_plugin_file_paths($variables)
|
950 |
+
{
|
951 |
+
$paths = [];
|
952 |
+
$plugin_names = [
|
953 |
+
'identity',
|
954 |
+
'microdata',
|
955 |
+
'inferredEvents',
|
956 |
+
'dwell',
|
957 |
+
'sessions',
|
958 |
+
'timespent',
|
959 |
+
'ga2fbq',
|
960 |
+
];
|
961 |
+
|
962 |
+
foreach($plugin_names as $plugin_name) {
|
963 |
+
$plugin_file_url = sprintf($this->plugins_file_url, $plugin_name, $variables['version']);
|
964 |
+
$plugin_file_name = sprintf($this->plugins_file_name, $plugin_name . '-' . $variables['version']);
|
965 |
+
$plugin_file_path = $this->busting_path . $plugin_file_name;
|
966 |
+
|
967 |
+
if( !$this->maybe_save($plugin_file_url, $plugin_file_path) ) {
|
968 |
+
return false;
|
969 |
+
}
|
970 |
+
|
971 |
+
$paths[] = $plugin_file_path;
|
972 |
+
}
|
973 |
+
|
974 |
+
return $paths;
|
975 |
+
}
|
976 |
+
|
977 |
+
/**
|
978 |
+
* Get a file contents. If the file doesn't exist or is not writtable, new contents are fetched remotely.
|
979 |
+
*
|
980 |
+
* @param string $file_path Path to the file.
|
981 |
+
* @param string $file_url URL to the remote file.
|
982 |
+
* @return string|bool The contents on success, false on failure.
|
983 |
+
* @since 3.2
|
984 |
+
* @access private
|
985 |
+
*
|
986 |
+
*/
|
987 |
+
private function get_file_contents($file_path, $file_url = false)
|
988 |
+
{
|
989 |
+
$filesystem = $this->filesystem;
|
990 |
+
|
991 |
+
if( $filesystem->is_writable($file_path) ) {
|
992 |
+
// If a previous version is present, return its contents.
|
993 |
+
$contents = $filesystem->get_contents($file_path);
|
994 |
+
|
995 |
+
if( $contents ) {
|
996 |
+
return $contents;
|
997 |
+
}
|
998 |
+
// In case the file is empty or we could not get its contents, try to get a fresh copy from remote location.
|
999 |
+
}
|
1000 |
+
|
1001 |
+
if( !$file_url ) {
|
1002 |
+
return false;
|
1003 |
+
}
|
1004 |
+
|
1005 |
+
return $this->get_remote_contents($file_url);
|
1006 |
+
}
|
1007 |
+
|
1008 |
+
/**
|
1009 |
+
* Get the contents of a URL.
|
1010 |
+
*
|
1011 |
+
* @param string $url The URL to request.
|
1012 |
+
* @return string|bool The contents on success. False on failure.
|
1013 |
+
* @since 3.2
|
1014 |
+
*
|
1015 |
+
*/
|
1016 |
+
private function get_remote_contents($url)
|
1017 |
+
{
|
1018 |
+
try {
|
1019 |
+
$response = wp_remote_get($url);
|
1020 |
+
} catch( \Exception $e ) {
|
1021 |
+
\WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $e->getMessage());
|
1022 |
+
|
1023 |
+
return false;
|
1024 |
+
}
|
1025 |
+
|
1026 |
+
if( is_wp_error($response) ) {
|
1027 |
+
\WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
|
1028 |
+
|
1029 |
+
return false;
|
1030 |
+
}
|
1031 |
+
|
1032 |
+
$contents = wp_remote_retrieve_body($response);
|
1033 |
+
|
1034 |
+
if( !$contents ) {
|
1035 |
+
\WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
|
1036 |
+
|
1037 |
+
return false;
|
1038 |
+
}
|
1039 |
+
|
1040 |
+
return $contents;
|
1041 |
+
}
|
1042 |
+
|
1043 |
+
/**
|
1044 |
+
* Escape a file name, to be used in a regex pattern (delimiter is `/`).
|
1045 |
+
* `%s` conversion specifications are protected.
|
1046 |
+
*
|
1047 |
+
* @param string $file_name The file name.
|
1048 |
+
* @return string
|
1049 |
+
* @since 3.2
|
1050 |
+
* @access private
|
1051 |
+
* @author Grégory Viguier
|
1052 |
+
*
|
1053 |
+
*/
|
1054 |
+
private function escape_file_name($file_name)
|
1055 |
+
{
|
1056 |
+
$file_name = explode('%s', $file_name);
|
1057 |
+
$file_name = array_map('preg_quote', $file_name);
|
1058 |
+
|
1059 |
+
return implode('%s', $file_name);
|
1060 |
+
}
|
1061 |
+
}
|
includes/classes/class-facebook-sdk.php
ADDED
@@ -0,0 +1,555 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WGA\Busting;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* This class configures the google analytics cache
|
7 |
+
*
|
8 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
9 |
+
* @copyright (c) 2017 Webraftic Ltd
|
10 |
+
* @version 1.0
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if( !defined('ABSPATH') ) {
|
15 |
+
exit;
|
16 |
+
}
|
17 |
+
|
18 |
+
class Facebook_SDK {
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Facebook SDK URL.
|
22 |
+
* %s is a locale like "en_US".
|
23 |
+
*
|
24 |
+
* @var string
|
25 |
+
* @since 3.2.0
|
26 |
+
*/
|
27 |
+
protected $url = 'https://connect.facebook.net/%s/sdk.js';
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Filename for the cache busting file.
|
31 |
+
* %s is a locale like "en_US".
|
32 |
+
*
|
33 |
+
* @var string
|
34 |
+
* @since 3.2.0
|
35 |
+
*/
|
36 |
+
protected $filename = 'fbsdk-%s.js';
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Flag to track the replacement.
|
40 |
+
*
|
41 |
+
* @var bool
|
42 |
+
* @since 3.2.0
|
43 |
+
*/
|
44 |
+
protected $is_replaced = false;
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Filesystem object.
|
48 |
+
*
|
49 |
+
* @var object
|
50 |
+
* @since 3.2.0
|
51 |
+
*/
|
52 |
+
protected $filesystem = false;
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Constructor.
|
56 |
+
*
|
57 |
+
* @param string $busting_path Path to the busting directory.
|
58 |
+
* @param string $busting_url URL of the busting directory.
|
59 |
+
* @since 3.2.0
|
60 |
+
*
|
61 |
+
*/
|
62 |
+
public function __construct($busting_path, $busting_url)
|
63 |
+
{
|
64 |
+
/** Warning: the file name and script URL are dynamic, and must be run through sprintf(). */
|
65 |
+
$this->busting_path = $busting_path . 'facebook-tracking/';
|
66 |
+
$this->busting_url = $busting_url . 'facebook-tracking/';
|
67 |
+
|
68 |
+
/*
|
69 |
+
* Define the timeouts for the connections. Only available after the constructor is called
|
70 |
+
* to allow for per-transport overriding of the default.
|
71 |
+
*/
|
72 |
+
if( !defined('FS_CONNECT_TIMEOUT') ) {
|
73 |
+
define('FS_CONNECT_TIMEOUT', 30);
|
74 |
+
}
|
75 |
+
if( !defined('FS_TIMEOUT') ) {
|
76 |
+
define('FS_TIMEOUT', 30);
|
77 |
+
}
|
78 |
+
|
79 |
+
// Set the permission constants if not already set.
|
80 |
+
if( !defined('FS_CHMOD_DIR') ) {
|
81 |
+
define('FS_CHMOD_DIR', (fileperms(ABSPATH) & 0777 | 0755));
|
82 |
+
}
|
83 |
+
if( !defined('FS_CHMOD_FILE') ) {
|
84 |
+
define('FS_CHMOD_FILE', (fileperms(ABSPATH . 'index.php') & 0777 | 0644));
|
85 |
+
}
|
86 |
+
|
87 |
+
require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php';
|
88 |
+
require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php';
|
89 |
+
$this->filesystem = new \WP_Filesystem_Direct(new \StdClass());
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Perform the URL replacement process.
|
94 |
+
*
|
95 |
+
* @param string $html HTML contents.
|
96 |
+
* @return string HTML contents.
|
97 |
+
* @since 3.2.0
|
98 |
+
*
|
99 |
+
*/
|
100 |
+
public function replace_url($html)
|
101 |
+
{
|
102 |
+
$this->is_replaced = false;
|
103 |
+
|
104 |
+
$tag = $this->find('<script[^>]*?>(.*)<\/script>', $html);
|
105 |
+
|
106 |
+
if( !$tag ) {
|
107 |
+
return $html;
|
108 |
+
}
|
109 |
+
|
110 |
+
\WGA_Plugin::app()->logger->info('FACEBOOK SDK CACHING PROCESS STARTED. Tag ' . $tag);
|
111 |
+
|
112 |
+
$locale = $this->get_locale_from_url($tag);
|
113 |
+
$remote_url = $this->get_url($locale);
|
114 |
+
|
115 |
+
if( !$this->save($remote_url) ) {
|
116 |
+
return $html;
|
117 |
+
}
|
118 |
+
|
119 |
+
$file_url = $this->get_busting_file_url($locale);
|
120 |
+
$replace_tag = preg_replace('@(?:https?:)?//connect\.facebook\.net/[a-zA-Z_-]+/sdk\.js@i', $file_url, $tag, -1, $count);
|
121 |
+
|
122 |
+
if( !$count || false === strpos($html, $tag) ) {
|
123 |
+
\WGA_Plugin::app()->logger->error('The facebook sdk local file URL could not be replaced in the page contents.');
|
124 |
+
|
125 |
+
return $html;
|
126 |
+
}
|
127 |
+
|
128 |
+
$html = str_replace($tag, $replace_tag, $html);
|
129 |
+
$file_path = $this->get_busting_file_path($locale);
|
130 |
+
$xfbml = $this->get_xfbml_from_url($tag); // Default value should be set to false.
|
131 |
+
$app_id = $this->get_appId_from_url($tag); // APP_ID is the only required value.
|
132 |
+
$url_version = $this->get_version_from_url($tag);
|
133 |
+
$version = false === $url_version ? 'v5.0' : $url_version; // If version is not available set it to the latest: v.5.0.
|
134 |
+
|
135 |
+
if( false !== $app_id ) {
|
136 |
+
// Add FB async init.
|
137 |
+
$fb_async_script = '<script>window.fbAsyncInit = function fbAsyncInit () {FB.init({appId: \'' . $app_id . '\',xfbml: ' . $xfbml . ',version: \'' . $version . '\'})}</script>';
|
138 |
+
$html = str_replace('</body>', $fb_async_script . '</body>', $html);
|
139 |
+
}
|
140 |
+
|
141 |
+
$this->is_replaced = true;
|
142 |
+
|
143 |
+
\WGA_Plugin::app()->logger->info('Facebook SDK caching process succeeded. File ' . $file_path);
|
144 |
+
|
145 |
+
return $html;
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Tell if the replacement was sucessful or not.
|
150 |
+
*
|
151 |
+
* @return bool
|
152 |
+
* @since 3.2.0
|
153 |
+
*
|
154 |
+
*/
|
155 |
+
public function is_replaced()
|
156 |
+
{
|
157 |
+
return $this->is_replaced;
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* Search for an element in the DOM.
|
162 |
+
*
|
163 |
+
* @param string $pattern Pattern to match.
|
164 |
+
* @param string $html HTML contents.
|
165 |
+
* @return string|bool The matched HTML on success. False if nothing is found.
|
166 |
+
* @since 3.2.0
|
167 |
+
*
|
168 |
+
*/
|
169 |
+
protected function find($pattern, $html)
|
170 |
+
{
|
171 |
+
preg_match_all('/' . $pattern . '/Umsi', $html, $matches, PREG_SET_ORDER);
|
172 |
+
|
173 |
+
if( empty($matches) ) {
|
174 |
+
return false;
|
175 |
+
}
|
176 |
+
|
177 |
+
foreach($matches as $match) {
|
178 |
+
if( trim($match[1]) && preg_match('@//connect\.facebook\.net/[a-zA-Z_-]+/sdk\.js@i', $match[1]) ) {
|
179 |
+
return $match[0];
|
180 |
+
}
|
181 |
+
}
|
182 |
+
|
183 |
+
return false;
|
184 |
+
}
|
185 |
+
|
186 |
+
/**
|
187 |
+
* Save the contents of a URL into a local file if it doesn't exist yet.
|
188 |
+
*
|
189 |
+
* @param string $url URL to get the contents from.
|
190 |
+
* @return bool True on success. False on failure.
|
191 |
+
* @since 3.2.0
|
192 |
+
*
|
193 |
+
*/
|
194 |
+
public function save($url)
|
195 |
+
{
|
196 |
+
$locale = $this->get_locale_from_url($url);
|
197 |
+
$path = $this->get_busting_file_path($locale);
|
198 |
+
|
199 |
+
if( $this->filesystem->exists($path) ) {
|
200 |
+
// If a previous version is present, keep it.
|
201 |
+
return true;
|
202 |
+
}
|
203 |
+
|
204 |
+
return $this->refresh_save($url);
|
205 |
+
}
|
206 |
+
|
207 |
+
/**
|
208 |
+
* Save the contents of a URL into a local file.
|
209 |
+
*
|
210 |
+
* @param string $url URL to get the contents from.
|
211 |
+
* @return bool True on success. False on failure.
|
212 |
+
* @since 3.2.0
|
213 |
+
*
|
214 |
+
*/
|
215 |
+
public function refresh_save($url)
|
216 |
+
{
|
217 |
+
$content = $this->get_file_content($url);
|
218 |
+
|
219 |
+
if( !$content ) {
|
220 |
+
// Error, we couldn't fetch the file contents.
|
221 |
+
return false;
|
222 |
+
}
|
223 |
+
|
224 |
+
$locale = $this->get_locale_from_url($url);
|
225 |
+
$path = $this->get_busting_file_path($locale);
|
226 |
+
|
227 |
+
return (bool)$this->update_file_contents($path, $content);
|
228 |
+
}
|
229 |
+
|
230 |
+
/**
|
231 |
+
* Add new contents to a file. If the file doesn't exist, it is created.
|
232 |
+
*
|
233 |
+
* @param string $file_path Path to the file to update.
|
234 |
+
* @param string $file_contents New contents.
|
235 |
+
* @return string|bool The file contents on success. False on failure.
|
236 |
+
* @since 3.2.0
|
237 |
+
*
|
238 |
+
*/
|
239 |
+
private function update_file_contents($file_path, $file_contents)
|
240 |
+
{
|
241 |
+
if( !$this->filesystem->exists($this->busting_path) ) {
|
242 |
+
wp_mkdir_p($this->busting_path);
|
243 |
+
}
|
244 |
+
|
245 |
+
if( !$this->filesystem->put_contents($file_path, $file_contents) ) {
|
246 |
+
\WGA_Plugin::app()->logger->error('Contents could not be written into file. File path ' . $file_path);
|
247 |
+
|
248 |
+
return false;
|
249 |
+
}
|
250 |
+
|
251 |
+
return $file_contents;
|
252 |
+
}
|
253 |
+
|
254 |
+
/**
|
255 |
+
* Look for existing local files and update their contents if there's a new version available.
|
256 |
+
* Actually, if a more recent version exists on the FB side, it will delete all local files and hit the home page to recreate them.
|
257 |
+
*
|
258 |
+
* @return bool True on success. False on failure.
|
259 |
+
* @since 3.2.0
|
260 |
+
*
|
261 |
+
*/
|
262 |
+
public function refresh()
|
263 |
+
{
|
264 |
+
$files = $this->get_files();
|
265 |
+
|
266 |
+
if( !$files ) {
|
267 |
+
// No files (or there's an error).
|
268 |
+
return false !== $files;
|
269 |
+
}
|
270 |
+
|
271 |
+
$error_paths = [];
|
272 |
+
$pattern = $this->escape_file_name($this->filename);
|
273 |
+
$pattern = sprintf($pattern, '(?<locale>[a-zA-Z_-]+)');
|
274 |
+
|
275 |
+
foreach($files as $file) {
|
276 |
+
preg_match('/^' . $pattern . '$/', $file, $matches);
|
277 |
+
|
278 |
+
$remote_url = $this->get_url($matches['locale']);
|
279 |
+
|
280 |
+
if( !$this->refresh_save($remote_url) ) {
|
281 |
+
$error_paths[] = $this->get_busting_file_path($matches['locale']);
|
282 |
+
}
|
283 |
+
}
|
284 |
+
|
285 |
+
if( $error_paths ) {
|
286 |
+
\WGA_Plugin::app()->logger->error('Local file(s) could not be updated. Paths ' . $error_paths);
|
287 |
+
}
|
288 |
+
|
289 |
+
return !$error_paths;
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Delete all Facebook SDK busting files.
|
294 |
+
*
|
295 |
+
* @return bool True on success. False on failure.
|
296 |
+
* @since 3.2.0
|
297 |
+
*
|
298 |
+
*/
|
299 |
+
public function delete()
|
300 |
+
{
|
301 |
+
$filesystem = $this->filesystem;
|
302 |
+
$files = $this->get_files();
|
303 |
+
|
304 |
+
if( !$files ) {
|
305 |
+
// No files (or there's an error).
|
306 |
+
return false !== $files;
|
307 |
+
}
|
308 |
+
|
309 |
+
$error_paths = [];
|
310 |
+
|
311 |
+
foreach($files as $file_name) {
|
312 |
+
if( !$filesystem->delete($this->busting_path . $file_name, false, 'f') ) {
|
313 |
+
$error_paths[] = $this->busting_path . $file_name;
|
314 |
+
}
|
315 |
+
}
|
316 |
+
|
317 |
+
if( $error_paths ) {
|
318 |
+
\WGA_Plugin::app()->logger->error('Local file(s) could not be deleted. Paths ' . $error_paths);
|
319 |
+
}
|
320 |
+
|
321 |
+
return !$error_paths;
|
322 |
+
}
|
323 |
+
|
324 |
+
/**
|
325 |
+
* Get all cached files in the directory.
|
326 |
+
*
|
327 |
+
* @return array|bool A list of file names. False on failure.
|
328 |
+
* @since 3.2.0
|
329 |
+
*
|
330 |
+
*/
|
331 |
+
private function get_files()
|
332 |
+
{
|
333 |
+
$filesystem = $this->filesystem;
|
334 |
+
$dir_path = rtrim($this->busting_path, '\\/');
|
335 |
+
|
336 |
+
if( !$filesystem->exists($dir_path) ) {
|
337 |
+
return [];
|
338 |
+
}
|
339 |
+
|
340 |
+
if( !$filesystem->is_writable($dir_path) ) {
|
341 |
+
\WGA_Plugin::app()->logger->error('Facebook sdk: Directory is not writable. Path ' . $dir_path);
|
342 |
+
|
343 |
+
return false;
|
344 |
+
}
|
345 |
+
|
346 |
+
$dir = $filesystem->dirlist($dir_path);
|
347 |
+
|
348 |
+
if( false === $dir ) {
|
349 |
+
\WGA_Plugin::app()->logger->error('Facebook sdk: Could not get the directory contents. Path ' . $dir_path);
|
350 |
+
|
351 |
+
return false;
|
352 |
+
}
|
353 |
+
|
354 |
+
if( !$dir ) {
|
355 |
+
return [];
|
356 |
+
}
|
357 |
+
|
358 |
+
$list = [];
|
359 |
+
$pattern = $this->escape_file_name($this->filename);
|
360 |
+
$pattern = sprintf($pattern, '[a-zA-Z_-]+');
|
361 |
+
|
362 |
+
foreach($dir as $entry) {
|
363 |
+
if( 'f' !== $entry['type'] ) {
|
364 |
+
continue;
|
365 |
+
}
|
366 |
+
if( preg_match('/^' . $pattern . '$/', $entry['name'], $matches) ) {
|
367 |
+
$list[$entry['name']] = $entry['name'];
|
368 |
+
}
|
369 |
+
}
|
370 |
+
|
371 |
+
return $list;
|
372 |
+
}
|
373 |
+
|
374 |
+
/**
|
375 |
+
* Get the remote Facebook SDK URL.
|
376 |
+
*
|
377 |
+
* @param string $locale A locale string, like 'en_US'.
|
378 |
+
* @return string
|
379 |
+
* @since 3.2.0
|
380 |
+
*
|
381 |
+
*/
|
382 |
+
public function get_url($locale)
|
383 |
+
{
|
384 |
+
return sprintf($this->url, $locale);
|
385 |
+
}
|
386 |
+
|
387 |
+
/**
|
388 |
+
* Extract the locale from a URL to bust.
|
389 |
+
*
|
390 |
+
* @param string $url Any string containing the URL to bust.
|
391 |
+
* @return string|bool The locale on success. False on failure.
|
392 |
+
* @since 3.2.0
|
393 |
+
*
|
394 |
+
*/
|
395 |
+
private function get_locale_from_url($url)
|
396 |
+
{
|
397 |
+
$pattern = '@//connect\.facebook\.net/(?<locale>[a-zA-Z_-]+)/sdk\.js@i';
|
398 |
+
|
399 |
+
if( !preg_match($pattern, $url, $matches) ) {
|
400 |
+
return false;
|
401 |
+
}
|
402 |
+
|
403 |
+
return $matches['locale'];
|
404 |
+
}
|
405 |
+
|
406 |
+
/**
|
407 |
+
* Extract XFBML from a URL to bust.
|
408 |
+
*
|
409 |
+
* @param string $url Any string containing the URL to bust.
|
410 |
+
* @return string|bool The XFBML on success. False on failure.
|
411 |
+
* @since 3.4.3
|
412 |
+
*
|
413 |
+
*/
|
414 |
+
private function get_xfbml_from_url($url)
|
415 |
+
{
|
416 |
+
$pattern = '@//connect\.facebook\.net/(?<locale>[a-zA-Z_-]+)/sdk\.js#(?:.+&)?xfbml=(?<xfbml>[0-9]+)@i';
|
417 |
+
|
418 |
+
if( !preg_match($pattern, $url, $matches) ) {
|
419 |
+
return false;
|
420 |
+
}
|
421 |
+
|
422 |
+
return $matches['xfbml'];
|
423 |
+
}
|
424 |
+
|
425 |
+
/**
|
426 |
+
* Extract appId from a URL to bust.
|
427 |
+
*
|
428 |
+
* @param string $url Any string containing the URL to bust.
|
429 |
+
* @return string|bool The appId on success. False on failure.
|
430 |
+
* @since 3.4.3
|
431 |
+
*
|
432 |
+
*/
|
433 |
+
private function get_appId_from_url($url)
|
434 |
+
{
|
435 |
+
$pattern = '@//connect\.facebook\.net/(?<locale>[a-zA-Z_-]+)/sdk\.js#(?:.+&)?appId=(?<appId>[0-9]+)@i';
|
436 |
+
|
437 |
+
if( !preg_match($pattern, $url, $matches) ) {
|
438 |
+
return false;
|
439 |
+
}
|
440 |
+
|
441 |
+
return $matches['appId'];
|
442 |
+
}
|
443 |
+
|
444 |
+
/**
|
445 |
+
* Extract version from a URL to bust.
|
446 |
+
*
|
447 |
+
* @param string $url Any string containing the URL to bust.
|
448 |
+
* @return string|bool The version on success. False on failure.
|
449 |
+
* @since 3.4.3
|
450 |
+
*
|
451 |
+
*/
|
452 |
+
private function get_version_from_url($url)
|
453 |
+
{
|
454 |
+
$pattern = '@//connect\.facebook\.net/(?<locale>[a-zA-Z_-]+)/sdk\.js#(?:.+&)?version=(?<version>[a-zA-Z0-9.]+)@i';
|
455 |
+
|
456 |
+
if( !preg_match($pattern, $url, $matches) ) {
|
457 |
+
return false;
|
458 |
+
}
|
459 |
+
|
460 |
+
return $matches['version'];
|
461 |
+
}
|
462 |
+
|
463 |
+
/**
|
464 |
+
* Get the local Facebook SDK URL.
|
465 |
+
*
|
466 |
+
* @param string $locale A locale string, like 'en_US'.
|
467 |
+
* @return string
|
468 |
+
* @since 3.2.0
|
469 |
+
*
|
470 |
+
*/
|
471 |
+
private function get_busting_file_url($locale)
|
472 |
+
{
|
473 |
+
$filename = $this->get_busting_file_name($locale);
|
474 |
+
|
475 |
+
return $this->busting_url . $filename;
|
476 |
+
}
|
477 |
+
|
478 |
+
/**
|
479 |
+
* Get the local Facebook SDK file name.
|
480 |
+
*
|
481 |
+
* @param string $locale A locale string, like 'en_US'.
|
482 |
+
* @return string
|
483 |
+
* @since 3.2.0
|
484 |
+
*
|
485 |
+
*/
|
486 |
+
private function get_busting_file_name($locale)
|
487 |
+
{
|
488 |
+
return sprintf($this->filename, $locale);
|
489 |
+
}
|
490 |
+
|
491 |
+
/**
|
492 |
+
* Get the local Facebook SDK file path.
|
493 |
+
*
|
494 |
+
* @param string $locale A locale string, like 'en_US'.
|
495 |
+
* @return string
|
496 |
+
* @since 3.2.0
|
497 |
+
*
|
498 |
+
*/
|
499 |
+
private function get_busting_file_path($locale)
|
500 |
+
{
|
501 |
+
return $this->busting_path . $this->get_busting_file_name($locale);
|
502 |
+
}
|
503 |
+
|
504 |
+
/**
|
505 |
+
* Get the contents of a URL.
|
506 |
+
*
|
507 |
+
* @param string $url The URL to request.
|
508 |
+
* @return string|bool The contents on success. False on failure.
|
509 |
+
* @since 3.2.0
|
510 |
+
*
|
511 |
+
*/
|
512 |
+
protected function get_file_content($url)
|
513 |
+
{
|
514 |
+
try {
|
515 |
+
$response = wp_remote_get($url);
|
516 |
+
} catch( \Exception $e ) {
|
517 |
+
\WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $e->getMessage());
|
518 |
+
|
519 |
+
return false;
|
520 |
+
}
|
521 |
+
|
522 |
+
if( is_wp_error($response) ) {
|
523 |
+
\WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
|
524 |
+
|
525 |
+
return false;
|
526 |
+
}
|
527 |
+
|
528 |
+
$contents = wp_remote_retrieve_body($response);
|
529 |
+
|
530 |
+
if( !$contents ) {
|
531 |
+
\WGA_Plugin::app()->logger->error('Remote file could not be fetched. Response ' . $response->get_error_message());
|
532 |
+
|
533 |
+
return false;
|
534 |
+
}
|
535 |
+
|
536 |
+
return $contents;
|
537 |
+
}
|
538 |
+
|
539 |
+
/**
|
540 |
+
* Escape a file name, to be used in a regex pattern (delimiter is `/`).
|
541 |
+
* `%s` conversion specifications are protected.
|
542 |
+
*
|
543 |
+
* @param string $file_name The file name.
|
544 |
+
* @return string
|
545 |
+
* @since 3.2.0
|
546 |
+
*
|
547 |
+
*/
|
548 |
+
private function escape_file_name($file_name)
|
549 |
+
{
|
550 |
+
$file_name = explode('%s', $file_name);
|
551 |
+
$file_name = array_map('preg_quote', $file_name);
|
552 |
+
|
553 |
+
return implode('%s', $file_name);
|
554 |
+
}
|
555 |
+
}
|
includes/classes/class-google-analytics-cache.php
ADDED
@@ -0,0 +1,162 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WGA\Busting;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* This class configures the google analytics cache
|
7 |
+
*
|
8 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
9 |
+
* @copyright (c) 2017 Webraftic Ltd
|
10 |
+
* @version 1.0
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if( !defined('ABSPATH') ) {
|
15 |
+
exit;
|
16 |
+
}
|
17 |
+
|
18 |
+
class Google_Analytics_Cache extends Abstract_Cache {
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Google Analytics URL.
|
22 |
+
*
|
23 |
+
* @var string
|
24 |
+
* @since 3.2.0
|
25 |
+
*/
|
26 |
+
protected $url = 'https://www.google-analytics.com/analytics.js';
|
27 |
+
|
28 |
+
/**
|
29 |
+
* File name (local).
|
30 |
+
* %s is a "version": a md5 hash of the file contents.
|
31 |
+
*
|
32 |
+
* @var string
|
33 |
+
* @since 3.2.0
|
34 |
+
*/
|
35 |
+
protected $filename_pattern = 'ga-%s.js';
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Current file version (local): a md5 hash of the file contents.
|
39 |
+
*
|
40 |
+
* @var string
|
41 |
+
* @since 3.2.0
|
42 |
+
*/
|
43 |
+
protected $file_version;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Flag to track the replacement.
|
47 |
+
*
|
48 |
+
* @var bool
|
49 |
+
* @since 3.2.0
|
50 |
+
*/
|
51 |
+
protected $is_replaced = false;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Constructor.
|
55 |
+
*
|
56 |
+
* @param string $busting_path Path to the busting directory.
|
57 |
+
* @param string $busting_url URL of the busting directory.
|
58 |
+
* @since 3.1
|
59 |
+
* @access public
|
60 |
+
*
|
61 |
+
*/
|
62 |
+
public function __construct($busting_path, $busting_url)
|
63 |
+
{
|
64 |
+
parent::__construct($busting_path, $busting_url);
|
65 |
+
|
66 |
+
$this->busting_path = $busting_path . 'google-tracking/';
|
67 |
+
$this->busting_url = $busting_url . 'google-tracking/';
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Performs the replacement process.
|
72 |
+
*
|
73 |
+
* @param string $html HTML content.
|
74 |
+
* @return string
|
75 |
+
* @since 3.2.0
|
76 |
+
*
|
77 |
+
*/
|
78 |
+
public function replace_url($html)
|
79 |
+
{
|
80 |
+
$this->is_replaced = false;
|
81 |
+
|
82 |
+
$tag = $this->find('<script\s*(?<attr>[^>]*)?>(?<content>[^<]+)?<\/script>', $html);
|
83 |
+
|
84 |
+
if( !$tag ) {
|
85 |
+
return $html;
|
86 |
+
}
|
87 |
+
|
88 |
+
\WGA_Plugin::app()->logger->info('GOOGLE ANALYTICS CACHING PROCESS STARTED. TAG #' . $tag);
|
89 |
+
|
90 |
+
if( !$this->save($this->url) ) {
|
91 |
+
return $html;
|
92 |
+
}
|
93 |
+
|
94 |
+
$replace_tag = preg_replace('/(?:https?:)?\/\/www\.google-analytics\.com\/analytics\.js/i', $this->get_busting_url(), $tag);
|
95 |
+
$html = str_replace($tag, $replace_tag, $html);
|
96 |
+
|
97 |
+
$this->is_replaced = true;
|
98 |
+
|
99 |
+
\WGA_Plugin::app()->logger->info('Google Analytics caching process succeeded. Busting path ' . $this->get_busting_path());
|
100 |
+
|
101 |
+
return $html;
|
102 |
+
}
|
103 |
+
|
104 |
+
/**
|
105 |
+
* Tell if the replacement was sucessful or not.
|
106 |
+
*
|
107 |
+
* @return bool
|
108 |
+
*
|
109 |
+
* @since 3.2.0
|
110 |
+
*/
|
111 |
+
public function is_replaced()
|
112 |
+
{
|
113 |
+
return $this->is_replaced;
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* Get the Google Analytics URL.
|
118 |
+
*
|
119 |
+
* @return string
|
120 |
+
* @author Remy Perona
|
121 |
+
*
|
122 |
+
* @since 3.1
|
123 |
+
* @access public
|
124 |
+
*/
|
125 |
+
public function get_url()
|
126 |
+
{
|
127 |
+
return $this->url;
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Searches for element(s) in the DOM.
|
132 |
+
*
|
133 |
+
* @param string $pattern Pattern to match.
|
134 |
+
* @param string $html HTML content.
|
135 |
+
* @return string
|
136 |
+
* @author Remy Perona
|
137 |
+
*
|
138 |
+
* @since 3.1
|
139 |
+
* @access public
|
140 |
+
*/
|
141 |
+
protected function find($pattern, $html)
|
142 |
+
{
|
143 |
+
preg_match_all('/' . $pattern . '/is', $html, $all_matches, PREG_SET_ORDER);
|
144 |
+
|
145 |
+
$matches = array_map(function ($match) {
|
146 |
+
|
147 |
+
if( empty($match['content']) || (!preg_match('/src\s*=\s*[\'"]\s*(?:https?:)?\/\/www\.google-analytics\.com\/analytics\.js\s*[\'"]/i', $match['attr'] . $match['content']) && false === strpos($match['content'], 'GoogleAnalyticsObject')) ) {
|
148 |
+
return;
|
149 |
+
}
|
150 |
+
|
151 |
+
return $match[0];
|
152 |
+
}, $all_matches);
|
153 |
+
|
154 |
+
$matches = array_values(array_filter($matches));
|
155 |
+
|
156 |
+
if( !$matches ) {
|
157 |
+
return false;
|
158 |
+
}
|
159 |
+
|
160 |
+
return $matches[0];
|
161 |
+
}
|
162 |
+
}
|
includes/classes/class-google-tag-manager-cache.php
ADDED
@@ -0,0 +1,156 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WGA\Busting;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* This class configures the google analytics cache
|
7 |
+
*
|
8 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
9 |
+
* @copyright (c) 2017 Webraftic Ltd
|
10 |
+
* @version 1.0
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if( !defined('ABSPATH') ) {
|
15 |
+
exit;
|
16 |
+
}
|
17 |
+
|
18 |
+
class Google_Tag_Manager_Cache extends Abstract_Cache {
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Context used for the logger.
|
22 |
+
*
|
23 |
+
* @var string
|
24 |
+
* @since 3.2.4
|
25 |
+
*/
|
26 |
+
const LOGGER_CONTEXT = 'gg tag manager';
|
27 |
+
|
28 |
+
/**
|
29 |
+
* File name (local).
|
30 |
+
* %s is a "version": a md5 hash of the file contents.
|
31 |
+
*
|
32 |
+
* @var string
|
33 |
+
* @since 3.2.4
|
34 |
+
* @access protected
|
35 |
+
*/
|
36 |
+
protected $filename_pattern = 'gtm-%s.js';
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Current file version (local): a md5 hash of the file contents.
|
40 |
+
*
|
41 |
+
* @var string
|
42 |
+
* @since 3.2.4
|
43 |
+
* @access protected
|
44 |
+
*/
|
45 |
+
protected $file_version;
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Filesystem object.
|
49 |
+
*
|
50 |
+
* @var object
|
51 |
+
* @since 3.2.4
|
52 |
+
* @access protected
|
53 |
+
*/
|
54 |
+
protected $filesystem = false;
|
55 |
+
|
56 |
+
/**
|
57 |
+
* Google Analytics object.
|
58 |
+
*
|
59 |
+
* @var object
|
60 |
+
* @since 3.2.4
|
61 |
+
* @access protected
|
62 |
+
*/
|
63 |
+
protected $ga_busting = false;
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Constructor.
|
67 |
+
*
|
68 |
+
* @param string $busting_path Path to the busting directory.
|
69 |
+
* @param string $busting_url URL of the busting directory.
|
70 |
+
* @param Google_Analytics_Cache $ga_busting A GoogleAnalytics instance.
|
71 |
+
* @since 3.1
|
72 |
+
* @access public
|
73 |
+
*
|
74 |
+
*/
|
75 |
+
public function __construct($busting_path, $busting_url, Google_Analytics_Cache $ga_busting)
|
76 |
+
{
|
77 |
+
parent::__construct($busting_path, $busting_url);
|
78 |
+
$blog_id = get_current_blog_id();
|
79 |
+
$this->busting_path = $busting_path . $blog_id . '/';
|
80 |
+
$this->busting_url = $busting_url . $blog_id . '/';
|
81 |
+
$this->ga_busting = $ga_busting;
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Performs the replacement process.
|
86 |
+
*
|
87 |
+
* @param string $html HTML content.
|
88 |
+
* @return string
|
89 |
+
* @since 3.1
|
90 |
+
* @access public
|
91 |
+
*
|
92 |
+
*/
|
93 |
+
public function replace_url($html)
|
94 |
+
{
|
95 |
+
$script = $this->find('<script(\s+[^>]+)?\s+src\s*=\s*[\'"]\s*?((?:https?:)?\/\/www\.googletagmanager\.com(?:.+)?)\s*?[\'"]([^>]+)?\/?>', $html);
|
96 |
+
|
97 |
+
if( !$script ) {
|
98 |
+
return $html;
|
99 |
+
}
|
100 |
+
|
101 |
+
// replace relative protocol // with full https://.
|
102 |
+
$gtm_url = preg_replace('/^\/\//', 'https://', $script[2]);
|
103 |
+
|
104 |
+
\WGA_Plugin::app()->logger->info('GOOGLE TAG MANAGER CACHING PROCESS STARTED. Script ' . $script);
|
105 |
+
|
106 |
+
if( !$this->save($gtm_url) ) {
|
107 |
+
return $html;
|
108 |
+
}
|
109 |
+
|
110 |
+
$replace_script = str_replace($script[2], $this->get_busting_url(), $script[0]);
|
111 |
+
$replace_script = str_replace('<script', '<script data-no-minify="1"', $replace_script);
|
112 |
+
$html = str_replace($script[0], $replace_script, $html);
|
113 |
+
|
114 |
+
\WGA_Plugin::app()->logger->info('Google Tag Manager caching process succeeded. Path ' . $this->get_busting_path());
|
115 |
+
|
116 |
+
return $html;
|
117 |
+
}
|
118 |
+
|
119 |
+
/**
|
120 |
+
* Searches for element(s) in the DOM.
|
121 |
+
*
|
122 |
+
* @param string $pattern Pattern to match.
|
123 |
+
* @param string $html HTML content.
|
124 |
+
* @return string
|
125 |
+
* @since 3.1
|
126 |
+
* @access public
|
127 |
+
*
|
128 |
+
*/
|
129 |
+
protected function find($pattern, $html)
|
130 |
+
{
|
131 |
+
preg_match_all('/' . $pattern . '/Umsi', $html, $matches, PREG_SET_ORDER);
|
132 |
+
|
133 |
+
if( empty($matches) ) {
|
134 |
+
return false;
|
135 |
+
}
|
136 |
+
|
137 |
+
return $matches[0];
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Replaces the Google Analytics URL by the local copy inside the gtm-local.js file content
|
142 |
+
*
|
143 |
+
* @param string $content JavaScript content.
|
144 |
+
* @return string
|
145 |
+
* @since 3.1
|
146 |
+
*
|
147 |
+
*/
|
148 |
+
protected function replace_ga_url($content)
|
149 |
+
{
|
150 |
+
if( !$this->ga_busting->save($this->ga_busting->get_url()) ) {
|
151 |
+
return $content;
|
152 |
+
}
|
153 |
+
|
154 |
+
return str_replace($this->ga_busting->get_url(), $this->ga_busting->get_busting_url(), $content);
|
155 |
+
}
|
156 |
+
}
|
includes/classes/class-scheduler.php
ADDED
@@ -0,0 +1,210 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WGA\Busting;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* This class configures the google analytics cache
|
7 |
+
*
|
8 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
9 |
+
* @copyright (c) 2017 Webraftic Ltd
|
10 |
+
* @version 1.0
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if( !defined('ABSPATH') ) {
|
15 |
+
exit;
|
16 |
+
}
|
17 |
+
|
18 |
+
class Sheduller {
|
19 |
+
|
20 |
+
protected $ga_processor;
|
21 |
+
protected $gtm_processor;
|
22 |
+
protected $fbpix_processor;
|
23 |
+
protected $fbsdk_processor;
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Constructor
|
27 |
+
*/
|
28 |
+
public function __construct()
|
29 |
+
{
|
30 |
+
require_once WGA_PLUGIN_DIR . '/includes/classes/class-abstract-cache.php';
|
31 |
+
require_once WGA_PLUGIN_DIR . '/includes/classes/class-google-analytics-cache.php';
|
32 |
+
require_once WGA_PLUGIN_DIR . '/includes/classes/class-yandex-metrika-cache.php';
|
33 |
+
require_once WGA_PLUGIN_DIR . '/includes/classes/class-google-tag-manager-cache.php';
|
34 |
+
require_once WGA_PLUGIN_DIR . '/includes/classes/class-facebook-sdk.php';
|
35 |
+
require_once WGA_PLUGIN_DIR . '/includes/classes/class-facebook-cache.php';
|
36 |
+
|
37 |
+
$uploads_dir = wp_get_upload_dir();
|
38 |
+
|
39 |
+
if( !$uploads_dir ) {
|
40 |
+
return false;
|
41 |
+
}
|
42 |
+
|
43 |
+
$busting_path = trailingslashit($uploads_dir['basedir']) . WGA_PLUGIN_CACHE_FOLDER . '/';
|
44 |
+
$busting_url = trailingslashit($uploads_dir['baseurl']) . WGA_PLUGIN_CACHE_FOLDER . '/';
|
45 |
+
|
46 |
+
if( \WGA_Plugin::app()->getPopulateOption('yandex_metrika_cache') ) {
|
47 |
+
$this->ym_processor = new Yandex_Metrika_Cache($busting_path, $busting_url);
|
48 |
+
}
|
49 |
+
|
50 |
+
if( \WGA_Plugin::app()->getPopulateOption('google_analytics_cache') ) {
|
51 |
+
$this->ga_processor = new Google_Analytics_Cache($busting_path, $busting_url);
|
52 |
+
$this->gtm_processor = new Google_Tag_Manager_Cache($busting_path, $busting_url, $this->ga_processor);
|
53 |
+
}
|
54 |
+
if( \WGA_Plugin::app()->getPopulateOption('facebook_cache') ) {
|
55 |
+
$this->fbpix_processor = new Facebook_Pixel_Cache($busting_path, $busting_url);
|
56 |
+
$this->fbsdk_processor = new Facebook_SDK($busting_path, $busting_url);
|
57 |
+
}
|
58 |
+
|
59 |
+
add_action('cron_schedules', [$this, 'add_schedule']);
|
60 |
+
add_action('wclearfy/google_tracking_cache_update', [$this, 'update_tracking_cache']);
|
61 |
+
add_action('init', [$this, 'schedule_tracking_cache_update']);
|
62 |
+
|
63 |
+
add_action('template_redirect', function () {
|
64 |
+
ob_start([$this, 'cache_busting_google_tracking']);
|
65 |
+
}, 1);
|
66 |
+
|
67 |
+
add_action('wclearfy_delete_cache', [$this, 'delete_tracking_cache']);
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Processes the cache busting on the HTML content
|
72 |
+
*
|
73 |
+
* Google Analytics replacement is performed first, and if no replacement occured, Google Tag Manager replacement is performed.
|
74 |
+
*
|
75 |
+
* @param string $html HTML content.
|
76 |
+
* @return string
|
77 |
+
* @since 3.1
|
78 |
+
*
|
79 |
+
*/
|
80 |
+
public function cache_busting_google_tracking($html)
|
81 |
+
{
|
82 |
+
if( !$this->is_busting_active() ) {
|
83 |
+
return $html;
|
84 |
+
}
|
85 |
+
|
86 |
+
if( \WGA_Plugin::app()->getPopulateOption('yandex_metrika_cache') ) {
|
87 |
+
$html = $this->ym_processor->replace_url($html);
|
88 |
+
}
|
89 |
+
|
90 |
+
if( \WGA_Plugin::app()->getPopulateOption('google_analytics_cache') ) {
|
91 |
+
$html = $this->ga_processor->replace_url($html);
|
92 |
+
$html = $this->gtm_processor->replace_url($html);
|
93 |
+
}
|
94 |
+
if( \WGA_Plugin::app()->getPopulateOption('facebook_cache') ) {
|
95 |
+
$html = $this->fbpix_processor->replace_url($html);
|
96 |
+
$html = $this->fbsdk_processor->replace_url($html);
|
97 |
+
}
|
98 |
+
|
99 |
+
return $html;
|
100 |
+
}
|
101 |
+
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Adds weekly interval to cron schedules
|
105 |
+
*
|
106 |
+
* @param $schedules array An array of intervals used by cron jobs.
|
107 |
+
* @return []
|
108 |
+
* @since 3.2.0
|
109 |
+
*
|
110 |
+
*/
|
111 |
+
public function add_schedule($schedules)
|
112 |
+
{
|
113 |
+
if( !$this->is_busting_active() ) {
|
114 |
+
return $schedules;
|
115 |
+
}
|
116 |
+
|
117 |
+
$schedules['weekly'] = [
|
118 |
+
'interval' => 604800,
|
119 |
+
'display' => __('weekly', 'clearfy'),
|
120 |
+
];
|
121 |
+
|
122 |
+
return $schedules;
|
123 |
+
}
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Schedules the auto-update of Google Analytics cache busting file
|
127 |
+
*
|
128 |
+
* @return void
|
129 |
+
* @since 3.2.0
|
130 |
+
*/
|
131 |
+
public function schedule_tracking_cache_update()
|
132 |
+
{
|
133 |
+
if( !$this->is_busting_active() ) {
|
134 |
+
return;
|
135 |
+
}
|
136 |
+
|
137 |
+
if( !wp_next_scheduled('wclearfy/google_tracking_cache_update') ) {
|
138 |
+
wp_schedule_event(time(), 'weekly', 'wclearfy/google_tracking_cache_update');
|
139 |
+
}
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* Updates Google Analytics cache busting file
|
144 |
+
*
|
145 |
+
* @return bool
|
146 |
+
* @since 3.2.0
|
147 |
+
*/
|
148 |
+
public function update_tracking_cache()
|
149 |
+
{
|
150 |
+
if( !$this->is_busting_active() ) {
|
151 |
+
return false;
|
152 |
+
}
|
153 |
+
|
154 |
+
if( \WGA_Plugin::app()->getPopulateOption('yandex_metrika_cache') ) {
|
155 |
+
$this->ym_processor->refresh_save($this->ym_processor->get_url());
|
156 |
+
}
|
157 |
+
|
158 |
+
if( \WGA_Plugin::app()->getPopulateOption('google_analytics_cache') ) {
|
159 |
+
$this->ga_processor->refresh_save($this->ga_processor->get_url());
|
160 |
+
}
|
161 |
+
|
162 |
+
if( \WGA_Plugin::app()->getPopulateOption('facebook_cache') ) {
|
163 |
+
$this->fbsdk_processor->refresh();
|
164 |
+
$this->fbpix_processor->refresh_all();
|
165 |
+
}
|
166 |
+
|
167 |
+
return true;
|
168 |
+
}
|
169 |
+
|
170 |
+
/**
|
171 |
+
* Deletes the GA busting file.
|
172 |
+
*
|
173 |
+
* @return bool
|
174 |
+
* @since 3.2.0
|
175 |
+
*/
|
176 |
+
public function delete_tracking_cache()
|
177 |
+
{
|
178 |
+
if( !$this->is_busting_active() ) {
|
179 |
+
return false;
|
180 |
+
}
|
181 |
+
|
182 |
+
$result = false;
|
183 |
+
|
184 |
+
if( \WGA_Plugin::app()->getPopulateOption('facebook_cache') ) {
|
185 |
+
$result = $this->fbsdk_processor->delete() && $this->fbpix_processor->delete_all();
|
186 |
+
}
|
187 |
+
|
188 |
+
if( \WGA_Plugin::app()->getPopulateOption('google_analytics_cache') ) {
|
189 |
+
$result = $result && $this->ga_processor->delete() && $this->gtm_processor->delete();
|
190 |
+
}
|
191 |
+
|
192 |
+
if( \WGA_Plugin::app()->getPopulateOption('yandex_metrika_cache') ) {
|
193 |
+
$result = $result && $this->ym_processor->delete();
|
194 |
+
}
|
195 |
+
|
196 |
+
return $result;
|
197 |
+
}
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Tell if the cache busting option is active.
|
201 |
+
*
|
202 |
+
* @return bool
|
203 |
+
* @since 3.2.0
|
204 |
+
*
|
205 |
+
*/
|
206 |
+
private function is_busting_active()
|
207 |
+
{
|
208 |
+
return (\WGA_Plugin::app()->getPopulateOption('yandex_metrika_cache') || \WGA_Plugin::app()->getPopulateOption('google_analytics_cache') || \WGA_Plugin::app()->getPopulateOption('facebook_cache'));
|
209 |
+
}
|
210 |
+
}
|
includes/classes/class-yandex-metrika-cache.php
ADDED
@@ -0,0 +1,162 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WGA\Busting;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* This class configures the google analytics cache
|
7 |
+
*
|
8 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
9 |
+
* @copyright (c) 2017 Webraftic Ltd
|
10 |
+
* @version 1.0
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if( !defined('ABSPATH') ) {
|
15 |
+
exit;
|
16 |
+
}
|
17 |
+
|
18 |
+
class Yandex_Metrika_Cache extends Abstract_Cache {
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Google Analytics URL.
|
22 |
+
*
|
23 |
+
* @var string
|
24 |
+
* @since 3.2.0
|
25 |
+
*/
|
26 |
+
protected $url = 'https://mc.yandex.ru/metrika/tag.js';
|
27 |
+
|
28 |
+
/**
|
29 |
+
* File name (local).
|
30 |
+
* %s is a "version": a md5 hash of the file contents.
|
31 |
+
*
|
32 |
+
* @var string
|
33 |
+
* @since 3.2.0
|
34 |
+
*/
|
35 |
+
protected $filename_pattern = 'ym-tag-%s.js';
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Current file version (local): a md5 hash of the file contents.
|
39 |
+
*
|
40 |
+
* @var string
|
41 |
+
* @since 3.2.0
|
42 |
+
*/
|
43 |
+
protected $file_version;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Flag to track the replacement.
|
47 |
+
*
|
48 |
+
* @var bool
|
49 |
+
* @since 3.2.0
|
50 |
+
*/
|
51 |
+
protected $is_replaced = false;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Constructor.
|
55 |
+
*
|
56 |
+
* @param string $busting_path Path to the busting directory.
|
57 |
+
* @param string $busting_url URL of the busting directory.
|
58 |
+
* @since 3.1
|
59 |
+
* @access public
|
60 |
+
*
|
61 |
+
*/
|
62 |
+
public function __construct($busting_path, $busting_url)
|
63 |
+
{
|
64 |
+
parent::__construct($busting_path, $busting_url);
|
65 |
+
|
66 |
+
$this->busting_path = $busting_path . 'yandex-tracking/';
|
67 |
+
$this->busting_url = $busting_url . 'yandex-tracking/';
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Performs the replacement process.
|
72 |
+
*
|
73 |
+
* @param string $html HTML content.
|
74 |
+
* @return string
|
75 |
+
* @since 3.2.0
|
76 |
+
*
|
77 |
+
*/
|
78 |
+
public function replace_url($html)
|
79 |
+
{
|
80 |
+
$this->is_replaced = false;
|
81 |
+
|
82 |
+
$tag = $this->find('<script\s*(?<attr>[^>]*)?>(?<content>[^<]+)?<\/script>', $html);
|
83 |
+
|
84 |
+
if( !$tag ) {
|
85 |
+
return $html;
|
86 |
+
}
|
87 |
+
|
88 |
+
\WGA_Plugin::app()->logger->info('YANDEX METRIKA CACHING PROCESS STARTED. TAG #' . $tag);
|
89 |
+
|
90 |
+
if( !$this->save($this->url) ) {
|
91 |
+
return $html;
|
92 |
+
}
|
93 |
+
|
94 |
+
$replace_tag = preg_replace('/(?:https?:)?\/\/mc\.yandex\.ru\/metrika\/tag\.js/i', $this->get_busting_url(), $tag);
|
95 |
+
$html = str_replace($tag, $replace_tag, $html);
|
96 |
+
|
97 |
+
$this->is_replaced = true;
|
98 |
+
|
99 |
+
\WGA_Plugin::app()->logger->info('Yandex metrika caching process succeeded. Busting path ' . $this->get_busting_path());
|
100 |
+
|
101 |
+
return $html;
|
102 |
+
}
|
103 |
+
|
104 |
+
/**
|
105 |
+
* Tell if the replacement was sucessful or not.
|
106 |
+
*
|
107 |
+
* @return bool
|
108 |
+
*
|
109 |
+
* @since 3.2.0
|
110 |
+
*/
|
111 |
+
public function is_replaced()
|
112 |
+
{
|
113 |
+
return $this->is_replaced;
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* Get the Google Analytics URL.
|
118 |
+
*
|
119 |
+
* @return string
|
120 |
+
* @author Remy Perona
|
121 |
+
*
|
122 |
+
* @since 3.1
|
123 |
+
* @access public
|
124 |
+
*/
|
125 |
+
public function get_url()
|
126 |
+
{
|
127 |
+
return $this->url;
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Searches for element(s) in the DOM.
|
132 |
+
*
|
133 |
+
* @param string $pattern Pattern to match.
|
134 |
+
* @param string $html HTML content.
|
135 |
+
* @return string
|
136 |
+
* @author Remy Perona
|
137 |
+
*
|
138 |
+
* @since 3.1
|
139 |
+
* @access public
|
140 |
+
*/
|
141 |
+
protected function find($pattern, $html)
|
142 |
+
{
|
143 |
+
preg_match_all('/' . $pattern . '/is', $html, $all_matches, PREG_SET_ORDER);
|
144 |
+
|
145 |
+
$matches = array_map(function ($match) {
|
146 |
+
|
147 |
+
if( empty($match['content']) || (!preg_match('/\"script\",\s*[\'"](?:https?:)?\/\/mc\.yandex\.ru\/metrika\/tag\.js[\'"]/i', $match['attr'] . $match['content'])) ) {
|
148 |
+
return false;
|
149 |
+
}
|
150 |
+
|
151 |
+
return $match[0];
|
152 |
+
}, $all_matches);
|
153 |
+
|
154 |
+
$matches = array_values(array_filter($matches));
|
155 |
+
|
156 |
+
if( !$matches ) {
|
157 |
+
return false;
|
158 |
+
}
|
159 |
+
|
160 |
+
return $matches[0];
|
161 |
+
}
|
162 |
+
}
|
includes/update-local-ga.php
CHANGED
@@ -1,77 +1,92 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Script to update local-ga.js-file
|
4 |
-
* Credits go to: Matthew Horne | http://diywpblog.com/leverage-browser-cache-optimize-google-analytics/
|
5 |
-
* I adjusted this script to work with wp-cron. It will still run in crontab, though.
|
6 |
-
* To run the script in crontab, remove the code on lines 8 and 9.
|
7 |
-
*/
|
8 |
-
// Exit if accessed directly.
|
9 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
10 |
-
exit;
|
11 |
-
}
|
12 |
-
|
13 |
-
// Remote file to download.
|
14 |
-
$remote_file = 'https://www.google-analytics.com/analytics.js';
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
$
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
$
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
$
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
$
|
59 |
-
$
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
//
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Script to update local-ga.js-file
|
4 |
+
* Credits go to: Matthew Horne | http://diywpblog.com/leverage-browser-cache-optimize-google-analytics/
|
5 |
+
* I adjusted this script to work with wp-cron. It will still run in crontab, though.
|
6 |
+
* To run the script in crontab, remove the code on lines 8 and 9.
|
7 |
+
*/
|
8 |
+
// Exit if accessed directly.
|
9 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
10 |
+
exit;
|
11 |
+
}
|
12 |
+
|
13 |
+
// Remote file to download.
|
14 |
+
$remote_file = 'https://www.google-analytics.com/analytics.js';
|
15 |
+
|
16 |
+
$upload_dir = wp_upload_dir();
|
17 |
+
|
18 |
+
if ( true === $upload_dir['error'] ) {
|
19 |
+
return;
|
20 |
+
}
|
21 |
+
|
22 |
+
$cache_dir = untrailingslashit( $upload_dir['basedir'] ) . '/wga-cache';
|
23 |
+
|
24 |
+
if ( ! file_exists( $cache_dir ) ) {
|
25 |
+
if ( ! wp_mkdir_p( $cache_dir ) ) {
|
26 |
+
return;
|
27 |
+
}
|
28 |
+
}
|
29 |
+
|
30 |
+
$local_file = $cache_dir . '/local-ga.js';
|
31 |
+
|
32 |
+
// Connection time out.
|
33 |
+
$conn_timeout = 10;
|
34 |
+
$url = wp_parse_url( $remote_file );
|
35 |
+
$host = $url['host'];
|
36 |
+
$path = isset( $url['path'] ) ? $url['path'] : '/';
|
37 |
+
|
38 |
+
if ( isset( $url['query'] ) ) {
|
39 |
+
$path .= '?' . $url['query'];
|
40 |
+
}
|
41 |
+
|
42 |
+
$port = isset( $url['port'] ) ? $url['port'] : '80';
|
43 |
+
$fp = @fsockopen( $host, '80', $errno, $errstr, $conn_timeout );
|
44 |
+
|
45 |
+
if ( ! $fp ) {
|
46 |
+
// On connection failure return the cached file (if exists).
|
47 |
+
if ( file_exists( $local_file ) ) {
|
48 |
+
readfile( $local_file );
|
49 |
+
}
|
50 |
+
} else {
|
51 |
+
// Send the header information
|
52 |
+
$header = "GET $path HTTP/1.0\r\n";
|
53 |
+
$header .= "Host: $host\r\n";
|
54 |
+
$header .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6\r\n";
|
55 |
+
$header .= "Accept: */*\r\n";
|
56 |
+
$header .= "Accept-Language: en-us,en;q=0.5\r\n";
|
57 |
+
$header .= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
|
58 |
+
$header .= "Keep-Alive: 300\r\n";
|
59 |
+
$header .= "Connection: keep-alive\r\n";
|
60 |
+
$header .= "Referer: http://$host\r\n\r\n";
|
61 |
+
fputs( $fp, $header );
|
62 |
+
$response = '';
|
63 |
+
|
64 |
+
// Get the response from the remote server.
|
65 |
+
while( $line = fread( $fp, 4096 ) ) {
|
66 |
+
$response .= $line;
|
67 |
+
}
|
68 |
+
|
69 |
+
// Close the connection.
|
70 |
+
fclose( $fp );
|
71 |
+
|
72 |
+
// Remove the headers.
|
73 |
+
$pos = strpos( $response, "\r\n\r\n" );
|
74 |
+
$response = substr( $response, $pos + 4 );
|
75 |
+
|
76 |
+
// Return the processed response.
|
77 |
+
echo $response;
|
78 |
+
|
79 |
+
// Save the response to the local file.
|
80 |
+
if ( ! file_exists( $local_file ) ) {
|
81 |
+
// Try to create the file, if doesn't exist.
|
82 |
+
fopen( $local_file, 'w' );
|
83 |
+
}
|
84 |
+
|
85 |
+
if ( is_writable( $local_file ) ) {
|
86 |
+
$fp = fopen( $local_file, 'w' );
|
87 |
+
if ( $fp ) {
|
88 |
+
fwrite( $fp, $response );
|
89 |
+
fclose( $fp );
|
90 |
+
}
|
91 |
+
}
|
92 |
+
}// End if().
|
languages/simple-google-analytics-es_ES.po
CHANGED
@@ -1,234 +1,234 @@
|
|
1 |
-
# Translation of Plugins - Clearfy in Spanish (Spain)
|
2 |
-
# This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
|
3 |
-
msgid ""
|
4 |
-
msgstr ""
|
5 |
-
"Project-Id-Version: \n"
|
6 |
-
"POT-Creation-Date: 2019-04-28 06:27+0300\n"
|
7 |
-
"PO-Revision-Date: 2019-04-28 06:27+0300\n"
|
8 |
-
"Last-Translator: \n"
|
9 |
-
"Language-Team: \n"
|
10 |
-
"Language: es\n"
|
11 |
-
"MIME-Version: 1.0\n"
|
12 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
13 |
-
"Content-Transfer-Encoding: 8bit\n"
|
14 |
-
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
15 |
-
"X-Generator: Poedit 2.1.1\n"
|
16 |
-
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
17 |
-
"X-Generator: Poedit 2.1.1\n"
|
18 |
-
"X-Poedit-Basepath: ..\n"
|
19 |
-
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
20 |
-
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
21 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
22 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
23 |
-
"X-Poedit-SearchPath-0: .\n"
|
24 |
-
"X-Poedit-SearchPathExcluded-0: libs\n"
|
25 |
-
"X-Poedit-SearchPathExcluded-1: components\n"
|
26 |
-
"X-Poedit-SearchPathExcluded-2: cache\n"
|
27 |
-
|
28 |
-
#: admin/boot.php:34
|
29 |
-
msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
|
30 |
-
msgstr "El plugin <b>Simple Google Analytics</b> tiene cambios importantes."
|
31 |
-
|
32 |
-
#: admin/boot.php:35
|
33 |
-
msgid ""
|
34 |
-
"Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
|
35 |
-
"but you still can download it from the WordPress repository in case if the "
|
36 |
-
"new release doesn’t work for you."
|
37 |
-
msgstr ""
|
38 |
-
"Desafortunadamente, la versión anterior del complemento (2.2.2) ya no aplica "
|
39 |
-
"soporte, pero aún puede descargarlo del repositorio de WordPress en caso de "
|
40 |
-
"que la nueva versión no funcione para usted."
|
41 |
-
|
42 |
-
#: admin/boot.php:36
|
43 |
-
msgid ""
|
44 |
-
"We’ve updated the code and fixed the compatibility issue for the latest "
|
45 |
-
"WordPress and PHP versions. We’ve also added additional feature of the Local "
|
46 |
-
"Google Analytics – this way your website will load faster. The plugin’s name "
|
47 |
-
"has been changed to Local Google Analytics, but all features remained the "
|
48 |
-
"same."
|
49 |
-
msgstr ""
|
50 |
-
"Hemos actualizado el código y hemos solucionado el problema de "
|
51 |
-
"compatibilidad para las últimas versiones de WordPress y PHP. También hemos "
|
52 |
-
"agregado una función adicional de Local Google Analytics, de esta manera su "
|
53 |
-
"sitio web cargará más rápido. El nombre del plugin se ha cambiado a Local "
|
54 |
-
"Google Analytics, pero todas las características siguen siendo las mismas."
|
55 |
-
|
56 |
-
#: admin/boot.php:37
|
57 |
-
#, php-format
|
58 |
-
msgid ""
|
59 |
-
"Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
|
60 |
-
"website. We do care about you and want to avoid any problems with the new "
|
61 |
-
"version."
|
62 |
-
msgstr ""
|
63 |
-
"Verifique <a href=\"%s\">configuraciónes de plugins</a> y el rendimiento de "
|
64 |
-
"su Website. Nos preocupamos por usted, queremos evitar problemas con la "
|
65 |
-
"nueva versión."
|
66 |
-
|
67 |
-
#: admin/boot.php:38
|
68 |
-
#, php-format
|
69 |
-
msgid ""
|
70 |
-
"We are aimed to pay more attention to the speed and security aspects of your "
|
71 |
-
"website. That’s why you should definitely try our basic WordPress "
|
72 |
-
"optimization plugin as well. Clearfy includes functionality of this plugin "
|
73 |
-
"and has many additional features for the website optimization:\n"
|
74 |
-
"<a href=\"%s\">Donwload Clearfy for free</a>"
|
75 |
-
msgstr ""
|
76 |
-
"Nuestro meta es prestar más atención a los aspectos de velocidad y seguridad "
|
77 |
-
"de su sitio web. Por eso prueba nuestro plugin básico de optimización "
|
78 |
-
"WordPress. Clearfy incluye funcionalidades de este plugin y posee "
|
79 |
-
"características adicionales para optimización de sitios web:\n"
|
80 |
-
"<a href=\"%s\">Descargue Clearfy de forma gratuita</a>"
|
81 |
-
|
82 |
-
#: admin/boot.php:170 admin/options.php:29 admin/pages/ga_cache.php:54
|
83 |
-
msgid "Google Analytics Cache"
|
84 |
-
msgstr "Cache de Google Analytics"
|
85 |
-
|
86 |
-
#: admin/boot.php:176 admin/options.php:49
|
87 |
-
msgid "Google analytic Code"
|
88 |
-
msgstr "Código de Google Analytics"
|
89 |
-
|
90 |
-
#: admin/boot.php:181 admin/options.php:70
|
91 |
-
msgid "Use adjusted bounce rate?"
|
92 |
-
msgstr "¿Usar tasa de rebote ajustada?"
|
93 |
-
|
94 |
-
#: admin/boot.php:186 admin/options.php:79
|
95 |
-
msgid "Change enqueue order?"
|
96 |
-
msgstr "¿Cambiar orden del turno?"
|
97 |
-
|
98 |
-
#: admin/boot.php:191 admin/options.php:88
|
99 |
-
msgid "Disable all display features functionality?"
|
100 |
-
msgstr "¿Desactivar todas las funciones de la pantalla?"
|
101 |
-
|
102 |
-
#: admin/boot.php:196 admin/options.php:97
|
103 |
-
msgid "Use Anonymize IP? (Required by law for some countries)"
|
104 |
-
msgstr "¿Usar IP Anónima? (Requerimiento legal en algunos países)"
|
105 |
-
|
106 |
-
#: admin/boot.php:201 admin/options.php:106 admin/options.php:108
|
107 |
-
msgid "Track logged in Administrators?"
|
108 |
-
msgstr "¿Registrados en Administradores?"
|
109 |
-
|
110 |
-
#: admin/boot.php:232
|
111 |
-
msgid "Get ultimate plugin free"
|
112 |
-
msgstr "Obtener el ultimate plugin gratis"
|
113 |
-
|
114 |
-
#: admin/options.php:22
|
115 |
-
msgid "<strong>Google Analytics cache</strong>."
|
116 |
-
msgstr "<strong>Google Analytics cache</strong>."
|
117 |
-
|
118 |
-
#: admin/options.php:22
|
119 |
-
msgid ""
|
120 |
-
"To improve Google Page Speed indicators Analytics caching is needed. "
|
121 |
-
"However, it can also slightly increase your website loading speed, because "
|
122 |
-
"Analytics js files will load locally. The second case that you might need "
|
123 |
-
"these settings is the usual Google Analytics connection to your website. You "
|
124 |
-
"do not need to do this with other plugins or insert the tracking code into "
|
125 |
-
"your theme."
|
126 |
-
msgstr ""
|
127 |
-
"Para mejorar el ranking en Google Page Speed, es necesario el almacenamiento "
|
128 |
-
"en caché de Analytics. con esto, aumentará ligeramente la velocidad de carga "
|
129 |
-
"de su sitio web, ya que los archivos de Analytics js se cargarán localmente. "
|
130 |
-
"El segundo caso en el que puede necesitar estos ajustes, es con la conexión "
|
131 |
-
"habitual de Google Analytics a su sitio web. No necesita hacer esto con "
|
132 |
-
"otros plugins ni insertar el código de seguimiento en su tema."
|
133 |
-
|
134 |
-
#: admin/options.php:31
|
135 |
-
msgid ""
|
136 |
-
"If you enable this option, the plugin will begin to save a local copy of "
|
137 |
-
"Google Analytics to speed up the loading of your website and improve Google "
|
138 |
-
"Page Speed."
|
139 |
-
msgstr ""
|
140 |
-
"Si habilita esta opción, el complemento comenzará a guardar una copia local "
|
141 |
-
"de Google Analytics acelerando la carga de su sitio web y mejorando el "
|
142 |
-
"ranking en Google Page Speed ."
|
143 |
-
|
144 |
-
#: admin/options.php:31
|
145 |
-
msgid ""
|
146 |
-
"ATTENTION! Before using this option, remove the previously installed Google "
|
147 |
-
"Analytics code inside your theme or plugins associated with this feature!"
|
148 |
-
msgstr ""
|
149 |
-
"¡ATENCIÓN! ¡Antes de usar esta opción, elimine el código de Google Analytics "
|
150 |
-
"instalado previamente dentro de su tema o los complementos asociados con "
|
151 |
-
"esta función!"
|
152 |
-
|
153 |
-
#: admin/options.php:51
|
154 |
-
msgid "Set the Google Analytics tracking code."
|
155 |
-
msgstr "Configure el código de seguimiento de Google Analytics."
|
156 |
-
|
157 |
-
#: admin/options.php:62
|
158 |
-
msgid "Save GA in"
|
159 |
-
msgstr "Guardar GA en"
|
160 |
-
|
161 |
-
#: admin/options.php:63
|
162 |
-
msgid "Select location for the Google Analytics code."
|
163 |
-
msgstr "Seleccione la ubicación para el código de Google Analytics."
|
164 |
-
|
165 |
-
#: admin/options.php:73
|
166 |
-
msgid ""
|
167 |
-
"Essentially, you set up an event which is triggered after a user spends a "
|
168 |
-
"certain amount of time on the landing page, telling Google Analytics not to "
|
169 |
-
"count these users as bounces. A user may come to your website, find all of "
|
170 |
-
"the information they need (a phone number, for example) and then leave the "
|
171 |
-
"site without visiting another page. Without adjusted bounce rate, such a "
|
172 |
-
"user would be considered a bounce, even though they had a successful "
|
173 |
-
"experience. By defining a time limit after which you can consider a user to "
|
174 |
-
"be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
|
175 |
-
"more accurate idea of whether they found what they were looking for."
|
176 |
-
msgstr ""
|
177 |
-
"Básicamente, configura un evento que se activa después de que un usuario "
|
178 |
-
"pasa una cierta cantidad de tiempo en la página de destino, diciéndole a "
|
179 |
-
"Google Analytics que no cuente a estos usuarios como rebotes. Un usuario "
|
180 |
-
"puede ir a su sitio web, buscar toda la información que necesita (un número "
|
181 |
-
"de teléfono, por ejemplo) y luego abandonar el sitio sin visitar otra "
|
182 |
-
"página. Sin una tasa de rebote ajustada, dicho usuario se consideraría un "
|
183 |
-
"rebote aunque tuviera una experiencia exitosa. Al definir un límite de "
|
184 |
-
"tiempo, un usuario se consideraría \"comprometido\", ese usuario ya no se "
|
185 |
-
"contaría como un rebote ya que sería obvio que encontró lo que buscó."
|
186 |
-
|
187 |
-
#: admin/options.php:82
|
188 |
-
msgid ""
|
189 |
-
"By default, Google Analytics code is loaded before other scripts and "
|
190 |
-
"javasscript code, but if you set the value to 100, the GA code will be "
|
191 |
-
"loaded after all other scripts. By changing the priority, you can set code "
|
192 |
-
"position on the page."
|
193 |
-
msgstr ""
|
194 |
-
"Por defecto, el código de Google Analytics se carga antes que otros scripts "
|
195 |
-
"y el código javasscript, pero si establece el valor a 100, el código GA se "
|
196 |
-
"cargará después de todos los demás scripts. Al cambiar la prioridad, puede "
|
197 |
-
"establecer la posición del código en la página."
|
198 |
-
|
199 |
-
#: admin/options.php:90
|
200 |
-
#, php-format
|
201 |
-
msgid "Disable all <a href=\"%s\">display features functionality?</a>"
|
202 |
-
msgstr ""
|
203 |
-
"Deshabilitar todas las <a href=\"%s\">¿Características de funciones?</a>"
|
204 |
-
|
205 |
-
#: admin/options.php:99
|
206 |
-
#, php-format
|
207 |
-
msgid ""
|
208 |
-
"Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
|
209 |
-
msgstr ""
|
210 |
-
"Use <a href=\"%s\">¿Anonimizar IP?</a> (Requisito legal para algunos países)"
|
211 |
-
|
212 |
-
#: admin/pages/ga_cache.php:38
|
213 |
-
msgid "Local Google Analytics"
|
214 |
-
msgstr "Google Analytics local"
|
215 |
-
|
216 |
-
#: admin/pages/ga_cache.php:55
|
217 |
-
msgid "General"
|
218 |
-
msgstr "General"
|
219 |
-
|
220 |
-
#: includes/classes/class.configurate-ga.php:44
|
221 |
-
msgid "Once Weekly"
|
222 |
-
msgstr "Una vez a la semana"
|
223 |
-
|
224 |
-
#: includes/classes/class.configurate-ga.php:49
|
225 |
-
msgid "Twice Monthly"
|
226 |
-
msgstr "Dos veces al mes"
|
227 |
-
|
228 |
-
#: includes/classes/class.configurate-ga.php:54
|
229 |
-
msgid "Once Monthly"
|
230 |
-
msgstr "Una vez al mes"
|
231 |
-
|
232 |
-
#: simple_google_analytics.php:83
|
233 |
-
msgid "Webcraftic Local Google Analytics"
|
234 |
msgstr "Webcraftic Local Google Analytics"
|
1 |
+
# Translation of Plugins - Clearfy in Spanish (Spain)
|
2 |
+
# This file is distributed under the same license as the Plugins - Clearfy – WordPress optimization plugin and disable ultimate tweaker - Development (trunk) package.
|
3 |
+
msgid ""
|
4 |
+
msgstr ""
|
5 |
+
"Project-Id-Version: \n"
|
6 |
+
"POT-Creation-Date: 2019-04-28 06:27+0300\n"
|
7 |
+
"PO-Revision-Date: 2019-04-28 06:27+0300\n"
|
8 |
+
"Last-Translator: \n"
|
9 |
+
"Language-Team: \n"
|
10 |
+
"Language: es\n"
|
11 |
+
"MIME-Version: 1.0\n"
|
12 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
13 |
+
"Content-Transfer-Encoding: 8bit\n"
|
14 |
+
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
15 |
+
"X-Generator: Poedit 2.1.1\n"
|
16 |
+
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
17 |
+
"X-Generator: Poedit 2.1.1\n"
|
18 |
+
"X-Poedit-Basepath: ..\n"
|
19 |
+
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
20 |
+
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
21 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
22 |
+
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
23 |
+
"X-Poedit-SearchPath-0: .\n"
|
24 |
+
"X-Poedit-SearchPathExcluded-0: libs\n"
|
25 |
+
"X-Poedit-SearchPathExcluded-1: components\n"
|
26 |
+
"X-Poedit-SearchPathExcluded-2: cache\n"
|
27 |
+
|
28 |
+
#: admin/boot.php:34
|
29 |
+
msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
|
30 |
+
msgstr "El plugin <b>Simple Google Analytics</b> tiene cambios importantes."
|
31 |
+
|
32 |
+
#: admin/boot.php:35
|
33 |
+
msgid ""
|
34 |
+
"Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
|
35 |
+
"but you still can download it from the WordPress repository in case if the "
|
36 |
+
"new release doesn’t work for you."
|
37 |
+
msgstr ""
|
38 |
+
"Desafortunadamente, la versión anterior del complemento (2.2.2) ya no aplica "
|
39 |
+
"soporte, pero aún puede descargarlo del repositorio de WordPress en caso de "
|
40 |
+
"que la nueva versión no funcione para usted."
|
41 |
+
|
42 |
+
#: admin/boot.php:36
|
43 |
+
msgid ""
|
44 |
+
"We’ve updated the code and fixed the compatibility issue for the latest "
|
45 |
+
"WordPress and PHP versions. We’ve also added additional feature of the Local "
|
46 |
+
"Google Analytics – this way your website will load faster. The plugin’s name "
|
47 |
+
"has been changed to Local Google Analytics, but all features remained the "
|
48 |
+
"same."
|
49 |
+
msgstr ""
|
50 |
+
"Hemos actualizado el código y hemos solucionado el problema de "
|
51 |
+
"compatibilidad para las últimas versiones de WordPress y PHP. También hemos "
|
52 |
+
"agregado una función adicional de Local Google Analytics, de esta manera su "
|
53 |
+
"sitio web cargará más rápido. El nombre del plugin se ha cambiado a Local "
|
54 |
+
"Google Analytics, pero todas las características siguen siendo las mismas."
|
55 |
+
|
56 |
+
#: admin/boot.php:37
|
57 |
+
#, php-format
|
58 |
+
msgid ""
|
59 |
+
"Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
|
60 |
+
"website. We do care about you and want to avoid any problems with the new "
|
61 |
+
"version."
|
62 |
+
msgstr ""
|
63 |
+
"Verifique <a href=\"%s\">configuraciónes de plugins</a> y el rendimiento de "
|
64 |
+
"su Website. Nos preocupamos por usted, queremos evitar problemas con la "
|
65 |
+
"nueva versión."
|
66 |
+
|
67 |
+
#: admin/boot.php:38
|
68 |
+
#, php-format
|
69 |
+
msgid ""
|
70 |
+
"We are aimed to pay more attention to the speed and security aspects of your "
|
71 |
+
"website. That’s why you should definitely try our basic WordPress "
|
72 |
+
"optimization plugin as well. Clearfy includes functionality of this plugin "
|
73 |
+
"and has many additional features for the website optimization:\n"
|
74 |
+
"<a href=\"%s\">Donwload Clearfy for free</a>"
|
75 |
+
msgstr ""
|
76 |
+
"Nuestro meta es prestar más atención a los aspectos de velocidad y seguridad "
|
77 |
+
"de su sitio web. Por eso prueba nuestro plugin básico de optimización "
|
78 |
+
"WordPress. Clearfy incluye funcionalidades de este plugin y posee "
|
79 |
+
"características adicionales para optimización de sitios web:\n"
|
80 |
+
"<a href=\"%s\">Descargue Clearfy de forma gratuita</a>"
|
81 |
+
|
82 |
+
#: admin/boot.php:170 admin/options.php:29 admin/pages/ga_cache.php:54
|
83 |
+
msgid "Google Analytics Cache"
|
84 |
+
msgstr "Cache de Google Analytics"
|
85 |
+
|
86 |
+
#: admin/boot.php:176 admin/options.php:49
|
87 |
+
msgid "Google analytic Code"
|
88 |
+
msgstr "Código de Google Analytics"
|
89 |
+
|
90 |
+
#: admin/boot.php:181 admin/options.php:70
|
91 |
+
msgid "Use adjusted bounce rate?"
|
92 |
+
msgstr "¿Usar tasa de rebote ajustada?"
|
93 |
+
|
94 |
+
#: admin/boot.php:186 admin/options.php:79
|
95 |
+
msgid "Change enqueue order?"
|
96 |
+
msgstr "¿Cambiar orden del turno?"
|
97 |
+
|
98 |
+
#: admin/boot.php:191 admin/options.php:88
|
99 |
+
msgid "Disable all display features functionality?"
|
100 |
+
msgstr "¿Desactivar todas las funciones de la pantalla?"
|
101 |
+
|
102 |
+
#: admin/boot.php:196 admin/options.php:97
|
103 |
+
msgid "Use Anonymize IP? (Required by law for some countries)"
|
104 |
+
msgstr "¿Usar IP Anónima? (Requerimiento legal en algunos países)"
|
105 |
+
|
106 |
+
#: admin/boot.php:201 admin/options.php:106 admin/options.php:108
|
107 |
+
msgid "Track logged in Administrators?"
|
108 |
+
msgstr "¿Registrados en Administradores?"
|
109 |
+
|
110 |
+
#: admin/boot.php:232
|
111 |
+
msgid "Get ultimate plugin free"
|
112 |
+
msgstr "Obtener el ultimate plugin gratis"
|
113 |
+
|
114 |
+
#: admin/options.php:22
|
115 |
+
msgid "<strong>Google Analytics cache</strong>."
|
116 |
+
msgstr "<strong>Google Analytics cache</strong>."
|
117 |
+
|
118 |
+
#: admin/options.php:22
|
119 |
+
msgid ""
|
120 |
+
"To improve Google Page Speed indicators Analytics caching is needed. "
|
121 |
+
"However, it can also slightly increase your website loading speed, because "
|
122 |
+
"Analytics js files will load locally. The second case that you might need "
|
123 |
+
"these settings is the usual Google Analytics connection to your website. You "
|
124 |
+
"do not need to do this with other plugins or insert the tracking code into "
|
125 |
+
"your theme."
|
126 |
+
msgstr ""
|
127 |
+
"Para mejorar el ranking en Google Page Speed, es necesario el almacenamiento "
|
128 |
+
"en caché de Analytics. con esto, aumentará ligeramente la velocidad de carga "
|
129 |
+
"de su sitio web, ya que los archivos de Analytics js se cargarán localmente. "
|
130 |
+
"El segundo caso en el que puede necesitar estos ajustes, es con la conexión "
|
131 |
+
"habitual de Google Analytics a su sitio web. No necesita hacer esto con "
|
132 |
+
"otros plugins ni insertar el código de seguimiento en su tema."
|
133 |
+
|
134 |
+
#: admin/options.php:31
|
135 |
+
msgid ""
|
136 |
+
"If you enable this option, the plugin will begin to save a local copy of "
|
137 |
+
"Google Analytics to speed up the loading of your website and improve Google "
|
138 |
+
"Page Speed."
|
139 |
+
msgstr ""
|
140 |
+
"Si habilita esta opción, el complemento comenzará a guardar una copia local "
|
141 |
+
"de Google Analytics acelerando la carga de su sitio web y mejorando el "
|
142 |
+
"ranking en Google Page Speed ."
|
143 |
+
|
144 |
+
#: admin/options.php:31
|
145 |
+
msgid ""
|
146 |
+
"ATTENTION! Before using this option, remove the previously installed Google "
|
147 |
+
"Analytics code inside your theme or plugins associated with this feature!"
|
148 |
+
msgstr ""
|
149 |
+
"¡ATENCIÓN! ¡Antes de usar esta opción, elimine el código de Google Analytics "
|
150 |
+
"instalado previamente dentro de su tema o los complementos asociados con "
|
151 |
+
"esta función!"
|
152 |
+
|
153 |
+
#: admin/options.php:51
|
154 |
+
msgid "Set the Google Analytics tracking code."
|
155 |
+
msgstr "Configure el código de seguimiento de Google Analytics."
|
156 |
+
|
157 |
+
#: admin/options.php:62
|
158 |
+
msgid "Save GA in"
|
159 |
+
msgstr "Guardar GA en"
|
160 |
+
|
161 |
+
#: admin/options.php:63
|
162 |
+
msgid "Select location for the Google Analytics code."
|
163 |
+
msgstr "Seleccione la ubicación para el código de Google Analytics."
|
164 |
+
|
165 |
+
#: admin/options.php:73
|
166 |
+
msgid ""
|
167 |
+
"Essentially, you set up an event which is triggered after a user spends a "
|
168 |
+
"certain amount of time on the landing page, telling Google Analytics not to "
|
169 |
+
"count these users as bounces. A user may come to your website, find all of "
|
170 |
+
"the information they need (a phone number, for example) and then leave the "
|
171 |
+
"site without visiting another page. Without adjusted bounce rate, such a "
|
172 |
+
"user would be considered a bounce, even though they had a successful "
|
173 |
+
"experience. By defining a time limit after which you can consider a user to "
|
174 |
+
"be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
|
175 |
+
"more accurate idea of whether they found what they were looking for."
|
176 |
+
msgstr ""
|
177 |
+
"Básicamente, configura un evento que se activa después de que un usuario "
|
178 |
+
"pasa una cierta cantidad de tiempo en la página de destino, diciéndole a "
|
179 |
+
"Google Analytics que no cuente a estos usuarios como rebotes. Un usuario "
|
180 |
+
"puede ir a su sitio web, buscar toda la información que necesita (un número "
|
181 |
+
"de teléfono, por ejemplo) y luego abandonar el sitio sin visitar otra "
|
182 |
+
"página. Sin una tasa de rebote ajustada, dicho usuario se consideraría un "
|
183 |
+
"rebote aunque tuviera una experiencia exitosa. Al definir un límite de "
|
184 |
+
"tiempo, un usuario se consideraría \"comprometido\", ese usuario ya no se "
|
185 |
+
"contaría como un rebote ya que sería obvio que encontró lo que buscó."
|
186 |
+
|
187 |
+
#: admin/options.php:82
|
188 |
+
msgid ""
|
189 |
+
"By default, Google Analytics code is loaded before other scripts and "
|
190 |
+
"javasscript code, but if you set the value to 100, the GA code will be "
|
191 |
+
"loaded after all other scripts. By changing the priority, you can set code "
|
192 |
+
"position on the page."
|
193 |
+
msgstr ""
|
194 |
+
"Por defecto, el código de Google Analytics se carga antes que otros scripts "
|
195 |
+
"y el código javasscript, pero si establece el valor a 100, el código GA se "
|
196 |
+
"cargará después de todos los demás scripts. Al cambiar la prioridad, puede "
|
197 |
+
"establecer la posición del código en la página."
|
198 |
+
|
199 |
+
#: admin/options.php:90
|
200 |
+
#, php-format
|
201 |
+
msgid "Disable all <a href=\"%s\">display features functionality?</a>"
|
202 |
+
msgstr ""
|
203 |
+
"Deshabilitar todas las <a href=\"%s\">¿Características de funciones?</a>"
|
204 |
+
|
205 |
+
#: admin/options.php:99
|
206 |
+
#, php-format
|
207 |
+
msgid ""
|
208 |
+
"Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
|
209 |
+
msgstr ""
|
210 |
+
"Use <a href=\"%s\">¿Anonimizar IP?</a> (Requisito legal para algunos países)"
|
211 |
+
|
212 |
+
#: admin/pages/ga_cache.php:38
|
213 |
+
msgid "Local Google Analytics"
|
214 |
+
msgstr "Google Analytics local"
|
215 |
+
|
216 |
+
#: admin/pages/ga_cache.php:55
|
217 |
+
msgid "General"
|
218 |
+
msgstr "General"
|
219 |
+
|
220 |
+
#: includes/classes/class.configurate-ga.php:44
|
221 |
+
msgid "Once Weekly"
|
222 |
+
msgstr "Una vez a la semana"
|
223 |
+
|
224 |
+
#: includes/classes/class.configurate-ga.php:49
|
225 |
+
msgid "Twice Monthly"
|
226 |
+
msgstr "Dos veces al mes"
|
227 |
+
|
228 |
+
#: includes/classes/class.configurate-ga.php:54
|
229 |
+
msgid "Once Monthly"
|
230 |
+
msgstr "Una vez al mes"
|
231 |
+
|
232 |
+
#: simple_google_analytics.php:83
|
233 |
+
msgid "Webcraftic Local Google Analytics"
|
234 |
msgstr "Webcraftic Local Google Analytics"
|
languages/simple-google-analytics-nl_BE.po
CHANGED
@@ -1,243 +1,243 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: Clearfy\n"
|
4 |
-
"POT-Creation-Date: 2018-09-06 18:33+0300\n"
|
5 |
-
"PO-Revision-Date: \n"
|
6 |
-
"Last-Translator: \n"
|
7 |
-
"Language-Team: \n"
|
8 |
-
"Language: nl_BE\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"X-Generator: Poedit 2.1.1\n"
|
13 |
-
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
14 |
-
"X-Generator: Poedit 2.1.1\n"
|
15 |
-
"X-Poedit-Basepath: ..\n"
|
16 |
-
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
17 |
-
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
18 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
19 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
20 |
-
"X-Poedit-SearchPath-0: .\n"
|
21 |
-
"X-Poedit-SearchPathExcluded-0: libs\n"
|
22 |
-
"X-Poedit-SearchPathExcluded-1: components\n"
|
23 |
-
"X-Poedit-SearchPathExcluded-2: cache\n"
|
24 |
-
|
25 |
-
#: admin/boot.php:27
|
26 |
-
msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
|
27 |
-
msgstr ""
|
28 |
-
|
29 |
-
#: admin/boot.php:28
|
30 |
-
msgid ""
|
31 |
-
"Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
|
32 |
-
"but you still can download it from the WordPress repository in case if the new "
|
33 |
-
"release doesn’t work for you."
|
34 |
-
msgstr ""
|
35 |
-
|
36 |
-
#: admin/boot.php:29
|
37 |
-
msgid ""
|
38 |
-
"We’ve updated the code and fixed the compatibility issue for the latest "
|
39 |
-
"WordPress and PHP versions. We’ve also added additional feature of the Local "
|
40 |
-
"Google Analytics – this way your website will load faster. The plugin’s name "
|
41 |
-
"has been changed to Local Google Analytics, but all features remained the same."
|
42 |
-
msgstr ""
|
43 |
-
|
44 |
-
#: admin/boot.php:30
|
45 |
-
#, php-format
|
46 |
-
msgid ""
|
47 |
-
"Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
|
48 |
-
"website. We do care about you and want to avoid any problems with the new "
|
49 |
-
"version."
|
50 |
-
msgstr ""
|
51 |
-
|
52 |
-
#: admin/boot.php:32
|
53 |
-
#, php-format
|
54 |
-
msgid ""
|
55 |
-
"We are aimed to pay more attention to the speed and security aspects of your "
|
56 |
-
"website. That’s why you should definitely try our basic WordPress optimization "
|
57 |
-
"plugin as well. Clearfy includes functionality of this plugin and has many "
|
58 |
-
"additional features for the website optimization:\n"
|
59 |
-
"<a href=\"%s\">Donwload Clearfy for free</a>"
|
60 |
-
msgstr ""
|
61 |
-
|
62 |
-
#: admin/boot.php:121 admin/options.php:30 admin/pages/ga_cache.php:49
|
63 |
-
msgid "Google Analytics Cache"
|
64 |
-
msgstr ""
|
65 |
-
|
66 |
-
#: admin/boot.php:127 admin/options.php:50
|
67 |
-
msgid "Google analytic Code"
|
68 |
-
msgstr "Google analytics Code"
|
69 |
-
|
70 |
-
#: admin/boot.php:132 admin/options.php:71
|
71 |
-
msgid "Use adjusted bounce rate?"
|
72 |
-
msgstr "Aangepast bounce percentage gebruiken?"
|
73 |
-
|
74 |
-
#: admin/boot.php:137 admin/options.php:80
|
75 |
-
msgid "Change enqueue order?"
|
76 |
-
msgstr "Enqueue volgorde wijzigen?"
|
77 |
-
|
78 |
-
#: admin/boot.php:142 admin/options.php:89
|
79 |
-
msgid "Disable all display features functionality?"
|
80 |
-
msgstr "Alle weergave functionaliteit uitschakelen?"
|
81 |
-
|
82 |
-
#: admin/boot.php:147 admin/options.php:98
|
83 |
-
msgid "Use Anonymize IP? (Required by law for some countries)"
|
84 |
-
msgstr "Gebruik anonimiseren IP? (Voor sommige landen wettelijk verplicht)"
|
85 |
-
|
86 |
-
#: admin/boot.php:152 admin/options.php:107 admin/options.php:109
|
87 |
-
msgid "Track logged in Administrators?"
|
88 |
-
msgstr "Track ingelogde Beheerders?"
|
89 |
-
|
90 |
-
#: admin/boot.php:157 admin/options.php:116
|
91 |
-
msgid "Remove script from wp-cron?"
|
92 |
-
msgstr "Verwijder script van wp-cron?"
|
93 |
-
|
94 |
-
#: admin/boot.php:185
|
95 |
-
msgid "Get ultimate plugin free"
|
96 |
-
msgstr "Krijg ultieme plugin gratis"
|
97 |
-
|
98 |
-
#: admin/options.php:23
|
99 |
-
msgid "<strong>Google Analytics cache</strong>."
|
100 |
-
msgstr "<strong>Google Analytics cache</strong>."
|
101 |
-
|
102 |
-
#: admin/options.php:23
|
103 |
-
msgid ""
|
104 |
-
"To improve Google Page Speed indicators Analytics caching is needed. However, "
|
105 |
-
"it can also slightly increase your website loading speed, because Analytics js "
|
106 |
-
"files will load locally. The second case that you might need these settings is "
|
107 |
-
"the usual Google Analytics connection to your website. You do not need to do "
|
108 |
-
"this with other plugins or insert the tracking code into your theme."
|
109 |
-
msgstr ""
|
110 |
-
"Om de pagina snelheid indicatoren van Google te verbeteren, is caching in "
|
111 |
-
"Analytics nodig. Het kan echter ook de laadsnelheid van uw website enigszins "
|
112 |
-
"verhogen, omdat de Analytics js bestanden lokaal worden geladen. Het tweede "
|
113 |
-
"geval waarvoor u deze instellingen nodig heeft, is de gebruikelijke Google "
|
114 |
-
"Analytics verbinding met uw website. U hoeft dit niet met andere plugins te "
|
115 |
-
"doen of de tracking code in uw thema in te voegen."
|
116 |
-
|
117 |
-
#: admin/options.php:32
|
118 |
-
msgid ""
|
119 |
-
"If you enable this option, the plugin will begin to save a local copy of "
|
120 |
-
"Google Analytics to speed up the loading of your website and improve Google "
|
121 |
-
"Page Speed."
|
122 |
-
msgstr ""
|
123 |
-
"Als u deze optie inschakelt, zal de plugin beginnen met het opslaan van een "
|
124 |
-
"lokale kopie van Google Analytics om het laden van uw website te versnellen en "
|
125 |
-
"de Google Page Speed te verbeteren."
|
126 |
-
|
127 |
-
#: admin/options.php:32
|
128 |
-
msgid ""
|
129 |
-
"ATTENTION! Before using this option, remove the previously installed Google "
|
130 |
-
"Analytics code inside your theme or plugins associated with this feature!"
|
131 |
-
msgstr ""
|
132 |
-
"AANDACHT! Voordat u deze optie gebruikt, verwijdert u de eerder geïnstalleerde "
|
133 |
-
"Google Analytics code in uw thema of plugins die aan deze functie zijn "
|
134 |
-
"gekoppeld!"
|
135 |
-
|
136 |
-
#: admin/options.php:52
|
137 |
-
msgid "Set the Google Analytics tracking code."
|
138 |
-
msgstr "Stel de Google Analytics tracking code in."
|
139 |
-
|
140 |
-
#: admin/options.php:63
|
141 |
-
msgid "Save GA in"
|
142 |
-
msgstr "Bewaar GA in"
|
143 |
-
|
144 |
-
#: admin/options.php:64
|
145 |
-
msgid "Select location for the Google Analytics code."
|
146 |
-
msgstr "Selecteer een locatie voor de Google Analytics code."
|
147 |
-
|
148 |
-
#: admin/options.php:74
|
149 |
-
msgid ""
|
150 |
-
"Essentially, you set up an event which is triggered after a user spends a "
|
151 |
-
"certain amount of time on the landing page, telling Google Analytics not to "
|
152 |
-
"count these users as bounces. A user may come to your website, find all of the "
|
153 |
-
"information they need (a phone number, for example) and then leave the site "
|
154 |
-
"without visiting another page. Without adjusted bounce rate, such a user would "
|
155 |
-
"be considered a bounce, even though they had a successful experience. By "
|
156 |
-
"defining a time limit after which you can consider a user to be \"engaged,\" "
|
157 |
-
"that user would no longer count as a bounce, and you'd get a more accurate "
|
158 |
-
"idea of whether they found what they were looking for."
|
159 |
-
msgstr ""
|
160 |
-
"In essentie stelt u een gebeurtenis in die wordt geactiveerd nadat een "
|
161 |
-
"gebruiker een bepaalde hoeveelheid tijd op de bestemmingspagina heeft "
|
162 |
-
"doorgebracht, waarmee u Google Analytics vertelt om deze gebruikers niet als "
|
163 |
-
"bounces te tellen. Een gebruiker kan naar uw website komen, alle benodigde "
|
164 |
-
"informatie vinden (bijvoorbeeld een telefoonnummer) en vervolgens de website "
|
165 |
-
"verlaten zonder een andere pagina te bezoeken. Zonder aangepast bounce "
|
166 |
-
"percentage zou een dergelijke gebruiker als een bounce worden beschouwd, ook "
|
167 |
-
"al hadden ze een succesvolle ervaring. Door een tijdslimiet te definiëren "
|
168 |
-
"waarna u kunt concluderen dat een gebruiker \"geëngageerd\" is, telt die "
|
169 |
-
"gebruiker niet mee als een bounce en krijgt u een beter beeld van het feit of "
|
170 |
-
"ze hebben gevonden waarnaar ze op zoek waren."
|
171 |
-
|
172 |
-
#: admin/options.php:83
|
173 |
-
msgid ""
|
174 |
-
"By default, Google Analytics code is loaded before other scripts and "
|
175 |
-
"javasscript code, but if you set the value to 100, the GA code will be loaded "
|
176 |
-
"after all other scripts. By changing the priority, you can set code position "
|
177 |
-
"on the page."
|
178 |
-
msgstr ""
|
179 |
-
"Standaard wordt de Google Analytics code geladen voor andere scripts en "
|
180 |
-
"javasscript code, maar als u de waarde instelt op 100, wordt de GA code "
|
181 |
-
"geladen na alle andere scripts. Door de prioriteit te wijzigen, kunt u de "
|
182 |
-
"codepositie op de pagina instellen."
|
183 |
-
|
184 |
-
#: admin/options.php:91
|
185 |
-
#, php-format
|
186 |
-
msgid "Disable all <a href=\"%s\">display features functionality?</a>"
|
187 |
-
msgstr "Alle <a href=\"%s\">van weergave functies uitschakelen?</a>"
|
188 |
-
|
189 |
-
#: admin/options.php:100
|
190 |
-
#, php-format
|
191 |
-
msgid "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
|
192 |
-
msgstr ""
|
193 |
-
"Gebruik <a href=\"%s\">Anoniem maken van IP?</a> (Wettelijk vereist voor "
|
194 |
-
"sommige landen)"
|
195 |
-
|
196 |
-
#: admin/options.php:118
|
197 |
-
msgid ""
|
198 |
-
"Clearfy creates a cron job to daily update Google Analytics cache scripts. "
|
199 |
-
"After enabling this option, the plugin will not update Google Analytics cache "
|
200 |
-
"file. Do not use this option if you do not understand why you need it!"
|
201 |
-
msgstr ""
|
202 |
-
"Clearfy maakt een cron-taak om dagelijks de cache scripts van Google Analytics "
|
203 |
-
"bij te werken. Nadat u deze optie hebt ingeschakeld, werkt de plugin het cache "
|
204 |
-
"bestand van Google Analytics niet bij. Gebruik deze optie niet als u niet "
|
205 |
-
"begrijpt waarom u het nodig hebt!"
|
206 |
-
|
207 |
-
#: admin/pages/ga_cache.php:33
|
208 |
-
msgid "Local Google Analytics"
|
209 |
-
msgstr ""
|
210 |
-
|
211 |
-
#: admin/pages/ga_cache.php:50
|
212 |
-
msgid "General"
|
213 |
-
msgstr "Algemeen"
|
214 |
-
|
215 |
-
#: includes/classes/class.configurate-ga.php:37
|
216 |
-
msgid "Once Weekly"
|
217 |
-
msgstr "Eénmaal per week"
|
218 |
-
|
219 |
-
#: includes/classes/class.configurate-ga.php:42
|
220 |
-
msgid "Twice Monthly"
|
221 |
-
msgstr "Tweemaal per maand"
|
222 |
-
|
223 |
-
#: includes/classes/class.configurate-ga.php:47
|
224 |
-
msgid "Once Monthly"
|
225 |
-
msgstr "Eénmaal per maand"
|
226 |
-
|
227 |
-
#: simple_google_analytics.php:32
|
228 |
-
msgid ""
|
229 |
-
"We found that you have the \"Clearfy - disable unused features\" plugin "
|
230 |
-
"installed, this plugin already has Google Analytics cache functions, so you "
|
231 |
-
"can deactivate plugin \"Google Analytics Cache\"!"
|
232 |
-
msgstr ""
|
233 |
-
|
234 |
-
#: simple_google_analytics.php:40
|
235 |
-
msgid ""
|
236 |
-
"You use the old version of Wordpress to use the <b>Webcraftic Local Google "
|
237 |
-
"Analytics (Old name: Simple Google Analytics)</b> plugin, you must upgrade "
|
238 |
-
"your Wordpress to the minimum version 4.2!"
|
239 |
-
msgstr ""
|
240 |
-
|
241 |
-
#: simple_google_analytics.php:65
|
242 |
-
msgid "Webcraftic Local Google Analytics"
|
243 |
msgstr ""
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: Clearfy\n"
|
4 |
+
"POT-Creation-Date: 2018-09-06 18:33+0300\n"
|
5 |
+
"PO-Revision-Date: \n"
|
6 |
+
"Last-Translator: \n"
|
7 |
+
"Language-Team: \n"
|
8 |
+
"Language: nl_BE\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"X-Generator: Poedit 2.1.1\n"
|
13 |
+
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
14 |
+
"X-Generator: Poedit 2.1.1\n"
|
15 |
+
"X-Poedit-Basepath: ..\n"
|
16 |
+
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
17 |
+
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
18 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
19 |
+
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
20 |
+
"X-Poedit-SearchPath-0: .\n"
|
21 |
+
"X-Poedit-SearchPathExcluded-0: libs\n"
|
22 |
+
"X-Poedit-SearchPathExcluded-1: components\n"
|
23 |
+
"X-Poedit-SearchPathExcluded-2: cache\n"
|
24 |
+
|
25 |
+
#: admin/boot.php:27
|
26 |
+
msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
|
27 |
+
msgstr ""
|
28 |
+
|
29 |
+
#: admin/boot.php:28
|
30 |
+
msgid ""
|
31 |
+
"Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
|
32 |
+
"but you still can download it from the WordPress repository in case if the new "
|
33 |
+
"release doesn’t work for you."
|
34 |
+
msgstr ""
|
35 |
+
|
36 |
+
#: admin/boot.php:29
|
37 |
+
msgid ""
|
38 |
+
"We’ve updated the code and fixed the compatibility issue for the latest "
|
39 |
+
"WordPress and PHP versions. We’ve also added additional feature of the Local "
|
40 |
+
"Google Analytics – this way your website will load faster. The plugin’s name "
|
41 |
+
"has been changed to Local Google Analytics, but all features remained the same."
|
42 |
+
msgstr ""
|
43 |
+
|
44 |
+
#: admin/boot.php:30
|
45 |
+
#, php-format
|
46 |
+
msgid ""
|
47 |
+
"Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
|
48 |
+
"website. We do care about you and want to avoid any problems with the new "
|
49 |
+
"version."
|
50 |
+
msgstr ""
|
51 |
+
|
52 |
+
#: admin/boot.php:32
|
53 |
+
#, php-format
|
54 |
+
msgid ""
|
55 |
+
"We are aimed to pay more attention to the speed and security aspects of your "
|
56 |
+
"website. That’s why you should definitely try our basic WordPress optimization "
|
57 |
+
"plugin as well. Clearfy includes functionality of this plugin and has many "
|
58 |
+
"additional features for the website optimization:\n"
|
59 |
+
"<a href=\"%s\">Donwload Clearfy for free</a>"
|
60 |
+
msgstr ""
|
61 |
+
|
62 |
+
#: admin/boot.php:121 admin/options.php:30 admin/pages/ga_cache.php:49
|
63 |
+
msgid "Google Analytics Cache"
|
64 |
+
msgstr ""
|
65 |
+
|
66 |
+
#: admin/boot.php:127 admin/options.php:50
|
67 |
+
msgid "Google analytic Code"
|
68 |
+
msgstr "Google analytics Code"
|
69 |
+
|
70 |
+
#: admin/boot.php:132 admin/options.php:71
|
71 |
+
msgid "Use adjusted bounce rate?"
|
72 |
+
msgstr "Aangepast bounce percentage gebruiken?"
|
73 |
+
|
74 |
+
#: admin/boot.php:137 admin/options.php:80
|
75 |
+
msgid "Change enqueue order?"
|
76 |
+
msgstr "Enqueue volgorde wijzigen?"
|
77 |
+
|
78 |
+
#: admin/boot.php:142 admin/options.php:89
|
79 |
+
msgid "Disable all display features functionality?"
|
80 |
+
msgstr "Alle weergave functionaliteit uitschakelen?"
|
81 |
+
|
82 |
+
#: admin/boot.php:147 admin/options.php:98
|
83 |
+
msgid "Use Anonymize IP? (Required by law for some countries)"
|
84 |
+
msgstr "Gebruik anonimiseren IP? (Voor sommige landen wettelijk verplicht)"
|
85 |
+
|
86 |
+
#: admin/boot.php:152 admin/options.php:107 admin/options.php:109
|
87 |
+
msgid "Track logged in Administrators?"
|
88 |
+
msgstr "Track ingelogde Beheerders?"
|
89 |
+
|
90 |
+
#: admin/boot.php:157 admin/options.php:116
|
91 |
+
msgid "Remove script from wp-cron?"
|
92 |
+
msgstr "Verwijder script van wp-cron?"
|
93 |
+
|
94 |
+
#: admin/boot.php:185
|
95 |
+
msgid "Get ultimate plugin free"
|
96 |
+
msgstr "Krijg ultieme plugin gratis"
|
97 |
+
|
98 |
+
#: admin/options.php:23
|
99 |
+
msgid "<strong>Google Analytics cache</strong>."
|
100 |
+
msgstr "<strong>Google Analytics cache</strong>."
|
101 |
+
|
102 |
+
#: admin/options.php:23
|
103 |
+
msgid ""
|
104 |
+
"To improve Google Page Speed indicators Analytics caching is needed. However, "
|
105 |
+
"it can also slightly increase your website loading speed, because Analytics js "
|
106 |
+
"files will load locally. The second case that you might need these settings is "
|
107 |
+
"the usual Google Analytics connection to your website. You do not need to do "
|
108 |
+
"this with other plugins or insert the tracking code into your theme."
|
109 |
+
msgstr ""
|
110 |
+
"Om de pagina snelheid indicatoren van Google te verbeteren, is caching in "
|
111 |
+
"Analytics nodig. Het kan echter ook de laadsnelheid van uw website enigszins "
|
112 |
+
"verhogen, omdat de Analytics js bestanden lokaal worden geladen. Het tweede "
|
113 |
+
"geval waarvoor u deze instellingen nodig heeft, is de gebruikelijke Google "
|
114 |
+
"Analytics verbinding met uw website. U hoeft dit niet met andere plugins te "
|
115 |
+
"doen of de tracking code in uw thema in te voegen."
|
116 |
+
|
117 |
+
#: admin/options.php:32
|
118 |
+
msgid ""
|
119 |
+
"If you enable this option, the plugin will begin to save a local copy of "
|
120 |
+
"Google Analytics to speed up the loading of your website and improve Google "
|
121 |
+
"Page Speed."
|
122 |
+
msgstr ""
|
123 |
+
"Als u deze optie inschakelt, zal de plugin beginnen met het opslaan van een "
|
124 |
+
"lokale kopie van Google Analytics om het laden van uw website te versnellen en "
|
125 |
+
"de Google Page Speed te verbeteren."
|
126 |
+
|
127 |
+
#: admin/options.php:32
|
128 |
+
msgid ""
|
129 |
+
"ATTENTION! Before using this option, remove the previously installed Google "
|
130 |
+
"Analytics code inside your theme or plugins associated with this feature!"
|
131 |
+
msgstr ""
|
132 |
+
"AANDACHT! Voordat u deze optie gebruikt, verwijdert u de eerder geïnstalleerde "
|
133 |
+
"Google Analytics code in uw thema of plugins die aan deze functie zijn "
|
134 |
+
"gekoppeld!"
|
135 |
+
|
136 |
+
#: admin/options.php:52
|
137 |
+
msgid "Set the Google Analytics tracking code."
|
138 |
+
msgstr "Stel de Google Analytics tracking code in."
|
139 |
+
|
140 |
+
#: admin/options.php:63
|
141 |
+
msgid "Save GA in"
|
142 |
+
msgstr "Bewaar GA in"
|
143 |
+
|
144 |
+
#: admin/options.php:64
|
145 |
+
msgid "Select location for the Google Analytics code."
|
146 |
+
msgstr "Selecteer een locatie voor de Google Analytics code."
|
147 |
+
|
148 |
+
#: admin/options.php:74
|
149 |
+
msgid ""
|
150 |
+
"Essentially, you set up an event which is triggered after a user spends a "
|
151 |
+
"certain amount of time on the landing page, telling Google Analytics not to "
|
152 |
+
"count these users as bounces. A user may come to your website, find all of the "
|
153 |
+
"information they need (a phone number, for example) and then leave the site "
|
154 |
+
"without visiting another page. Without adjusted bounce rate, such a user would "
|
155 |
+
"be considered a bounce, even though they had a successful experience. By "
|
156 |
+
"defining a time limit after which you can consider a user to be \"engaged,\" "
|
157 |
+
"that user would no longer count as a bounce, and you'd get a more accurate "
|
158 |
+
"idea of whether they found what they were looking for."
|
159 |
+
msgstr ""
|
160 |
+
"In essentie stelt u een gebeurtenis in die wordt geactiveerd nadat een "
|
161 |
+
"gebruiker een bepaalde hoeveelheid tijd op de bestemmingspagina heeft "
|
162 |
+
"doorgebracht, waarmee u Google Analytics vertelt om deze gebruikers niet als "
|
163 |
+
"bounces te tellen. Een gebruiker kan naar uw website komen, alle benodigde "
|
164 |
+
"informatie vinden (bijvoorbeeld een telefoonnummer) en vervolgens de website "
|
165 |
+
"verlaten zonder een andere pagina te bezoeken. Zonder aangepast bounce "
|
166 |
+
"percentage zou een dergelijke gebruiker als een bounce worden beschouwd, ook "
|
167 |
+
"al hadden ze een succesvolle ervaring. Door een tijdslimiet te definiëren "
|
168 |
+
"waarna u kunt concluderen dat een gebruiker \"geëngageerd\" is, telt die "
|
169 |
+
"gebruiker niet mee als een bounce en krijgt u een beter beeld van het feit of "
|
170 |
+
"ze hebben gevonden waarnaar ze op zoek waren."
|
171 |
+
|
172 |
+
#: admin/options.php:83
|
173 |
+
msgid ""
|
174 |
+
"By default, Google Analytics code is loaded before other scripts and "
|
175 |
+
"javasscript code, but if you set the value to 100, the GA code will be loaded "
|
176 |
+
"after all other scripts. By changing the priority, you can set code position "
|
177 |
+
"on the page."
|
178 |
+
msgstr ""
|
179 |
+
"Standaard wordt de Google Analytics code geladen voor andere scripts en "
|
180 |
+
"javasscript code, maar als u de waarde instelt op 100, wordt de GA code "
|
181 |
+
"geladen na alle andere scripts. Door de prioriteit te wijzigen, kunt u de "
|
182 |
+
"codepositie op de pagina instellen."
|
183 |
+
|
184 |
+
#: admin/options.php:91
|
185 |
+
#, php-format
|
186 |
+
msgid "Disable all <a href=\"%s\">display features functionality?</a>"
|
187 |
+
msgstr "Alle <a href=\"%s\">van weergave functies uitschakelen?</a>"
|
188 |
+
|
189 |
+
#: admin/options.php:100
|
190 |
+
#, php-format
|
191 |
+
msgid "Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
|
192 |
+
msgstr ""
|
193 |
+
"Gebruik <a href=\"%s\">Anoniem maken van IP?</a> (Wettelijk vereist voor "
|
194 |
+
"sommige landen)"
|
195 |
+
|
196 |
+
#: admin/options.php:118
|
197 |
+
msgid ""
|
198 |
+
"Clearfy creates a cron job to daily update Google Analytics cache scripts. "
|
199 |
+
"After enabling this option, the plugin will not update Google Analytics cache "
|
200 |
+
"file. Do not use this option if you do not understand why you need it!"
|
201 |
+
msgstr ""
|
202 |
+
"Clearfy maakt een cron-taak om dagelijks de cache scripts van Google Analytics "
|
203 |
+
"bij te werken. Nadat u deze optie hebt ingeschakeld, werkt de plugin het cache "
|
204 |
+
"bestand van Google Analytics niet bij. Gebruik deze optie niet als u niet "
|
205 |
+
"begrijpt waarom u het nodig hebt!"
|
206 |
+
|
207 |
+
#: admin/pages/ga_cache.php:33
|
208 |
+
msgid "Local Google Analytics"
|
209 |
+
msgstr ""
|
210 |
+
|
211 |
+
#: admin/pages/ga_cache.php:50
|
212 |
+
msgid "General"
|
213 |
+
msgstr "Algemeen"
|
214 |
+
|
215 |
+
#: includes/classes/class.configurate-ga.php:37
|
216 |
+
msgid "Once Weekly"
|
217 |
+
msgstr "Eénmaal per week"
|
218 |
+
|
219 |
+
#: includes/classes/class.configurate-ga.php:42
|
220 |
+
msgid "Twice Monthly"
|
221 |
+
msgstr "Tweemaal per maand"
|
222 |
+
|
223 |
+
#: includes/classes/class.configurate-ga.php:47
|
224 |
+
msgid "Once Monthly"
|
225 |
+
msgstr "Eénmaal per maand"
|
226 |
+
|
227 |
+
#: simple_google_analytics.php:32
|
228 |
+
msgid ""
|
229 |
+
"We found that you have the \"Clearfy - disable unused features\" plugin "
|
230 |
+
"installed, this plugin already has Google Analytics cache functions, so you "
|
231 |
+
"can deactivate plugin \"Google Analytics Cache\"!"
|
232 |
+
msgstr ""
|
233 |
+
|
234 |
+
#: simple_google_analytics.php:40
|
235 |
+
msgid ""
|
236 |
+
"You use the old version of Wordpress to use the <b>Webcraftic Local Google "
|
237 |
+
"Analytics (Old name: Simple Google Analytics)</b> plugin, you must upgrade "
|
238 |
+
"your Wordpress to the minimum version 4.2!"
|
239 |
+
msgstr ""
|
240 |
+
|
241 |
+
#: simple_google_analytics.php:65
|
242 |
+
msgid "Webcraftic Local Google Analytics"
|
243 |
msgstr ""
|
languages/simple-google-analytics-pt_BR.po
CHANGED
@@ -1,247 +1,247 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: clearfy\n"
|
4 |
-
"POT-Creation-Date: 2018-09-06 18:33+0300\n"
|
5 |
-
"PO-Revision-Date: 2018-09-06 18:33+0300\n"
|
6 |
-
"Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
|
7 |
-
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
-
"Language: pt_BR\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"X-Generator: Poedit 2.1.1\n"
|
13 |
-
"X-Poedit-Basepath: ..\n"
|
14 |
-
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
-
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
-
"X-Poedit-SearchPath-0: .\n"
|
19 |
-
"X-Poedit-SearchPathExcluded-0: libs\n"
|
20 |
-
"X-Poedit-SearchPathExcluded-1: components\n"
|
21 |
-
"X-Poedit-SearchPathExcluded-2: cache\n"
|
22 |
-
|
23 |
-
#: admin/boot.php:27
|
24 |
-
msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
|
25 |
-
msgstr ""
|
26 |
-
|
27 |
-
#: admin/boot.php:28
|
28 |
-
msgid ""
|
29 |
-
"Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
|
30 |
-
"but you still can download it from the WordPress repository in case if the "
|
31 |
-
"new release doesn’t work for you."
|
32 |
-
msgstr ""
|
33 |
-
|
34 |
-
#: admin/boot.php:29
|
35 |
-
msgid ""
|
36 |
-
"We’ve updated the code and fixed the compatibility issue for the latest "
|
37 |
-
"WordPress and PHP versions. We’ve also added additional feature of the Local "
|
38 |
-
"Google Analytics – this way your website will load faster. The plugin’s name "
|
39 |
-
"has been changed to Local Google Analytics, but all features remained the "
|
40 |
-
"same."
|
41 |
-
msgstr ""
|
42 |
-
|
43 |
-
#: admin/boot.php:30
|
44 |
-
#, php-format
|
45 |
-
msgid ""
|
46 |
-
"Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
|
47 |
-
"website. We do care about you and want to avoid any problems with the new "
|
48 |
-
"version."
|
49 |
-
msgstr ""
|
50 |
-
|
51 |
-
#: admin/boot.php:32
|
52 |
-
#, php-format
|
53 |
-
msgid ""
|
54 |
-
"We are aimed to pay more attention to the speed and security aspects of your "
|
55 |
-
"website. That’s why you should definitely try our basic WordPress "
|
56 |
-
"optimization plugin as well. Clearfy includes functionality of this plugin "
|
57 |
-
"and has many additional features for the website optimization:\n"
|
58 |
-
"<a href=\"%s\">Donwload Clearfy for free</a>"
|
59 |
-
msgstr ""
|
60 |
-
|
61 |
-
#: admin/boot.php:121 admin/options.php:30 admin/pages/ga_cache.php:49
|
62 |
-
msgid "Google Analytics Cache"
|
63 |
-
msgstr "Cache analítico do Google"
|
64 |
-
|
65 |
-
#: admin/boot.php:127 admin/options.php:50
|
66 |
-
msgid "Google analytic Code"
|
67 |
-
msgstr "Código analítico do Google"
|
68 |
-
|
69 |
-
#: admin/boot.php:132 admin/options.php:71
|
70 |
-
msgid "Use adjusted bounce rate?"
|
71 |
-
msgstr "Use taxa de rejeição ajustada?"
|
72 |
-
|
73 |
-
#: admin/boot.php:137 admin/options.php:80
|
74 |
-
msgid "Change enqueue order?"
|
75 |
-
msgstr "Alterar ordem de enfileiramento?"
|
76 |
-
|
77 |
-
#: admin/boot.php:142 admin/options.php:89
|
78 |
-
msgid "Disable all display features functionality?"
|
79 |
-
msgstr "Desativar todas as funcionalidades dos recursos de exibição?"
|
80 |
-
|
81 |
-
#: admin/boot.php:147 admin/options.php:98
|
82 |
-
msgid "Use Anonymize IP? (Required by law for some countries)"
|
83 |
-
msgstr "Use Anonymize IP? (Obrigatório por lei para alguns países)"
|
84 |
-
|
85 |
-
#: admin/boot.php:152 admin/options.php:107 admin/options.php:109
|
86 |
-
msgid "Track logged in Administrators?"
|
87 |
-
msgstr "Track logado em Administradores?"
|
88 |
-
|
89 |
-
#: admin/boot.php:157 admin/options.php:116
|
90 |
-
msgid "Remove script from wp-cron?"
|
91 |
-
msgstr "Remover script do wp-cron?"
|
92 |
-
|
93 |
-
#: admin/boot.php:185
|
94 |
-
msgid "Get ultimate plugin free"
|
95 |
-
msgstr "Obtenha o melhor plugin grátis"
|
96 |
-
|
97 |
-
#: admin/options.php:23
|
98 |
-
msgid "<strong>Google Analytics cache</strong>."
|
99 |
-
msgstr "<strong>cache do Google Analytics</strong>."
|
100 |
-
|
101 |
-
#: admin/options.php:23
|
102 |
-
msgid ""
|
103 |
-
"To improve Google Page Speed indicators Analytics caching is needed. "
|
104 |
-
"However, it can also slightly increase your website loading speed, because "
|
105 |
-
"Analytics js files will load locally. The second case that you might need "
|
106 |
-
"these settings is the usual Google Analytics connection to your website. You "
|
107 |
-
"do not need to do this with other plugins or insert the tracking code into "
|
108 |
-
"your theme."
|
109 |
-
msgstr ""
|
110 |
-
"Para melhorar os indicadores do Google Page Speed, é necessário o "
|
111 |
-
"armazenamento em cache do Analytics. No entanto, também pode aumentar "
|
112 |
-
"ligeiramente a velocidade de carregamento do seu site, porque os arquivos do "
|
113 |
-
"Google Analytics js serão carregados localmente. O segundo caso em que você "
|
114 |
-
"pode precisar dessas configurações é a conexão normal do Google Analytics "
|
115 |
-
"com seu website. Você não precisa fazer isso com outros plug-ins ou inserir "
|
116 |
-
"o código de acompanhamento em seu tema."
|
117 |
-
|
118 |
-
#: admin/options.php:32
|
119 |
-
msgid ""
|
120 |
-
"If you enable this option, the plugin will begin to save a local copy of "
|
121 |
-
"Google Analytics to speed up the loading of your website and improve Google "
|
122 |
-
"Page Speed."
|
123 |
-
msgstr ""
|
124 |
-
"Se você ativar essa opção, o plug-in começará a salvar uma cópia local do "
|
125 |
-
"Google Analytics para acelerar o carregamento de seu website e melhorar a "
|
126 |
-
"velocidade da página do Google."
|
127 |
-
|
128 |
-
#: admin/options.php:32
|
129 |
-
msgid ""
|
130 |
-
"ATTENTION! Before using this option, remove the previously installed Google "
|
131 |
-
"Analytics code inside your theme or plugins associated with this feature!"
|
132 |
-
msgstr ""
|
133 |
-
"ATENÇÃO! Antes de usar essa opção, remova o código do Google Analytics "
|
134 |
-
"instalado anteriormente no seu tema ou plug-ins associados a esse recurso."
|
135 |
-
|
136 |
-
#: admin/options.php:52
|
137 |
-
msgid "Set the Google Analytics tracking code."
|
138 |
-
msgstr "Definir o código de acompanhamento do Google Analytics."
|
139 |
-
|
140 |
-
#: admin/options.php:63
|
141 |
-
msgid "Save GA in"
|
142 |
-
msgstr "Salvar o GA em"
|
143 |
-
|
144 |
-
#: admin/options.php:64
|
145 |
-
msgid "Select location for the Google Analytics code."
|
146 |
-
msgstr "Selecione o local para o código do Google Analytics."
|
147 |
-
|
148 |
-
#: admin/options.php:74
|
149 |
-
msgid ""
|
150 |
-
"Essentially, you set up an event which is triggered after a user spends a "
|
151 |
-
"certain amount of time on the landing page, telling Google Analytics not to "
|
152 |
-
"count these users as bounces. A user may come to your website, find all of "
|
153 |
-
"the information they need (a phone number, for example) and then leave the "
|
154 |
-
"site without visiting another page. Without adjusted bounce rate, such a "
|
155 |
-
"user would be considered a bounce, even though they had a successful "
|
156 |
-
"experience. By defining a time limit after which you can consider a user to "
|
157 |
-
"be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
|
158 |
-
"more accurate idea of whether they found what they were looking for."
|
159 |
-
msgstr ""
|
160 |
-
"Essencialmente, você configura um evento que é acionado depois que um "
|
161 |
-
"usuário passa um determinado período de tempo na página de destino, dizendo "
|
162 |
-
"ao Google Analytics para não contabilizar esses usuários como rejeições. Um "
|
163 |
-
"usuário pode acessar seu site, encontrar todas as informações necessárias "
|
164 |
-
"(um número de telefone, por exemplo) e sair do site sem visitar outra "
|
165 |
-
"página. Sem a taxa de rejeição ajustada, esse usuário seria considerado uma "
|
166 |
-
"rejeição, mesmo que tivesse uma experiência bem-sucedida. Ao definir um "
|
167 |
-
"limite de tempo após o qual você pode considerar um usuário \"engajado\", "
|
168 |
-
"esse usuário não será mais considerado uma rejeição, e você terá uma ideia "
|
169 |
-
"mais precisa sobre se encontrou o que estava procurando."
|
170 |
-
|
171 |
-
#: admin/options.php:83
|
172 |
-
msgid ""
|
173 |
-
"By default, Google Analytics code is loaded before other scripts and "
|
174 |
-
"javasscript code, but if you set the value to 100, the GA code will be "
|
175 |
-
"loaded after all other scripts. By changing the priority, you can set code "
|
176 |
-
"position on the page."
|
177 |
-
msgstr ""
|
178 |
-
"Por padrão, o código do Google Analytics é carregado antes de outros scripts "
|
179 |
-
"e código javasscript, mas se você definir o valor como 100, o código do GA "
|
180 |
-
"será carregado depois de todos os outros scripts. Ao alterar a prioridade, "
|
181 |
-
"você pode definir a posição do código na página."
|
182 |
-
|
183 |
-
#: admin/options.php:91
|
184 |
-
#, php-format
|
185 |
-
msgid "Disable all <a href=\"%s\">display features functionality?</a>"
|
186 |
-
msgstr ""
|
187 |
-
"Desativar todas as <a href=\"%s\"> funcionalidades dos recursos de exibição? "
|
188 |
-
"</a>"
|
189 |
-
|
190 |
-
#: admin/options.php:100
|
191 |
-
#, php-format
|
192 |
-
msgid ""
|
193 |
-
"Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
|
194 |
-
msgstr ""
|
195 |
-
"Usar <a href=\"%s\">Anonimizar IP?</a> (exigido por lei para alguns países)"
|
196 |
-
|
197 |
-
#: admin/options.php:118
|
198 |
-
msgid ""
|
199 |
-
"Clearfy creates a cron job to daily update Google Analytics cache scripts. "
|
200 |
-
"After enabling this option, the plugin will not update Google Analytics "
|
201 |
-
"cache file. Do not use this option if you do not understand why you need it!"
|
202 |
-
msgstr ""
|
203 |
-
"O Clearfy cria uma tarefa cron para atualizar diariamente os scripts de "
|
204 |
-
"cache do Google Analytics. Depois de ativar essa opção, o plug-in não "
|
205 |
-
"atualizará o arquivo de cache do Google Analytics. Não use essa opção se "
|
206 |
-
"você não entender por que precisa!"
|
207 |
-
|
208 |
-
#: admin/pages/ga_cache.php:33
|
209 |
-
msgid "Local Google Analytics"
|
210 |
-
msgstr ""
|
211 |
-
|
212 |
-
#: admin/pages/ga_cache.php:50
|
213 |
-
msgid "General"
|
214 |
-
msgstr "Geral"
|
215 |
-
|
216 |
-
#: includes/classes/class.configurate-ga.php:37
|
217 |
-
msgid "Once Weekly"
|
218 |
-
msgstr "Uma vez por semana"
|
219 |
-
|
220 |
-
#: includes/classes/class.configurate-ga.php:42
|
221 |
-
msgid "Twice Monthly"
|
222 |
-
msgstr "Duas vezes por mês"
|
223 |
-
|
224 |
-
#: includes/classes/class.configurate-ga.php:47
|
225 |
-
msgid "Once Monthly"
|
226 |
-
msgstr "Uma vez por mês"
|
227 |
-
|
228 |
-
#: simple_google_analytics.php:32
|
229 |
-
msgid ""
|
230 |
-
"We found that you have the \"Clearfy - disable unused features\" plugin "
|
231 |
-
"installed, this plugin already has Google Analytics cache functions, so you "
|
232 |
-
"can deactivate plugin \"Google Analytics Cache\"!"
|
233 |
-
msgstr ""
|
234 |
-
"Descobrimos que você tem o \"Clearfy - desativar os recursos não utilizados "
|
235 |
-
"\" plugin instalado, este plugin já tem desativar as funções de comentários, "
|
236 |
-
"assim você pode desativar o plugin \"Hide Login Page \"!"
|
237 |
-
|
238 |
-
#: simple_google_analytics.php:40
|
239 |
-
msgid ""
|
240 |
-
"You use the old version of Wordpress to use the <b>Webcraftic Local Google "
|
241 |
-
"Analytics (Old name: Simple Google Analytics)</b> plugin, you must upgrade "
|
242 |
-
"your Wordpress to the minimum version 4.2!"
|
243 |
-
msgstr ""
|
244 |
-
|
245 |
-
#: simple_google_analytics.php:65
|
246 |
-
msgid "Webcraftic Local Google Analytics"
|
247 |
msgstr ""
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: clearfy\n"
|
4 |
+
"POT-Creation-Date: 2018-09-06 18:33+0300\n"
|
5 |
+
"PO-Revision-Date: 2018-09-06 18:33+0300\n"
|
6 |
+
"Last-Translator: alex.kovalevv@gmail.com <alex.kovalevv@gmail.com>\n"
|
7 |
+
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
+
"Language: pt_BR\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"X-Generator: Poedit 2.1.1\n"
|
13 |
+
"X-Poedit-Basepath: ..\n"
|
14 |
+
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
+
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
+
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
+
"X-Poedit-SearchPath-0: .\n"
|
19 |
+
"X-Poedit-SearchPathExcluded-0: libs\n"
|
20 |
+
"X-Poedit-SearchPathExcluded-1: components\n"
|
21 |
+
"X-Poedit-SearchPathExcluded-2: cache\n"
|
22 |
+
|
23 |
+
#: admin/boot.php:27
|
24 |
+
msgid "The <b>Simple Google Analytics</b> plugin has some major changes!"
|
25 |
+
msgstr ""
|
26 |
+
|
27 |
+
#: admin/boot.php:28
|
28 |
+
msgid ""
|
29 |
+
"Unfortunately, the old version of the plugin (2.2.2) is no longer supported, "
|
30 |
+
"but you still can download it from the WordPress repository in case if the "
|
31 |
+
"new release doesn’t work for you."
|
32 |
+
msgstr ""
|
33 |
+
|
34 |
+
#: admin/boot.php:29
|
35 |
+
msgid ""
|
36 |
+
"We’ve updated the code and fixed the compatibility issue for the latest "
|
37 |
+
"WordPress and PHP versions. We’ve also added additional feature of the Local "
|
38 |
+
"Google Analytics – this way your website will load faster. The plugin’s name "
|
39 |
+
"has been changed to Local Google Analytics, but all features remained the "
|
40 |
+
"same."
|
41 |
+
msgstr ""
|
42 |
+
|
43 |
+
#: admin/boot.php:30
|
44 |
+
#, php-format
|
45 |
+
msgid ""
|
46 |
+
"Please, check <a href=\"%s\">plugin settings</a> and its performance on your "
|
47 |
+
"website. We do care about you and want to avoid any problems with the new "
|
48 |
+
"version."
|
49 |
+
msgstr ""
|
50 |
+
|
51 |
+
#: admin/boot.php:32
|
52 |
+
#, php-format
|
53 |
+
msgid ""
|
54 |
+
"We are aimed to pay more attention to the speed and security aspects of your "
|
55 |
+
"website. That’s why you should definitely try our basic WordPress "
|
56 |
+
"optimization plugin as well. Clearfy includes functionality of this plugin "
|
57 |
+
"and has many additional features for the website optimization:\n"
|
58 |
+
"<a href=\"%s\">Donwload Clearfy for free</a>"
|
59 |
+
msgstr ""
|
60 |
+
|
61 |
+
#: admin/boot.php:121 admin/options.php:30 admin/pages/ga_cache.php:49
|
62 |
+
msgid "Google Analytics Cache"
|
63 |
+
msgstr "Cache analítico do Google"
|
64 |
+
|
65 |
+
#: admin/boot.php:127 admin/options.php:50
|
66 |
+
msgid "Google analytic Code"
|
67 |
+
msgstr "Código analítico do Google"
|
68 |
+
|
69 |
+
#: admin/boot.php:132 admin/options.php:71
|
70 |
+
msgid "Use adjusted bounce rate?"
|
71 |
+
msgstr "Use taxa de rejeição ajustada?"
|
72 |
+
|
73 |
+
#: admin/boot.php:137 admin/options.php:80
|
74 |
+
msgid "Change enqueue order?"
|
75 |
+
msgstr "Alterar ordem de enfileiramento?"
|
76 |
+
|
77 |
+
#: admin/boot.php:142 admin/options.php:89
|
78 |
+
msgid "Disable all display features functionality?"
|
79 |
+
msgstr "Desativar todas as funcionalidades dos recursos de exibição?"
|
80 |
+
|
81 |
+
#: admin/boot.php:147 admin/options.php:98
|
82 |
+
msgid "Use Anonymize IP? (Required by law for some countries)"
|
83 |
+
msgstr "Use Anonymize IP? (Obrigatório por lei para alguns países)"
|
84 |
+
|
85 |
+
#: admin/boot.php:152 admin/options.php:107 admin/options.php:109
|
86 |
+
msgid "Track logged in Administrators?"
|
87 |
+
msgstr "Track logado em Administradores?"
|
88 |
+
|
89 |
+
#: admin/boot.php:157 admin/options.php:116
|
90 |
+
msgid "Remove script from wp-cron?"
|
91 |
+
msgstr "Remover script do wp-cron?"
|
92 |
+
|
93 |
+
#: admin/boot.php:185
|
94 |
+
msgid "Get ultimate plugin free"
|
95 |
+
msgstr "Obtenha o melhor plugin grátis"
|
96 |
+
|
97 |
+
#: admin/options.php:23
|
98 |
+
msgid "<strong>Google Analytics cache</strong>."
|
99 |
+
msgstr "<strong>cache do Google Analytics</strong>."
|
100 |
+
|
101 |
+
#: admin/options.php:23
|
102 |
+
msgid ""
|
103 |
+
"To improve Google Page Speed indicators Analytics caching is needed. "
|
104 |
+
"However, it can also slightly increase your website loading speed, because "
|
105 |
+
"Analytics js files will load locally. The second case that you might need "
|
106 |
+
"these settings is the usual Google Analytics connection to your website. You "
|
107 |
+
"do not need to do this with other plugins or insert the tracking code into "
|
108 |
+
"your theme."
|
109 |
+
msgstr ""
|
110 |
+
"Para melhorar os indicadores do Google Page Speed, é necessário o "
|
111 |
+
"armazenamento em cache do Analytics. No entanto, também pode aumentar "
|
112 |
+
"ligeiramente a velocidade de carregamento do seu site, porque os arquivos do "
|
113 |
+
"Google Analytics js serão carregados localmente. O segundo caso em que você "
|
114 |
+
"pode precisar dessas configurações é a conexão normal do Google Analytics "
|
115 |
+
"com seu website. Você não precisa fazer isso com outros plug-ins ou inserir "
|
116 |
+
"o código de acompanhamento em seu tema."
|
117 |
+
|
118 |
+
#: admin/options.php:32
|
119 |
+
msgid ""
|
120 |
+
"If you enable this option, the plugin will begin to save a local copy of "
|
121 |
+
"Google Analytics to speed up the loading of your website and improve Google "
|
122 |
+
"Page Speed."
|
123 |
+
msgstr ""
|
124 |
+
"Se você ativar essa opção, o plug-in começará a salvar uma cópia local do "
|
125 |
+
"Google Analytics para acelerar o carregamento de seu website e melhorar a "
|
126 |
+
"velocidade da página do Google."
|
127 |
+
|
128 |
+
#: admin/options.php:32
|
129 |
+
msgid ""
|
130 |
+
"ATTENTION! Before using this option, remove the previously installed Google "
|
131 |
+
"Analytics code inside your theme or plugins associated with this feature!"
|
132 |
+
msgstr ""
|
133 |
+
"ATENÇÃO! Antes de usar essa opção, remova o código do Google Analytics "
|
134 |
+
"instalado anteriormente no seu tema ou plug-ins associados a esse recurso."
|
135 |
+
|
136 |
+
#: admin/options.php:52
|
137 |
+
msgid "Set the Google Analytics tracking code."
|
138 |
+
msgstr "Definir o código de acompanhamento do Google Analytics."
|
139 |
+
|
140 |
+
#: admin/options.php:63
|
141 |
+
msgid "Save GA in"
|
142 |
+
msgstr "Salvar o GA em"
|
143 |
+
|
144 |
+
#: admin/options.php:64
|
145 |
+
msgid "Select location for the Google Analytics code."
|
146 |
+
msgstr "Selecione o local para o código do Google Analytics."
|
147 |
+
|
148 |
+
#: admin/options.php:74
|
149 |
+
msgid ""
|
150 |
+
"Essentially, you set up an event which is triggered after a user spends a "
|
151 |
+
"certain amount of time on the landing page, telling Google Analytics not to "
|
152 |
+
"count these users as bounces. A user may come to your website, find all of "
|
153 |
+
"the information they need (a phone number, for example) and then leave the "
|
154 |
+
"site without visiting another page. Without adjusted bounce rate, such a "
|
155 |
+
"user would be considered a bounce, even though they had a successful "
|
156 |
+
"experience. By defining a time limit after which you can consider a user to "
|
157 |
+
"be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
|
158 |
+
"more accurate idea of whether they found what they were looking for."
|
159 |
+
msgstr ""
|
160 |
+
"Essencialmente, você configura um evento que é acionado depois que um "
|
161 |
+
"usuário passa um determinado período de tempo na página de destino, dizendo "
|
162 |
+
"ao Google Analytics para não contabilizar esses usuários como rejeições. Um "
|
163 |
+
"usuário pode acessar seu site, encontrar todas as informações necessárias "
|
164 |
+
"(um número de telefone, por exemplo) e sair do site sem visitar outra "
|
165 |
+
"página. Sem a taxa de rejeição ajustada, esse usuário seria considerado uma "
|
166 |
+
"rejeição, mesmo que tivesse uma experiência bem-sucedida. Ao definir um "
|
167 |
+
"limite de tempo após o qual você pode considerar um usuário \"engajado\", "
|
168 |
+
"esse usuário não será mais considerado uma rejeição, e você terá uma ideia "
|
169 |
+
"mais precisa sobre se encontrou o que estava procurando."
|
170 |
+
|
171 |
+
#: admin/options.php:83
|
172 |
+
msgid ""
|
173 |
+
"By default, Google Analytics code is loaded before other scripts and "
|
174 |
+
"javasscript code, but if you set the value to 100, the GA code will be "
|
175 |
+
"loaded after all other scripts. By changing the priority, you can set code "
|
176 |
+
"position on the page."
|
177 |
+
msgstr ""
|
178 |
+
"Por padrão, o código do Google Analytics é carregado antes de outros scripts "
|
179 |
+
"e código javasscript, mas se você definir o valor como 100, o código do GA "
|
180 |
+
"será carregado depois de todos os outros scripts. Ao alterar a prioridade, "
|
181 |
+
"você pode definir a posição do código na página."
|
182 |
+
|
183 |
+
#: admin/options.php:91
|
184 |
+
#, php-format
|
185 |
+
msgid "Disable all <a href=\"%s\">display features functionality?</a>"
|
186 |
+
msgstr ""
|
187 |
+
"Desativar todas as <a href=\"%s\"> funcionalidades dos recursos de exibição? "
|
188 |
+
"</a>"
|
189 |
+
|
190 |
+
#: admin/options.php:100
|
191 |
+
#, php-format
|
192 |
+
msgid ""
|
193 |
+
"Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
|
194 |
+
msgstr ""
|
195 |
+
"Usar <a href=\"%s\">Anonimizar IP?</a> (exigido por lei para alguns países)"
|
196 |
+
|
197 |
+
#: admin/options.php:118
|
198 |
+
msgid ""
|
199 |
+
"Clearfy creates a cron job to daily update Google Analytics cache scripts. "
|
200 |
+
"After enabling this option, the plugin will not update Google Analytics "
|
201 |
+
"cache file. Do not use this option if you do not understand why you need it!"
|
202 |
+
msgstr ""
|
203 |
+
"O Clearfy cria uma tarefa cron para atualizar diariamente os scripts de "
|
204 |
+
"cache do Google Analytics. Depois de ativar essa opção, o plug-in não "
|
205 |
+
"atualizará o arquivo de cache do Google Analytics. Não use essa opção se "
|
206 |
+
"você não entender por que precisa!"
|
207 |
+
|
208 |
+
#: admin/pages/ga_cache.php:33
|
209 |
+
msgid "Local Google Analytics"
|
210 |
+
msgstr ""
|
211 |
+
|
212 |
+
#: admin/pages/ga_cache.php:50
|
213 |
+
msgid "General"
|
214 |
+
msgstr "Geral"
|
215 |
+
|
216 |
+
#: includes/classes/class.configurate-ga.php:37
|
217 |
+
msgid "Once Weekly"
|
218 |
+
msgstr "Uma vez por semana"
|
219 |
+
|
220 |
+
#: includes/classes/class.configurate-ga.php:42
|
221 |
+
msgid "Twice Monthly"
|
222 |
+
msgstr "Duas vezes por mês"
|
223 |
+
|
224 |
+
#: includes/classes/class.configurate-ga.php:47
|
225 |
+
msgid "Once Monthly"
|
226 |
+
msgstr "Uma vez por mês"
|
227 |
+
|
228 |
+
#: simple_google_analytics.php:32
|
229 |
+
msgid ""
|
230 |
+
"We found that you have the \"Clearfy - disable unused features\" plugin "
|
231 |
+
"installed, this plugin already has Google Analytics cache functions, so you "
|
232 |
+
"can deactivate plugin \"Google Analytics Cache\"!"
|
233 |
+
msgstr ""
|
234 |
+
"Descobrimos que você tem o \"Clearfy - desativar os recursos não utilizados "
|
235 |
+
"\" plugin instalado, este plugin já tem desativar as funções de comentários, "
|
236 |
+
"assim você pode desativar o plugin \"Hide Login Page \"!"
|
237 |
+
|
238 |
+
#: simple_google_analytics.php:40
|
239 |
+
msgid ""
|
240 |
+
"You use the old version of Wordpress to use the <b>Webcraftic Local Google "
|
241 |
+
"Analytics (Old name: Simple Google Analytics)</b> plugin, you must upgrade "
|
242 |
+
"your Wordpress to the minimum version 4.2!"
|
243 |
+
msgstr ""
|
244 |
+
|
245 |
+
#: simple_google_analytics.php:65
|
246 |
+
msgid "Webcraftic Local Google Analytics"
|
247 |
msgstr ""
|
languages/simple-google-analytics-ru_RU.po
CHANGED
@@ -1,198 +1,198 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: \n"
|
4 |
-
"POT-Creation-Date: 2018-04-17 02:28+0400\n"
|
5 |
-
"PO-Revision-Date: 2018-04-17 02:35+0400\n"
|
6 |
-
"Last-Translator: \n"
|
7 |
-
"Language-Team: \n"
|
8 |
-
"Language: ru_RU\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"X-Generator: Poedit 2.0.6\n"
|
13 |
-
"X-Poedit-Basepath: ga-cache\n"
|
14 |
-
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
-
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
-
"X-Poedit-SearchPath-0: google-analytics-cache.php\n"
|
19 |
-
"X-Poedit-SearchPath-1: includes/class-rio-plugin.php\n"
|
20 |
-
"X-Poedit-SearchPath-2: admin/options.php\n"
|
21 |
-
"X-Poedit-SearchPath-3: includes/classes/class.configurate-ga.php\n"
|
22 |
-
"X-Poedit-SearchPath-4: admin/pages/class-pages-general-settings.php\n"
|
23 |
-
|
24 |
-
#: admin/options.php:23
|
25 |
-
msgid "<strong>Google Analytics cache</strong>."
|
26 |
-
msgstr ""
|
27 |
-
|
28 |
-
#: admin/options.php:23
|
29 |
-
msgid ""
|
30 |
-
"To improve Google Page Speed indicators Analytics caching is needed. "
|
31 |
-
"However, it can also slightly increase your website loading speed, because "
|
32 |
-
"Analytics js files will load locally. The second case that you might need "
|
33 |
-
"these settings is the usual Google Analytics connection to your website. You "
|
34 |
-
"do not need to do this with other plugins or insert the tracking code into "
|
35 |
-
"your theme."
|
36 |
-
msgstr ""
|
37 |
-
"Кеширование Analytics нужно для улучшения показателей Google Page Speed, но\n"
|
38 |
-
"это также может незначительно повысить скорость загрузки вашего сайта, \n"
|
39 |
-
"потому что js файлы Analytics будут подгружаться локально. Второй случай, \n"
|
40 |
-
"когда вам могут понадобиться эти настройки — обычное подключение Google \n"
|
41 |
-
"Analytics к сайту. Вам не нужно делать это с помощью других плагинов или \n"
|
42 |
-
"просто вставлять код отслеживания в вашу тему."
|
43 |
-
|
44 |
-
#: admin/options.php:31 admin/pages/ga_cache.php:33 admin/pages/ga_cache.php:49
|
45 |
-
msgid "Google Analytics Cache"
|
46 |
-
msgstr ""
|
47 |
-
|
48 |
-
#: admin/options.php:33
|
49 |
-
msgid ""
|
50 |
-
"If you enable this option, the plugin will begin to save a local copy of "
|
51 |
-
"Google Analytics to speed up the loading of your website and improve Google "
|
52 |
-
"Page Speed."
|
53 |
-
msgstr ""
|
54 |
-
"Если включить эту опцию, плагин начнет сохранять локальную копию Google \n"
|
55 |
-
"Analytics, чтобы ускорить загрузку вашего сайта и улучшить показатели "
|
56 |
-
"Google \n"
|
57 |
-
"Page speed. ВНИМАНИЕ! Перед использованием этой опции, удалите ранее \n"
|
58 |
-
"установленный код Google Analytics в вашей теме или плагины, связанные с \n"
|
59 |
-
"этой функцией!"
|
60 |
-
|
61 |
-
#: admin/options.php:33
|
62 |
-
msgid ""
|
63 |
-
"ATTENTION! Before using this option, remove the previously installed Google "
|
64 |
-
"Analytics code inside your theme or plugins associated with this feature!"
|
65 |
-
msgstr ""
|
66 |
-
"ВНИМАНИЕ! Перед использованием этой опции, удалите ранее установленный код \n"
|
67 |
-
"Google Analytics в вашей теме или плагины, связанные с этой функцией!"
|
68 |
-
|
69 |
-
#: admin/options.php:51
|
70 |
-
msgid "Google analytic Code"
|
71 |
-
msgstr "Код Google аналитики"
|
72 |
-
|
73 |
-
#: admin/options.php:53
|
74 |
-
msgid "Set the Google Analytics tracking code."
|
75 |
-
msgstr "Установите код отслеживания Google Analytics."
|
76 |
-
|
77 |
-
#: admin/options.php:64
|
78 |
-
msgid "Save GA in"
|
79 |
-
msgstr "Использовать код аналитики в"
|
80 |
-
|
81 |
-
#: admin/options.php:65
|
82 |
-
msgid "Select location for the Google Analytics code."
|
83 |
-
msgstr "Выберите местоположение для кода Google Analytics."
|
84 |
-
|
85 |
-
#: admin/options.php:72
|
86 |
-
msgid "Use adjusted bounce rate?"
|
87 |
-
msgstr "Показатель отказов?"
|
88 |
-
|
89 |
-
#: admin/options.php:75
|
90 |
-
msgid ""
|
91 |
-
"Essentially, you set up an event which is triggered after a user spends a "
|
92 |
-
"certain amount of time on the landing page, telling Google Analytics not to "
|
93 |
-
"count these users as bounces. A user may come to your website, find all of "
|
94 |
-
"the information they need (a phone number, for example) and then leave the "
|
95 |
-
"site without visiting another page. Without adjusted bounce rate, such a "
|
96 |
-
"user would be considered a bounce, even though they had a successful "
|
97 |
-
"experience. By defining a time limit after which you can consider a user to "
|
98 |
-
"be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
|
99 |
-
"more accurate idea of whether they found what they were looking for."
|
100 |
-
msgstr ""
|
101 |
-
"По сути, вы настраиваете событие, которое запускается после того, как \n"
|
102 |
-
"пользователь тратит определенное количество времени на целевую страницу, \n"
|
103 |
-
"сообщая Google Analytics не считать этих пользователей как отказы. \n"
|
104 |
-
"Пользователь может зайти на ваш сайт, найти всю необходимую информацию \n"
|
105 |
-
"(например, номер телефона), а затем покинуть сайт, не посещая другую \n"
|
106 |
-
"страницу. Без скорректированного коэффициента отказов такой пользователь \n"
|
107 |
-
"будет считаться отказом, хотя у них был успешный опыт. Определив лимит \n"
|
108 |
-
"времени, после которого вы можете считать пользователя «включенным», этот \n"
|
109 |
-
"пользователь больше не будет считаться отказом, и вы получите более точное \n"
|
110 |
-
"представление о том, нашли ли они то, что искали."
|
111 |
-
|
112 |
-
#: admin/options.php:81
|
113 |
-
msgid "Change enqueue order?"
|
114 |
-
msgstr "Сортировка скрипта?"
|
115 |
-
|
116 |
-
#: admin/options.php:84
|
117 |
-
msgid ""
|
118 |
-
"By default, Google Analytics code is loaded before other scripts and "
|
119 |
-
"javasscript code, but if you set the value to 100, the GA code will be "
|
120 |
-
"loaded after all other scripts. By changing the priority, you can set code "
|
121 |
-
"position on the page."
|
122 |
-
msgstr ""
|
123 |
-
"По умолчанию код Google Analytics загружается раньше остальных скриптов и \n"
|
124 |
-
"javasscript кода, но если вы установите к примеру значение 100, то код GA \n"
|
125 |
-
"будет загружен после всех остальных скриптов. Изменяя приоритет, вы можете \n"
|
126 |
-
"задавать положение кода на странице."
|
127 |
-
|
128 |
-
#: admin/options.php:90
|
129 |
-
msgid "Disable all display features functionality?"
|
130 |
-
msgstr "Отключить все функции для контекстно-медийной сети?"
|
131 |
-
|
132 |
-
#: admin/options.php:92
|
133 |
-
#, php-format
|
134 |
-
msgid "Disable all <a href=\"%s\">display features functionality?</a>"
|
135 |
-
msgstr "Отключить <a href=\"%s\">все функции для контекстно-медийной сети?</a>"
|
136 |
-
|
137 |
-
#: admin/options.php:99
|
138 |
-
msgid "Use Anonymize IP? (Required by law for some countries)"
|
139 |
-
msgstr ""
|
140 |
-
"Использовать анонимный IP-адрес? (Требуется по закону для некоторых стран)"
|
141 |
-
|
142 |
-
#: admin/options.php:101
|
143 |
-
#, php-format
|
144 |
-
msgid ""
|
145 |
-
"Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
|
146 |
-
msgstr ""
|
147 |
-
"Использовать <a href=\"%s\">анонимный IP-адрес?</a> (Требуется по закону "
|
148 |
-
"для \n"
|
149 |
-
"некоторых стран)"
|
150 |
-
|
151 |
-
#: admin/options.php:108 admin/options.php:110
|
152 |
-
msgid "Track logged in Administrators?"
|
153 |
-
msgstr "Отслеживать, если вы авторизованы под администратором?"
|
154 |
-
|
155 |
-
#: admin/options.php:117
|
156 |
-
msgid "Remove script from wp-cron?"
|
157 |
-
msgstr "Удалить кеширования скрипта из крона?"
|
158 |
-
|
159 |
-
#: admin/options.php:119
|
160 |
-
msgid ""
|
161 |
-
"Clearfy creates a cron job to daily update Google Analytics cache scripts. "
|
162 |
-
"After enabling this option, the plugin will not update Google Analytics "
|
163 |
-
"cache file. Do not use this option if you do not understand why you need it!"
|
164 |
-
msgstr ""
|
165 |
-
"Плагин создает cron задание, чтобы ежедневно обновлять кеш скриптов Google \n"
|
166 |
-
"Analytics. После включения этой опции, плагин не будет обновлять кэш файл \n"
|
167 |
-
"Google Analytics. Не используйте эту опцию, если вы не понимаете, для чего \n"
|
168 |
-
"вам это нужно!"
|
169 |
-
|
170 |
-
#: admin/pages/ga_cache.php:50
|
171 |
-
msgid "General"
|
172 |
-
msgstr "Основные"
|
173 |
-
|
174 |
-
#: google-analytics-cache.php:22
|
175 |
-
msgid ""
|
176 |
-
"We found that you have the \"Clearfy - disable unused features\" plugin "
|
177 |
-
"installed, this plugin already has Google Analytics cache functions, so you "
|
178 |
-
"can deactivate plugin \"Google Analytics Cache\"!"
|
179 |
-
msgstr ""
|
180 |
-
"Мы обнаружили, что у вас установлен плагин «Clearfy - отключить \n"
|
181 |
-
"неиспользуемые функции», этот плагин уже имеет функцию кеширования Google "
|
182 |
-
"Analytics, поэтому вы можете отключить плагин «Google Analytics Cache»!"
|
183 |
-
|
184 |
-
#: google-analytics-cache.php:50
|
185 |
-
msgid "Webcraftic Google Analytics Cache"
|
186 |
-
msgstr ""
|
187 |
-
|
188 |
-
#: includes/classes/class.configurate-ga.php:40
|
189 |
-
msgid "Once Weekly"
|
190 |
-
msgstr ""
|
191 |
-
|
192 |
-
#: includes/classes/class.configurate-ga.php:45
|
193 |
-
msgid "Twice Monthly"
|
194 |
-
msgstr ""
|
195 |
-
|
196 |
-
#: includes/classes/class.configurate-ga.php:50
|
197 |
-
msgid "Once Monthly"
|
198 |
-
msgstr ""
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: \n"
|
4 |
+
"POT-Creation-Date: 2018-04-17 02:28+0400\n"
|
5 |
+
"PO-Revision-Date: 2018-04-17 02:35+0400\n"
|
6 |
+
"Last-Translator: \n"
|
7 |
+
"Language-Team: \n"
|
8 |
+
"Language: ru_RU\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"X-Generator: Poedit 2.0.6\n"
|
13 |
+
"X-Poedit-Basepath: ga-cache\n"
|
14 |
+
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
+
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
+
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
+
"X-Poedit-SearchPath-0: google-analytics-cache.php\n"
|
19 |
+
"X-Poedit-SearchPath-1: includes/class-rio-plugin.php\n"
|
20 |
+
"X-Poedit-SearchPath-2: admin/options.php\n"
|
21 |
+
"X-Poedit-SearchPath-3: includes/classes/class.configurate-ga.php\n"
|
22 |
+
"X-Poedit-SearchPath-4: admin/pages/class-pages-general-settings.php\n"
|
23 |
+
|
24 |
+
#: admin/options.php:23
|
25 |
+
msgid "<strong>Google Analytics cache</strong>."
|
26 |
+
msgstr ""
|
27 |
+
|
28 |
+
#: admin/options.php:23
|
29 |
+
msgid ""
|
30 |
+
"To improve Google Page Speed indicators Analytics caching is needed. "
|
31 |
+
"However, it can also slightly increase your website loading speed, because "
|
32 |
+
"Analytics js files will load locally. The second case that you might need "
|
33 |
+
"these settings is the usual Google Analytics connection to your website. You "
|
34 |
+
"do not need to do this with other plugins or insert the tracking code into "
|
35 |
+
"your theme."
|
36 |
+
msgstr ""
|
37 |
+
"Кеширование Analytics нужно для улучшения показателей Google Page Speed, но\n"
|
38 |
+
"это также может незначительно повысить скорость загрузки вашего сайта, \n"
|
39 |
+
"потому что js файлы Analytics будут подгружаться локально. Второй случай, \n"
|
40 |
+
"когда вам могут понадобиться эти настройки — обычное подключение Google \n"
|
41 |
+
"Analytics к сайту. Вам не нужно делать это с помощью других плагинов или \n"
|
42 |
+
"просто вставлять код отслеживания в вашу тему."
|
43 |
+
|
44 |
+
#: admin/options.php:31 admin/pages/ga_cache.php:33 admin/pages/ga_cache.php:49
|
45 |
+
msgid "Google Analytics Cache"
|
46 |
+
msgstr ""
|
47 |
+
|
48 |
+
#: admin/options.php:33
|
49 |
+
msgid ""
|
50 |
+
"If you enable this option, the plugin will begin to save a local copy of "
|
51 |
+
"Google Analytics to speed up the loading of your website and improve Google "
|
52 |
+
"Page Speed."
|
53 |
+
msgstr ""
|
54 |
+
"Если включить эту опцию, плагин начнет сохранять локальную копию Google \n"
|
55 |
+
"Analytics, чтобы ускорить загрузку вашего сайта и улучшить показатели "
|
56 |
+
"Google \n"
|
57 |
+
"Page speed. ВНИМАНИЕ! Перед использованием этой опции, удалите ранее \n"
|
58 |
+
"установленный код Google Analytics в вашей теме или плагины, связанные с \n"
|
59 |
+
"этой функцией!"
|
60 |
+
|
61 |
+
#: admin/options.php:33
|
62 |
+
msgid ""
|
63 |
+
"ATTENTION! Before using this option, remove the previously installed Google "
|
64 |
+
"Analytics code inside your theme or plugins associated with this feature!"
|
65 |
+
msgstr ""
|
66 |
+
"ВНИМАНИЕ! Перед использованием этой опции, удалите ранее установленный код \n"
|
67 |
+
"Google Analytics в вашей теме или плагины, связанные с этой функцией!"
|
68 |
+
|
69 |
+
#: admin/options.php:51
|
70 |
+
msgid "Google analytic Code"
|
71 |
+
msgstr "Код Google аналитики"
|
72 |
+
|
73 |
+
#: admin/options.php:53
|
74 |
+
msgid "Set the Google Analytics tracking code."
|
75 |
+
msgstr "Установите код отслеживания Google Analytics."
|
76 |
+
|
77 |
+
#: admin/options.php:64
|
78 |
+
msgid "Save GA in"
|
79 |
+
msgstr "Использовать код аналитики в"
|
80 |
+
|
81 |
+
#: admin/options.php:65
|
82 |
+
msgid "Select location for the Google Analytics code."
|
83 |
+
msgstr "Выберите местоположение для кода Google Analytics."
|
84 |
+
|
85 |
+
#: admin/options.php:72
|
86 |
+
msgid "Use adjusted bounce rate?"
|
87 |
+
msgstr "Показатель отказов?"
|
88 |
+
|
89 |
+
#: admin/options.php:75
|
90 |
+
msgid ""
|
91 |
+
"Essentially, you set up an event which is triggered after a user spends a "
|
92 |
+
"certain amount of time on the landing page, telling Google Analytics not to "
|
93 |
+
"count these users as bounces. A user may come to your website, find all of "
|
94 |
+
"the information they need (a phone number, for example) and then leave the "
|
95 |
+
"site without visiting another page. Without adjusted bounce rate, such a "
|
96 |
+
"user would be considered a bounce, even though they had a successful "
|
97 |
+
"experience. By defining a time limit after which you can consider a user to "
|
98 |
+
"be \"engaged,\" that user would no longer count as a bounce, and you'd get a "
|
99 |
+
"more accurate idea of whether they found what they were looking for."
|
100 |
+
msgstr ""
|
101 |
+
"По сути, вы настраиваете событие, которое запускается после того, как \n"
|
102 |
+
"пользователь тратит определенное количество времени на целевую страницу, \n"
|
103 |
+
"сообщая Google Analytics не считать этих пользователей как отказы. \n"
|
104 |
+
"Пользователь может зайти на ваш сайт, найти всю необходимую информацию \n"
|
105 |
+
"(например, номер телефона), а затем покинуть сайт, не посещая другую \n"
|
106 |
+
"страницу. Без скорректированного коэффициента отказов такой пользователь \n"
|
107 |
+
"будет считаться отказом, хотя у них был успешный опыт. Определив лимит \n"
|
108 |
+
"времени, после которого вы можете считать пользователя «включенным», этот \n"
|
109 |
+
"пользователь больше не будет считаться отказом, и вы получите более точное \n"
|
110 |
+
"представление о том, нашли ли они то, что искали."
|
111 |
+
|
112 |
+
#: admin/options.php:81
|
113 |
+
msgid "Change enqueue order?"
|
114 |
+
msgstr "Сортировка скрипта?"
|
115 |
+
|
116 |
+
#: admin/options.php:84
|
117 |
+
msgid ""
|
118 |
+
"By default, Google Analytics code is loaded before other scripts and "
|
119 |
+
"javasscript code, but if you set the value to 100, the GA code will be "
|
120 |
+
"loaded after all other scripts. By changing the priority, you can set code "
|
121 |
+
"position on the page."
|
122 |
+
msgstr ""
|
123 |
+
"По умолчанию код Google Analytics загружается раньше остальных скриптов и \n"
|
124 |
+
"javasscript кода, но если вы установите к примеру значение 100, то код GA \n"
|
125 |
+
"будет загружен после всех остальных скриптов. Изменяя приоритет, вы можете \n"
|
126 |
+
"задавать положение кода на странице."
|
127 |
+
|
128 |
+
#: admin/options.php:90
|
129 |
+
msgid "Disable all display features functionality?"
|
130 |
+
msgstr "Отключить все функции для контекстно-медийной сети?"
|
131 |
+
|
132 |
+
#: admin/options.php:92
|
133 |
+
#, php-format
|
134 |
+
msgid "Disable all <a href=\"%s\">display features functionality?</a>"
|
135 |
+
msgstr "Отключить <a href=\"%s\">все функции для контекстно-медийной сети?</a>"
|
136 |
+
|
137 |
+
#: admin/options.php:99
|
138 |
+
msgid "Use Anonymize IP? (Required by law for some countries)"
|
139 |
+
msgstr ""
|
140 |
+
"Использовать анонимный IP-адрес? (Требуется по закону для некоторых стран)"
|
141 |
+
|
142 |
+
#: admin/options.php:101
|
143 |
+
#, php-format
|
144 |
+
msgid ""
|
145 |
+
"Use <a href=\"%s\">Anonymize IP?</a> (Required by law for some countries)"
|
146 |
+
msgstr ""
|
147 |
+
"Использовать <a href=\"%s\">анонимный IP-адрес?</a> (Требуется по закону "
|
148 |
+
"для \n"
|
149 |
+
"некоторых стран)"
|
150 |
+
|
151 |
+
#: admin/options.php:108 admin/options.php:110
|
152 |
+
msgid "Track logged in Administrators?"
|
153 |
+
msgstr "Отслеживать, если вы авторизованы под администратором?"
|
154 |
+
|
155 |
+
#: admin/options.php:117
|
156 |
+
msgid "Remove script from wp-cron?"
|
157 |
+
msgstr "Удалить кеширования скрипта из крона?"
|
158 |
+
|
159 |
+
#: admin/options.php:119
|
160 |
+
msgid ""
|
161 |
+
"Clearfy creates a cron job to daily update Google Analytics cache scripts. "
|
162 |
+
"After enabling this option, the plugin will not update Google Analytics "
|
163 |
+
"cache file. Do not use this option if you do not understand why you need it!"
|
164 |
+
msgstr ""
|
165 |
+
"Плагин создает cron задание, чтобы ежедневно обновлять кеш скриптов Google \n"
|
166 |
+
"Analytics. После включения этой опции, плагин не будет обновлять кэш файл \n"
|
167 |
+
"Google Analytics. Не используйте эту опцию, если вы не понимаете, для чего \n"
|
168 |
+
"вам это нужно!"
|
169 |
+
|
170 |
+
#: admin/pages/ga_cache.php:50
|
171 |
+
msgid "General"
|
172 |
+
msgstr "Основные"
|
173 |
+
|
174 |
+
#: google-analytics-cache.php:22
|
175 |
+
msgid ""
|
176 |
+
"We found that you have the \"Clearfy - disable unused features\" plugin "
|
177 |
+
"installed, this plugin already has Google Analytics cache functions, so you "
|
178 |
+
"can deactivate plugin \"Google Analytics Cache\"!"
|
179 |
+
msgstr ""
|
180 |
+
"Мы обнаружили, что у вас установлен плагин «Clearfy - отключить \n"
|
181 |
+
"неиспользуемые функции», этот плагин уже имеет функцию кеширования Google "
|
182 |
+
"Analytics, поэтому вы можете отключить плагин «Google Analytics Cache»!"
|
183 |
+
|
184 |
+
#: google-analytics-cache.php:50
|
185 |
+
msgid "Webcraftic Google Analytics Cache"
|
186 |
+
msgstr ""
|
187 |
+
|
188 |
+
#: includes/classes/class.configurate-ga.php:40
|
189 |
+
msgid "Once Weekly"
|
190 |
+
msgstr ""
|
191 |
+
|
192 |
+
#: includes/classes/class.configurate-ga.php:45
|
193 |
+
msgid "Twice Monthly"
|
194 |
+
msgstr ""
|
195 |
+
|
196 |
+
#: includes/classes/class.configurate-ga.php:50
|
197 |
+
msgid "Once Monthly"
|
198 |
+
msgstr ""
|
libs/factory/adverts/boot.php
CHANGED
@@ -1,50 +1,50 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
use WBCR\
|
4 |
-
|
5 |
-
/**
|
6 |
-
* Factory Adverts
|
7 |
-
*
|
8 |
-
* @author Alexander Vitkalov <nechin.va@gmail.com>
|
9 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
10 |
-
* @since 1.0.0
|
11 |
-
*
|
12 |
-
* @package factory-ad-inserter
|
13 |
-
* @copyright (c) 2019, Webcraftic Ltd
|
14 |
-
*
|
15 |
-
* @version 1.2.3
|
16 |
-
*/
|
17 |
-
|
18 |
-
// Exit if accessed directly
|
19 |
-
if
|
20 |
-
exit;
|
21 |
-
}
|
22 |
-
|
23 |
-
if
|
24 |
-
return;
|
25 |
-
}
|
26 |
-
|
27 |
-
# Устанавливаем константу, что модуль уже загружен
|
28 |
-
define(
|
29 |
-
|
30 |
-
# Устанавливаем версию модуля
|
31 |
-
define(
|
32 |
-
|
33 |
-
# Регистрируем тектовый домен, для интернализации интерфейса модуля
|
34 |
-
load_plugin_textdomain(
|
35 |
-
|
36 |
-
# Устанавливаем директорию модуля
|
37 |
-
define(
|
38 |
-
|
39 |
-
# Устанавливаем url модуля
|
40 |
-
define(
|
41 |
-
|
42 |
-
require_once(
|
43 |
-
require_once(
|
44 |
-
|
45 |
-
/**
|
46 |
-
* @param
|
47 |
-
*/
|
48 |
-
add_action(
|
49 |
-
$plugin->set_adverts_manager(
|
50 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
use WBCR\Factory_Adverts_124\Base;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Factory Adverts
|
7 |
+
*
|
8 |
+
* @author Alexander Vitkalov <nechin.va@gmail.com>
|
9 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
10 |
+
* @since 1.0.0
|
11 |
+
*
|
12 |
+
* @package factory-ad-inserter
|
13 |
+
* @copyright (c) 2019, Webcraftic Ltd
|
14 |
+
*
|
15 |
+
* @version 1.2.3
|
16 |
+
*/
|
17 |
+
|
18 |
+
// Exit if accessed directly
|
19 |
+
if( !defined('ABSPATH') ) {
|
20 |
+
exit;
|
21 |
+
}
|
22 |
+
|
23 |
+
if( defined('FACTORY_ADVERTS_124_LOADED') || (defined('FACTORY_ADVERTS_BLOCK') && FACTORY_ADVERTS_BLOCK) ) {
|
24 |
+
return;
|
25 |
+
}
|
26 |
+
|
27 |
+
# Устанавливаем константу, что модуль уже загружен
|
28 |
+
define('FACTORY_ADVERTS_124_LOADED', true);
|
29 |
+
|
30 |
+
# Устанавливаем версию модуля
|
31 |
+
define('FACTORY_ADVERTS_124_VERSION', '1.2.4');
|
32 |
+
|
33 |
+
# Регистрируем тектовый домен, для интернализации интерфейса модуля
|
34 |
+
load_plugin_textdomain('wbcr_factory_adverts_124', false, dirname(plugin_basename(__FILE__)) . '/langs');
|
35 |
+
|
36 |
+
# Устанавливаем директорию модуля
|
37 |
+
define('FACTORY_ADVERTS_124_DIR', dirname(__FILE__));
|
38 |
+
|
39 |
+
# Устанавливаем url модуля
|
40 |
+
define('FACTORY_ADVERTS_124_URL', plugins_url(null, __FILE__));
|
41 |
+
|
42 |
+
require_once(FACTORY_ADVERTS_124_DIR . '/includes/class-rest-request.php');
|
43 |
+
require_once(FACTORY_ADVERTS_124_DIR . '/includes/class-base.php');
|
44 |
+
|
45 |
+
/**
|
46 |
+
* @param Wbcr_Factory446_Plugin $plugin
|
47 |
+
*/
|
48 |
+
add_action('wbcr_factory_adverts_124_plugin_created', function ($plugin) {
|
49 |
+
$plugin->set_adverts_manager("WBCR\Factory_Adverts_124\Base");
|
50 |
+
});
|
libs/factory/adverts/includes/class-base.php
CHANGED
@@ -1,319 +1,319 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace WBCR\
|
4 |
-
|
5 |
-
// Exit if accessed directly
|
6 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
7 |
-
exit;
|
8 |
-
}
|
9 |
-
|
10 |
-
/**
|
11 |
-
* Base class for adverts module.
|
12 |
-
*
|
13 |
-
* Contains methods for retrieving banner data for a specific position.
|
14 |
-
* With this class user cat get advert content for a specific position.
|
15 |
-
* This class use functional design pattern.
|
16 |
-
*
|
17 |
-
* @author Alexander Vitkalov <nechin.va@gmail.com>
|
18 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
19 |
-
*
|
20 |
-
* @since 1.0.0 Added
|
21 |
-
* @package factory-adverts
|
22 |
-
* @copyright (c) 2019 Webcraftic Ltd
|
23 |
-
*/
|
24 |
-
class Base {
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Экзепляр плагина с которым взаимодействует этот модуль
|
28 |
-
*
|
29 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
30 |
-
* @since 1.0.1
|
31 |
-
* @var \
|
32 |
-
*/
|
33 |
-
private $plugin;
|
34 |
-
|
35 |
-
/*
|
36 |
-
* Contain array data with the plugin information and the module settings.
|
37 |
-
* Mainly used to get the name of the plugin and how to get the adverts blocks.
|
38 |
-
*
|
39 |
-
* @since 1.0.0 Added
|
40 |
-
*
|
41 |
-
* @var array Example: array(
|
42 |
-
* 'dashboard_widget' => true,
|
43 |
-
* 'right_sidebar' => true,
|
44 |
-
* 'notice' => true,
|
45 |
-
* ...
|
46 |
-
* )
|
47 |
-
*
|
48 |
-
*/
|
49 |
-
private $settings = [];
|
50 |
-
|
51 |
-
/**
|
52 |
-
* Экземпляр класса для работы API CreativeMotion
|
53 |
-
*
|
54 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
55 |
-
* @since 1.0.1
|
56 |
-
* @var \WBCR\
|
57 |
-
*/
|
58 |
-
private $api;
|
59 |
-
|
60 |
-
/**
|
61 |
-
* Сохраняем уже полученные данные, для объектного кеширования
|
62 |
-
*
|
63 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
64 |
-
* @since 1.0.1
|
65 |
-
* @var array
|
66 |
-
*/
|
67 |
-
private $placements = [];
|
68 |
-
|
69 |
-
/**
|
70 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
71 |
-
* @since 1.0.1
|
72 |
-
* @var array
|
73 |
-
*/
|
74 |
-
private $errors = [];
|
75 |
-
|
76 |
-
/**
|
77 |
-
* Wbcr_Factory_Adinserter constructor.
|
78 |
-
*
|
79 |
-
* - Store plugin information and settings.
|
80 |
-
* - Add filter and actions.
|
81 |
-
* - Include dashboard widget.
|
82 |
-
*
|
83 |
-
* @since 1.0.0 Added
|
84 |
-
*
|
85 |
-
* @param \
|
86 |
-
*/
|
87 |
-
public function __construct( \
|
88 |
-
$this->plugin = $plugin;
|
89 |
-
|
90 |
-
$this->settings = wp_parse_args( $settings, [
|
91 |
-
'dashboard_widget' => false, // show dashboard widget (default: false)
|
92 |
-
'right_sidebar' => false, // show adverts sidebar (default: false)
|
93 |
-
'notice' => false, // show notice message (default: false),
|
94 |
-
'business_suggetion' => false,
|
95 |
-
'support' => false
|
96 |
-
] );
|
97 |
-
|
98 |
-
$this->api = new Creative_Motion_API( $this->plugin );
|
99 |
-
|
100 |
-
add_filter( 'wbcr/factory/pages/impressive/widgets', [ $this, 'register_plugin_widgets' ], 10, 3 );
|
101 |
-
add_action( 'wbcr/factory/admin_notices', [ $this, 'register_plugin_notice' ], 10, 2 );
|
102 |
-
add_action( 'current_screen', [ $this, 'register_dashboard_widget' ], 10, 2 );
|
103 |
-
}
|
104 |
-
|
105 |
-
/**
|
106 |
-
* Directly get advert content for selected position.
|
107 |
-
*
|
108 |
-
* @since 1.0.1 Rename method. Content should now be printed.
|
109 |
-
* @since 1.0.0 Added
|
110 |
-
*
|
111 |
-
* @param string $position Custom position name
|
112 |
-
*
|
113 |
-
* @return void
|
114 |
-
*/
|
115 |
-
public function render_placement( $position = 'right_sidebar' ) {
|
116 |
-
$content = '';
|
117 |
-
|
118 |
-
if ( $position ) {
|
119 |
-
$content = $this->get_content( $position );
|
120 |
-
}
|
121 |
-
|
122 |
-
echo $content;
|
123 |
-
}
|
124 |
-
|
125 |
-
/**
|
126 |
-
* Register widgets.
|
127 |
-
*
|
128 |
-
* Depending on the settings, register new widgets.
|
129 |
-
*
|
130 |
-
* @since 1.0.0 Added
|
131 |
-
*
|
132 |
-
* @param array $widgets Already existing registered widgets
|
133 |
-
* @param string $position Position for the widget
|
134 |
-
* @param string $plugin Plugin object for which the hook is run
|
135 |
-
*
|
136 |
-
* @return array array(
|
137 |
-
* 'adverts_widget' => '<p></p>',
|
138 |
-
* 'business_suggetion' => '<p></p>',
|
139 |
-
* 'support' => '<p></p>',
|
140 |
-
* ...
|
141 |
-
* )
|
142 |
-
*/
|
143 |
-
public function register_plugin_widgets( $widgets, $position, $plugin ) {
|
144 |
-
if ( $plugin->getPluginName() == $this->plugin->getPluginName() && 'right' == $position ) {
|
145 |
-
|
146 |
-
if ( $this->settings['right_sidebar'] ) {
|
147 |
-
$content = $this->get_content( 'right_sidebar' );
|
148 |
-
$widgets['adverts_widget'] = $content;
|
149 |
-
|
150 |
-
if ( empty( $widgets['adverts_widget'] ) ) {
|
151 |
-
if ( defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
|
152 |
-
$debug_message = '<div style="background: #fff4f1;padding: 10px;color: #a58074;">';
|
153 |
-
$debug_message .= $this->get_debug_message( 'right_sidebar' );
|
154 |
-
$debug_message .= '</div>';
|
155 |
-
|
156 |
-
$widgets['adverts_widget'] = $debug_message;
|
157 |
-
} else {
|
158 |
-
unset( $widgets['adverts_widget'] );
|
159 |
-
}
|
160 |
-
}
|
161 |
-
}
|
162 |
-
|
163 |
-
if ( $this->settings['business_suggetion'] ) {
|
164 |
-
$content = $this->get_content( 'business_suggetion' );
|
165 |
-
|
166 |
-
if ( ! empty( $content ) ) {
|
167 |
-
$widgets['business_suggetion'] = $content;
|
168 |
-
}
|
169 |
-
}
|
170 |
-
|
171 |
-
if ( $this->settings['support'] ) {
|
172 |
-
$content = $this->get_content( 'support' );
|
173 |
-
|
174 |
-
if ( ! empty( $content ) ) {
|
175 |
-
$widgets['support'] = $content;
|
176 |
-
}
|
177 |
-
}
|
178 |
-
}
|
179 |
-
|
180 |
-
return $widgets;
|
181 |
-
}
|
182 |
-
|
183 |
-
/**
|
184 |
-
* Регистрирует уведомление для текущего плагина
|
185 |
-
*
|
186 |
-
* Мы добавляем уведомления в массив всех уведомлений плагина с ключем 'adverts_notice',
|
187 |
-
* то есть если другие плагины, тоже добавят свои рекламные уведомления, они просто
|
188 |
-
* будут перезаписывать друг друга, в итоге будет отображено только одно рекламное
|
189 |
-
* уведомеление. Это нужно для того, чтобы ограничить пользователя от спама.
|
190 |
-
*
|
191 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
192 |
-
*
|
193 |
-
* @since 1.0.1 Переделан полностью под интферфейс фреймворка. Используем встроенную систему уведомлений.
|
194 |
-
* @since 1.0.0 Added
|
195 |
-
*
|
196 |
-
* @param array $notices Массив со списком всех уведомлений, которые будут напечатыны в админ панели
|
197 |
-
* @param string $plugin_name Имя плагина, передано для того, чтобы выводить уведомления условно, только для конкретного плагина
|
198 |
-
*/
|
199 |
-
public function register_plugin_notice( $notices, $plugin_name ) {
|
200 |
-
if ( $plugin_name !== $this->plugin->getPluginName() ) {
|
201 |
-
return $notices;
|
202 |
-
}
|
203 |
-
|
204 |
-
if ( $this->settings['notice'] ) {
|
205 |
-
$notice_content = $this->get_content( 'notice' );
|
206 |
-
|
207 |
-
if ( empty( $notice_content ) ) {
|
208 |
-
# Информация для отладки
|
209 |
-
if ( defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
|
210 |
-
$debug_message = $this->get_debug_message( 'notice' );
|
211 |
-
|
212 |
-
$notices['adverts_notice'] = [
|
213 |
-
'id' => 'adverts_debug',
|
214 |
-
'type' => 'error',
|
215 |
-
'dismissible' => false,
|
216 |
-
'dismiss_expires' => 0,
|
217 |
-
'text' => '<p><b>' . $this->plugin->getPluginTitle() . '</b>:<br>' . $debug_message . '</p>'
|
218 |
-
];
|
219 |
-
}
|
220 |
-
|
221 |
-
return $notices;
|
222 |
-
}
|
223 |
-
|
224 |
-
$hash = md5( $notice_content );
|
225 |
-
|
226 |
-
$notices['adverts_notice'] = [
|
227 |
-
'id' => 'adverts_' . $hash,
|
228 |
-
'type' => 'success',
|
229 |
-
'dismissible' => true,
|
230 |
-
'dismiss_expires' => 0,
|
231 |
-
'text' => '<p><b>' . $this->plugin->getPluginTitle() . '</b>:<br>' . $notice_content . '</p>'
|
232 |
-
];
|
233 |
-
}
|
234 |
-
|
235 |
-
return $notices;
|
236 |
-
}
|
237 |
-
|
238 |
-
/**
|
239 |
-
* Include dashboard widget
|
240 |
-
*
|
241 |
-
* Include functionality the output of the widget on the dashboard.
|
242 |
-
* Only one dashboard widget must be shown for some plugins with this setting (dashboard_widget).
|
243 |
-
*
|
244 |
-
* @since 1.0.0 Added
|
245 |
-
*/
|
246 |
-
public function register_dashboard_widget() {
|
247 |
-
if ( $this->settings['dashboard_widget'] && current_user_can( 'manage_options' ) ) {
|
248 |
-
$current_screen = get_current_screen();
|
249 |
-
|
250 |
-
if ( ! in_array( $current_screen->id, [ 'dashboard', 'dashboard-network' ] ) ) {
|
251 |
-
return;
|
252 |
-
}
|
253 |
-
|
254 |
-
$content = $this->get_content( 'dashboard_widget' );
|
255 |
-
|
256 |
-
if ( empty( $content ) && defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
|
257 |
-
$content = $this->get_debug_message( 'dashboard_widget' );
|
258 |
-
}
|
259 |
-
|
260 |
-
require_once
|
261 |
-
new Dashboard_Widget( $this->plugin, $content );
|
262 |
-
}
|
263 |
-
}
|
264 |
-
|
265 |
-
/**
|
266 |
-
* Позволяет получить сообщение об ошибках
|
267 |
-
*
|
268 |
-
* Метод проверяет последние ошибки, которые могли произойти в результате api запроса.
|
269 |
-
* Если ошибки есть, он выводит предупреждение и список последних ошибок. Если ошибок нет,
|
270 |
-
* метод вернет просто предупреждение, что реклама не настроена.
|
271 |
-
*
|
272 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
273 |
-
* @since 1.0.1
|
274 |
-
*
|
275 |
-
* @param string $position Position for the widget
|
276 |
-
*
|
277 |
-
* @return string Возвращает сообщение с последниеми ошибками для отладки
|
278 |
-
*/
|
279 |
-
private function get_debug_message( $position ) {
|
280 |
-
$debug_massage = 'Plugin ads not configured or server unavailable. See full error report below.<br>';
|
281 |
-
|
282 |
-
if ( isset( $this->errors[ $position ] ) && ! empty( $this->errors ) ) {
|
283 |
-
$debug_massage .= '<b>Last errors:</b><br>';
|
284 |
-
foreach ( $this->errors[ $position ] as $error_code => $error_message ) {
|
285 |
-
$debug_massage .= 'Code: ' . $error_code . ' Error: ' . $error_message . '<br>';
|
286 |
-
}
|
287 |
-
}
|
288 |
-
|
289 |
-
return $debug_massage;
|
290 |
-
}
|
291 |
-
|
292 |
-
/**
|
293 |
-
* Get advert content for selected position.
|
294 |
-
*
|
295 |
-
* @since 1.0.1 Полностью переписан
|
296 |
-
* @since 1.0.0 Added
|
297 |
-
*
|
298 |
-
* @param string $position The position for advert
|
299 |
-
*
|
300 |
-
* @return string
|
301 |
-
*/
|
302 |
-
private function get_content( $position ) {
|
303 |
-
if ( isset( $this->placements[ $position ] ) ) {
|
304 |
-
return $this->placements[ $position ];
|
305 |
-
}
|
306 |
-
|
307 |
-
$content = $this->api->get_content( $position );
|
308 |
-
|
309 |
-
if ( is_wp_error( $content ) ) {
|
310 |
-
$this->errors[ $position ][ $content->get_error_code() ] = $content->get_error_message();
|
311 |
-
|
312 |
-
return null;
|
313 |
-
}
|
314 |
-
|
315 |
-
$this->placements[ $position ] = $content;
|
316 |
-
|
317 |
-
return $content;
|
318 |
-
}
|
319 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WBCR\Factory_Adverts_124;
|
4 |
+
|
5 |
+
// Exit if accessed directly
|
6 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
7 |
+
exit;
|
8 |
+
}
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Base class for adverts module.
|
12 |
+
*
|
13 |
+
* Contains methods for retrieving banner data for a specific position.
|
14 |
+
* With this class user cat get advert content for a specific position.
|
15 |
+
* This class use functional design pattern.
|
16 |
+
*
|
17 |
+
* @author Alexander Vitkalov <nechin.va@gmail.com>
|
18 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
19 |
+
*
|
20 |
+
* @since 1.0.0 Added
|
21 |
+
* @package factory-adverts
|
22 |
+
* @copyright (c) 2019 Webcraftic Ltd
|
23 |
+
*/
|
24 |
+
class Base {
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Экзепляр плагина с которым взаимодействует этот модуль
|
28 |
+
*
|
29 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
30 |
+
* @since 1.0.1
|
31 |
+
* @var \Wbcr_Factory446_Plugin
|
32 |
+
*/
|
33 |
+
private $plugin;
|
34 |
+
|
35 |
+
/*
|
36 |
+
* Contain array data with the plugin information and the module settings.
|
37 |
+
* Mainly used to get the name of the plugin and how to get the adverts blocks.
|
38 |
+
*
|
39 |
+
* @since 1.0.0 Added
|
40 |
+
*
|
41 |
+
* @var array Example: array(
|
42 |
+
* 'dashboard_widget' => true,
|
43 |
+
* 'right_sidebar' => true,
|
44 |
+
* 'notice' => true,
|
45 |
+
* ...
|
46 |
+
* )
|
47 |
+
*
|
48 |
+
*/
|
49 |
+
private $settings = [];
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Экземпляр класса для работы API CreativeMotion
|
53 |
+
*
|
54 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
55 |
+
* @since 1.0.1
|
56 |
+
* @var \WBCR\Factory_Adverts_124\Creative_Motion_API
|
57 |
+
*/
|
58 |
+
private $api;
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Сохраняем уже полученные данные, для объектного кеширования
|
62 |
+
*
|
63 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
64 |
+
* @since 1.0.1
|
65 |
+
* @var array
|
66 |
+
*/
|
67 |
+
private $placements = [];
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
71 |
+
* @since 1.0.1
|
72 |
+
* @var array
|
73 |
+
*/
|
74 |
+
private $errors = [];
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Wbcr_Factory_Adinserter constructor.
|
78 |
+
*
|
79 |
+
* - Store plugin information and settings.
|
80 |
+
* - Add filter and actions.
|
81 |
+
* - Include dashboard widget.
|
82 |
+
*
|
83 |
+
* @since 1.0.0 Added
|
84 |
+
*
|
85 |
+
* @param \Wbcr_Factory446_Plugin $plugin
|
86 |
+
*/
|
87 |
+
public function __construct( \Wbcr_Factory446_Plugin $plugin, $settings ) {
|
88 |
+
$this->plugin = $plugin;
|
89 |
+
|
90 |
+
$this->settings = wp_parse_args( $settings, [
|
91 |
+
'dashboard_widget' => false, // show dashboard widget (default: false)
|
92 |
+
'right_sidebar' => false, // show adverts sidebar (default: false)
|
93 |
+
'notice' => false, // show notice message (default: false),
|
94 |
+
'business_suggetion' => false,
|
95 |
+
'support' => false
|
96 |
+
] );
|
97 |
+
|
98 |
+
$this->api = new Creative_Motion_API( $this->plugin );
|
99 |
+
|
100 |
+
add_filter( 'wbcr/factory/pages/impressive/widgets', [ $this, 'register_plugin_widgets' ], 10, 3 );
|
101 |
+
add_action( 'wbcr/factory/admin_notices', [ $this, 'register_plugin_notice' ], 10, 2 );
|
102 |
+
add_action( 'current_screen', [ $this, 'register_dashboard_widget' ], 10, 2 );
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Directly get advert content for selected position.
|
107 |
+
*
|
108 |
+
* @since 1.0.1 Rename method. Content should now be printed.
|
109 |
+
* @since 1.0.0 Added
|
110 |
+
*
|
111 |
+
* @param string $position Custom position name
|
112 |
+
*
|
113 |
+
* @return void
|
114 |
+
*/
|
115 |
+
public function render_placement( $position = 'right_sidebar' ) {
|
116 |
+
$content = '';
|
117 |
+
|
118 |
+
if ( $position ) {
|
119 |
+
$content = $this->get_content( $position );
|
120 |
+
}
|
121 |
+
|
122 |
+
echo $content;
|
123 |
+
}
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Register widgets.
|
127 |
+
*
|
128 |
+
* Depending on the settings, register new widgets.
|
129 |
+
*
|
130 |
+
* @since 1.0.0 Added
|
131 |
+
*
|
132 |
+
* @param array $widgets Already existing registered widgets
|
133 |
+
* @param string $position Position for the widget
|
134 |
+
* @param string $plugin Plugin object for which the hook is run
|
135 |
+
*
|
136 |
+
* @return array array(
|
137 |
+
* 'adverts_widget' => '<p></p>',
|
138 |
+
* 'business_suggetion' => '<p></p>',
|
139 |
+
* 'support' => '<p></p>',
|
140 |
+
* ...
|
141 |
+
* )
|
142 |
+
*/
|
143 |
+
public function register_plugin_widgets( $widgets, $position, $plugin ) {
|
144 |
+
if ( $plugin->getPluginName() == $this->plugin->getPluginName() && 'right' == $position ) {
|
145 |
+
|
146 |
+
if ( $this->settings['right_sidebar'] ) {
|
147 |
+
$content = $this->get_content( 'right_sidebar' );
|
148 |
+
$widgets['adverts_widget'] = $content;
|
149 |
+
|
150 |
+
if ( empty( $widgets['adverts_widget'] ) ) {
|
151 |
+
if ( defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
|
152 |
+
$debug_message = '<div style="background: #fff4f1;padding: 10px;color: #a58074;">';
|
153 |
+
$debug_message .= $this->get_debug_message( 'right_sidebar' );
|
154 |
+
$debug_message .= '</div>';
|
155 |
+
|
156 |
+
$widgets['adverts_widget'] = $debug_message;
|
157 |
+
} else {
|
158 |
+
unset( $widgets['adverts_widget'] );
|
159 |
+
}
|
160 |
+
}
|
161 |
+
}
|
162 |
+
|
163 |
+
if ( $this->settings['business_suggetion'] ) {
|
164 |
+
$content = $this->get_content( 'business_suggetion' );
|
165 |
+
|
166 |
+
if ( ! empty( $content ) ) {
|
167 |
+
$widgets['business_suggetion'] = $content;
|
168 |
+
}
|
169 |
+
}
|
170 |
+
|
171 |
+
if ( $this->settings['support'] ) {
|
172 |
+
$content = $this->get_content( 'support' );
|
173 |
+
|
174 |
+
if ( ! empty( $content ) ) {
|
175 |
+
$widgets['support'] = $content;
|
176 |
+
}
|
177 |
+
}
|
178 |
+
}
|
179 |
+
|
180 |
+
return $widgets;
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Регистрирует уведомление для текущего плагина
|
185 |
+
*
|
186 |
+
* Мы добавляем уведомления в массив всех уведомлений плагина с ключем 'adverts_notice',
|
187 |
+
* то есть если другие плагины, тоже добавят свои рекламные уведомления, они просто
|
188 |
+
* будут перезаписывать друг друга, в итоге будет отображено только одно рекламное
|
189 |
+
* уведомеление. Это нужно для того, чтобы ограничить пользователя от спама.
|
190 |
+
*
|
191 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
192 |
+
*
|
193 |
+
* @since 1.0.1 Переделан полностью под интферфейс фреймворка. Используем встроенную систему уведомлений.
|
194 |
+
* @since 1.0.0 Added
|
195 |
+
*
|
196 |
+
* @param array $notices Массив со списком всех уведомлений, которые будут напечатыны в админ панели
|
197 |
+
* @param string $plugin_name Имя плагина, передано для того, чтобы выводить уведомления условно, только для конкретного плагина
|
198 |
+
*/
|
199 |
+
public function register_plugin_notice( $notices, $plugin_name ) {
|
200 |
+
if ( $plugin_name !== $this->plugin->getPluginName() ) {
|
201 |
+
return $notices;
|
202 |
+
}
|
203 |
+
|
204 |
+
if ( $this->settings['notice'] ) {
|
205 |
+
$notice_content = $this->get_content( 'notice' );
|
206 |
+
|
207 |
+
if ( empty( $notice_content ) ) {
|
208 |
+
# Информация для отладки
|
209 |
+
if ( defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
|
210 |
+
$debug_message = $this->get_debug_message( 'notice' );
|
211 |
+
|
212 |
+
$notices['adverts_notice'] = [
|
213 |
+
'id' => 'adverts_debug',
|
214 |
+
'type' => 'error',
|
215 |
+
'dismissible' => false,
|
216 |
+
'dismiss_expires' => 0,
|
217 |
+
'text' => '<p><b>' . $this->plugin->getPluginTitle() . '</b>:<br>' . $debug_message . '</p>'
|
218 |
+
];
|
219 |
+
}
|
220 |
+
|
221 |
+
return $notices;
|
222 |
+
}
|
223 |
+
|
224 |
+
$hash = md5( $notice_content );
|
225 |
+
|
226 |
+
$notices['adverts_notice'] = [
|
227 |
+
'id' => 'adverts_' . $hash,
|
228 |
+
'type' => 'success',
|
229 |
+
'dismissible' => true,
|
230 |
+
'dismiss_expires' => 0,
|
231 |
+
'text' => '<p><b>' . $this->plugin->getPluginTitle() . '</b>:<br>' . $notice_content . '</p>'
|
232 |
+
];
|
233 |
+
}
|
234 |
+
|
235 |
+
return $notices;
|
236 |
+
}
|
237 |
+
|
238 |
+
/**
|
239 |
+
* Include dashboard widget
|
240 |
+
*
|
241 |
+
* Include functionality the output of the widget on the dashboard.
|
242 |
+
* Only one dashboard widget must be shown for some plugins with this setting (dashboard_widget).
|
243 |
+
*
|
244 |
+
* @since 1.0.0 Added
|
245 |
+
*/
|
246 |
+
public function register_dashboard_widget() {
|
247 |
+
if ( $this->settings['dashboard_widget'] && current_user_can( 'manage_options' ) ) {
|
248 |
+
$current_screen = get_current_screen();
|
249 |
+
|
250 |
+
if ( ! in_array( $current_screen->id, [ 'dashboard', 'dashboard-network' ] ) ) {
|
251 |
+
return;
|
252 |
+
}
|
253 |
+
|
254 |
+
$content = $this->get_content( 'dashboard_widget' );
|
255 |
+
|
256 |
+
if ( empty( $content ) && defined( 'FACTORY_ADVERTS_DEBUG' ) && FACTORY_ADVERTS_DEBUG ) {
|
257 |
+
$content = $this->get_debug_message( 'dashboard_widget' );
|
258 |
+
}
|
259 |
+
|
260 |
+
require_once FACTORY_ADVERTS_124_DIR . '/includes/class-dashboard-widget.php';
|
261 |
+
new Dashboard_Widget( $this->plugin, $content );
|
262 |
+
}
|
263 |
+
}
|
264 |
+
|
265 |
+
/**
|
266 |
+
* Позволяет получить сообщение об ошибках
|
267 |
+
*
|
268 |
+
* Метод проверяет последние ошибки, которые могли произойти в результате api запроса.
|
269 |
+
* Если ошибки есть, он выводит предупреждение и список последних ошибок. Если ошибок нет,
|
270 |
+
* метод вернет просто предупреждение, что реклама не настроена.
|
271 |
+
*
|
272 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
273 |
+
* @since 1.0.1
|
274 |
+
*
|
275 |
+
* @param string $position Position for the widget
|
276 |
+
*
|
277 |
+
* @return string Возвращает сообщение с последниеми ошибками для отладки
|
278 |
+
*/
|
279 |
+
private function get_debug_message( $position ) {
|
280 |
+
$debug_massage = 'Plugin ads not configured or server unavailable. See full error report below.<br>';
|
281 |
+
|
282 |
+
if ( isset( $this->errors[ $position ] ) && ! empty( $this->errors ) ) {
|
283 |
+
$debug_massage .= '<b>Last errors:</b><br>';
|
284 |
+
foreach ( $this->errors[ $position ] as $error_code => $error_message ) {
|
285 |
+
$debug_massage .= 'Code: ' . $error_code . ' Error: ' . $error_message . '<br>';
|
286 |
+
}
|
287 |
+
}
|
288 |
+
|
289 |
+
return $debug_massage;
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Get advert content for selected position.
|
294 |
+
*
|
295 |
+
* @since 1.0.1 Полностью переписан
|
296 |
+
* @since 1.0.0 Added
|
297 |
+
*
|
298 |
+
* @param string $position The position for advert
|
299 |
+
*
|
300 |
+
* @return string
|
301 |
+
*/
|
302 |
+
private function get_content( $position ) {
|
303 |
+
if ( isset( $this->placements[ $position ] ) ) {
|
304 |
+
return $this->placements[ $position ];
|
305 |
+
}
|
306 |
+
|
307 |
+
$content = $this->api->get_content( $position );
|
308 |
+
|
309 |
+
if ( is_wp_error( $content ) ) {
|
310 |
+
$this->errors[ $position ][ $content->get_error_code() ] = $content->get_error_message();
|
311 |
+
|
312 |
+
return null;
|
313 |
+
}
|
314 |
+
|
315 |
+
$this->placements[ $position ] = $content;
|
316 |
+
|
317 |
+
return $content;
|
318 |
+
}
|
319 |
+
}
|
libs/factory/adverts/includes/class-dashboard-widget.php
CHANGED
@@ -1,125 +1,125 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace WBCR\
|
4 |
-
|
5 |
-
// Exit if accessed directly
|
6 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
7 |
-
exit;
|
8 |
-
}
|
9 |
-
|
10 |
-
/**
|
11 |
-
* Adverts Dashboard Widget.
|
12 |
-
*
|
13 |
-
* Adds a widget with a banner or a list of news.
|
14 |
-
*
|
15 |
-
* @author Alexander Vitkalov <nechin.va@gmail.com>
|
16 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
17 |
-
*
|
18 |
-
* @since 1.0.0 Added
|
19 |
-
* @package factory-adverts
|
20 |
-
* @copyright (c) 2019 Webcraftic Ltd
|
21 |
-
*/
|
22 |
-
class Dashboard_Widget {
|
23 |
-
|
24 |
-
/**
|
25 |
-
* Контент, который должен быть напечатан внутри дашбоард виджета
|
26 |
-
*
|
27 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
28 |
-
* @since 1.0.1
|
29 |
-
* @var string
|
30 |
-
*/
|
31 |
-
private $content;
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Экзепляр плагина с которым взаимодействует этот модуль
|
35 |
-
*
|
36 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
37 |
-
* @since 1.0.1
|
38 |
-
* @var \
|
39 |
-
*/
|
40 |
-
private $plugin;
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Dashboard_Widget constructor.
|
44 |
-
*
|
45 |
-
* Call parent constructor. Registration hooks.
|
46 |
-
*
|
47 |
-
* @since 1.0.0 Added
|
48 |
-
*
|
49 |
-
* @param \
|
50 |
-
* @param string $content
|
51 |
-
*/
|
52 |
-
public function __construct( \
|
53 |
-
|
54 |
-
$this->plugin = $plugin;
|
55 |
-
$this->content = $content;
|
56 |
-
|
57 |
-
if ( ! empty( $this->content ) ) {
|
58 |
-
if ( $this->plugin->isNetworkActive() && $this->plugin->isNetworkAdmin() ) {
|
59 |
-
add_action( 'wp_network_dashboard_setup', [ $this, 'add_dashboard_widgets' ], 999 );
|
60 |
-
|
61 |
-
return;
|
62 |
-
}
|
63 |
-
|
64 |
-
add_action( 'wp_dashboard_setup', [ $this, 'add_dashboard_widgets' ], 999 );
|
65 |
-
}
|
66 |
-
}
|
67 |
-
|
68 |
-
/**
|
69 |
-
* Add the News widget to the dashboard.
|
70 |
-
*
|
71 |
-
* @since 1.0.0 Added
|
72 |
-
*/
|
73 |
-
public function add_dashboard_widgets() {
|
74 |
-
$widget_id = 'wbcr-factory-adverts-widget';
|
75 |
-
|
76 |
-
wp_add_dashboard_widget( $widget_id, $this->plugin->getPluginTitle() . ' News', [
|
77 |
-
$this,
|
78 |
-
'print_widget_content'
|
79 |
-
] );
|
80 |
-
|
81 |
-
$this->sort_dashboard_widgets( $widget_id );
|
82 |
-
}
|
83 |
-
|
84 |
-
/**
|
85 |
-
* Create the function to output the contents of the Dashboard Widget.
|
86 |
-
*
|
87 |
-
* @since 1.0.0 Added
|
88 |
-
*/
|
89 |
-
public function print_widget_content() {
|
90 |
-
?>
|
91 |
-
<div class="wordpress-news hide-if-no-js">
|
92 |
-
<div class="rss-widget">
|
93 |
-
<?php echo $this->content; ?>
|
94 |
-
</div>
|
95 |
-
</div>
|
96 |
-
<?php
|
97 |
-
|
98 |
-
}
|
99 |
-
|
100 |
-
/**
|
101 |
-
* Сортируем виджеты на странице дашбоард
|
102 |
-
*
|
103 |
-
* Виджеты должны быть в таком порядке, чтобы наш виджет был выше всех.
|
104 |
-
*
|
105 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
106 |
-
* @author Alexander Vitkalov <nechin.va@gmail.com>
|
107 |
-
*
|
108 |
-
* @since 1.0.2 Добавлена поддержка мультисайтов
|
109 |
-
* @since 1.0.0 Добавлен
|
110 |
-
*
|
111 |
-
* @param string $widget_id ID нашего виджета
|
112 |
-
*/
|
113 |
-
private function sort_dashboard_widgets( $widget_id ) {
|
114 |
-
global $wp_meta_boxes;
|
115 |
-
|
116 |
-
$location = $this->plugin->isNetworkAdmin() ? 'dashboard-network' : 'dashboard';
|
117 |
-
|
118 |
-
$normal_core = $wp_meta_boxes[ $location ]['normal']['core'];
|
119 |
-
$widget_backup = [ $widget_id => $normal_core[ $widget_id ] ];
|
120 |
-
unset( $normal_core[ $widget_id ] );
|
121 |
-
$sorted_core = array_merge( $widget_backup, $normal_core );
|
122 |
-
|
123 |
-
$wp_meta_boxes['dashboard']['normal']['core'] = $sorted_core;
|
124 |
-
}
|
125 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WBCR\Factory_Adverts_124;
|
4 |
+
|
5 |
+
// Exit if accessed directly
|
6 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
7 |
+
exit;
|
8 |
+
}
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Adverts Dashboard Widget.
|
12 |
+
*
|
13 |
+
* Adds a widget with a banner or a list of news.
|
14 |
+
*
|
15 |
+
* @author Alexander Vitkalov <nechin.va@gmail.com>
|
16 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
17 |
+
*
|
18 |
+
* @since 1.0.0 Added
|
19 |
+
* @package factory-adverts
|
20 |
+
* @copyright (c) 2019 Webcraftic Ltd
|
21 |
+
*/
|
22 |
+
class Dashboard_Widget {
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Контент, который должен быть напечатан внутри дашбоард виджета
|
26 |
+
*
|
27 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
28 |
+
* @since 1.0.1
|
29 |
+
* @var string
|
30 |
+
*/
|
31 |
+
private $content;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Экзепляр плагина с которым взаимодействует этот модуль
|
35 |
+
*
|
36 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
37 |
+
* @since 1.0.1
|
38 |
+
* @var \Wbcr_Factory446_Plugin
|
39 |
+
*/
|
40 |
+
private $plugin;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Dashboard_Widget constructor.
|
44 |
+
*
|
45 |
+
* Call parent constructor. Registration hooks.
|
46 |
+
*
|
47 |
+
* @since 1.0.0 Added
|
48 |
+
*
|
49 |
+
* @param \Wbcr_Factory446_Plugin $plugin
|
50 |
+
* @param string $content
|
51 |
+
*/
|
52 |
+
public function __construct( \Wbcr_Factory446_Plugin $plugin, $content ) {
|
53 |
+
|
54 |
+
$this->plugin = $plugin;
|
55 |
+
$this->content = $content;
|
56 |
+
|
57 |
+
if ( ! empty( $this->content ) ) {
|
58 |
+
if ( $this->plugin->isNetworkActive() && $this->plugin->isNetworkAdmin() ) {
|
59 |
+
add_action( 'wp_network_dashboard_setup', [ $this, 'add_dashboard_widgets' ], 999 );
|
60 |
+
|
61 |
+
return;
|
62 |
+
}
|
63 |
+
|
64 |
+
add_action( 'wp_dashboard_setup', [ $this, 'add_dashboard_widgets' ], 999 );
|
65 |
+
}
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Add the News widget to the dashboard.
|
70 |
+
*
|
71 |
+
* @since 1.0.0 Added
|
72 |
+
*/
|
73 |
+
public function add_dashboard_widgets() {
|
74 |
+
$widget_id = 'wbcr-factory-adverts-widget';
|
75 |
+
|
76 |
+
wp_add_dashboard_widget( $widget_id, $this->plugin->getPluginTitle() . ' News', [
|
77 |
+
$this,
|
78 |
+
'print_widget_content'
|
79 |
+
] );
|
80 |
+
|
81 |
+
$this->sort_dashboard_widgets( $widget_id );
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Create the function to output the contents of the Dashboard Widget.
|
86 |
+
*
|
87 |
+
* @since 1.0.0 Added
|
88 |
+
*/
|
89 |
+
public function print_widget_content() {
|
90 |
+
?>
|
91 |
+
<div class="wordpress-news hide-if-no-js">
|
92 |
+
<div class="rss-widget">
|
93 |
+
<?php echo $this->content; ?>
|
94 |
+
</div>
|
95 |
+
</div>
|
96 |
+
<?php
|
97 |
+
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Сортируем виджеты на странице дашбоард
|
102 |
+
*
|
103 |
+
* Виджеты должны быть в таком порядке, чтобы наш виджет был выше всех.
|
104 |
+
*
|
105 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
106 |
+
* @author Alexander Vitkalov <nechin.va@gmail.com>
|
107 |
+
*
|
108 |
+
* @since 1.0.2 Добавлена поддержка мультисайтов
|
109 |
+
* @since 1.0.0 Добавлен
|
110 |
+
*
|
111 |
+
* @param string $widget_id ID нашего виджета
|
112 |
+
*/
|
113 |
+
private function sort_dashboard_widgets( $widget_id ) {
|
114 |
+
global $wp_meta_boxes;
|
115 |
+
|
116 |
+
$location = $this->plugin->isNetworkAdmin() ? 'dashboard-network' : 'dashboard';
|
117 |
+
|
118 |
+
$normal_core = $wp_meta_boxes[ $location ]['normal']['core'];
|
119 |
+
$widget_backup = [ $widget_id => $normal_core[ $widget_id ] ];
|
120 |
+
unset( $normal_core[ $widget_id ] );
|
121 |
+
$sorted_core = array_merge( $widget_backup, $normal_core );
|
122 |
+
|
123 |
+
$wp_meta_boxes['dashboard']['normal']['core'] = $sorted_core;
|
124 |
+
}
|
125 |
+
}
|
libs/factory/adverts/includes/class-rest-request.php
CHANGED
@@ -1,197 +1,217 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace WBCR\
|
4 |
-
|
5 |
-
// Exit if accessed directly
|
6 |
-
if
|
7 |
-
exit;
|
8 |
-
}
|
9 |
-
|
10 |
-
/**
|
11 |
-
* Factory request class.
|
12 |
-
*
|
13 |
-
* Performs a server request, retrieves banner data and stores it in the cache.
|
14 |
-
*
|
15 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
16 |
-
* @author Alexander Vitkalov <nechin.va@gmail.com>
|
17 |
-
*
|
18 |
-
* @since 1.0.1 Изменил имя класса и доработал его.
|
19 |
-
* @since 1.0.0 Added
|
20 |
-
*
|
21 |
-
* @package factory-adverts
|
22 |
-
* @copyright (c) 2019 Webcraftic Ltd
|
23 |
-
*/
|
24 |
-
class Creative_Motion_API {
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Rest request url.
|
28 |
-
*
|
29 |
-
* Define rest request url for rest request to remote server.
|
30 |
-
*
|
31 |
-
* @since 1.2.1
|
32 |
-
*/
|
33 |
-
const SERVER_URL = 'https://api.cm-wp.com';
|
34 |
-
|
35 |
-
/**
|
36 |
-
* Rest route path.
|
37 |
-
*
|
38 |
-
* Define rest route path for rest request.
|
39 |
-
*
|
40 |
-
* @since 1.0.0
|
41 |
-
*/
|
42 |
-
const REST_ROUTE = '/adverds/v1/advt';
|
43 |
-
|
44 |
-
/**
|
45 |
-
* Интервал между запросами по умолчанию
|
46 |
-
*
|
47 |
-
* Значение в часах.
|
48 |
-
*
|
49 |
-
* @since 1.0.1
|
50 |
-
*/
|
51 |
-
const DEFAULT_REQUESTS_INTERVAL = 24;
|
52 |
-
|
53 |
-
/**
|
54 |
-
* Интервал между запросами, если сервер недоступен
|
55 |
-
*
|
56 |
-
* Значение в часах.
|
57 |
-
*
|
58 |
-
* @since 1.0.1
|
59 |
-
*/
|
60 |
-
const SERVER_UNAVAILABLE_INTERVAL = 4;
|
61 |
-
|
62 |
-
|
63 |
-
/**
|
64 |
-
* Экзепляр плагина с которым взаимодействует этот модуль
|
65 |
-
*
|
66 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
67 |
-
* @since 1.0.1
|
68 |
-
* @var \
|
69 |
-
*/
|
70 |
-
private $plugin;
|
71 |
-
|
72 |
-
|
73 |
-
/**
|
74 |
-
* Request constructor.
|
75 |
-
*
|
76 |
-
* Variable initialization.
|
77 |
-
*
|
78 |
-
* @
|
79 |
-
*
|
80 |
-
*
|
81 |
-
*/
|
82 |
-
public function __construct(
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
*
|
89 |
-
*
|
90 |
-
* @
|
91 |
-
*
|
92 |
-
* @
|
93 |
-
*
|
94 |
-
* @
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
*
|
110 |
-
*
|
111 |
-
*
|
112 |
-
*
|
113 |
-
* @
|
114 |
-
*
|
115 |
-
*
|
116 |
-
*
|
117 |
-
*
|
118 |
-
*
|
119 |
-
*
|
120 |
-
*
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
*
|
165 |
-
*
|
166 |
-
*
|
167 |
-
*
|
168 |
-
*
|
169 |
-
*
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
$
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
$
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WBCR\Factory_Adverts_124;
|
4 |
+
|
5 |
+
// Exit if accessed directly
|
6 |
+
if( !defined('ABSPATH') ) {
|
7 |
+
exit;
|
8 |
+
}
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Factory request class.
|
12 |
+
*
|
13 |
+
* Performs a server request, retrieves banner data and stores it in the cache.
|
14 |
+
*
|
15 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
16 |
+
* @author Alexander Vitkalov <nechin.va@gmail.com>
|
17 |
+
*
|
18 |
+
* @since 1.0.1 Изменил имя класса и доработал его.
|
19 |
+
* @since 1.0.0 Added
|
20 |
+
*
|
21 |
+
* @package factory-adverts
|
22 |
+
* @copyright (c) 2019 Webcraftic Ltd
|
23 |
+
*/
|
24 |
+
class Creative_Motion_API {
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Rest request url.
|
28 |
+
*
|
29 |
+
* Define rest request url for rest request to remote server.
|
30 |
+
*
|
31 |
+
* @since 1.2.1
|
32 |
+
*/
|
33 |
+
const SERVER_URL = 'https://api.cm-wp.com';
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Rest route path.
|
37 |
+
*
|
38 |
+
* Define rest route path for rest request.
|
39 |
+
*
|
40 |
+
* @since 1.0.0
|
41 |
+
*/
|
42 |
+
const REST_ROUTE = '/adverds/v1/advt';
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Интервал между запросами по умолчанию
|
46 |
+
*
|
47 |
+
* Значение в часах.
|
48 |
+
*
|
49 |
+
* @since 1.0.1
|
50 |
+
*/
|
51 |
+
const DEFAULT_REQUESTS_INTERVAL = 24;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Интервал между запросами, если сервер недоступен
|
55 |
+
*
|
56 |
+
* Значение в часах.
|
57 |
+
*
|
58 |
+
* @since 1.0.1
|
59 |
+
*/
|
60 |
+
const SERVER_UNAVAILABLE_INTERVAL = 4;
|
61 |
+
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Экзепляр плагина с которым взаимодействует этот модуль
|
65 |
+
*
|
66 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
67 |
+
* @since 1.0.1
|
68 |
+
* @var \Wbcr_Factory446_Plugin
|
69 |
+
*/
|
70 |
+
private $plugin;
|
71 |
+
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Request constructor.
|
75 |
+
*
|
76 |
+
* Variable initialization.
|
77 |
+
*
|
78 |
+
* @param \Wbcr_Factory446_Plugin $plugin_name
|
79 |
+
* @since 1.0.0 Added
|
80 |
+
*
|
81 |
+
*/
|
82 |
+
public function __construct(\Wbcr_Factory446_Plugin $plugin)
|
83 |
+
{
|
84 |
+
$this->plugin = $plugin;
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* Get adverts content.
|
89 |
+
*
|
90 |
+
* @param $position
|
91 |
+
*
|
92 |
+
* @return string|\WP_Error
|
93 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
94 |
+
* @since 1.0.1
|
95 |
+
*
|
96 |
+
*/
|
97 |
+
public function get_content($position)
|
98 |
+
{
|
99 |
+
$data = $this->get_cache($position);
|
100 |
+
|
101 |
+
if( is_wp_error($data) ) {
|
102 |
+
return $data;
|
103 |
+
}
|
104 |
+
|
105 |
+
return strip_tags($data['content'], '<b>,<a>,<i>,<strong>,<img>,<ul>,<ol>,<li>');
|
106 |
+
}
|
107 |
+
|
108 |
+
/**
|
109 |
+
* Get data from cache.
|
110 |
+
*
|
111 |
+
* If data in the cache, not empty and not expired, then get data from cache. Or get data from server.
|
112 |
+
*
|
113 |
+
* @return mixed array(
|
114 |
+
* 'plugin' => 'wbcr_insert_php',
|
115 |
+
* 'content' => '<p></p>',
|
116 |
+
* 'expires' => 1563542199,
|
117 |
+
* );
|
118 |
+
* @since 1.0.1 Полностью переписан, с перехватом api ошибок
|
119 |
+
* @since 1.0.0 Added
|
120 |
+
*
|
121 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
122 |
+
*
|
123 |
+
*/
|
124 |
+
private function get_cache($position)
|
125 |
+
{
|
126 |
+
|
127 |
+
if( defined('FACTORY_ADVERTS_DEBUG') && FACTORY_ADVERTS_DEBUG ) {
|
128 |
+
return $this->do_api_request($position);
|
129 |
+
}
|
130 |
+
|
131 |
+
$key = $this->plugin->getPrefix() . md5($position . 'adverts_transient_');
|
132 |
+
|
133 |
+
if( 'ru_RU' === get_locale() ) {
|
134 |
+
$key .= 'ru_';
|
135 |
+
}
|
136 |
+
|
137 |
+
$cached = get_transient($key);
|
138 |
+
|
139 |
+
if( $cached !== false ) {
|
140 |
+
if( isset($cached['error_code']) && isset($cached['error']) ) {
|
141 |
+
return new \WP_Error($cached['error_code'], $cached['error']);
|
142 |
+
}
|
143 |
+
|
144 |
+
return $cached;
|
145 |
+
}
|
146 |
+
|
147 |
+
$data = $this->do_api_request($position);
|
148 |
+
|
149 |
+
if( is_wp_error($data) ) {
|
150 |
+
set_transient($key, [
|
151 |
+
'error' => $data->get_error_message(),
|
152 |
+
'error_code' => $data->get_error_code()
|
153 |
+
], self::SERVER_UNAVAILABLE_INTERVAL * HOUR_IN_SECONDS);
|
154 |
+
|
155 |
+
return $data;
|
156 |
+
}
|
157 |
+
|
158 |
+
set_transient($key, $data, self::DEFAULT_REQUESTS_INTERVAL * HOUR_IN_SECONDS);
|
159 |
+
|
160 |
+
return $data;
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Performs rest api request.
|
165 |
+
*
|
166 |
+
* In some case on the server (Apache) in the .htaccess must be set
|
167 |
+
* RewriteRule ^wp-json/(.*)[?](.*) /?rest_route=/$1&$2 [L]
|
168 |
+
*
|
169 |
+
* @return mixed array(
|
170 |
+
* 'plugin' => 'wbcr_insert_php',
|
171 |
+
* 'content' => '<p></p>',
|
172 |
+
* 'expires' => 1563542199,
|
173 |
+
* );
|
174 |
+
* @since 1.0.0 Added
|
175 |
+
*
|
176 |
+
* @since 1.0.1 Добавлен перехват ошибок, рефакторинг кода.
|
177 |
+
*/
|
178 |
+
private function do_api_request($position)
|
179 |
+
{
|
180 |
+
$default_result = [
|
181 |
+
'content' => '',
|
182 |
+
'expires' => self::DEFAULT_REQUESTS_INTERVAL * HOUR_IN_SECONDS,
|
183 |
+
];
|
184 |
+
|
185 |
+
$url = untrailingslashit(self::SERVER_URL) . '/wp-json' . self::REST_ROUTE;
|
186 |
+
|
187 |
+
$ads_ID = $this->plugin->getPluginName();
|
188 |
+
|
189 |
+
if( 'ru_RU' === get_locale() ) {
|
190 |
+
$ads_ID .= '-ru';
|
191 |
+
}
|
192 |
+
|
193 |
+
$url = add_query_arg([
|
194 |
+
'plugin' => $ads_ID,
|
195 |
+
'position' => $position,
|
196 |
+
'plugin_title' => $this->plugin->getPluginTitle(),
|
197 |
+
'lang' => get_locale()
|
198 |
+
], $url);
|
199 |
+
|
200 |
+
$response = wp_remote_get($url);
|
201 |
+
|
202 |
+
$code = wp_remote_retrieve_response_code($response);
|
203 |
+
$body = wp_remote_retrieve_body($response);
|
204 |
+
|
205 |
+
$data = @json_decode($body, true);
|
206 |
+
|
207 |
+
if( is_wp_error($response) ) {
|
208 |
+
return $response;
|
209 |
+
}
|
210 |
+
|
211 |
+
if( 200 !== $code ) {
|
212 |
+
return new \WP_Error('http_request_error', 'Failed request to the remote server. Code: ' . $code);
|
213 |
+
}
|
214 |
+
|
215 |
+
return wp_parse_args($data, $default_result);
|
216 |
+
}
|
217 |
+
}
|
libs/factory/adverts/includes/index.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
<?php
|
2 |
-
// Silence is golden.
|
1 |
+
<?php
|
2 |
+
// Silence is golden.
|
libs/factory/adverts/index.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
<?php
|
2 |
-
// Silence is golden.
|
1 |
+
<?php
|
2 |
+
// Silence is golden.
|
libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.mo → wbcr_factory_adverts_124-ru_RU.mo}
RENAMED
File without changes
|
libs/factory/adverts/langs/{wbcr_factory_adverts_102-ru_RU.po → wbcr_factory_adverts_124-ru_RU.po}
RENAMED
@@ -1,83 +1,83 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: factory_forms\n"
|
4 |
-
"POT-Creation-Date: 2018-10-16 22:44+0300\n"
|
5 |
-
"PO-Revision-Date: 2018-10-16 22:45+0300\n"
|
6 |
-
"Last-Translator: \n"
|
7 |
-
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
-
"Language: ru_RU\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"X-Generator: Poedit 2.1.1\n"
|
13 |
-
"X-Poedit-Basepath: ..\n"
|
14 |
-
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
-
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
-
"X-Poedit-SearchPath-0: .\n"
|
19 |
-
|
20 |
-
#: includes/check-compatibility.php:80
|
21 |
-
msgid "warning"
|
22 |
-
msgstr "предупреждение"
|
23 |
-
|
24 |
-
#: includes/check-compatibility.php:82
|
25 |
-
#, php-format
|
26 |
-
msgid "The %s plugin has stopped."
|
27 |
-
msgstr "Работа плагина %s была остановлена."
|
28 |
-
|
29 |
-
#: includes/check-compatibility.php:83
|
30 |
-
msgid "Possible reasons:"
|
31 |
-
msgstr "Возможные причины:"
|
32 |
-
|
33 |
-
#: includes/check-compatibility.php:89
|
34 |
-
#, php-format
|
35 |
-
msgid "You need to update the PHP version to %s or higher!"
|
36 |
-
msgstr "Вам нужно обновить версию PHP до %s или выше!"
|
37 |
-
|
38 |
-
#: includes/check-compatibility.php:94
|
39 |
-
#, php-format
|
40 |
-
msgid "You need to update WordPress to %s or higher!"
|
41 |
-
msgstr "Вам нужно обновить WordPress до %s или выше!"
|
42 |
-
|
43 |
-
#: includes/functions.php:132
|
44 |
-
#, php-format
|
45 |
-
msgid ""
|
46 |
-
"%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead."
|
47 |
-
msgstr ""
|
48 |
-
"%1$s является <strong>устаревшим,</strong> начиная с версии %2$s в "
|
49 |
-
"Wordpress! Используйте %3$s."
|
50 |
-
|
51 |
-
#: includes/functions.php:134
|
52 |
-
#, php-format
|
53 |
-
msgid ""
|
54 |
-
"%1$s is <strong>deprecated</strong> since version %2$s with no alternative "
|
55 |
-
"available."
|
56 |
-
msgstr ""
|
57 |
-
"%1$s был вызван с параметром, который является <strong>устаревшими</strong> "
|
58 |
-
"начиная с версии %2$s , в настоящее время доступных альтернатив нет."
|
59 |
-
|
60 |
-
#: includes/plugin.class.php:202 includes/plugin.class.php:237
|
61 |
-
msgid ""
|
62 |
-
"You are trying to call this earlier than the plugin menu will be registered."
|
63 |
-
msgstr ""
|
64 |
-
"Вы пытаетесь вызвать это раньше, чем будет зарегистрировано меню плагина."
|
65 |
-
|
66 |
-
#: includes/plugin.class.php:220
|
67 |
-
msgid ""
|
68 |
-
"You are trying to get a link to a page that does not have multisite mode. "
|
69 |
-
"Clicking this link will lead the user to a non-existent page."
|
70 |
-
msgstr ""
|
71 |
-
"Вы пытаетесь получить ссылку на страницу, которая не имеет "
|
72 |
-
"многопользовательского режима. Щелчок по этой ссылке приведет пользователя "
|
73 |
-
"к несуществующей странице."
|
74 |
-
|
75 |
-
#: includes/plugin.class.php:222
|
76 |
-
msgid ""
|
77 |
-
"Trying to get a link to an unregistered page. You are trying to call this "
|
78 |
-
"earlier than the plugin menu will be registered."
|
79 |
-
msgstr ""
|
80 |
-
"Попытка получить ссылку на незарегистрированную страницу. Вы пытаетесь "
|
81 |
-
"вызвать это раньше, чем будет зарегистрировано меню плагина."
|
82 |
-
|
83 |
-
|
1 |
+
msgid ""
|
2 |
+
msgstr ""
|
3 |
+
"Project-Id-Version: factory_forms\n"
|
4 |
+
"POT-Creation-Date: 2018-10-16 22:44+0300\n"
|
5 |
+
"PO-Revision-Date: 2018-10-16 22:45+0300\n"
|
6 |
+
"Last-Translator: \n"
|
7 |
+
"Language-Team: Alex Kovalev <alex.kovalevv@gmail.com>\n"
|
8 |
+
"Language: ru_RU\n"
|
9 |
+
"MIME-Version: 1.0\n"
|
10 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
+
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"X-Generator: Poedit 2.1.1\n"
|
13 |
+
"X-Poedit-Basepath: ..\n"
|
14 |
+
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
15 |
+
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
16 |
+
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
+
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c\n"
|
18 |
+
"X-Poedit-SearchPath-0: .\n"
|
19 |
+
|
20 |
+
#: includes/check-compatibility.php:80
|
21 |
+
msgid "warning"
|
22 |
+
msgstr "предупреждение"
|
23 |
+
|
24 |
+
#: includes/check-compatibility.php:82
|
25 |
+
#, php-format
|
26 |
+
msgid "The %s plugin has stopped."
|
27 |
+
msgstr "Работа плагина %s была остановлена."
|
28 |
+
|
29 |
+
#: includes/check-compatibility.php:83
|
30 |
+
msgid "Possible reasons:"
|
31 |
+
msgstr "Возможные причины:"
|
32 |
+
|
33 |
+
#: includes/check-compatibility.php:89
|
34 |
+
#, php-format
|
35 |
+
msgid "You need to update the PHP version to %s or higher!"
|
36 |
+
msgstr "Вам нужно обновить версию PHP до %s или выше!"
|
37 |
+
|
38 |
+
#: includes/check-compatibility.php:94
|
39 |
+
#, php-format
|
40 |
+
msgid "You need to update WordPress to %s or higher!"
|
41 |
+
msgstr "Вам нужно обновить WordPress до %s или выше!"
|
42 |
+
|
43 |
+
#: includes/functions.php:132
|
44 |
+
#, php-format
|
45 |
+
msgid ""
|
46 |
+
"%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead."
|
47 |
+
msgstr ""
|
48 |
+
"%1$s является <strong>устаревшим,</strong> начиная с версии %2$s в "
|
49 |
+
"Wordpress! Используйте %3$s."
|
50 |
+
|
51 |
+
#: includes/functions.php:134
|
52 |
+
#, php-format
|
53 |
+
msgid ""
|
54 |
+
"%1$s is <strong>deprecated</strong> since version %2$s with no alternative "
|
55 |
+
"available."
|
56 |
+
msgstr ""
|
57 |
+
"%1$s был вызван с параметром, который является <strong>устаревшими</strong> "
|
58 |
+
"начиная с версии %2$s , в настоящее время доступных альтернатив нет."
|
59 |
+
|
60 |
+
#: includes/plugin.class.php:202 includes/plugin.class.php:237
|
61 |
+
msgid ""
|
62 |
+
"You are trying to call this earlier than the plugin menu will be registered."
|
63 |
+
msgstr ""
|
64 |
+
"Вы пытаетесь вызвать это раньше, чем будет зарегистрировано меню плагина."
|
65 |
+
|
66 |
+
#: includes/plugin.class.php:220
|
67 |
+
msgid ""
|
68 |
+
"You are trying to get a link to a page that does not have multisite mode. "
|
69 |
+
"Clicking this link will lead the user to a non-existent page."
|
70 |
+
msgstr ""
|
71 |
+
"Вы пытаетесь получить ссылку на страницу, которая не имеет "
|
72 |
+
"многопользовательского режима. Щелчок по этой ссылке приведет пользователя "
|
73 |
+
"к несуществующей странице."
|
74 |
+
|
75 |
+
#: includes/plugin.class.php:222
|
76 |
+
msgid ""
|
77 |
+
"Trying to get a link to an unregistered page. You are trying to call this "
|
78 |
+
"earlier than the plugin menu will be registered."
|
79 |
+
msgstr ""
|
80 |
+
"Попытка получить ссылку на незарегистрированную страницу. Вы пытаетесь "
|
81 |
+
"вызвать это раньше, чем будет зарегистрировано меню плагина."
|
82 |
+
|
83 |
+
|
libs/factory/bootstrap/assets/css-min/bootstrap.accordion.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .factory-accordion{margin:0 0 30px;border-top:1px solid #DDD;border-right:1px solid #DDD;border-left:1px solid #DDD;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.factory-bootstrap-446 .factory-accordion>h3{border-bottom:1px solid #DDD;cursor:pointer;padding:8px 15px;margin:0}.factory-bootstrap-446 .factory-accordion>div{display:none;margin:0;border-bottom:1px solid #DDD}.factory-bootstrap-446 .factory-accordion-item{display:none}.factory-bootstrap-446 .inner-factory-accordion-item{padding:10px 0}.factory-bootstrap-446 .factory-accordion>h3.active:hover{cursor:default}
|
libs/factory/bootstrap/assets/css-min/bootstrap.blue.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .btn-primary{background:#e1a948;border-color:#d39323;color:#fff;-webkit-box-shadow:inset 0 1px 0 #ecc88a,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #ecc88a,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#db9825;border-color:#bd831f;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8be74,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8be74,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#db9825;border-color:#bd831f;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#d1cdc7!important;background:#db9825!important;border-color:#bd831f!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#e1a948;border-color:#d39323}
|
libs/factory/bootstrap/assets/css-min/bootstrap.coffee.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .btn-primary{background:#c7a589;border-color:#b78a66;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e0cdbd,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#ba906d;border-color:#ae7d55;color:#fff;-webkit-box-shadow:inset 0 1px 0 #d7bfac,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #d7bfac,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#ba906d;border-color:#ae7d55;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#d1cbc7!important;background:#ba906d!important;border-color:#ae7d55!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#c7a589;border-color:#b78a66}
|
libs/factory/bootstrap/assets/css-min/bootstrap.core.min.css
CHANGED
@@ -1,25 +1,25 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-421 article,.factory-bootstrap-421 aside,.factory-bootstrap-421 details,.factory-bootstrap-421 figcaption,.factory-bootstrap-421 figure,.factory-bootstrap-421 footer,.factory-bootstrap-421 header,.factory-bootstrap-421 hgroup,.factory-bootstrap-421 main,.factory-bootstrap-421 nav,.factory-bootstrap-421 section,.factory-bootstrap-421 summary{display:block}.factory-bootstrap-421 audio,.factory-bootstrap-421 canvas,.factory-bootstrap-421 video{display:inline-block}.factory-bootstrap-421 audio:not([controls]){display:none;height:0}.factory-bootstrap-421 [hidden],.factory-bootstrap-421 template{display:none}.factory-bootstrap-421 body{margin:0}.factory-bootstrap-421 a{background:0 0}.factory-bootstrap-421 a:focus{outline:thin dotted}.factory-bootstrap-421 a:active,.factory-bootstrap-421 a:hover{outline:0}.factory-bootstrap-421 h1{margin:.67em 0}.factory-bootstrap-421 b,.factory-bootstrap-421 strong{font-weight:700}.factory-bootstrap-421 dfn{font-style:italic}.factory-bootstrap-421 hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-421 mark{color:#000;background:#ff0}.factory-bootstrap-421 code,.factory-bootstrap-421 kbd,.factory-bootstrap-421 pre,.factory-bootstrap-421 samp{font-size:1em}.factory-bootstrap-421 pre{white-space:pre-wrap}.factory-bootstrap-421 q{quotes:"\201C" "\201D" "\2018" "\2019"}.factory-bootstrap-421 sub,.factory-bootstrap-421 sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.factory-bootstrap-421 sup{top:-.5em}.factory-bootstrap-421 sub{bottom:-.25em}.factory-bootstrap-421 img{border:0}.factory-bootstrap-421 svg:not(:root){overflow:hidden}.factory-bootstrap-421 figure{margin:0}.factory-bootstrap-421 button,.factory-bootstrap-421 input,.factory-bootstrap-421 select,.factory-bootstrap-421 textarea{margin:0}.factory-bootstrap-421 button,.factory-bootstrap-421 select{text-transform:none}.factory-bootstrap-421 select{padding-right:4px!important}.factory-bootstrap-421 button,.factory-bootstrap-421 input[type=reset],.factory-bootstrap-421 input[type=submit],html .factory-bootstrap-421 input[type=button]{cursor:pointer;-webkit-appearance:button}.factory-bootstrap-421 button[disabled],html .factory-bootstrap-421 input[disabled]{cursor:default}.factory-bootstrap-421 input[type=checkbox],.factory-bootstrap-421 input[type=radio]{padding:0;box-sizing:border-box}.factory-bootstrap-421 input[type=search]{-webkit-appearance:textfield}.factory-bootstrap-421 input[type=search]::-webkit-search-cancel-button,.factory-bootstrap-421 input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.factory-bootstrap-421 button::-moz-focus-inner,.factory-bootstrap-421 input::-moz-focus-inner{padding:0;border:0}.factory-bootstrap-421 textarea{overflow:auto;vertical-align:top}.factory-bootstrap-421 table{border-collapse:collapse;border-spacing:0}@media print{.factory-bootstrap-421 *{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}.factory-bootstrap-421 a,.factory-bootstrap-421 a:visited{text-decoration:underline}.factory-bootstrap-421 a[href]:after{content:" (" attr(href) ")"}.factory-bootstrap-421 abbr[title]:after{content:" (" attr(title) ")"}.factory-bootstrap-421 a[href^="javascript:"]:after,.factory-bootstrap-421 a[href^="#"]:after{content:""}.factory-bootstrap-421 blockquote,.factory-bootstrap-421 pre{border:1px solid #999;page-break-inside:avoid}.factory-bootstrap-421 thead{display:table-header-group}.factory-bootstrap-421 img,.factory-bootstrap-421 tr{page-break-inside:avoid}.factory-bootstrap-421 img{max-width:100%!important}@page{margin:2cm .5cm}.factory-bootstrap-421 h2,.factory-bootstrap-421 h3,.factory-bootstrap-421 p{orphans:3;widows:3}.factory-bootstrap-421 h2,.factory-bootstrap-421 h3{page-break-after:avoid}.factory-bootstrap-421 select{background:#fff!important}.factory-bootstrap-421 .navbar{display:none}.factory-bootstrap-421 .table td,.factory-bootstrap-421 .table th{background-color:#fff!important}.factory-bootstrap-421 .btn>.caret,.factory-bootstrap-421 .dropup>.btn>.caret{border-top-color:#000!important}.factory-bootstrap-421 .label{border:1px solid #000}.factory-bootstrap-421 .table{border-collapse:collapse!important}.factory-bootstrap-421 .table-bordered td,.factory-bootstrap-421 .table-bordered th{border:1px solid #ddd!important}}.factory-bootstrap-421 *,.factory-bootstrap-421 :after,.factory-bootstrap-421 :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html .factory-bootstrap-421{-webkit-tap-highlight-color:rgba(0,0,0,0)}.factory-bootstrap-421 body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}.factory-bootstrap-421 button,.factory-bootstrap-421 input,.factory-bootstrap-421 select,.factory-bootstrap-421 textarea{font-family:inherit;font-size:inherit;line-height:inherit}.factory-bootstrap-421 img{vertical-align:middle}.factory-bootstrap-421 .img-responsive{display:block;height:auto;max-width:100%}.factory-bootstrap-421 .img-rounded{border-radius:6px}.factory-bootstrap-421 .img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-421 .img-circle{border-radius:50%}.factory-bootstrap-421 hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.factory-bootstrap-421 .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.factory-bootstrap-421 .h1,.factory-bootstrap-421 .h2,.factory-bootstrap-421 .h3,.factory-bootstrap-421 .h4,.factory-bootstrap-421 .h5,.factory-bootstrap-421 .h6,.factory-bootstrap-421 h1,.factory-bootstrap-421 h2,.factory-bootstrap-421 h3,.factory-bootstrap-421 h4,.factory-bootstrap-421 h5,.factory-bootstrap-421 h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}.factory-bootstrap-421 .h1 .small,.factory-bootstrap-421 .h1 small,.factory-bootstrap-421 .h2 .small,.factory-bootstrap-421 .h2 small,.factory-bootstrap-421 .h3 .small,.factory-bootstrap-421 .h3 small,.factory-bootstrap-421 .h4 .small,.factory-bootstrap-421 .h4 small,.factory-bootstrap-421 .h5 .small,.factory-bootstrap-421 .h5 small,.factory-bootstrap-421 .h6 .small,.factory-bootstrap-421 .h6 small,.factory-bootstrap-421 h1 .small,.factory-bootstrap-421 h1 small,.factory-bootstrap-421 h2 .small,.factory-bootstrap-421 h2 small,.factory-bootstrap-421 h3 .small,.factory-bootstrap-421 h3 small,.factory-bootstrap-421 h4 .small,.factory-bootstrap-421 h4 small,.factory-bootstrap-421 h5 .small,.factory-bootstrap-421 h5 small,.factory-bootstrap-421 h6 .small,.factory-bootstrap-421 h6 small{font-weight:400;line-height:1;color:#999}.factory-bootstrap-421 h1,.factory-bootstrap-421 h2,.factory-bootstrap-421 h3{margin-top:20px;margin-bottom:10px}.factory-bootstrap-421 h1 .small,.factory-bootstrap-421 h1 small,.factory-bootstrap-421 h2 .small,.factory-bootstrap-421 h2 small,.factory-bootstrap-421 h3 .small,.factory-bootstrap-421 h3 small{font-size:65%}.factory-bootstrap-421 h4,.factory-bootstrap-421 h5,.factory-bootstrap-421 h6{margin-top:10px;margin-bottom:10px}.factory-bootstrap-421 h4 .small,.factory-bootstrap-421 h4 small,.factory-bootstrap-421 h5 .small,.factory-bootstrap-421 h5 small,.factory-bootstrap-421 h6 .small,.factory-bootstrap-421 h6 small{font-size:75%}.factory-bootstrap-421 .h1,.factory-bootstrap-421 h1{font-size:36px}.factory-bootstrap-421 .h2,.factory-bootstrap-421 h2{font-size:30px}.factory-bootstrap-421 .h3,.factory-bootstrap-421 h3{font-size:24px}.factory-bootstrap-421 .h4,.factory-bootstrap-421 h4{font-size:18px}.factory-bootstrap-421 .h5,.factory-bootstrap-421 h5{font-size:14px}.factory-bootstrap-421 .h6,.factory-bootstrap-421 h6{font-size:12px}.factory-bootstrap-421 p{margin:0 0 10px}.factory-bootstrap-421 .lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.factory-bootstrap-421 .small,.factory-bootstrap-421 small{font-size:85%}.factory-bootstrap-421 cite{font-style:normal}.factory-bootstrap-421 .text-muted{color:#999}.factory-bootstrap-421 .text-primary{color:#428bca}.factory-bootstrap-421 .text-primary:hover{color:#3071a9}.factory-bootstrap-421 .text-warning{color:#8a6d3b}.factory-bootstrap-421 .text-warning:hover{color:#66512c}.factory-bootstrap-421 .text-danger{color:#a94442}.factory-bootstrap-421 .text-danger:hover{color:#843534}.factory-bootstrap-421 .text-success{color:#3c763d}.factory-bootstrap-421 .text-success:hover{color:#2b542c}.factory-bootstrap-421 .text-info{color:#31708f}.factory-bootstrap-421 .text-info:hover{color:#245269}.factory-bootstrap-421 .text-left{text-align:left}.factory-bootstrap-421 .text-right{text-align:right}.factory-bootstrap-421 .text-center{text-align:center}.factory-bootstrap-421 .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}.factory-bootstrap-421 ol,.factory-bootstrap-421 ul{margin-top:0;margin-bottom:10px}.factory-bootstrap-421 ol ol,.factory-bootstrap-421 ol ul,.factory-bootstrap-421 ul ol,.factory-bootstrap-421 ul ul{margin-bottom:0}.factory-bootstrap-421 .list-inline,.factory-bootstrap-421 .list-unstyled{padding-left:0;list-style:none}.factory-bootstrap-421 .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.factory-bootstrap-421 .list-inline>li:first-child{padding-left:0}.factory-bootstrap-421 dl{margin-top:0;margin-bottom:20px}.factory-bootstrap-421 dd,.factory-bootstrap-421 dt{line-height:1.428571429}.factory-bootstrap-421 dt{font-weight:700}.factory-bootstrap-421 dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:after,.dl-horizontal dd:before{display:table;content:" "}.dl-horizontal dd:after{clear:both}}.factory-bootstrap-421 abbr[data-original-title],.factory-bootstrap-421 abbr[title]{cursor:help;border-bottom:1px dotted #999}.factory-bootstrap-421 .initialism{font-size:90%;text-transform:uppercase}.factory-bootstrap-421 blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}.factory-bootstrap-421 blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}.factory-bootstrap-421 blockquote p:last-child{margin-bottom:0}.factory-bootstrap-421 blockquote .small,.factory-bootstrap-421 blockquote small{display:block;line-height:1.428571429;color:#999}.factory-bootstrap-421 blockquote .small:before,.factory-bootstrap-421 blockquote small:before{content:'\2014 \00A0'}.factory-bootstrap-421 blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}.factory-bootstrap-421 blockquote.pull-right .small,.factory-bootstrap-421 blockquote.pull-right p,.factory-bootstrap-421 blockquote.pull-right small{text-align:right}.factory-bootstrap-421 blockquote.pull-right .small:before,.factory-bootstrap-421 blockquote.pull-right small:before{content:''}.factory-bootstrap-421 blockquote.pull-right .small:after,.factory-bootstrap-421 blockquote.pull-right small:after{content:'\00A0 \2014'}.factory-bootstrap-421 blockquote:after,.factory-bootstrap-421 blockquote:before{content:""}.factory-bootstrap-421 address{margin-bottom:20px;font-style:normal;line-height:1.428571429}.factory-bootstrap-421 code,.factory-bootstrap-421 kbd,.factory-bootstrap-421 pre,.factory-bootstrap-421 samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.factory-bootstrap-421 code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}.factory-bootstrap-421 pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-421 pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.factory-bootstrap-421 .pre-scrollable{max-height:340px;overflow-y:scroll}.factory-bootstrap-421 .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.factory-bootstrap-421 .container:after,.factory-bootstrap-421 .container:before{display:table;content:" "}.factory-bootstrap-421 .container:after{clear:both}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.factory-bootstrap-421 .row{margin-right:-15px;margin-left:-15px}.factory-bootstrap-421 .row:after,.factory-bootstrap-421 .row:before{display:table;content:" "}.factory-bootstrap-421 .row:after{clear:both}.factory-bootstrap-421 .col-lg-1,.factory-bootstrap-421 .col-lg-10,.factory-bootstrap-421 .col-lg-11,.factory-bootstrap-421 .col-lg-12,.factory-bootstrap-421 .col-lg-2,.factory-bootstrap-421 .col-lg-3,.factory-bootstrap-421 .col-lg-4,.factory-bootstrap-421 .col-lg-5,.factory-bootstrap-421 .col-lg-6,.factory-bootstrap-421 .col-lg-7,.factory-bootstrap-421 .col-lg-8,.factory-bootstrap-421 .col-lg-9,.factory-bootstrap-421 .col-md-1,.factory-bootstrap-421 .col-md-10,.factory-bootstrap-421 .col-md-11,.factory-bootstrap-421 .col-md-12,.factory-bootstrap-421 .col-md-2,.factory-bootstrap-421 .col-md-3,.factory-bootstrap-421 .col-md-4,.factory-bootstrap-421 .col-md-5,.factory-bootstrap-421 .col-md-6,.factory-bootstrap-421 .col-md-7,.factory-bootstrap-421 .col-md-8,.factory-bootstrap-421 .col-md-9,.factory-bootstrap-421 .col-sm-1,.factory-bootstrap-421 .col-sm-10,.factory-bootstrap-421 .col-sm-11,.factory-bootstrap-421 .col-sm-12,.factory-bootstrap-421 .col-sm-2,.factory-bootstrap-421 .col-sm-3,.factory-bootstrap-421 .col-sm-4,.factory-bootstrap-421 .col-sm-5,.factory-bootstrap-421 .col-sm-6,.factory-bootstrap-421 .col-sm-7,.factory-bootstrap-421 .col-sm-8,.factory-bootstrap-421 .col-sm-9,.factory-bootstrap-421 .col-xs-1,.factory-bootstrap-421 .col-xs-10,.factory-bootstrap-421 .col-xs-11,.factory-bootstrap-421 .col-xs-12,.factory-bootstrap-421 .col-xs-2,.factory-bootstrap-421 .col-xs-3,.factory-bootstrap-421 .col-xs-4,.factory-bootstrap-421 .col-xs-5,.factory-bootstrap-421 .col-xs-6,.factory-bootstrap-421 .col-xs-7,.factory-bootstrap-421 .col-xs-8,.factory-bootstrap-421 .col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.factory-bootstrap-421 .col-xs-1,.factory-bootstrap-421 .col-xs-10,.factory-bootstrap-421 .col-xs-11,.factory-bootstrap-421 .col-xs-12,.factory-bootstrap-421 .col-xs-2,.factory-bootstrap-421 .col-xs-3,.factory-bootstrap-421 .col-xs-4,.factory-bootstrap-421 .col-xs-5,.factory-bootstrap-421 .col-xs-6,.factory-bootstrap-421 .col-xs-7,.factory-bootstrap-421 .col-xs-8,.factory-bootstrap-421 .col-xs-9{float:left}.factory-bootstrap-421 .col-xs-12{width:100%}.factory-bootstrap-421 .col-xs-11{width:91.66666666666666%}.factory-bootstrap-421 .col-xs-10{width:83.33333333333334%}.factory-bootstrap-421 .col-xs-9{width:75%}.factory-bootstrap-421 .col-xs-8{width:66.66666666666666%}.factory-bootstrap-421 .col-xs-7{width:58.333333333333336%}.factory-bootstrap-421 .col-xs-6{width:50%}.factory-bootstrap-421 .col-xs-5{width:41.66666666666667%}.factory-bootstrap-421 .col-xs-4{width:33.33333333333333%}.factory-bootstrap-421 .col-xs-3{width:25%}.factory-bootstrap-421 .col-xs-2{width:16.666666666666664%}.factory-bootstrap-421 .col-xs-1{width:8.333333333333332%}.factory-bootstrap-421 .col-xs-pull-12{right:100%}.factory-bootstrap-421 .col-xs-pull-11{right:91.66666666666666%}.factory-bootstrap-421 .col-xs-pull-10{right:83.33333333333334%}.factory-bootstrap-421 .col-xs-pull-9{right:75%}.factory-bootstrap-421 .col-xs-pull-8{right:66.66666666666666%}.factory-bootstrap-421 .col-xs-pull-7{right:58.333333333333336%}.factory-bootstrap-421 .col-xs-pull-6{right:50%}.factory-bootstrap-421 .col-xs-pull-5{right:41.66666666666667%}.factory-bootstrap-421 .col-xs-pull-4{right:33.33333333333333%}.factory-bootstrap-421 .col-xs-pull-3{right:25%}.factory-bootstrap-421 .col-xs-pull-2{right:16.666666666666664%}.factory-bootstrap-421 .col-xs-pull-1{right:8.333333333333332%}.factory-bootstrap-421 .col-xs-pull-0{right:0}.factory-bootstrap-421 .col-xs-push-12{left:100%}.factory-bootstrap-421 .col-xs-push-11{left:91.66666666666666%}.factory-bootstrap-421 .col-xs-push-10{left:83.33333333333334%}.factory-bootstrap-421 .col-xs-push-9{left:75%}.factory-bootstrap-421 .col-xs-push-8{left:66.66666666666666%}.factory-bootstrap-421 .col-xs-push-7{left:58.333333333333336%}.factory-bootstrap-421 .col-xs-push-6{left:50%}.factory-bootstrap-421 .col-xs-push-5{left:41.66666666666667%}.factory-bootstrap-421 .col-xs-push-4{left:33.33333333333333%}.factory-bootstrap-421 .col-xs-push-3{left:25%}.factory-bootstrap-421 .col-xs-push-2{left:16.666666666666664%}.factory-bootstrap-421 .col-xs-push-1{left:8.333333333333332%}.factory-bootstrap-421 .col-xs-push-0{left:0}.factory-bootstrap-421 .col-xs-offset-12{margin-left:100%}.factory-bootstrap-421 .col-xs-offset-11{margin-left:91.66666666666666%}.factory-bootstrap-421 .col-xs-offset-10{margin-left:83.33333333333334%}.factory-bootstrap-421 .col-xs-offset-9{margin-left:75%}.factory-bootstrap-421 .col-xs-offset-8{margin-left:66.66666666666666%}.factory-bootstrap-421 .col-xs-offset-7{margin-left:58.333333333333336%}.factory-bootstrap-421 .col-xs-offset-6{margin-left:50%}.factory-bootstrap-421 .col-xs-offset-5{margin-left:41.66666666666667%}.factory-bootstrap-421 .col-xs-offset-4{margin-left:33.33333333333333%}.factory-bootstrap-421 .col-xs-offset-3{margin-left:25%}.factory-bootstrap-421 .col-xs-offset-2{margin-left:16.666666666666664%}.factory-bootstrap-421 .col-xs-offset-1{margin-left:8.333333333333332%}.factory-bootstrap-421 .col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}.factory-bootstrap-421 table{max-width:100%;background-color:transparent}.factory-bootstrap-421 th{text-align:left}.factory-bootstrap-421 .table{width:100%;margin-bottom:20px}.factory-bootstrap-421 .table>tbody>tr>td,.factory-bootstrap-421 .table>tbody>tr>th,.factory-bootstrap-421 .table>tfoot>tr>td,.factory-bootstrap-421 .table>tfoot>tr>th,.factory-bootstrap-421 .table>thead>tr>td,.factory-bootstrap-421 .table>thead>tr>th{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.factory-bootstrap-421 .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.factory-bootstrap-421 .table>caption+thead>tr:first-child>td,.factory-bootstrap-421 .table>caption+thead>tr:first-child>th,.factory-bootstrap-421 .table>colgroup+thead>tr:first-child>td,.factory-bootstrap-421 .table>colgroup+thead>tr:first-child>th,.factory-bootstrap-421 .table>thead:first-child>tr:first-child>td,.factory-bootstrap-421 .table>thead:first-child>tr:first-child>th{border-top:0}.factory-bootstrap-421 .table>tbody+tbody{border-top:2px solid #ddd}.factory-bootstrap-421 .table .table{background-color:#fff}.factory-bootstrap-421 .table-condensed>tbody>tr>td,.factory-bootstrap-421 .table-condensed>tbody>tr>th,.factory-bootstrap-421 .table-condensed>tfoot>tr>td,.factory-bootstrap-421 .table-condensed>tfoot>tr>th,.factory-bootstrap-421 .table-condensed>thead>tr>td,.factory-bootstrap-421 .table-condensed>thead>tr>th{padding:5px}.factory-bootstrap-421 .table-bordered,.factory-bootstrap-421 .table-bordered>tbody>tr>td,.factory-bootstrap-421 .table-bordered>tbody>tr>th,.factory-bootstrap-421 .table-bordered>tfoot>tr>td,.factory-bootstrap-421 .table-bordered>tfoot>tr>th,.factory-bootstrap-421 .table-bordered>thead>tr>td,.factory-bootstrap-421 .table-bordered>thead>tr>th{border:1px solid #ddd}.factory-bootstrap-421 .table-bordered>thead>tr>td,.factory-bootstrap-421 .table-bordered>thead>tr>th{border-bottom-width:2px}.factory-bootstrap-421 .table-striped>tbody>tr:nth-child(odd)>td,.factory-bootstrap-421 .table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.factory-bootstrap-421 .table-hover>tbody>tr:hover>td,.factory-bootstrap-421 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}.factory-bootstrap-421 table col[class*=col-]{position:static;display:table-column;float:none}.factory-bootstrap-421 table td[class*=col-],.factory-bootstrap-421 table th[class*=col-]{display:table-cell;float:none}.factory-bootstrap-421 .table>tbody>.active>td,.factory-bootstrap-421 .table>tbody>.active>th,.factory-bootstrap-421 .table>tbody>tr>.active,.factory-bootstrap-421 .table>tfoot>.active>td,.factory-bootstrap-421 .table>tfoot>.active>th,.factory-bootstrap-421 .table>tfoot>tr>.active,.factory-bootstrap-421 .table>thead>.active>td,.factory-bootstrap-421 .table>thead>.active>th,.factory-bootstrap-421 .table>thead>tr>.active{background-color:#f5f5f5}.factory-bootstrap-421 .table-hover>tbody>.active:hover>td,.factory-bootstrap-421 .table-hover>tbody>.active:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.active:hover{background-color:#e8e8e8}.factory-bootstrap-421 .table>tbody>.success>td,.factory-bootstrap-421 .table>tbody>.success>th,.factory-bootstrap-421 .table>tbody>tr>.success,.factory-bootstrap-421 .table>tfoot>.success>td,.factory-bootstrap-421 .table>tfoot>.success>th,.factory-bootstrap-421 .table>tfoot>tr>.success,.factory-bootstrap-421 .table>thead>.success>td,.factory-bootstrap-421 .table>thead>.success>th,.factory-bootstrap-421 .table>thead>tr>.success{background-color:#dff0d8}.factory-bootstrap-421 .table-hover>tbody>.success:hover>td,.factory-bootstrap-421 .table-hover>tbody>.success:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.success:hover{background-color:#d0e9c6}.factory-bootstrap-421 .table>tbody>.danger>td,.factory-bootstrap-421 .table>tbody>.danger>th,.factory-bootstrap-421 .table>tbody>tr>.danger,.factory-bootstrap-421 .table>tfoot>.danger>td,.factory-bootstrap-421 .table>tfoot>.danger>th,.factory-bootstrap-421 .table>tfoot>tr>.danger,.factory-bootstrap-421 .table>thead>.danger>td,.factory-bootstrap-421 .table>thead>.danger>th,.factory-bootstrap-421 .table>thead>tr>.danger{background-color:#f2dede}.factory-bootstrap-421 .table-hover>tbody>.danger:hover>td,.factory-bootstrap-421 .table-hover>tbody>.danger:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.danger:hover{background-color:#ebcccc}.factory-bootstrap-421 .table>tbody>.warning>td,.factory-bootstrap-421 .table>tbody>.warning>th,.factory-bootstrap-421 .table>tbody>tr>.warning,.factory-bootstrap-421 .table>tfoot>.warning>td,.factory-bootstrap-421 .table>tfoot>.warning>th,.factory-bootstrap-421 .table>tfoot>tr>.warning,.factory-bootstrap-421 .table>thead>.warning>td,.factory-bootstrap-421 .table>thead>.warning>th,.factory-bootstrap-421 .table>thead>tr>.warning{background-color:#fcf8e3}.factory-bootstrap-421 .table-hover>tbody>.warning:hover>td,.factory-bootstrap-421 .table-hover>tbody>.warning:hover>th,.factory-bootstrap-421 .table-hover>tbody>tr>.warning:hover{background-color:#faf2cc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.factory-bootstrap-421 fieldset{padding:0;margin:0;border:0}.factory-bootstrap-421 legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-421 label{display:inline-block;margin-bottom:5px;font-weight:700}.factory-bootstrap-421 input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.factory-bootstrap-421 input[type=checkbox],.factory-bootstrap-421 input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.factory-bootstrap-421 input[type=file]{display:block}.factory-bootstrap-421 select[multiple],.factory-bootstrap-421 select[size]{height:auto}.factory-bootstrap-421 select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.factory-bootstrap-421 input[type=checkbox]:focus,.factory-bootstrap-421 input[type=file]:focus,.factory-bootstrap-421 input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-421 input[type=number]::-webkit-inner-spin-button,.factory-bootstrap-421 input[type=number]::-webkit-outer-spin-button{height:auto}.factory-bootstrap-421 output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.factory-bootstrap-421 .form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.factory-bootstrap-421 .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .form-control:-moz-placeholder{color:#999}.factory-bootstrap-421 .form-control::-moz-placeholder{color:#999;opacity:1}.factory-bootstrap-421 .form-control:-ms-input-placeholder{color:#999}.factory-bootstrap-421 .form-control::-webkit-input-placeholder{color:#999}.factory-bootstrap-421 .form-control[disabled],.factory-bootstrap-421 .form-control[readonly],.factory-bootstrap-421 fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.factory-bootstrap-421 textarea.form-control{height:auto}.factory-bootstrap-421 .form-group{margin-bottom:15px}.factory-bootstrap-421 .checkbox,.factory-bootstrap-421 .radio{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.factory-bootstrap-421 .checkbox label,.factory-bootstrap-421 .radio label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.factory-bootstrap-421 .checkbox input[type=checkbox],.factory-bootstrap-421 .checkbox-inline input[type=checkbox],.factory-bootstrap-421 .radio input[type=radio],.factory-bootstrap-421 .radio-inline input[type=radio]{float:left;margin-left:-20px}.factory-bootstrap-421 .checkbox+.checkbox,.factory-bootstrap-421 .radio+.radio{margin-top:-5px}.factory-bootstrap-421 .checkbox-inline,.factory-bootstrap-421 .radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.factory-bootstrap-421 .checkbox-inline+.checkbox-inline,.factory-bootstrap-421 .radio-inline+.radio-inline{margin-top:0;margin-left:10px}.factory-bootstrap-421 .checkbox-inline[disabled],.factory-bootstrap-421 .checkbox[disabled],.factory-bootstrap-421 .radio-inline[disabled],.factory-bootstrap-421 .radio[disabled],.factory-bootstrap-421 fieldset[disabled] .checkbox,.factory-bootstrap-421 fieldset[disabled] .checkbox-inline,.factory-bootstrap-421 fieldset[disabled] .radio,.factory-bootstrap-421 fieldset[disabled] .radio-inline,.factory-bootstrap-421 fieldset[disabled] input[type=checkbox],.factory-bootstrap-421 fieldset[disabled] input[type=radio],.factory-bootstrap-421 input[type=checkbox][disabled],.factory-bootstrap-421 input[type=radio][disabled]{cursor:not-allowed}.factory-bootstrap-421 .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 select.input-sm{height:30px;line-height:30px}.factory-bootstrap-421 textarea.input-sm{height:auto}.factory-bootstrap-421 .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 select.input-lg{height:46px;line-height:46px}.factory-bootstrap-421 textarea.input-lg{height:auto}.factory-bootstrap-421 .has-warning .checkbox,.factory-bootstrap-421 .has-warning .checkbox-inline,.factory-bootstrap-421 .has-warning .control-label,.factory-bootstrap-421 .has-warning .help-block,.factory-bootstrap-421 .has-warning .radio,.factory-bootstrap-421 .has-warning .radio-inline{color:#8a6d3b}.factory-bootstrap-421 .has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.factory-bootstrap-421 .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.factory-bootstrap-421 .has-error .checkbox,.factory-bootstrap-421 .has-error .checkbox-inline,.factory-bootstrap-421 .has-error .control-label,.factory-bootstrap-421 .has-error .help-block,.factory-bootstrap-421 .has-error .radio,.factory-bootstrap-421 .has-error .radio-inline{color:#a94442}.factory-bootstrap-421 .controls{display:block}.factory-bootstrap-421 .has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.factory-bootstrap-421 .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.factory-bootstrap-421 .has-success .checkbox,.factory-bootstrap-421 .has-success .checkbox-inline,.factory-bootstrap-421 .has-success .control-label,.factory-bootstrap-421 .has-success .help-block,.factory-bootstrap-421 .has-success .radio,.factory-bootstrap-421 .has-success .radio-inline{color:#3c763d}.factory-bootstrap-421 .has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.factory-bootstrap-421 .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.factory-bootstrap-421 .form-control-static{margin-bottom:0}.factory-bootstrap-421 .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373;font-weight:400}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .checkbox,.form-inline .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}}.factory-bootstrap-421 .form-horizontal .checkbox,.factory-bootstrap-421 .form-horizontal .checkbox-inline,.factory-bootstrap-421 .form-horizontal .control-label,.factory-bootstrap-421 .form-horizontal .radio,.factory-bootstrap-421 .form-horizontal .radio-inline{position:relative;padding-top:7px;margin-top:0;margin-bottom:0}.factory-bootstrap-421 .form-horizontal .control-label{max-width:200px}.factory-bootstrap-421 .form-horizontal .checkbox,.factory-bootstrap-421 .form-horizontal .radio{min-height:27px}.factory-bootstrap-421 .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.factory-bootstrap-421 .form-horizontal .form-group:after,.factory-bootstrap-421 .form-horizontal .form-group:before{display:table;content:" "}.factory-bootstrap-421 .form-horizontal .form-group:after{clear:both}.factory-bootstrap-421 .form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.factory-bootstrap-421 .btn{display:inline-block;padding:5px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.factory-bootstrap-421 .btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-421 .btn{text-decoration:none}.factory-bootstrap-421 .btn:focus,.factory-bootstrap-421 .btn:hover{color:#333;text-decoration:none}.factory-bootstrap-421 .btn.disabled,.factory-bootstrap-421 .btn[disabled],.factory-bootstrap-421 fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active,.factory-bootstrap-421 .btn-default:focus,.factory-bootstrap-421 .btn-default:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-default{background:#fafafa;border-color:#999;color:#222}.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-default{background-image:none}.factory-bootstrap-421 .btn-default.disabled,.factory-bootstrap-421 .btn-default.disabled.active,.factory-bootstrap-421 .btn-default.disabled:active,.factory-bootstrap-421 .btn-default.disabled:focus,.factory-bootstrap-421 .btn-default.disabled:hover,.factory-bootstrap-421 .btn-default[disabled],.factory-bootstrap-421 .btn-default[disabled].active,.factory-bootstrap-421 .btn-default[disabled]:active,.factory-bootstrap-421 .btn-default[disabled]:focus,.factory-bootstrap-421 .btn-default[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-default,.factory-bootstrap-421 fieldset[disabled] .btn-default.active,.factory-bootstrap-421 fieldset[disabled] .btn-default:active,.factory-bootstrap-421 fieldset[disabled] .btn-default:focus,.factory-bootstrap-421 fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.factory-bootstrap-421 .btn-default .badge{color:#fff;background-color:#fff}.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active,.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-primary{background-image:none}.factory-bootstrap-421 .btn-primary.disabled,.factory-bootstrap-421 .btn-primary.disabled.active,.factory-bootstrap-421 .btn-primary.disabled:active,.factory-bootstrap-421 .btn-primary.disabled:focus,.factory-bootstrap-421 .btn-primary.disabled:hover,.factory-bootstrap-421 .btn-primary[disabled],.factory-bootstrap-421 .btn-primary[disabled].active,.factory-bootstrap-421 .btn-primary[disabled]:active,.factory-bootstrap-421 .btn-primary[disabled]:focus,.factory-bootstrap-421 .btn-primary[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-primary,.factory-bootstrap-421 fieldset[disabled] .btn-primary.active,.factory-bootstrap-421 fieldset[disabled] .btn-primary:active,.factory-bootstrap-421 fieldset[disabled] .btn-primary:focus,.factory-bootstrap-421 fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.factory-bootstrap-421 .btn-primary .badge{color:#428bca;background-color:#fff}.factory-bootstrap-421 .btn-warning{color:#fff;background-color:#f0ad4e}.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active,.factory-bootstrap-421 .btn-warning:focus,.factory-bootstrap-421 .btn-warning:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-warning{background-image:none}.factory-bootstrap-421 .btn-warning.disabled,.factory-bootstrap-421 .btn-warning.disabled.active,.factory-bootstrap-421 .btn-warning.disabled:active,.factory-bootstrap-421 .btn-warning.disabled:focus,.factory-bootstrap-421 .btn-warning.disabled:hover,.factory-bootstrap-421 .btn-warning[disabled],.factory-bootstrap-421 .btn-warning[disabled].active,.factory-bootstrap-421 .btn-warning[disabled]:active,.factory-bootstrap-421 .btn-warning[disabled]:focus,.factory-bootstrap-421 .btn-warning[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-warning,.factory-bootstrap-421 fieldset[disabled] .btn-warning.active,.factory-bootstrap-421 fieldset[disabled] .btn-warning:active,.factory-bootstrap-421 fieldset[disabled] .btn-warning:focus,.factory-bootstrap-421 fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.factory-bootstrap-421 .btn-warning .badge{color:#f0ad4e;background-color:#fff}.factory-bootstrap-421 .btn-success{color:#fff;background-color:#5cb85c}.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active,.factory-bootstrap-421 .btn-success:focus,.factory-bootstrap-421 .btn-success:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-success{background-image:none}.factory-bootstrap-421 .btn-success.disabled,.factory-bootstrap-421 .btn-success.disabled.active,.factory-bootstrap-421 .btn-success.disabled:active,.factory-bootstrap-421 .btn-success.disabled:focus,.factory-bootstrap-421 .btn-success.disabled:hover,.factory-bootstrap-421 .btn-success[disabled],.factory-bootstrap-421 .btn-success[disabled].active,.factory-bootstrap-421 .btn-success[disabled]:active,.factory-bootstrap-421 .btn-success[disabled]:focus,.factory-bootstrap-421 .btn-success[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-success,.factory-bootstrap-421 fieldset[disabled] .btn-success.active,.factory-bootstrap-421 fieldset[disabled] .btn-success:active,.factory-bootstrap-421 fieldset[disabled] .btn-success:focus,.factory-bootstrap-421 fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.factory-bootstrap-421 .btn-success .badge{color:#5cb85c;background-color:#fff}.factory-bootstrap-421 .btn-info{color:#fff;background-color:#5bc0de}.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active,.factory-bootstrap-421 .btn-info:focus,.factory-bootstrap-421 .btn-info:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active,.factory-bootstrap-421 .open .dropdown-toggle.btn-info{background-image:none}.factory-bootstrap-421 .btn-info.disabled,.factory-bootstrap-421 .btn-info.disabled.active,.factory-bootstrap-421 .btn-info.disabled:active,.factory-bootstrap-421 .btn-info.disabled:focus,.factory-bootstrap-421 .btn-info.disabled:hover,.factory-bootstrap-421 .btn-info[disabled],.factory-bootstrap-421 .btn-info[disabled].active,.factory-bootstrap-421 .btn-info[disabled]:active,.factory-bootstrap-421 .btn-info[disabled]:focus,.factory-bootstrap-421 .btn-info[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-info,.factory-bootstrap-421 fieldset[disabled] .btn-info.active,.factory-bootstrap-421 fieldset[disabled] .btn-info:active,.factory-bootstrap-421 fieldset[disabled] .btn-info:focus,.factory-bootstrap-421 fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.factory-bootstrap-421 .btn-info .badge{color:#5bc0de;background-color:#fff}.factory-bootstrap-421 .btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.factory-bootstrap-421 .btn-link,.factory-bootstrap-421 .btn-link:active,.factory-bootstrap-421 .btn-link[disabled],.factory-bootstrap-421 fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-421 .btn-link,.factory-bootstrap-421 .btn-link:active,.factory-bootstrap-421 .btn-link:focus,.factory-bootstrap-421 .btn-link:hover{border-color:transparent}.factory-bootstrap-421 .btn-link:focus,.factory-bootstrap-421 .btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.factory-bootstrap-421 .btn-link[disabled]:focus,.factory-bootstrap-421 .btn-link[disabled]:hover,.factory-bootstrap-421 fieldset[disabled] .btn-link:focus,.factory-bootstrap-421 fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.factory-bootstrap-421 .btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-block{display:block;width:100%;padding-right:0;padding-left:0}.factory-bootstrap-421 .btn-block+.btn-block{margin-top:5px}.factory-bootstrap-421 input[type=button].btn-block,.factory-bootstrap-421 input[type=reset].btn-block,.factory-bootstrap-421 input[type=submit].btn-block{width:100%}.factory-bootstrap-421 .fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.factory-bootstrap-421 .fade.in{opacity:1}.factory-bootstrap-421 .collapse{display:none}.factory-bootstrap-421 .collapse.in{display:block}.factory-bootstrap-421 .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular) format('svg')}.factory-bootstrap-421 .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale}.factory-bootstrap-421 .glyphicon:empty{width:1em}.factory-bootstrap-421 .glyphicon-asterisk:before{content:"\2a"}.factory-bootstrap-421 .glyphicon-plus:before{content:"\2b"}.factory-bootstrap-421 .glyphicon-euro:before{content:"\20ac"}.factory-bootstrap-421 .glyphicon-minus:before{content:"\2212"}.factory-bootstrap-421 .glyphicon-cloud:before{content:"\2601"}.factory-bootstrap-421 .glyphicon-envelope:before{content:"\2709"}.factory-bootstrap-421 .glyphicon-pencil:before{content:"\270f"}.factory-bootstrap-421 .glyphicon-glass:before{content:"\e001"}.factory-bootstrap-421 .glyphicon-music:before{content:"\e002"}.factory-bootstrap-421 .glyphicon-search:before{content:"\e003"}.factory-bootstrap-421 .glyphicon-heart:before{content:"\e005"}.factory-bootstrap-421 .glyphicon-star:before{content:"\e006"}.factory-bootstrap-421 .glyphicon-star-empty:before{content:"\e007"}.factory-bootstrap-421 .glyphicon-user:before{content:"\e008"}.factory-bootstrap-421 .glyphicon-film:before{content:"\e009"}.factory-bootstrap-421 .glyphicon-th-large:before{content:"\e010"}.factory-bootstrap-421 .glyphicon-th:before{content:"\e011"}.factory-bootstrap-421 .glyphicon-th-list:before{content:"\e012"}.factory-bootstrap-421 .glyphicon-ok:before{content:"\e013"}.factory-bootstrap-421 .glyphicon-remove:before{content:"\e014"}.factory-bootstrap-421 .glyphicon-zoom-in:before{content:"\e015"}.factory-bootstrap-421 .glyphicon-zoom-out:before{content:"\e016"}.factory-bootstrap-421 .glyphicon-off:before{content:"\e017"}.factory-bootstrap-421 .glyphicon-signal:before{content:"\e018"}.factory-bootstrap-421 .glyphicon-cog:before{content:"\e019"}.factory-bootstrap-421 .glyphicon-trash:before{content:"\e020"}.factory-bootstrap-421 .glyphicon-home:before{content:"\e021"}.factory-bootstrap-421 .glyphicon-file:before{content:"\e022"}.factory-bootstrap-421 .glyphicon-time:before{content:"\e023"}.factory-bootstrap-421 .glyphicon-road:before{content:"\e024"}.factory-bootstrap-421 .glyphicon-download-alt:before{content:"\e025"}.factory-bootstrap-421 .glyphicon-download:before{content:"\e026"}.factory-bootstrap-421 .glyphicon-upload:before{content:"\e027"}.factory-bootstrap-421 .glyphicon-inbox:before{content:"\e028"}.factory-bootstrap-421 .glyphicon-play-circle:before{content:"\e029"}.factory-bootstrap-421 .glyphicon-repeat:before{content:"\e030"}.factory-bootstrap-421 .glyphicon-refresh:before{content:"\e031"}.factory-bootstrap-421 .glyphicon-list-alt:before{content:"\e032"}.factory-bootstrap-421 .glyphicon-lock:before{content:"\e033"}.factory-bootstrap-421 .glyphicon-flag:before{content:"\e034"}.factory-bootstrap-421 .glyphicon-headphones:before{content:"\e035"}.factory-bootstrap-421 .glyphicon-volume-off:before{content:"\e036"}.factory-bootstrap-421 .glyphicon-volume-down:before{content:"\e037"}.factory-bootstrap-421 .glyphicon-volume-up:before{content:"\e038"}.factory-bootstrap-421 .glyphicon-qrcode:before{content:"\e039"}.factory-bootstrap-421 .glyphicon-barcode:before{content:"\e040"}.factory-bootstrap-421 .glyphicon-tag:before{content:"\e041"}.factory-bootstrap-421 .glyphicon-tags:before{content:"\e042"}.factory-bootstrap-421 .glyphicon-book:before{content:"\e043"}.factory-bootstrap-421 .glyphicon-bookmark:before{content:"\e044"}.factory-bootstrap-421 .glyphicon-print:before{content:"\e045"}.factory-bootstrap-421 .glyphicon-camera:before{content:"\e046"}.factory-bootstrap-421 .glyphicon-font:before{content:"\e047"}.factory-bootstrap-421 .glyphicon-bold:before{content:"\e048"}.factory-bootstrap-421 .glyphicon-italic:before{content:"\e049"}.factory-bootstrap-421 .glyphicon-text-height:before{content:"\e050"}.factory-bootstrap-421 .glyphicon-text-width:before{content:"\e051"}.factory-bootstrap-421 .glyphicon-align-left:before{content:"\e052"}.factory-bootstrap-421 .glyphicon-align-center:before{content:"\e053"}.factory-bootstrap-421 .glyphicon-align-right:before{content:"\e054"}.factory-bootstrap-421 .glyphicon-align-justify:before{content:"\e055"}.factory-bootstrap-421 .glyphicon-list:before{content:"\e056"}.factory-bootstrap-421 .glyphicon-indent-left:before{content:"\e057"}.factory-bootstrap-421 .glyphicon-indent-right:before{content:"\e058"}.factory-bootstrap-421 .glyphicon-facetime-video:before{content:"\e059"}.factory-bootstrap-421 .glyphicon-picture:before{content:"\e060"}.factory-bootstrap-421 .glyphicon-map-marker:before{content:"\e062"}.factory-bootstrap-421 .glyphicon-adjust:before{content:"\e063"}.factory-bootstrap-421 .glyphicon-tint:before{content:"\e064"}.factory-bootstrap-421 .glyphicon-edit:before{content:"\e065"}.factory-bootstrap-421 .glyphicon-share:before{content:"\e066"}.factory-bootstrap-421 .glyphicon-check:before{content:"\e067"}.factory-bootstrap-421 .glyphicon-move:before{content:"\e068"}.factory-bootstrap-421 .glyphicon-step-backward:before{content:"\e069"}.factory-bootstrap-421 .glyphicon-fast-backward:before{content:"\e070"}.factory-bootstrap-421 .glyphicon-backward:before{content:"\e071"}.factory-bootstrap-421 .glyphicon-play:before{content:"\e072"}.factory-bootstrap-421 .glyphicon-pause:before{content:"\e073"}.factory-bootstrap-421 .glyphicon-stop:before{content:"\e074"}.factory-bootstrap-421 .glyphicon-forward:before{content:"\e075"}.factory-bootstrap-421 .glyphicon-fast-forward:before{content:"\e076"}.factory-bootstrap-421 .glyphicon-step-forward:before{content:"\e077"}.factory-bootstrap-421 .glyphicon-eject:before{content:"\e078"}.factory-bootstrap-421 .glyphicon-chevron-left:before{content:"\e079"}.factory-bootstrap-421 .glyphicon-chevron-right:before{content:"\e080"}.factory-bootstrap-421 .glyphicon-plus-sign:before{content:"\e081"}.factory-bootstrap-421 .glyphicon-minus-sign:before{content:"\e082"}.factory-bootstrap-421 .glyphicon-remove-sign:before{content:"\e083"}.factory-bootstrap-421 .glyphicon-ok-sign:before{content:"\e084"}.factory-bootstrap-421 .glyphicon-question-sign:before{content:"\e085"}.factory-bootstrap-421 .glyphicon-info-sign:before{content:"\e086"}.factory-bootstrap-421 .glyphicon-screenshot:before{content:"\e087"}.factory-bootstrap-421 .glyphicon-remove-circle:before{content:"\e088"}.factory-bootstrap-421 .glyphicon-ok-circle:before{content:"\e089"}.factory-bootstrap-421 .glyphicon-ban-circle:before{content:"\e090"}.factory-bootstrap-421 .glyphicon-arrow-left:before{content:"\e091"}.factory-bootstrap-421 .glyphicon-arrow-right:before{content:"\e092"}.factory-bootstrap-421 .glyphicon-arrow-up:before{content:"\e093"}.factory-bootstrap-421 .glyphicon-arrow-down:before{content:"\e094"}.factory-bootstrap-421 .glyphicon-share-alt:before{content:"\e095"}.factory-bootstrap-421 .glyphicon-resize-full:before{content:"\e096"}.factory-bootstrap-421 .glyphicon-resize-small:before{content:"\e097"}.factory-bootstrap-421 .glyphicon-exclamation-sign:before{content:"\e101"}.factory-bootstrap-421 .glyphicon-gift:before{content:"\e102"}.factory-bootstrap-421 .glyphicon-leaf:before{content:"\e103"}.factory-bootstrap-421 .glyphicon-fire:before{content:"\e104"}.factory-bootstrap-421 .glyphicon-eye-open:before{content:"\e105"}.factory-bootstrap-421 .glyphicon-eye-close:before{content:"\e106"}.factory-bootstrap-421 .glyphicon-warning-sign:before{content:"\e107"}.factory-bootstrap-421 .glyphicon-plane:before{content:"\e108"}.factory-bootstrap-421 .glyphicon-calendar:before{content:"\e109"}.factory-bootstrap-421 .glyphicon-random:before{content:"\e110"}.factory-bootstrap-421 .glyphicon-comment:before{content:"\e111"}.factory-bootstrap-421 .glyphicon-magnet:before{content:"\e112"}.factory-bootstrap-421 .glyphicon-chevron-up:before{content:"\e113"}.factory-bootstrap-421 .glyphicon-chevron-down:before{content:"\e114"}.factory-bootstrap-421 .glyphicon-retweet:before{content:"\e115"}.factory-bootstrap-421 .glyphicon-shopping-cart:before{content:"\e116"}.factory-bootstrap-421 .glyphicon-folder-close:before{content:"\e117"}.factory-bootstrap-421 .glyphicon-folder-open:before{content:"\e118"}.factory-bootstrap-421 .glyphicon-resize-vertical:before{content:"\e119"}.factory-bootstrap-421 .glyphicon-resize-horizontal:before{content:"\e120"}.factory-bootstrap-421 .glyphicon-hdd:before{content:"\e121"}.factory-bootstrap-421 .glyphicon-bullhorn:before{content:"\e122"}.factory-bootstrap-421 .glyphicon-bell:before{content:"\e123"}.factory-bootstrap-421 .glyphicon-certificate:before{content:"\e124"}.factory-bootstrap-421 .glyphicon-thumbs-up:before{content:"\e125"}.factory-bootstrap-421 .glyphicon-thumbs-down:before{content:"\e126"}.factory-bootstrap-421 .glyphicon-hand-right:before{content:"\e127"}.factory-bootstrap-421 .glyphicon-hand-left:before{content:"\e128"}.factory-bootstrap-421 .glyphicon-hand-up:before{content:"\e129"}.factory-bootstrap-421 .glyphicon-hand-down:before{content:"\e130"}.factory-bootstrap-421 .glyphicon-circle-arrow-right:before{content:"\e131"}.factory-bootstrap-421 .glyphicon-circle-arrow-left:before{content:"\e132"}.factory-bootstrap-421 .glyphicon-circle-arrow-up:before{content:"\e133"}.factory-bootstrap-421 .glyphicon-circle-arrow-down:before{content:"\e134"}.factory-bootstrap-421 .glyphicon-globe:before{content:"\e135"}.factory-bootstrap-421 .glyphicon-wrench:before{content:"\e136"}.factory-bootstrap-421 .glyphicon-tasks:before{content:"\e137"}.factory-bootstrap-421 .glyphicon-filter:before{content:"\e138"}.factory-bootstrap-421 .glyphicon-briefcase:before{content:"\e139"}.factory-bootstrap-421 .glyphicon-fullscreen:before{content:"\e140"}.factory-bootstrap-421 .glyphicon-dashboard:before{content:"\e141"}.factory-bootstrap-421 .glyphicon-paperclip:before{content:"\e142"}.factory-bootstrap-421 .glyphicon-heart-empty:before{content:"\e143"}.factory-bootstrap-421 .glyphicon-link:before{content:"\e144"}.factory-bootstrap-421 .glyphicon-phone:before{content:"\e145"}.factory-bootstrap-421 .glyphicon-pushpin:before{content:"\e146"}.factory-bootstrap-421 .glyphicon-usd:before{content:"\e148"}.factory-bootstrap-421 .glyphicon-gbp:before{content:"\e149"}.factory-bootstrap-421 .glyphicon-sort:before{content:"\e150"}.factory-bootstrap-421 .glyphicon-sort-by-alphabet:before{content:"\e151"}.factory-bootstrap-421 .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.factory-bootstrap-421 .glyphicon-sort-by-order:before{content:"\e153"}.factory-bootstrap-421 .glyphicon-sort-by-order-alt:before{content:"\e154"}.factory-bootstrap-421 .glyphicon-sort-by-attributes:before{content:"\e155"}.factory-bootstrap-421 .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.factory-bootstrap-421 .glyphicon-unchecked:before{content:"\e157"}.factory-bootstrap-421 .glyphicon-expand:before{content:"\e158"}.factory-bootstrap-421 .glyphicon-collapse-down:before{content:"\e159"}.factory-bootstrap-421 .glyphicon-collapse-up:before{content:"\e160"}.factory-bootstrap-421 .glyphicon-log-in:before{content:"\e161"}.factory-bootstrap-421 .glyphicon-flash:before{content:"\e162"}.factory-bootstrap-421 .glyphicon-log-out:before{content:"\e163"}.factory-bootstrap-421 .glyphicon-new-window:before{content:"\e164"}.factory-bootstrap-421 .glyphicon-record:before{content:"\e165"}.factory-bootstrap-421 .glyphicon-save:before{content:"\e166"}.factory-bootstrap-421 .glyphicon-open:before{content:"\e167"}.factory-bootstrap-421 .glyphicon-saved:before{content:"\e168"}.factory-bootstrap-421 .glyphicon-import:before{content:"\e169"}.factory-bootstrap-421 .glyphicon-export:before{content:"\e170"}.factory-bootstrap-421 .glyphicon-send:before{content:"\e171"}.factory-bootstrap-421 .glyphicon-floppy-disk:before{content:"\e172"}.factory-bootstrap-421 .glyphicon-floppy-saved:before{content:"\e173"}.factory-bootstrap-421 .glyphicon-floppy-remove:before{content:"\e174"}.factory-bootstrap-421 .glyphicon-floppy-save:before{content:"\e175"}.factory-bootstrap-421 .glyphicon-floppy-open:before{content:"\e176"}.factory-bootstrap-421 .glyphicon-credit-card:before{content:"\e177"}.factory-bootstrap-421 .glyphicon-transfer:before{content:"\e178"}.factory-bootstrap-421 .glyphicon-cutlery:before{content:"\e179"}.factory-bootstrap-421 .glyphicon-header:before{content:"\e180"}.factory-bootstrap-421 .glyphicon-compressed:before{content:"\e181"}.factory-bootstrap-421 .glyphicon-earphone:before{content:"\e182"}.factory-bootstrap-421 .glyphicon-phone-alt:before{content:"\e183"}.factory-bootstrap-421 .glyphicon-tower:before{content:"\e184"}.factory-bootstrap-421 .glyphicon-stats:before{content:"\e185"}.factory-bootstrap-421 .glyphicon-sd-video:before{content:"\e186"}.factory-bootstrap-421 .glyphicon-hd-video:before{content:"\e187"}.factory-bootstrap-421 .glyphicon-subtitles:before{content:"\e188"}.factory-bootstrap-421 .glyphicon-sound-stereo:before{content:"\e189"}.factory-bootstrap-421 .glyphicon-sound-dolby:before{content:"\e190"}.factory-bootstrap-421 .glyphicon-sound-5-1:before{content:"\e191"}.factory-bootstrap-421 .glyphicon-sound-6-1:before{content:"\e192"}.factory-bootstrap-421 .glyphicon-sound-7-1:before{content:"\e193"}.factory-bootstrap-421 .glyphicon-copyright-mark:before{content:"\e194"}.factory-bootstrap-421 .glyphicon-registration-mark:before{content:"\e195"}.factory-bootstrap-421 .glyphicon-cloud-download:before{content:"\e197"}.factory-bootstrap-421 .glyphicon-cloud-upload:before{content:"\e198"}.factory-bootstrap-421 .glyphicon-tree-conifer:before{content:"\e199"}.factory-bootstrap-421 .glyphicon-tree-deciduous:before{content:"\e200"}.factory-bootstrap-421 .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.factory-bootstrap-421 .dropdown{position:relative}.factory-bootstrap-421 .dropdown-toggle:focus{outline:0}.factory-bootstrap-421 .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.factory-bootstrap-421 .dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-421 .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-421 .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}.factory-bootstrap-421 .dropdown-menu>li>a:focus,.factory-bootstrap-421 .dropdown-menu>li>a:hover{color:#262626;text-decoration:none}.factory-bootstrap-421 .dropdown-menu>.active>a,.factory-bootstrap-421 .dropdown-menu>.active>a:focus,.factory-bootstrap-421 .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0}.factory-bootstrap-421 .dropdown-menu>.disabled>a,.factory-bootstrap-421 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-421 .dropdown-menu>.disabled>a:hover{color:#999}.factory-bootstrap-421 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-421 .dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .open>.dropdown-menu{display:block}.factory-bootstrap-421 .open>a{outline:0}.factory-bootstrap-421 .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.factory-bootstrap-421 .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.factory-bootstrap-421 .pull-right>.dropdown-menu{right:0;left:auto}.factory-bootstrap-421 .dropup .caret,.factory-bootstrap-421 .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.factory-bootstrap-421 .dropup .dropdown-menu,.factory-bootstrap-421 .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.factory-bootstrap-421 .btn-group,.factory-bootstrap-421 .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.factory-bootstrap-421 .btn-group-vertical>.btn,.factory-bootstrap-421 .btn-group>.btn{position:relative;float:left}.factory-bootstrap-421 .btn-group-vertical>.btn.active,.factory-bootstrap-421 .btn-group-vertical>.btn:active,.factory-bootstrap-421 .btn-group-vertical>.btn:focus,.factory-bootstrap-421 .btn-group-vertical>.btn:hover,.factory-bootstrap-421 .btn-group>.btn.active,.factory-bootstrap-421 .btn-group>.btn:active,.factory-bootstrap-421 .btn-group>.btn:focus,.factory-bootstrap-421 .btn-group>.btn:hover{z-index:2}.factory-bootstrap-421 .btn-group-vertical>.btn:focus,.factory-bootstrap-421 .btn-group>.btn:focus{outline:0}.factory-bootstrap-421 .btn-group .btn+.btn,.factory-bootstrap-421 .btn-group .btn+.btn-group,.factory-bootstrap-421 .btn-group .btn-group+.btn,.factory-bootstrap-421 .btn-group .btn-group+.btn-group{margin-left:-1px}.factory-bootstrap-421 .btn-toolbar:after,.factory-bootstrap-421 .btn-toolbar:before{display:table;content:" "}.factory-bootstrap-421 .btn-toolbar:after{clear:both}.factory-bootstrap-421 .btn-toolbar .btn-group{float:left}.factory-bootstrap-421 .btn-toolbar>.btn+.btn,.factory-bootstrap-421 .btn-toolbar>.btn+.btn-group,.factory-bootstrap-421 .btn-toolbar>.btn-group+.btn,.factory-bootstrap-421 .btn-toolbar>.btn-group+.btn-group{margin-left:5px}.factory-bootstrap-421 .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.factory-bootstrap-421 .btn-group>.btn:first-child{margin-left:0}.factory-bootstrap-421 .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-421 .btn-group>.btn:last-child:not(:first-child),.factory-bootstrap-421 .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .btn-group>.btn-group{float:left}.factory-bootstrap-421 .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-421 .btn-group>.btn-group:first-child>.btn:last-child,.factory-bootstrap-421 .btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-421 .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .btn-group .dropdown-toggle:active,.factory-bootstrap-421 .btn-group.open .dropdown-toggle{outline:0}.factory-bootstrap-421 .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.factory-bootstrap-421 .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.factory-bootstrap-421 .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.factory-bootstrap-421 .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-421 .btn-group{border:4px solid #f9f9f9;border-radius:4px}.factory-bootstrap-421 .btn-group .btn.active.value{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-421 .btn .caret{margin-left:0}.factory-bootstrap-421 .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.factory-bootstrap-421 .dropup .btn-lg .caret{border-width:0 5px 5px}.factory-bootstrap-421 .btn-group-vertical>.btn,.factory-bootstrap-421 .btn-group-vertical>.btn-group,.factory-bootstrap-421 .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.factory-bootstrap-421 .btn-group-vertical>.btn-group:after,.factory-bootstrap-421 .btn-group-vertical>.btn-group:before{display:table;content:" "}.factory-bootstrap-421 .btn-group-vertical>.btn-group:after{clear:both}.factory-bootstrap-421 .btn-group-vertical>.btn-group>.btn{float:none}.factory-bootstrap-421 .btn-group-vertical>.btn+.btn,.factory-bootstrap-421 .btn-group-vertical>.btn+.btn-group,.factory-bootstrap-421 .btn-group-vertical>.btn-group+.btn,.factory-bootstrap-421 .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.factory-bootstrap-421 .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn-group:first-child>.btn:last-child,.factory-bootstrap-421 .btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-421 .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.factory-bootstrap-421 .btn-group-justified>.btn,.factory-bootstrap-421 .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.factory-bootstrap-421 .btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.factory-bootstrap-421 .input-group{position:relative;display:table;border-collapse:separate}.factory-bootstrap-421 .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.factory-bootstrap-421 .input-group .form-control{width:100%;margin-bottom:0}.factory-bootstrap-421 .input-group-lg>.form-control,.factory-bootstrap-421 .input-group-lg>.input-group-addon,.factory-bootstrap-421 .input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-421 select.input-group-lg>.form-control,.factory-bootstrap-421 select.input-group-lg>.input-group-addon,.factory-bootstrap-421 select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}.factory-bootstrap-421 textarea.input-group-lg>.form-control,.factory-bootstrap-421 textarea.input-group-lg>.input-group-addon,.factory-bootstrap-421 textarea.input-group-lg>.input-group-btn>.btn{height:auto}.factory-bootstrap-421 .input-group-sm>.form-control,.factory-bootstrap-421 .input-group-sm>.input-group-addon,.factory-bootstrap-421 .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-421 select.input-group-sm>.form-control,.factory-bootstrap-421 select.input-group-sm>.input-group-addon,.factory-bootstrap-421 select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}.factory-bootstrap-421 textarea.input-group-sm>.form-control,.factory-bootstrap-421 textarea.input-group-sm>.input-group-addon,.factory-bootstrap-421 textarea.input-group-sm>.input-group-btn>.btn{height:auto}.factory-bootstrap-421 .input-group .form-control,.factory-bootstrap-421 .input-group-addon,.factory-bootstrap-421 .input-group-btn{display:table-cell}.factory-bootstrap-421 .input-group .form-control:not(:first-child):not(:last-child),.factory-bootstrap-421 .input-group-addon:not(:first-child):not(:last-child),.factory-bootstrap-421 .input-group-btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-421 .input-group-addon,.factory-bootstrap-421 .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.factory-bootstrap-421 .input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-421 .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.factory-bootstrap-421 .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.factory-bootstrap-421 .input-group-addon input[type=checkbox],.factory-bootstrap-421 .input-group-addon input[type=radio]{margin-top:0}.factory-bootstrap-421 .input-group .form-control:first-child,.factory-bootstrap-421 .input-group-addon:first-child,.factory-bootstrap-421 .input-group-btn:first-child>.btn,.factory-bootstrap-421 .input-group-btn:first-child>.dropdown-toggle,.factory-bootstrap-421 .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-421 .input-group-addon:first-child{border-right:0}.factory-bootstrap-421 .input-group .form-control:last-child,.factory-bootstrap-421 .input-group-addon:last-child,.factory-bootstrap-421 .input-group-btn:first-child>.btn:not(:first-child),.factory-bootstrap-421 .input-group-btn:last-child>.btn,.factory-bootstrap-421 .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .input-group-addon:last-child{border-left:0}.factory-bootstrap-421 .input-group-btn{position:relative;white-space:nowrap}.factory-bootstrap-421 .input-group-btn:first-child>.btn{margin-right:-1px}.factory-bootstrap-421 .input-group-btn:last-child>.btn{margin-left:-1px}.factory-bootstrap-421 .input-group-btn>.btn{position:relative}.factory-bootstrap-421 .input-group-btn>.btn+.btn{margin-left:-4px}.factory-bootstrap-421 .input-group-btn>.btn:active,.factory-bootstrap-421 .input-group-btn>.btn:hover{z-index:2}.factory-bootstrap-421 .nav{padding-left:0;margin-bottom:0;list-style:none}.factory-bootstrap-421 .nav:after,.factory-bootstrap-421 .nav:before{display:table;content:" "}.factory-bootstrap-421 .nav:after{clear:both}.factory-bootstrap-421 .nav>li{position:relative;display:block}.factory-bootstrap-421 .nav>li>a{position:relative;display:block;padding:10px 15px}.factory-bootstrap-421 .nav>li>a:focus,.factory-bootstrap-421 .nav>li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-421 .nav>li.disabled>a{color:#999}.factory-bootstrap-421 .nav>li.disabled>a:focus,.factory-bootstrap-421 .nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.factory-bootstrap-421 .nav .open>a,.factory-bootstrap-421 .nav .open>a:focus,.factory-bootstrap-421 .nav .open>a:hover{background-color:#eee;border-color:#428bca}.factory-bootstrap-421 .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-421 .nav>li>a>img{max-width:none}.factory-bootstrap-421 .nav-tabs{border-bottom:1px solid #ddd}.factory-bootstrap-421 .nav-tabs>li{float:left;margin-bottom:-1px}.factory-bootstrap-421 .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.factory-bootstrap-421 .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.factory-bootstrap-421 .nav-tabs>li.active>a,.factory-bootstrap-421 .nav-tabs>li.active>a:focus,.factory-bootstrap-421 .nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.factory-bootstrap-421 .nav-tabs.nav-justified{width:100%;border-bottom:0}.factory-bootstrap-421 .nav-tabs.nav-justified>li{float:none}.factory-bootstrap-421 .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-421 .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-421 .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-421 .nav-tabs.nav-justified>.active>a,.factory-bootstrap-421 .nav-tabs.nav-justified>.active>a:focus,.factory-bootstrap-421 .nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-421 .nav-pills>li{float:left}.factory-bootstrap-421 .nav-pills>li>a{border-radius:4px}.factory-bootstrap-421 .nav-pills>li+li{margin-left:2px}.factory-bootstrap-421 .nav-pills>li.active>a,.factory-bootstrap-421 .nav-pills>li.active>a:focus,.factory-bootstrap-421 .nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.factory-bootstrap-421 .nav-stacked>li{float:none}.factory-bootstrap-421 .nav-stacked>li+li{margin-top:2px;margin-left:0}.factory-bootstrap-421 .nav-justified{width:100%}.factory-bootstrap-421 .nav-justified>li{float:none}.factory-bootstrap-421 .nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-421 .nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-421 .nav-tabs-justified{border-bottom:0}.factory-bootstrap-421 .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-421 .nav-tabs-justified>.active>a,.factory-bootstrap-421 .nav-tabs-justified>.active>a:focus,.factory-bootstrap-421 .nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-421 .tab-content>.tab-pane{display:none}.factory-bootstrap-421 .tab-content>.active{display:block}.factory-bootstrap-421 .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.factory-bootstrap-421 .navbar:after,.factory-bootstrap-421 .navbar:before{display:table;content:" "}.factory-bootstrap-421 .navbar:after{clear:both}@media (min-width:768px){.navbar{border-radius:4px}}.factory-bootstrap-421 .navbar-header:after,.factory-bootstrap-421 .navbar-header:before{display:table;content:" "}.factory-bootstrap-421 .navbar-header:after{clear:both}@media (min-width:768px){.navbar-header{float:left}}.factory-bootstrap-421 .navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.factory-bootstrap-421 .navbar-collapse:after,.factory-bootstrap-421 .navbar-collapse:before{display:table;content:" "}.factory-bootstrap-421 .navbar-collapse:after{clear:both}.factory-bootstrap-421 .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.factory-bootstrap-421 .container>.navbar-collapse,.factory-bootstrap-421 .container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.factory-bootstrap-421 .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.factory-bootstrap-421 .navbar-fixed-bottom,.factory-bootstrap-421 .navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.factory-bootstrap-421 .navbar-fixed-top{top:0;border-width:0 0 1px}.factory-bootstrap-421 .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.factory-bootstrap-421 .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.factory-bootstrap-421 .navbar-brand:focus,.factory-bootstrap-421 .navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.factory-bootstrap-421 .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.factory-bootstrap-421 .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.factory-bootstrap-421 .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.factory-bootstrap-421 .navbar-nav{margin:7.5px -15px}.factory-bootstrap-421 .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.factory-bootstrap-421 .navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{float:none;margin-left:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.factory-bootstrap-421 .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-421 .navbar-nav.pull-right>li>.dropdown-menu,.factory-bootstrap-421 .navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-421 .navbar-btn{margin-top:8px;margin-bottom:8px}.factory-bootstrap-421 .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.factory-bootstrap-421 .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.factory-bootstrap-421 .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.factory-bootstrap-421 .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.factory-bootstrap-421 .navbar-default .navbar-brand{color:#777}.factory-bootstrap-421 .navbar-default .navbar-brand:focus,.factory-bootstrap-421 .navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.factory-bootstrap-421 .navbar-default .navbar-nav>li>a,.factory-bootstrap-421 .navbar-default .navbar-text{color:#777}.factory-bootstrap-421 .navbar-default .navbar-nav>li>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a,.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.factory-bootstrap-421 .navbar-default .navbar-nav>.disabled>a,.factory-bootstrap-421 .navbar-default .navbar-nav>.disabled>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.factory-bootstrap-421 .navbar-default .navbar-toggle{border-color:#ddd}.factory-bootstrap-421 .navbar-default .navbar-toggle:focus,.factory-bootstrap-421 .navbar-default .navbar-toggle:hover{background-color:#ddd}.factory-bootstrap-421 .navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.factory-bootstrap-421 .navbar-default .navbar-collapse,.factory-bootstrap-421 .navbar-default .navbar-form{border-color:#e7e7e7}.factory-bootstrap-421 .navbar-default .navbar-nav>.open>a,.factory-bootstrap-421 .navbar-default .navbar-nav>.open>a:focus,.factory-bootstrap-421 .navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.factory-bootstrap-421 .navbar-default .navbar-link{color:#777}.factory-bootstrap-421 .navbar-default .navbar-link:hover{color:#333}.factory-bootstrap-421 .navbar-inverse{background-color:#222;border-color:#080808}.factory-bootstrap-421 .navbar-inverse .navbar-brand{color:#999}.factory-bootstrap-421 .navbar-inverse .navbar-brand:focus,.factory-bootstrap-421 .navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a,.factory-bootstrap-421 .navbar-inverse .navbar-text{color:#999}.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.disabled>a,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.disabled>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.factory-bootstrap-421 .navbar-inverse .navbar-toggle{border-color:#333}.factory-bootstrap-421 .navbar-inverse .navbar-toggle:focus,.factory-bootstrap-421 .navbar-inverse .navbar-toggle:hover{background-color:#333}.factory-bootstrap-421 .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.factory-bootstrap-421 .navbar-inverse .navbar-collapse,.factory-bootstrap-421 .navbar-inverse .navbar-form{border-color:#101010}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.open>a,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.open>a:focus,.factory-bootstrap-421 .navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.factory-bootstrap-421 .navbar-inverse .navbar-link{color:#999}.factory-bootstrap-421 .navbar-inverse .navbar-link:hover{color:#fff}.factory-bootstrap-421 .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.factory-bootstrap-421 .breadcrumb>li{display:inline-block}.factory-bootstrap-421 .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.factory-bootstrap-421 .breadcrumb>.active{color:#999}.factory-bootstrap-421 .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.factory-bootstrap-421 .pagination>li{display:inline}.factory-bootstrap-421 .pagination>li>a,.factory-bootstrap-421 .pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-421 .pagination>li:first-child>a,.factory-bootstrap-421 .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.factory-bootstrap-421 .pagination>li:last-child>a,.factory-bootstrap-421 .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.factory-bootstrap-421 .pagination>li>a:focus,.factory-bootstrap-421 .pagination>li>a:hover,.factory-bootstrap-421 .pagination>li>span:focus,.factory-bootstrap-421 .pagination>li>span:hover{background-color:#eee}.factory-bootstrap-421 .pagination>.active>a,.factory-bootstrap-421 .pagination>.active>a:focus,.factory-bootstrap-421 .pagination>.active>a:hover,.factory-bootstrap-421 .pagination>.active>span,.factory-bootstrap-421 .pagination>.active>span:focus,.factory-bootstrap-421 .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#1e8cbe;border-color:#0074a2}.factory-bootstrap-421 .pagination>.disabled>a,.factory-bootstrap-421 .pagination>.disabled>a:focus,.factory-bootstrap-421 .pagination>.disabled>a:hover,.factory-bootstrap-421 .pagination>.disabled>span,.factory-bootstrap-421 .pagination>.disabled>span:focus,.factory-bootstrap-421 .pagination>.disabled>span:hover{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.factory-bootstrap-421 .pagination-lg>li>a,.factory-bootstrap-421 .pagination-lg>li>span{padding:10px 16px;font-size:18px}.factory-bootstrap-421 .pagination-lg>li:first-child>a,.factory-bootstrap-421 .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.factory-bootstrap-421 .pagination-lg>li:last-child>a,.factory-bootstrap-421 .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.factory-bootstrap-421 .pagination-sm>li>a,.factory-bootstrap-421 .pagination-sm>li>span{padding:5px 10px;font-size:12px}.factory-bootstrap-421 .pagination-sm>li:first-child>a,.factory-bootstrap-421 .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.factory-bootstrap-421 .pagination-sm>li:last-child>a,.factory-bootstrap-421 .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.factory-bootstrap-421 .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.factory-bootstrap-421 .pager:after,.factory-bootstrap-421 .pager:before{display:table;content:" "}.factory-bootstrap-421 .pager:after{clear:both}.factory-bootstrap-421 .pager li{display:inline}.factory-bootstrap-421 .pager li>a,.factory-bootstrap-421 .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.factory-bootstrap-421 .pager li>a:focus,.factory-bootstrap-421 .pager li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-421 .pager .next>a,.factory-bootstrap-421 .pager .next>span{float:right}.factory-bootstrap-421 .pager .previous>a,.factory-bootstrap-421 .pager .previous>span{float:left}.factory-bootstrap-421 .pager .disabled>a,.factory-bootstrap-421 .pager .disabled>a:focus,.factory-bootstrap-421 .pager .disabled>a:hover,.factory-bootstrap-421 .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.factory-bootstrap-421 .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.factory-bootstrap-421 .label[href]:focus,.factory-bootstrap-421 .label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-421 .label:empty{display:none}.factory-bootstrap-421 .btn .label{position:relative;top:-1px}.factory-bootstrap-421 .label-default{background-color:#999}.factory-bootstrap-421 .label-default[href]:focus,.factory-bootstrap-421 .label-default[href]:hover{background-color:gray}.factory-bootstrap-421 .label-primary{background-color:#428bca}.factory-bootstrap-421 .label-primary[href]:focus,.factory-bootstrap-421 .label-primary[href]:hover{background-color:#3071a9}.factory-bootstrap-421 .label-success{background-color:#5cb85c}.factory-bootstrap-421 .label-success[href]:focus,.factory-bootstrap-421 .label-success[href]:hover{background-color:#449d44}.factory-bootstrap-421 .label-info{background-color:#5bc0de}.factory-bootstrap-421 .label-info[href]:focus,.factory-bootstrap-421 .label-info[href]:hover{background-color:#31b0d5}.factory-bootstrap-421 .label-warning{background-color:#f0ad4e}.factory-bootstrap-421 .label-warning[href]:focus,.factory-bootstrap-421 .label-warning[href]:hover{background-color:#ec971f}.factory-bootstrap-421 .label-danger{background-color:#d9534f}.factory-bootstrap-421 .label-danger[href]:focus,.factory-bootstrap-421 .label-danger[href]:hover{background-color:#c9302c}.factory-bootstrap-421 .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.factory-bootstrap-421 .badge:empty{display:none}.factory-bootstrap-421 .btn .badge{position:relative;top:-1px}.factory-bootstrap-421 a.badge:focus,.factory-bootstrap-421 a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-421 .nav-pills>.active>a>.badge,.factory-bootstrap-421 a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.factory-bootstrap-421 .nav-pills>li>a>.badge{margin-left:3px}.factory-bootstrap-421 .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.factory-bootstrap-421 .jumbotron .h1,.factory-bootstrap-421 .jumbotron h1{line-height:1;color:inherit}.factory-bootstrap-421 .jumbotron p{line-height:1.4}.factory-bootstrap-421 .container .jumbotron{border-radius:6px}.factory-bootstrap-421 .jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.factory-bootstrap-421 .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-421 .thumbnail a>img,.factory-bootstrap-421 .thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}.factory-bootstrap-421 a.thumbnail.active,.factory-bootstrap-421 a.thumbnail:focus,.factory-bootstrap-421 a.thumbnail:hover{border-color:#428bca}.factory-bootstrap-421 .thumbnail .caption{padding:9px;color:#333}.factory-bootstrap-421 .alert{border:1px solid transparent;border-radius:4px}.factory-bootstrap-421 .alert h4{margin-top:0;color:inherit}.factory-bootstrap-421 .alert .alert-link{font-weight:700}.factory-bootstrap-421 .alert>p,.factory-bootstrap-421 .alert>ul{margin-bottom:0}.factory-bootstrap-421 .alert>p+p{margin-top:5px}.factory-bootstrap-421 .alert-dismissable{padding-right:35px}.factory-bootstrap-421 .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.factory-bootstrap-421 .alert-info{color:#31708f;background-color:#d9edf7}.factory-bootstrap-421 .alert-info hr{border-top-color:#a6e1ec}.factory-bootstrap-421 .alert-info .alert-link{color:#245269}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.factory-bootstrap-421 .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.factory-bootstrap-421 .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#2ea2cc;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.factory-bootstrap-421 .progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.factory-bootstrap-421 .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.factory-bootstrap-421 .progress-bar-success{background-color:#5cb85c}.factory-bootstrap-421 .progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .progress-bar-info{background-color:#5bc0de}.factory-bootstrap-421 .progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .progress-bar-warning{background-color:#f0ad4e}.factory-bootstrap-421 .progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .progress-bar-danger{background-color:#d9534f}.factory-bootstrap-421 .progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-421 .media,.factory-bootstrap-421 .media-body{overflow:hidden;zoom:1}.factory-bootstrap-421 .media,.factory-bootstrap-421 .media .media{margin-top:15px}.factory-bootstrap-421 .media:first-child{margin-top:0}.factory-bootstrap-421 .media-object{display:block}.factory-bootstrap-421 .media-heading{margin:0 0 5px}.factory-bootstrap-421 .media>.pull-left{margin-right:10px}.factory-bootstrap-421 .media>.pull-right{margin-left:10px}.factory-bootstrap-421 .media-list{padding-left:0;list-style:none}.factory-bootstrap-421 .list-group{padding-left:0;margin-bottom:20px}.factory-bootstrap-421 .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-421 .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.factory-bootstrap-421 .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.factory-bootstrap-421 .list-group-item>.badge{float:right}.factory-bootstrap-421 .list-group-item>.badge+.badge{margin-right:5px}.factory-bootstrap-421 a.list-group-item{color:#555}.factory-bootstrap-421 a.list-group-item .list-group-item-heading{color:#333}.factory-bootstrap-421 a.list-group-item:focus,.factory-bootstrap-421 a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.factory-bootstrap-421 a.list-group-item.active,.factory-bootstrap-421 a.list-group-item.active:focus,.factory-bootstrap-421 a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-421 a.list-group-item.active .list-group-item-heading,.factory-bootstrap-421 a.list-group-item.active:focus .list-group-item-heading,.factory-bootstrap-421 a.list-group-item.active:hover .list-group-item-heading{color:inherit}.factory-bootstrap-421 a.list-group-item.active .list-group-item-text,.factory-bootstrap-421 a.list-group-item.active:focus .list-group-item-text,.factory-bootstrap-421 a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.factory-bootstrap-421 .list-group-item-heading{margin-top:0;margin-bottom:5px}.factory-bootstrap-421 .list-group-item-text{margin-bottom:0;line-height:1.3}.factory-bootstrap-421 .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px}.factory-bootstrap-421 .panel-body{padding:15px}.factory-bootstrap-421 .panel-body:after,.factory-bootstrap-421 .panel-body:before{display:table;content:" "}.factory-bootstrap-421 .panel-body:after{clear:both}.factory-bootstrap-421 .panel>.list-group{margin-bottom:0}.factory-bootstrap-421 .panel>.list-group .list-group-item{border-width:1px 0}.factory-bootstrap-421 .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-421 .panel>.list-group .list-group-item:last-child{border-bottom:0}.factory-bootstrap-421 .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.factory-bootstrap-421 .panel>.table,.factory-bootstrap-421 .panel>.table-responsive>.table{margin-bottom:0}.factory-bootstrap-421 .panel>.panel-body+.table,.factory-bootstrap-421 .panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.factory-bootstrap-421 .panel>.table>tbody:first-child td,.factory-bootstrap-421 .panel>.table>tbody:first-child th{border-top:0}.factory-bootstrap-421 .panel>.table-bordered,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered{border:0}.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>th:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-421 .panel>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-421 .panel>.table-bordered>thead>tr>th:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.factory-bootstrap-421 .panel>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-421 .panel>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-421 .panel>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-421 .panel>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-421 .panel>.table-bordered>thead>tr:last-child>th,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-421 .panel>.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}.factory-bootstrap-421 .panel>.table-responsive{margin-bottom:0;border:0}.factory-bootstrap-421 .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.factory-bootstrap-421 .panel-heading>.dropdown .dropdown-toggle{color:inherit}.factory-bootstrap-421 .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.factory-bootstrap-421 .panel-title>a{color:inherit}.factory-bootstrap-421 .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.factory-bootstrap-421 .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.factory-bootstrap-421 .panel-group .panel+.panel{margin-top:5px}.factory-bootstrap-421 .panel-group .panel-heading{border-bottom:0}.factory-bootstrap-421 .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.factory-bootstrap-421 .panel-group .panel-footer{border-top:0}.factory-bootstrap-421 .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.factory-bootstrap-421 .panel-default{border-color:#ddd}.factory-bootstrap-421 .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.factory-bootstrap-421 .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.factory-bootstrap-421 .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.factory-bootstrap-421 .panel-primary{border-color:#428bca}.factory-bootstrap-421 .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-421 .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.factory-bootstrap-421 .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.factory-bootstrap-421 .panel-success{border-color:#d6e9c6}.factory-bootstrap-421 .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.factory-bootstrap-421 .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.factory-bootstrap-421 .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.factory-bootstrap-421 .panel-warning{border-color:#faebcc}.factory-bootstrap-421 .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.factory-bootstrap-421 .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.factory-bootstrap-421 .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.factory-bootstrap-421 .panel-danger{border-color:#ebccd1}.factory-bootstrap-421 .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.factory-bootstrap-421 .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.factory-bootstrap-421 .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.factory-bootstrap-421 .panel-info{border-color:#bce8f1}.factory-bootstrap-421 .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.factory-bootstrap-421 .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.factory-bootstrap-421 .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.factory-bootstrap-421 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px}.factory-bootstrap-421 .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.factory-bootstrap-421 .well-lg{padding:24px;border-radius:6px}.factory-bootstrap-421 .well-sm{padding:9px;border-radius:3px}.factory-bootstrap-421 .close{float:right;font-size:14px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.3;filter:alpha(opacity=30)}.factory-bootstrap-421 .alert .close{position:relative;top:-8px;right:-7px}.factory-bootstrap-421 .close:focus,.factory-bootstrap-421 .close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-421 button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.factory-bootstrap-421 .modal-open{overflow:hidden}.factory-bootstrap-421 .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll;width:auto;margin-left:0;background-color:transparent;border:0}.factory-bootstrap-421 .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.factory-bootstrap-421 .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.factory-bootstrap-421 .modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.factory-bootstrap-421 .modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box}.factory-bootstrap-421 .modal-backdrop,.factory-bootstrap-421-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.factory-bootstrap-421 .modal-backdrop.fade,.factory-bootstrap-421-modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.factory-bootstrap-421 .modal-backdrop.in,.factory-bootstrap-421-modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-421 .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.factory-bootstrap-421 .modal-header .close{margin-top:-2px}.factory-bootstrap-421 .modal-title{margin:0;line-height:1.428571429}.factory-bootstrap-421 .modal-body{position:relative;padding:20px;max-height:none}.factory-bootstrap-421 .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.factory-bootstrap-421 .modal-footer:after,.factory-bootstrap-421 .modal-footer:before{display:table;content:" "}.factory-bootstrap-421 .modal-footer:after{clear:both}.factory-bootstrap-421 .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.factory-bootstrap-421 .modal-footer .btn-group .btn+.btn{margin-left:-1px}.factory-bootstrap-421 .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.factory-bootstrap-421 .modal-dialog{width:600px;margin:30px auto}.factory-bootstrap-421 .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}}.factory-bootstrap-421 .tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.factory-bootstrap-421 .tooltip.in{opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-421 .tooltip.top{padding:5px 0;margin-top:-3px}.factory-bootstrap-421 .tooltip.right{padding:0 5px;margin-left:3px}.factory-bootstrap-421 .tooltip.bottom{padding:5px 0;margin-top:3px}.factory-bootstrap-421 .tooltip.left{padding:0 5px;margin-left:-3px}.factory-bootstrap-421 .tooltip-inner{width:400px;padding:15px 20px;color:#fff;text-align:left;text-decoration:none;background-color:#673ab7;border-radius:3px}.factory-bootstrap-421 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-421 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-421 .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-421 .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-421 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#673ab7;border-width:5px 5px 5px 0}.factory-bootstrap-421 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#673ab7;border-width:5px 0 5px 5px}.factory-bootstrap-421 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-421 .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-421 .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-421 .popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.factory-bootstrap-421 .popover.top{margin-top:-10px}.factory-bootstrap-421 .popover.right{margin-left:10px}.factory-bootstrap-421 .popover.bottom{margin-top:10px}.factory-bootstrap-421 .popover.left{margin-left:-10px}.factory-bootstrap-421 .popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.factory-bootstrap-421 .popover-content{padding:9px 14px}.factory-bootstrap-421 .popover .arrow,.factory-bootstrap-421 .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-421 .popover .arrow{border-width:11px}.factory-bootstrap-421 .popover .arrow:after{border-width:10px;content:""}.factory-bootstrap-421 .popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.factory-bootstrap-421 .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.factory-bootstrap-421 .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.factory-bootstrap-421 .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.factory-bootstrap-421 .popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.factory-bootstrap-421 .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.factory-bootstrap-421 .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.factory-bootstrap-421 .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.factory-bootstrap-421 .carousel{position:relative}.factory-bootstrap-421 .carousel-inner{position:relative;width:100%;overflow:hidden}.factory-bootstrap-421 .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.factory-bootstrap-421 .carousel-inner>.item>a>img,.factory-bootstrap-421 .carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.factory-bootstrap-421 .carousel-inner>.active,.factory-bootstrap-421 .carousel-inner>.next,.factory-bootstrap-421 .carousel-inner>.prev{display:block}.factory-bootstrap-421 .carousel-inner>.active{left:0}.factory-bootstrap-421 .carousel-inner>.next,.factory-bootstrap-421 .carousel-inner>.prev{position:absolute;top:0;width:100%}.factory-bootstrap-421 .carousel-inner>.next{left:100%}.factory-bootstrap-421 .carousel-inner>.prev{left:-100%}.factory-bootstrap-421 .carousel-inner>.next.left,.factory-bootstrap-421 .carousel-inner>.prev.right{left:0}.factory-bootstrap-421 .carousel-inner>.active.left{left:-100%}.factory-bootstrap-421 .carousel-inner>.active.right{left:100%}.factory-bootstrap-421 .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-421 .carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.factory-bootstrap-421 .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.factory-bootstrap-421 .carousel-control:focus,.factory-bootstrap-421 .carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-421 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-421 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-421 .carousel-control .icon-next,.factory-bootstrap-421 .carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.factory-bootstrap-421 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-421 .carousel-control .icon-prev{left:50%}.factory-bootstrap-421 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-421 .carousel-control .icon-next{right:50%}.factory-bootstrap-421 .carousel-control .icon-next,.factory-bootstrap-421 .carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.factory-bootstrap-421 .carousel-control .icon-prev:before{content:'\2039'}.factory-bootstrap-421 .carousel-control .icon-next:before{content:'\203a'}.factory-bootstrap-421 .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.factory-bootstrap-421 .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.factory-bootstrap-421 .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.factory-bootstrap-421 .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.factory-bootstrap-421 .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.factory-bootstrap-421 .clearfix:after,.factory-bootstrap-421 .clearfix:before{display:table;content:" "}.factory-bootstrap-421 .clearfix:after{clear:both}.factory-bootstrap-421 .center-block{display:block;margin-right:auto;margin-left:auto}.factory-bootstrap-421 .pull-right{float:right!important}.factory-bootstrap-421 .pull-left{float:left!important}.factory-bootstrap-421 .hide{display:none!important}.factory-bootstrap-421 .show{display:block!important}.factory-bootstrap-421 .invisible{visibility:hidden}.factory-bootstrap-421 .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.factory-bootstrap-421 .hidden{display:none!important;visibility:hidden!important}.factory-bootstrap-421 .affix{position:fixed}@-ms-viewport{width:device-width}.factory-bootstrap-421 .visible-lg,.factory-bootstrap-421 .visible-md,.factory-bootstrap-421 .visible-sm,.factory-bootstrap-421 .visible-xs,.factory-bootstrap-421 td.visible-lg,.factory-bootstrap-421 td.visible-md,.factory-bootstrap-421 td.visible-sm,.factory-bootstrap-421 td.visible-xs,.factory-bootstrap-421 th.visible-lg,.factory-bootstrap-421 th.visible-md,.factory-bootstrap-421 th.visible-sm,.factory-bootstrap-421 th.visible-xs,.factory-bootstrap-421 tr.visible-lg,.factory-bootstrap-421 tr.visible-md,.factory-bootstrap-421 tr.visible-sm,.factory-bootstrap-421 tr.visible-xs{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}td.visible-xs.visible-sm,th.visible-xs.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}td.visible-xs.visible-md,th.visible-xs.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}td.visible-xs.visible-lg,th.visible-xs.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}td.visible-sm.visible-xs,th.visible-sm.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}td.visible-sm.visible-md,th.visible-sm.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}td.visible-sm.visible-lg,th.visible-sm.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}td.visible-md.visible-xs,th.visible-md.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}td.visible-md.visible-sm,th.visible-md.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}td.visible-md.visible-lg,th.visible-md.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}td.visible-lg.visible-xs,th.visible-lg.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}td.visible-lg.visible-sm,th.visible-lg.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}td.visible-lg.visible-md,th.visible-lg.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}.factory-bootstrap-421 .hidden-xs{display:block!important}.factory-bootstrap-421 table.hidden-xs{display:table}.factory-bootstrap-421 tr.hidden-xs{display:table-row!important}.factory-bootstrap-421 td.hidden-xs,.factory-bootstrap-421 th.hidden-xs{display:table-cell!important}@media (max-width:767px){.hidden-xs,td.hidden-xs,th.hidden-xs,tr.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,td.hidden-xs.hidden-md,th.hidden-xs.hidden-md,tr.hidden-xs.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg{display:none!important}}.factory-bootstrap-421 .hidden-sm{display:block!important}.factory-bootstrap-421 table.hidden-sm{display:table}.factory-bootstrap-421 tr.hidden-sm{display:table-row!important}.factory-bootstrap-421 td.hidden-sm,.factory-bootstrap-421 th.hidden-sm{display:table-cell!important}@media (max-width:767px){.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,td.hidden-sm,th.hidden-sm,tr.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,td.hidden-sm.hidden-md,th.hidden-sm.hidden-md,tr.hidden-sm.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg{display:none!important}}.factory-bootstrap-421 .hidden-md{display:block!important}.factory-bootstrap-421 table.hidden-md{display:table}.factory-bootstrap-421 tr.hidden-md{display:table-row!important}.factory-bootstrap-421 td.hidden-md,.factory-bootstrap-421 th.hidden-md{display:table-cell!important}@media (max-width:767px){.hidden-md.hidden-xs,td.hidden-md.hidden-xs,th.hidden-md.hidden-xs,tr.hidden-md.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,td.hidden-md.hidden-sm,th.hidden-md.hidden-sm,tr.hidden-md.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,td.hidden-md,th.hidden-md,tr.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-md.hidden-lg,td.hidden-md.hidden-lg,th.hidden-md.hidden-lg,tr.hidden-md.hidden-lg{display:none!important}}.factory-bootstrap-421 .hidden-lg{display:block!important}.factory-bootstrap-421 table.hidden-lg{display:table}.factory-bootstrap-421 tr.hidden-lg{display:table-row!important}.factory-bootstrap-421 td.hidden-lg,.factory-bootstrap-421 th.hidden-lg{display:table-cell!important}@media (max-width:767px){.factory-bootstrap-421 .hidden-lg.hidden-xs,.factory-bootstrap-421 td.hidden-lg.hidden-xs,.factory-bootstrap-421 th.hidden-lg.hidden-xs,.factory-bootstrap-421 tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.factory-bootstrap-421 .hidden-lg.hidden-sm,.factory-bootstrap-421 td.hidden-lg.hidden-sm,.factory-bootstrap-421 th.hidden-lg.hidden-sm,.factory-bootstrap-421 tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.factory-bootstrap-421 .hidden-lg.hidden-md,.factory-bootstrap-421 td.hidden-lg.hidden-md,.factory-bootstrap-421 th.hidden-lg.hidden-md,.factory-bootstrap-421 tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.factory-bootstrap-421 .hidden-lg,.factory-bootstrap-421 td.hidden-lg,.factory-bootstrap-421 th.hidden-lg,.factory-bootstrap-421 tr.hidden-lg{display:none!important}}.factory-bootstrap-421 .visible-print,.factory-bootstrap-421 td.visible-print,.factory-bootstrap-421 th.visible-print,.factory-bootstrap-421 tr.visible-print{display:none!important}@media print{.factory-bootstrap-421 .visible-print{display:block!important}.factory-bootstrap-421 table.visible-print{display:table}.factory-bootstrap-421 tr.visible-print{display:table-row!important}.factory-bootstrap-421 td.visible-print,.factory-bootstrap-421 th.visible-print{display:table-cell!important}.factory-bootstrap-421 .hidden-print,.factory-bootstrap-421 td.hidden-print,.factory-bootstrap-421 th.hidden-print,.factory-bootstrap-421 tr.hidden-print{display:none!important}}/*!
|
12 |
-
* Factory Default Bootstrap Theme
|
13 |
-
*
|
14 |
-
* The code is based on Bootstrap v2.1.1
|
15 |
-
*
|
16 |
-
* Bootstrap v3.0.3 (http://getbootstrap.com)
|
17 |
-
* Copyright 2013 Twitter, Inc.
|
18 |
-
* Licensed under http://www.apache.org/licenses/LICENSE-2.0
|
19 |
-
*
|
20 |
-
* @author Paul Kashtanoff <paul@byonepress.com>
|
21 |
-
* @copyright (c) 2013, OnePress Ltd
|
22 |
-
*
|
23 |
-
* @package factory-bootstrap
|
24 |
-
* @since 1.0.0
|
25 |
-
*/.factory-bootstrap-421 .btn-danger,.factory-bootstrap-421 .btn-default,.factory-bootstrap-421 .btn-info,.factory-bootstrap-421 .btn-primary,.factory-bootstrap-421 .btn-success,.factory-bootstrap-421 .btn-warning{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-421 .btn-danger.active,.factory-bootstrap-421 .btn-danger:active,.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active,.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active,.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active,.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active,.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.factory-bootstrap-421 .btn.active,.factory-bootstrap-421 .btn:active{background-image:none}.factory-bootstrap-421 .btn-default{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);vertical-align:top}.factory-bootstrap-421 .btn-default.active,.factory-bootstrap-421 .btn-default:active{background-color:#fff;border-color:#dbdbdb}.factory-bootstrap-421 .btn-gold{font-weight:700;padding:7px 12px;cursor:pointer;line-height:16px;display:inline-block;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;box-shadow:#e3e3e3 0 1px 1px;-moz-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);-webkit-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);text-shadow:1px 1px 0 #ffe8b2;color:#7c5d1b;border:1px solid #d6a437;background:#feeb80}.factory-bootstrap-421 .btn-gold:focus,.factory-bootstrap-421 .btn-gold:hover{background:#fef0a1}.factory-bootstrap-421 .btn-gold.active,.factory-bootstrap-421 .btn-gold:active{background:#fef0a1;-webkit-box-shadow:inset 0 3px 8px 0 #f8ba36;box-shadow:inset 0 3px 8px 0 #f8ba36}.factory-bootstrap-421 .btn-primary{background:#2ea2cc;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);color:#fff;text-decoration:none}.factory-bootstrap-421 .btn-primary:focus,.factory-bootstrap-421 .btn-primary:hover{background:#1e8cbe;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.6);box-shadow:inset 0 1px 0 rgba(120,200,230,.6);color:#fff}.factory-bootstrap-421 .btn-primary.active,.factory-bootstrap-421 .btn-primary:active{background-color:#2d6ca2;border-color:#2b669a}.factory-bootstrap-421 .btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .btn-success:focus,.factory-bootstrap-421 .btn-success:hover{background-color:#419641;background-position:0 -15px}.factory-bootstrap-421 .btn-success.active,.factory-bootstrap-421 .btn-success:active{background-color:#419641;border-color:#3e8f3e}.factory-bootstrap-421 .btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .btn-warning:focus,.factory-bootstrap-421 .btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.factory-bootstrap-421 .btn-warning.active,.factory-bootstrap-421 .btn-warning:active{background-color:#eb9316;border-color:#e38d13}.factory-bootstrap-421 .btn-danger{color:#fff;background:#d9534f;border-color:#d43f3a}.factory-bootstrap-421 .btn-danger.active,.factory-bootstrap-421 .btn-danger:active,.factory-bootstrap-421 .btn-danger:focus,.factory-bootstrap-421 .btn-danger:hover,.factory-bootstrap-421 .open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.factory-bootstrap-421 .btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .btn-info:focus,.factory-bootstrap-421 .btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.factory-bootstrap-421 .btn-info.active,.factory-bootstrap-421 .btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.factory-bootstrap-421 .img-thumbnail,.factory-bootstrap-421 .thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-421 .dropdown-menu>li>a:focus,.factory-bootstrap-421 .dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-421 .dropdown-menu>.active>a,.factory-bootstrap-421 .dropdown-menu>.active>a:focus,.factory-bootstrap-421 .dropdown-menu>.active>a:hover{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-421 .navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.factory-bootstrap-421 .navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.factory-bootstrap-421 .navbar-brand,.factory-bootstrap-421 .navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.factory-bootstrap-421 .navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-421 .navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.factory-bootstrap-421 .navbar-inverse .navbar-brand,.factory-bootstrap-421 .navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.factory-bootstrap-421 .navbar-fixed-bottom,.factory-bootstrap-421 .navbar-fixed-top,.factory-bootstrap-421 .navbar-static-top{border-radius:0}.factory-bootstrap-421 .alert{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-421 .alert .actions{padding-top:10px}.factory-bootstrap-421 .alert-success{color:#3c763d;background-color:#dff0d8;border-bottom:2px solid #c8e5bc}.factory-bootstrap-421 .alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0)}.factory-bootstrap-421 .alert{text-shadow:none;box-shadow:none;margin:0;margin-top:10px;margin-bottom:10px;padding:10px}.factory-bootstrap-421 .alert-normal,.factory-bootstrap-421 .alert-warning{background:#fcf8e3;color:#8a6d3b;border:1px solid #b8823b}.factory-bootstrap-421 .alert-danger{background:#cf4944;color:#fff;border-bottom:2px solid #b23e3a}.factory-bootstrap-421 .alert-danger a:not(.btn),.factory-bootstrap-421 .alert-error a:not(.btn){color:#fff}.factory-bootstrap-421 .progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.factory-bootstrap-421 .progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0)}.factory-bootstrap-421 .progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.factory-bootstrap-421 .progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.factory-bootstrap-421 .progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.factory-bootstrap-421 .progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.factory-bootstrap-421 .list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-421 .list-group-item.active,.factory-bootstrap-421 .list-group-item.active:focus,.factory-bootstrap-421 .list-group-item.active:hover{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0)}.factory-bootstrap-421 .panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-421 .panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-421 .panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-421 .panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.factory-bootstrap-421 .panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.factory-bootstrap-421 .panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.factory-bootstrap-421 .panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.factory-bootstrap-421 .well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}.factory-bootstrap-421 .factory-after{margin-left:7px;display:inline-block}.factory-bootstrap-421 .factory-hidden{display:none}.factory-bootstrap-421 .factory-ajax-loader{width:25px;height:25px;background:url(../assets/images/loader-sm-tr.gif)}.factory-control-error{background-color:rgba(0,0,0,.8);white-space:normal;z-index:10;font-weight:400;line-height:150%;border-radius:4px;color:#fff;font-size:13px;margin-top:5px;padding:4px 10px 3px;max-width:500px;display:inline-block}.factory-control-error i{margin:0 7px 0 1px}
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 article,.factory-bootstrap-446 aside,.factory-bootstrap-446 details,.factory-bootstrap-446 figcaption,.factory-bootstrap-446 figure,.factory-bootstrap-446 footer,.factory-bootstrap-446 header,.factory-bootstrap-446 hgroup,.factory-bootstrap-446 main,.factory-bootstrap-446 nav,.factory-bootstrap-446 section,.factory-bootstrap-446 summary{display:block}.factory-bootstrap-446 audio,.factory-bootstrap-446 canvas,.factory-bootstrap-446 video{display:inline-block}.factory-bootstrap-446 audio:not([controls]){display:none;height:0}.factory-bootstrap-446 [hidden],.factory-bootstrap-446 template{display:none}.factory-bootstrap-446 body{margin:0}.factory-bootstrap-446 a{background:0 0}.factory-bootstrap-446 a:focus{outline:thin dotted}.factory-bootstrap-446 a:active,.factory-bootstrap-446 a:hover{outline:0}.factory-bootstrap-446 h1{margin:.67em 0}.factory-bootstrap-446 b,.factory-bootstrap-446 strong{font-weight:700}.factory-bootstrap-446 dfn{font-style:italic}.factory-bootstrap-446 hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-446 mark{color:#000;background:#ff0}.factory-bootstrap-446 code,.factory-bootstrap-446 kbd,.factory-bootstrap-446 pre,.factory-bootstrap-446 samp{font-size:1em}.factory-bootstrap-446 pre{white-space:pre-wrap}.factory-bootstrap-446 q{quotes:"\201C" "\201D" "\2018" "\2019"}.factory-bootstrap-446 sub,.factory-bootstrap-446 sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.factory-bootstrap-446 sup{top:-.5em}.factory-bootstrap-446 sub{bottom:-.25em}.factory-bootstrap-446 img{border:0}.factory-bootstrap-446 svg:not(:root){overflow:hidden}.factory-bootstrap-446 figure{margin:0}.factory-bootstrap-446 button,.factory-bootstrap-446 input,.factory-bootstrap-446 select,.factory-bootstrap-446 textarea{margin:0}.factory-bootstrap-446 button,.factory-bootstrap-446 select{text-transform:none}.factory-bootstrap-446 select{padding-right:4px!important}.factory-bootstrap-446 button,.factory-bootstrap-446 input[type=reset],.factory-bootstrap-446 input[type=submit],html .factory-bootstrap-446 input[type=button]{cursor:pointer;-webkit-appearance:button}.factory-bootstrap-446 button[disabled],html .factory-bootstrap-446 input[disabled]{cursor:default}.factory-bootstrap-446 input[type=checkbox],.factory-bootstrap-446 input[type=radio]{padding:0;box-sizing:border-box}.factory-bootstrap-446 input[type=search]{-webkit-appearance:textfield}.factory-bootstrap-446 input[type=search]::-webkit-search-cancel-button,.factory-bootstrap-446 input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.factory-bootstrap-446 button::-moz-focus-inner,.factory-bootstrap-446 input::-moz-focus-inner{padding:0;border:0}.factory-bootstrap-446 textarea{overflow:auto;vertical-align:top}.factory-bootstrap-446 table{border-collapse:collapse;border-spacing:0}@media print{.factory-bootstrap-446 *{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}.factory-bootstrap-446 a,.factory-bootstrap-446 a:visited{text-decoration:underline}.factory-bootstrap-446 a[href]:after{content:" (" attr(href) ")"}.factory-bootstrap-446 abbr[title]:after{content:" (" attr(title) ")"}.factory-bootstrap-446 a[href^="javascript:"]:after,.factory-bootstrap-446 a[href^="#"]:after{content:""}.factory-bootstrap-446 blockquote,.factory-bootstrap-446 pre{border:1px solid #999;page-break-inside:avoid}.factory-bootstrap-446 thead{display:table-header-group}.factory-bootstrap-446 img,.factory-bootstrap-446 tr{page-break-inside:avoid}.factory-bootstrap-446 img{max-width:100%!important}@page{margin:2cm .5cm}.factory-bootstrap-446 h2,.factory-bootstrap-446 h3,.factory-bootstrap-446 p{orphans:3;widows:3}.factory-bootstrap-446 h2,.factory-bootstrap-446 h3{page-break-after:avoid}.factory-bootstrap-446 select{background:#fff!important}.factory-bootstrap-446 .navbar{display:none}.factory-bootstrap-446 .table td,.factory-bootstrap-446 .table th{background-color:#fff!important}.factory-bootstrap-446 .btn>.caret,.factory-bootstrap-446 .dropup>.btn>.caret{border-top-color:#000!important}.factory-bootstrap-446 .label{border:1px solid #000}.factory-bootstrap-446 .table{border-collapse:collapse!important}.factory-bootstrap-446 .table-bordered td,.factory-bootstrap-446 .table-bordered th{border:1px solid #ddd!important}}.factory-bootstrap-446 *,.factory-bootstrap-446 :after,.factory-bootstrap-446 :before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html .factory-bootstrap-446{-webkit-tap-highlight-color:rgba(0,0,0,0)}.factory-bootstrap-446 body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}.factory-bootstrap-446 button,.factory-bootstrap-446 input,.factory-bootstrap-446 select,.factory-bootstrap-446 textarea{font-family:inherit;font-size:inherit;line-height:inherit}.factory-bootstrap-446 img{vertical-align:middle}.factory-bootstrap-446 .img-responsive{display:block;height:auto;max-width:100%}.factory-bootstrap-446 .img-rounded{border-radius:6px}.factory-bootstrap-446 .img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-446 .img-circle{border-radius:50%}.factory-bootstrap-446 hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.factory-bootstrap-446 .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.factory-bootstrap-446 .h1,.factory-bootstrap-446 .h2,.factory-bootstrap-446 .h3,.factory-bootstrap-446 .h4,.factory-bootstrap-446 .h5,.factory-bootstrap-446 .h6,.factory-bootstrap-446 h1,.factory-bootstrap-446 h2,.factory-bootstrap-446 h3,.factory-bootstrap-446 h4,.factory-bootstrap-446 h5,.factory-bootstrap-446 h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}.factory-bootstrap-446 .h1 .small,.factory-bootstrap-446 .h1 small,.factory-bootstrap-446 .h2 .small,.factory-bootstrap-446 .h2 small,.factory-bootstrap-446 .h3 .small,.factory-bootstrap-446 .h3 small,.factory-bootstrap-446 .h4 .small,.factory-bootstrap-446 .h4 small,.factory-bootstrap-446 .h5 .small,.factory-bootstrap-446 .h5 small,.factory-bootstrap-446 .h6 .small,.factory-bootstrap-446 .h6 small,.factory-bootstrap-446 h1 .small,.factory-bootstrap-446 h1 small,.factory-bootstrap-446 h2 .small,.factory-bootstrap-446 h2 small,.factory-bootstrap-446 h3 .small,.factory-bootstrap-446 h3 small,.factory-bootstrap-446 h4 .small,.factory-bootstrap-446 h4 small,.factory-bootstrap-446 h5 .small,.factory-bootstrap-446 h5 small,.factory-bootstrap-446 h6 .small,.factory-bootstrap-446 h6 small{font-weight:400;line-height:1;color:#999}.factory-bootstrap-446 h1,.factory-bootstrap-446 h2,.factory-bootstrap-446 h3{margin-top:20px;margin-bottom:10px}.factory-bootstrap-446 h1 .small,.factory-bootstrap-446 h1 small,.factory-bootstrap-446 h2 .small,.factory-bootstrap-446 h2 small,.factory-bootstrap-446 h3 .small,.factory-bootstrap-446 h3 small{font-size:65%}.factory-bootstrap-446 h4,.factory-bootstrap-446 h5,.factory-bootstrap-446 h6{margin-top:10px;margin-bottom:10px}.factory-bootstrap-446 h4 .small,.factory-bootstrap-446 h4 small,.factory-bootstrap-446 h5 .small,.factory-bootstrap-446 h5 small,.factory-bootstrap-446 h6 .small,.factory-bootstrap-446 h6 small{font-size:75%}.factory-bootstrap-446 .h1,.factory-bootstrap-446 h1{font-size:36px}.factory-bootstrap-446 .h2,.factory-bootstrap-446 h2{font-size:30px}.factory-bootstrap-446 .h3,.factory-bootstrap-446 h3{font-size:24px}.factory-bootstrap-446 .h4,.factory-bootstrap-446 h4{font-size:18px}.factory-bootstrap-446 .h5,.factory-bootstrap-446 h5{font-size:14px}.factory-bootstrap-446 .h6,.factory-bootstrap-446 h6{font-size:12px}.factory-bootstrap-446 p{margin:0 0 10px}.factory-bootstrap-446 .lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.factory-bootstrap-446 .small,.factory-bootstrap-446 small{font-size:85%}.factory-bootstrap-446 cite{font-style:normal}.factory-bootstrap-446 .text-muted{color:#999}.factory-bootstrap-446 .text-primary{color:#428bca}.factory-bootstrap-446 .text-primary:hover{color:#3071a9}.factory-bootstrap-446 .text-warning{color:#8a6d3b}.factory-bootstrap-446 .text-warning:hover{color:#66512c}.factory-bootstrap-446 .text-danger{color:#a94442}.factory-bootstrap-446 .text-danger:hover{color:#843534}.factory-bootstrap-446 .text-success{color:#3c763d}.factory-bootstrap-446 .text-success:hover{color:#2b542c}.factory-bootstrap-446 .text-info{color:#31708f}.factory-bootstrap-446 .text-info:hover{color:#245269}.factory-bootstrap-446 .text-left{text-align:left}.factory-bootstrap-446 .text-right{text-align:right}.factory-bootstrap-446 .text-center{text-align:center}.factory-bootstrap-446 .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}.factory-bootstrap-446 ol,.factory-bootstrap-446 ul{margin-top:0;margin-bottom:10px}.factory-bootstrap-446 ol ol,.factory-bootstrap-446 ol ul,.factory-bootstrap-446 ul ol,.factory-bootstrap-446 ul ul{margin-bottom:0}.factory-bootstrap-446 .list-inline,.factory-bootstrap-446 .list-unstyled{padding-left:0;list-style:none}.factory-bootstrap-446 .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.factory-bootstrap-446 .list-inline>li:first-child{padding-left:0}.factory-bootstrap-446 dl{margin-top:0;margin-bottom:20px}.factory-bootstrap-446 dd,.factory-bootstrap-446 dt{line-height:1.428571429}.factory-bootstrap-446 dt{font-weight:700}.factory-bootstrap-446 dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:after,.dl-horizontal dd:before{display:table;content:" "}.dl-horizontal dd:after{clear:both}}.factory-bootstrap-446 abbr[data-original-title],.factory-bootstrap-446 abbr[title]{cursor:help;border-bottom:1px dotted #999}.factory-bootstrap-446 .initialism{font-size:90%;text-transform:uppercase}.factory-bootstrap-446 blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}.factory-bootstrap-446 blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}.factory-bootstrap-446 blockquote p:last-child{margin-bottom:0}.factory-bootstrap-446 blockquote .small,.factory-bootstrap-446 blockquote small{display:block;line-height:1.428571429;color:#999}.factory-bootstrap-446 blockquote .small:before,.factory-bootstrap-446 blockquote small:before{content:'\2014 \00A0'}.factory-bootstrap-446 blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}.factory-bootstrap-446 blockquote.pull-right .small,.factory-bootstrap-446 blockquote.pull-right p,.factory-bootstrap-446 blockquote.pull-right small{text-align:right}.factory-bootstrap-446 blockquote.pull-right .small:before,.factory-bootstrap-446 blockquote.pull-right small:before{content:''}.factory-bootstrap-446 blockquote.pull-right .small:after,.factory-bootstrap-446 blockquote.pull-right small:after{content:'\00A0 \2014'}.factory-bootstrap-446 blockquote:after,.factory-bootstrap-446 blockquote:before{content:""}.factory-bootstrap-446 address{margin-bottom:20px;font-style:normal;line-height:1.428571429}.factory-bootstrap-446 code,.factory-bootstrap-446 kbd,.factory-bootstrap-446 pre,.factory-bootstrap-446 samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}.factory-bootstrap-446 code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}.factory-bootstrap-446 pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-446 pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.factory-bootstrap-446 .pre-scrollable{max-height:340px;overflow-y:scroll}.factory-bootstrap-446 .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.factory-bootstrap-446 .container:after,.factory-bootstrap-446 .container:before{display:table;content:" "}.factory-bootstrap-446 .container:after{clear:both}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.factory-bootstrap-446 .row{margin-right:-15px;margin-left:-15px}.factory-bootstrap-446 .row:after,.factory-bootstrap-446 .row:before{display:table;content:" "}.factory-bootstrap-446 .row:after{clear:both}.factory-bootstrap-446 .col-lg-1,.factory-bootstrap-446 .col-lg-10,.factory-bootstrap-446 .col-lg-11,.factory-bootstrap-446 .col-lg-12,.factory-bootstrap-446 .col-lg-2,.factory-bootstrap-446 .col-lg-3,.factory-bootstrap-446 .col-lg-4,.factory-bootstrap-446 .col-lg-5,.factory-bootstrap-446 .col-lg-6,.factory-bootstrap-446 .col-lg-7,.factory-bootstrap-446 .col-lg-8,.factory-bootstrap-446 .col-lg-9,.factory-bootstrap-446 .col-md-1,.factory-bootstrap-446 .col-md-10,.factory-bootstrap-446 .col-md-11,.factory-bootstrap-446 .col-md-12,.factory-bootstrap-446 .col-md-2,.factory-bootstrap-446 .col-md-3,.factory-bootstrap-446 .col-md-4,.factory-bootstrap-446 .col-md-5,.factory-bootstrap-446 .col-md-6,.factory-bootstrap-446 .col-md-7,.factory-bootstrap-446 .col-md-8,.factory-bootstrap-446 .col-md-9,.factory-bootstrap-446 .col-sm-1,.factory-bootstrap-446 .col-sm-10,.factory-bootstrap-446 .col-sm-11,.factory-bootstrap-446 .col-sm-12,.factory-bootstrap-446 .col-sm-2,.factory-bootstrap-446 .col-sm-3,.factory-bootstrap-446 .col-sm-4,.factory-bootstrap-446 .col-sm-5,.factory-bootstrap-446 .col-sm-6,.factory-bootstrap-446 .col-sm-7,.factory-bootstrap-446 .col-sm-8,.factory-bootstrap-446 .col-sm-9,.factory-bootstrap-446 .col-xs-1,.factory-bootstrap-446 .col-xs-10,.factory-bootstrap-446 .col-xs-11,.factory-bootstrap-446 .col-xs-12,.factory-bootstrap-446 .col-xs-2,.factory-bootstrap-446 .col-xs-3,.factory-bootstrap-446 .col-xs-4,.factory-bootstrap-446 .col-xs-5,.factory-bootstrap-446 .col-xs-6,.factory-bootstrap-446 .col-xs-7,.factory-bootstrap-446 .col-xs-8,.factory-bootstrap-446 .col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.factory-bootstrap-446 .col-xs-1,.factory-bootstrap-446 .col-xs-10,.factory-bootstrap-446 .col-xs-11,.factory-bootstrap-446 .col-xs-12,.factory-bootstrap-446 .col-xs-2,.factory-bootstrap-446 .col-xs-3,.factory-bootstrap-446 .col-xs-4,.factory-bootstrap-446 .col-xs-5,.factory-bootstrap-446 .col-xs-6,.factory-bootstrap-446 .col-xs-7,.factory-bootstrap-446 .col-xs-8,.factory-bootstrap-446 .col-xs-9{float:left}.factory-bootstrap-446 .col-xs-12{width:100%}.factory-bootstrap-446 .col-xs-11{width:91.66666666666666%}.factory-bootstrap-446 .col-xs-10{width:83.33333333333334%}.factory-bootstrap-446 .col-xs-9{width:75%}.factory-bootstrap-446 .col-xs-8{width:66.66666666666666%}.factory-bootstrap-446 .col-xs-7{width:58.333333333333336%}.factory-bootstrap-446 .col-xs-6{width:50%}.factory-bootstrap-446 .col-xs-5{width:41.66666666666667%}.factory-bootstrap-446 .col-xs-4{width:33.33333333333333%}.factory-bootstrap-446 .col-xs-3{width:25%}.factory-bootstrap-446 .col-xs-2{width:16.666666666666664%}.factory-bootstrap-446 .col-xs-1{width:8.333333333333332%}.factory-bootstrap-446 .col-xs-pull-12{right:100%}.factory-bootstrap-446 .col-xs-pull-11{right:91.66666666666666%}.factory-bootstrap-446 .col-xs-pull-10{right:83.33333333333334%}.factory-bootstrap-446 .col-xs-pull-9{right:75%}.factory-bootstrap-446 .col-xs-pull-8{right:66.66666666666666%}.factory-bootstrap-446 .col-xs-pull-7{right:58.333333333333336%}.factory-bootstrap-446 .col-xs-pull-6{right:50%}.factory-bootstrap-446 .col-xs-pull-5{right:41.66666666666667%}.factory-bootstrap-446 .col-xs-pull-4{right:33.33333333333333%}.factory-bootstrap-446 .col-xs-pull-3{right:25%}.factory-bootstrap-446 .col-xs-pull-2{right:16.666666666666664%}.factory-bootstrap-446 .col-xs-pull-1{right:8.333333333333332%}.factory-bootstrap-446 .col-xs-pull-0{right:0}.factory-bootstrap-446 .col-xs-push-12{left:100%}.factory-bootstrap-446 .col-xs-push-11{left:91.66666666666666%}.factory-bootstrap-446 .col-xs-push-10{left:83.33333333333334%}.factory-bootstrap-446 .col-xs-push-9{left:75%}.factory-bootstrap-446 .col-xs-push-8{left:66.66666666666666%}.factory-bootstrap-446 .col-xs-push-7{left:58.333333333333336%}.factory-bootstrap-446 .col-xs-push-6{left:50%}.factory-bootstrap-446 .col-xs-push-5{left:41.66666666666667%}.factory-bootstrap-446 .col-xs-push-4{left:33.33333333333333%}.factory-bootstrap-446 .col-xs-push-3{left:25%}.factory-bootstrap-446 .col-xs-push-2{left:16.666666666666664%}.factory-bootstrap-446 .col-xs-push-1{left:8.333333333333332%}.factory-bootstrap-446 .col-xs-push-0{left:0}.factory-bootstrap-446 .col-xs-offset-12{margin-left:100%}.factory-bootstrap-446 .col-xs-offset-11{margin-left:91.66666666666666%}.factory-bootstrap-446 .col-xs-offset-10{margin-left:83.33333333333334%}.factory-bootstrap-446 .col-xs-offset-9{margin-left:75%}.factory-bootstrap-446 .col-xs-offset-8{margin-left:66.66666666666666%}.factory-bootstrap-446 .col-xs-offset-7{margin-left:58.333333333333336%}.factory-bootstrap-446 .col-xs-offset-6{margin-left:50%}.factory-bootstrap-446 .col-xs-offset-5{margin-left:41.66666666666667%}.factory-bootstrap-446 .col-xs-offset-4{margin-left:33.33333333333333%}.factory-bootstrap-446 .col-xs-offset-3{margin-left:25%}.factory-bootstrap-446 .col-xs-offset-2{margin-left:16.666666666666664%}.factory-bootstrap-446 .col-xs-offset-1{margin-left:8.333333333333332%}.factory-bootstrap-446 .col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}.factory-bootstrap-446 table{max-width:100%;background-color:transparent}.factory-bootstrap-446 th{text-align:left}.factory-bootstrap-446 .table{width:100%;margin-bottom:20px}.factory-bootstrap-446 .table>tbody>tr>td,.factory-bootstrap-446 .table>tbody>tr>th,.factory-bootstrap-446 .table>tfoot>tr>td,.factory-bootstrap-446 .table>tfoot>tr>th,.factory-bootstrap-446 .table>thead>tr>td,.factory-bootstrap-446 .table>thead>tr>th{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.factory-bootstrap-446 .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.factory-bootstrap-446 .table>caption+thead>tr:first-child>td,.factory-bootstrap-446 .table>caption+thead>tr:first-child>th,.factory-bootstrap-446 .table>colgroup+thead>tr:first-child>td,.factory-bootstrap-446 .table>colgroup+thead>tr:first-child>th,.factory-bootstrap-446 .table>thead:first-child>tr:first-child>td,.factory-bootstrap-446 .table>thead:first-child>tr:first-child>th{border-top:0}.factory-bootstrap-446 .table>tbody+tbody{border-top:2px solid #ddd}.factory-bootstrap-446 .table .table{background-color:#fff}.factory-bootstrap-446 .table-condensed>tbody>tr>td,.factory-bootstrap-446 .table-condensed>tbody>tr>th,.factory-bootstrap-446 .table-condensed>tfoot>tr>td,.factory-bootstrap-446 .table-condensed>tfoot>tr>th,.factory-bootstrap-446 .table-condensed>thead>tr>td,.factory-bootstrap-446 .table-condensed>thead>tr>th{padding:5px}.factory-bootstrap-446 .table-bordered,.factory-bootstrap-446 .table-bordered>tbody>tr>td,.factory-bootstrap-446 .table-bordered>tbody>tr>th,.factory-bootstrap-446 .table-bordered>tfoot>tr>td,.factory-bootstrap-446 .table-bordered>tfoot>tr>th,.factory-bootstrap-446 .table-bordered>thead>tr>td,.factory-bootstrap-446 .table-bordered>thead>tr>th{border:1px solid #ddd}.factory-bootstrap-446 .table-bordered>thead>tr>td,.factory-bootstrap-446 .table-bordered>thead>tr>th{border-bottom-width:2px}.factory-bootstrap-446 .table-striped>tbody>tr:nth-child(odd)>td,.factory-bootstrap-446 .table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.factory-bootstrap-446 .table-hover>tbody>tr:hover>td,.factory-bootstrap-446 .table-hover>tbody>tr:hover>th{background-color:#f5f5f5}.factory-bootstrap-446 table col[class*=col-]{position:static;display:table-column;float:none}.factory-bootstrap-446 table td[class*=col-],.factory-bootstrap-446 table th[class*=col-]{display:table-cell;float:none}.factory-bootstrap-446 .table>tbody>.active>td,.factory-bootstrap-446 .table>tbody>.active>th,.factory-bootstrap-446 .table>tbody>tr>.active,.factory-bootstrap-446 .table>tfoot>.active>td,.factory-bootstrap-446 .table>tfoot>.active>th,.factory-bootstrap-446 .table>tfoot>tr>.active,.factory-bootstrap-446 .table>thead>.active>td,.factory-bootstrap-446 .table>thead>.active>th,.factory-bootstrap-446 .table>thead>tr>.active{background-color:#f5f5f5}.factory-bootstrap-446 .table-hover>tbody>.active:hover>td,.factory-bootstrap-446 .table-hover>tbody>.active:hover>th,.factory-bootstrap-446 .table-hover>tbody>tr>.active:hover{background-color:#e8e8e8}.factory-bootstrap-446 .table>tbody>.success>td,.factory-bootstrap-446 .table>tbody>.success>th,.factory-bootstrap-446 .table>tbody>tr>.success,.factory-bootstrap-446 .table>tfoot>.success>td,.factory-bootstrap-446 .table>tfoot>.success>th,.factory-bootstrap-446 .table>tfoot>tr>.success,.factory-bootstrap-446 .table>thead>.success>td,.factory-bootstrap-446 .table>thead>.success>th,.factory-bootstrap-446 .table>thead>tr>.success{background-color:#dff0d8}.factory-bootstrap-446 .table-hover>tbody>.success:hover>td,.factory-bootstrap-446 .table-hover>tbody>.success:hover>th,.factory-bootstrap-446 .table-hover>tbody>tr>.success:hover{background-color:#d0e9c6}.factory-bootstrap-446 .table>tbody>.danger>td,.factory-bootstrap-446 .table>tbody>.danger>th,.factory-bootstrap-446 .table>tbody>tr>.danger,.factory-bootstrap-446 .table>tfoot>.danger>td,.factory-bootstrap-446 .table>tfoot>.danger>th,.factory-bootstrap-446 .table>tfoot>tr>.danger,.factory-bootstrap-446 .table>thead>.danger>td,.factory-bootstrap-446 .table>thead>.danger>th,.factory-bootstrap-446 .table>thead>tr>.danger{background-color:#f2dede}.factory-bootstrap-446 .table-hover>tbody>.danger:hover>td,.factory-bootstrap-446 .table-hover>tbody>.danger:hover>th,.factory-bootstrap-446 .table-hover>tbody>tr>.danger:hover{background-color:#ebcccc}.factory-bootstrap-446 .table>tbody>.warning>td,.factory-bootstrap-446 .table>tbody>.warning>th,.factory-bootstrap-446 .table>tbody>tr>.warning,.factory-bootstrap-446 .table>tfoot>.warning>td,.factory-bootstrap-446 .table>tfoot>.warning>th,.factory-bootstrap-446 .table>tfoot>tr>.warning,.factory-bootstrap-446 .table>thead>.warning>td,.factory-bootstrap-446 .table>thead>.warning>th,.factory-bootstrap-446 .table>thead>tr>.warning{background-color:#fcf8e3}.factory-bootstrap-446 .table-hover>tbody>.warning:hover>td,.factory-bootstrap-446 .table-hover>tbody>.warning:hover>th,.factory-bootstrap-446 .table-hover>tbody>tr>.warning:hover{background-color:#faf2cc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}.factory-bootstrap-446 fieldset{padding:0;margin:0;border:0}.factory-bootstrap-446 legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5;-moz-box-sizing:content-box;box-sizing:content-box}.factory-bootstrap-446 label{display:inline-block;margin-bottom:5px;font-weight:700}.factory-bootstrap-446 input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.factory-bootstrap-446 input[type=checkbox],.factory-bootstrap-446 input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}.factory-bootstrap-446 input[type=file]{display:block}.factory-bootstrap-446 select[multiple],.factory-bootstrap-446 select[size]{height:auto}.factory-bootstrap-446 select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}.factory-bootstrap-446 input[type=checkbox]:focus,.factory-bootstrap-446 input[type=file]:focus,.factory-bootstrap-446 input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-446 input[type=number]::-webkit-inner-spin-button,.factory-bootstrap-446 input[type=number]::-webkit-outer-spin-button{height:auto}.factory-bootstrap-446 output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.factory-bootstrap-446 .form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.factory-bootstrap-446 .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-446 .form-control:-moz-placeholder{color:#999}.factory-bootstrap-446 .form-control::-moz-placeholder{color:#999;opacity:1}.factory-bootstrap-446 .form-control:-ms-input-placeholder{color:#999}.factory-bootstrap-446 .form-control::-webkit-input-placeholder{color:#999}.factory-bootstrap-446 .form-control[disabled],.factory-bootstrap-446 .form-control[readonly],.factory-bootstrap-446 fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.factory-bootstrap-446 textarea.form-control{height:auto}.factory-bootstrap-446 .form-group{margin-bottom:15px}.factory-bootstrap-446 .checkbox,.factory-bootstrap-446 .radio{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.factory-bootstrap-446 .checkbox label,.factory-bootstrap-446 .radio label{display:inline;margin-bottom:0;font-weight:400;cursor:pointer}.factory-bootstrap-446 .checkbox input[type=checkbox],.factory-bootstrap-446 .checkbox-inline input[type=checkbox],.factory-bootstrap-446 .radio input[type=radio],.factory-bootstrap-446 .radio-inline input[type=radio]{float:left;margin-left:-20px}.factory-bootstrap-446 .checkbox+.checkbox,.factory-bootstrap-446 .radio+.radio{margin-top:-5px}.factory-bootstrap-446 .checkbox-inline,.factory-bootstrap-446 .radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.factory-bootstrap-446 .checkbox-inline+.checkbox-inline,.factory-bootstrap-446 .radio-inline+.radio-inline{margin-top:0;margin-left:10px}.factory-bootstrap-446 .checkbox-inline[disabled],.factory-bootstrap-446 .checkbox[disabled],.factory-bootstrap-446 .radio-inline[disabled],.factory-bootstrap-446 .radio[disabled],.factory-bootstrap-446 fieldset[disabled] .checkbox,.factory-bootstrap-446 fieldset[disabled] .checkbox-inline,.factory-bootstrap-446 fieldset[disabled] .radio,.factory-bootstrap-446 fieldset[disabled] .radio-inline,.factory-bootstrap-446 fieldset[disabled] input[type=checkbox],.factory-bootstrap-446 fieldset[disabled] input[type=radio],.factory-bootstrap-446 input[type=checkbox][disabled],.factory-bootstrap-446 input[type=radio][disabled]{cursor:not-allowed}.factory-bootstrap-446 .input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 select.input-sm{height:30px;line-height:30px}.factory-bootstrap-446 textarea.input-sm{height:auto}.factory-bootstrap-446 .input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-446 select.input-lg{height:46px;line-height:46px}.factory-bootstrap-446 textarea.input-lg{height:auto}.factory-bootstrap-446 .has-warning .checkbox,.factory-bootstrap-446 .has-warning .checkbox-inline,.factory-bootstrap-446 .has-warning .control-label,.factory-bootstrap-446 .has-warning .help-block,.factory-bootstrap-446 .has-warning .radio,.factory-bootstrap-446 .has-warning .radio-inline{color:#8a6d3b}.factory-bootstrap-446 .has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-446 .has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.factory-bootstrap-446 .has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.factory-bootstrap-446 .has-error .checkbox,.factory-bootstrap-446 .has-error .checkbox-inline,.factory-bootstrap-446 .has-error .control-label,.factory-bootstrap-446 .has-error .help-block,.factory-bootstrap-446 .has-error .radio,.factory-bootstrap-446 .has-error .radio-inline{color:#a94442}.factory-bootstrap-446 .controls{display:block}.factory-bootstrap-446 .has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-446 .has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.factory-bootstrap-446 .has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.factory-bootstrap-446 .has-success .checkbox,.factory-bootstrap-446 .has-success .checkbox-inline,.factory-bootstrap-446 .has-success .control-label,.factory-bootstrap-446 .has-success .help-block,.factory-bootstrap-446 .has-success .radio,.factory-bootstrap-446 .has-success .radio-inline{color:#3c763d}.factory-bootstrap-446 .has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-446 .has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.factory-bootstrap-446 .has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.factory-bootstrap-446 .form-control-static{margin-bottom:0}.factory-bootstrap-446 .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373;font-weight:400}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .checkbox,.form-inline .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}}.factory-bootstrap-446 .form-horizontal .checkbox,.factory-bootstrap-446 .form-horizontal .checkbox-inline,.factory-bootstrap-446 .form-horizontal .control-label,.factory-bootstrap-446 .form-horizontal .radio,.factory-bootstrap-446 .form-horizontal .radio-inline{position:relative;padding-top:7px;margin-top:0;margin-bottom:0}.factory-bootstrap-446 .form-horizontal .control-label{max-width:200px}.factory-bootstrap-446 .form-horizontal .checkbox,.factory-bootstrap-446 .form-horizontal .radio{min-height:27px}.factory-bootstrap-446 .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.factory-bootstrap-446 .form-horizontal .form-group:after,.factory-bootstrap-446 .form-horizontal .form-group:before{display:table;content:" "}.factory-bootstrap-446 .form-horizontal .form-group:after{clear:both}.factory-bootstrap-446 .form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.factory-bootstrap-446 .btn{display:inline-block;padding:5px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.factory-bootstrap-446 .btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.factory-bootstrap-446 .btn{text-decoration:none}.factory-bootstrap-446 .btn:focus,.factory-bootstrap-446 .btn:hover{color:#333;text-decoration:none}.factory-bootstrap-446 .btn.disabled,.factory-bootstrap-446 .btn[disabled],.factory-bootstrap-446 fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-446 .btn-default.active,.factory-bootstrap-446 .btn-default:active,.factory-bootstrap-446 .btn-default:focus,.factory-bootstrap-446 .btn-default:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-default{background:#fafafa;border-color:#999;color:#222}.factory-bootstrap-446 .btn-default.active,.factory-bootstrap-446 .btn-default:active,.factory-bootstrap-446 .open .dropdown-toggle.btn-default{background-image:none}.factory-bootstrap-446 .btn-default.disabled,.factory-bootstrap-446 .btn-default.disabled.active,.factory-bootstrap-446 .btn-default.disabled:active,.factory-bootstrap-446 .btn-default.disabled:focus,.factory-bootstrap-446 .btn-default.disabled:hover,.factory-bootstrap-446 .btn-default[disabled],.factory-bootstrap-446 .btn-default[disabled].active,.factory-bootstrap-446 .btn-default[disabled]:active,.factory-bootstrap-446 .btn-default[disabled]:focus,.factory-bootstrap-446 .btn-default[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-default,.factory-bootstrap-446 fieldset[disabled] .btn-default.active,.factory-bootstrap-446 fieldset[disabled] .btn-default:active,.factory-bootstrap-446 fieldset[disabled] .btn-default:focus,.factory-bootstrap-446 fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.factory-bootstrap-446 .btn-default .badge{color:#fff;background-color:#fff}.factory-bootstrap-446 .btn-primary.active,.factory-bootstrap-446 .btn-primary:active,.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.factory-bootstrap-446 .btn-primary.active,.factory-bootstrap-446 .btn-primary:active,.factory-bootstrap-446 .open .dropdown-toggle.btn-primary{background-image:none}.factory-bootstrap-446 .btn-primary.disabled,.factory-bootstrap-446 .btn-primary.disabled.active,.factory-bootstrap-446 .btn-primary.disabled:active,.factory-bootstrap-446 .btn-primary.disabled:focus,.factory-bootstrap-446 .btn-primary.disabled:hover,.factory-bootstrap-446 .btn-primary[disabled],.factory-bootstrap-446 .btn-primary[disabled].active,.factory-bootstrap-446 .btn-primary[disabled]:active,.factory-bootstrap-446 .btn-primary[disabled]:focus,.factory-bootstrap-446 .btn-primary[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-primary,.factory-bootstrap-446 fieldset[disabled] .btn-primary.active,.factory-bootstrap-446 fieldset[disabled] .btn-primary:active,.factory-bootstrap-446 fieldset[disabled] .btn-primary:focus,.factory-bootstrap-446 fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.factory-bootstrap-446 .btn-primary .badge{color:#428bca;background-color:#fff}.factory-bootstrap-446 .btn-warning{color:#fff;background-color:#f0ad4e}.factory-bootstrap-446 .btn-warning.active,.factory-bootstrap-446 .btn-warning:active,.factory-bootstrap-446 .btn-warning:focus,.factory-bootstrap-446 .btn-warning:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.factory-bootstrap-446 .btn-warning.active,.factory-bootstrap-446 .btn-warning:active,.factory-bootstrap-446 .open .dropdown-toggle.btn-warning{background-image:none}.factory-bootstrap-446 .btn-warning.disabled,.factory-bootstrap-446 .btn-warning.disabled.active,.factory-bootstrap-446 .btn-warning.disabled:active,.factory-bootstrap-446 .btn-warning.disabled:focus,.factory-bootstrap-446 .btn-warning.disabled:hover,.factory-bootstrap-446 .btn-warning[disabled],.factory-bootstrap-446 .btn-warning[disabled].active,.factory-bootstrap-446 .btn-warning[disabled]:active,.factory-bootstrap-446 .btn-warning[disabled]:focus,.factory-bootstrap-446 .btn-warning[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-warning,.factory-bootstrap-446 fieldset[disabled] .btn-warning.active,.factory-bootstrap-446 fieldset[disabled] .btn-warning:active,.factory-bootstrap-446 fieldset[disabled] .btn-warning:focus,.factory-bootstrap-446 fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.factory-bootstrap-446 .btn-warning .badge{color:#f0ad4e;background-color:#fff}.factory-bootstrap-446 .btn-success{color:#fff;background-color:#5cb85c}.factory-bootstrap-446 .btn-success.active,.factory-bootstrap-446 .btn-success:active,.factory-bootstrap-446 .btn-success:focus,.factory-bootstrap-446 .btn-success:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.factory-bootstrap-446 .btn-success.active,.factory-bootstrap-446 .btn-success:active,.factory-bootstrap-446 .open .dropdown-toggle.btn-success{background-image:none}.factory-bootstrap-446 .btn-success.disabled,.factory-bootstrap-446 .btn-success.disabled.active,.factory-bootstrap-446 .btn-success.disabled:active,.factory-bootstrap-446 .btn-success.disabled:focus,.factory-bootstrap-446 .btn-success.disabled:hover,.factory-bootstrap-446 .btn-success[disabled],.factory-bootstrap-446 .btn-success[disabled].active,.factory-bootstrap-446 .btn-success[disabled]:active,.factory-bootstrap-446 .btn-success[disabled]:focus,.factory-bootstrap-446 .btn-success[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-success,.factory-bootstrap-446 fieldset[disabled] .btn-success.active,.factory-bootstrap-446 fieldset[disabled] .btn-success:active,.factory-bootstrap-446 fieldset[disabled] .btn-success:focus,.factory-bootstrap-446 fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.factory-bootstrap-446 .btn-success .badge{color:#5cb85c;background-color:#fff}.factory-bootstrap-446 .btn-info{color:#fff;background-color:#5bc0de}.factory-bootstrap-446 .btn-info.active,.factory-bootstrap-446 .btn-info:active,.factory-bootstrap-446 .btn-info:focus,.factory-bootstrap-446 .btn-info:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.factory-bootstrap-446 .btn-info.active,.factory-bootstrap-446 .btn-info:active,.factory-bootstrap-446 .open .dropdown-toggle.btn-info{background-image:none}.factory-bootstrap-446 .btn-info.disabled,.factory-bootstrap-446 .btn-info.disabled.active,.factory-bootstrap-446 .btn-info.disabled:active,.factory-bootstrap-446 .btn-info.disabled:focus,.factory-bootstrap-446 .btn-info.disabled:hover,.factory-bootstrap-446 .btn-info[disabled],.factory-bootstrap-446 .btn-info[disabled].active,.factory-bootstrap-446 .btn-info[disabled]:active,.factory-bootstrap-446 .btn-info[disabled]:focus,.factory-bootstrap-446 .btn-info[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-info,.factory-bootstrap-446 fieldset[disabled] .btn-info.active,.factory-bootstrap-446 fieldset[disabled] .btn-info:active,.factory-bootstrap-446 fieldset[disabled] .btn-info:focus,.factory-bootstrap-446 fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.factory-bootstrap-446 .btn-info .badge{color:#5bc0de;background-color:#fff}.factory-bootstrap-446 .btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.factory-bootstrap-446 .btn-link,.factory-bootstrap-446 .btn-link:active,.factory-bootstrap-446 .btn-link[disabled],.factory-bootstrap-446 fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-446 .btn-link,.factory-bootstrap-446 .btn-link:active,.factory-bootstrap-446 .btn-link:focus,.factory-bootstrap-446 .btn-link:hover{border-color:transparent}.factory-bootstrap-446 .btn-link:focus,.factory-bootstrap-446 .btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.factory-bootstrap-446 .btn-link[disabled]:focus,.factory-bootstrap-446 .btn-link[disabled]:hover,.factory-bootstrap-446 fieldset[disabled] .btn-link:focus,.factory-bootstrap-446 fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.factory-bootstrap-446 .btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-446 .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 .btn-block{display:block;width:100%;padding-right:0;padding-left:0}.factory-bootstrap-446 .btn-block+.btn-block{margin-top:5px}.factory-bootstrap-446 input[type=button].btn-block,.factory-bootstrap-446 input[type=reset].btn-block,.factory-bootstrap-446 input[type=submit].btn-block{width:100%}.factory-bootstrap-446 .fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.factory-bootstrap-446 .fade.in{opacity:1}.factory-bootstrap-446 .collapse{display:none}.factory-bootstrap-446 .collapse.in{display:block}.factory-bootstrap-446 .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular) format('svg')}.factory-bootstrap-446 .glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;line-height:1;-moz-osx-font-smoothing:grayscale}.factory-bootstrap-446 .glyphicon:empty{width:1em}.factory-bootstrap-446 .glyphicon-asterisk:before{content:"\2a"}.factory-bootstrap-446 .glyphicon-plus:before{content:"\2b"}.factory-bootstrap-446 .glyphicon-euro:before{content:"\20ac"}.factory-bootstrap-446 .glyphicon-minus:before{content:"\2212"}.factory-bootstrap-446 .glyphicon-cloud:before{content:"\2601"}.factory-bootstrap-446 .glyphicon-envelope:before{content:"\2709"}.factory-bootstrap-446 .glyphicon-pencil:before{content:"\270f"}.factory-bootstrap-446 .glyphicon-glass:before{content:"\e001"}.factory-bootstrap-446 .glyphicon-music:before{content:"\e002"}.factory-bootstrap-446 .glyphicon-search:before{content:"\e003"}.factory-bootstrap-446 .glyphicon-heart:before{content:"\e005"}.factory-bootstrap-446 .glyphicon-star:before{content:"\e006"}.factory-bootstrap-446 .glyphicon-star-empty:before{content:"\e007"}.factory-bootstrap-446 .glyphicon-user:before{content:"\e008"}.factory-bootstrap-446 .glyphicon-film:before{content:"\e009"}.factory-bootstrap-446 .glyphicon-th-large:before{content:"\e010"}.factory-bootstrap-446 .glyphicon-th:before{content:"\e011"}.factory-bootstrap-446 .glyphicon-th-list:before{content:"\e012"}.factory-bootstrap-446 .glyphicon-ok:before{content:"\e013"}.factory-bootstrap-446 .glyphicon-remove:before{content:"\e014"}.factory-bootstrap-446 .glyphicon-zoom-in:before{content:"\e015"}.factory-bootstrap-446 .glyphicon-zoom-out:before{content:"\e016"}.factory-bootstrap-446 .glyphicon-off:before{content:"\e017"}.factory-bootstrap-446 .glyphicon-signal:before{content:"\e018"}.factory-bootstrap-446 .glyphicon-cog:before{content:"\e019"}.factory-bootstrap-446 .glyphicon-trash:before{content:"\e020"}.factory-bootstrap-446 .glyphicon-home:before{content:"\e021"}.factory-bootstrap-446 .glyphicon-file:before{content:"\e022"}.factory-bootstrap-446 .glyphicon-time:before{content:"\e023"}.factory-bootstrap-446 .glyphicon-road:before{content:"\e024"}.factory-bootstrap-446 .glyphicon-download-alt:before{content:"\e025"}.factory-bootstrap-446 .glyphicon-download:before{content:"\e026"}.factory-bootstrap-446 .glyphicon-upload:before{content:"\e027"}.factory-bootstrap-446 .glyphicon-inbox:before{content:"\e028"}.factory-bootstrap-446 .glyphicon-play-circle:before{content:"\e029"}.factory-bootstrap-446 .glyphicon-repeat:before{content:"\e030"}.factory-bootstrap-446 .glyphicon-refresh:before{content:"\e031"}.factory-bootstrap-446 .glyphicon-list-alt:before{content:"\e032"}.factory-bootstrap-446 .glyphicon-lock:before{content:"\e033"}.factory-bootstrap-446 .glyphicon-flag:before{content:"\e034"}.factory-bootstrap-446 .glyphicon-headphones:before{content:"\e035"}.factory-bootstrap-446 .glyphicon-volume-off:before{content:"\e036"}.factory-bootstrap-446 .glyphicon-volume-down:before{content:"\e037"}.factory-bootstrap-446 .glyphicon-volume-up:before{content:"\e038"}.factory-bootstrap-446 .glyphicon-qrcode:before{content:"\e039"}.factory-bootstrap-446 .glyphicon-barcode:before{content:"\e040"}.factory-bootstrap-446 .glyphicon-tag:before{content:"\e041"}.factory-bootstrap-446 .glyphicon-tags:before{content:"\e042"}.factory-bootstrap-446 .glyphicon-book:before{content:"\e043"}.factory-bootstrap-446 .glyphicon-bookmark:before{content:"\e044"}.factory-bootstrap-446 .glyphicon-print:before{content:"\e045"}.factory-bootstrap-446 .glyphicon-camera:before{content:"\e046"}.factory-bootstrap-446 .glyphicon-font:before{content:"\e047"}.factory-bootstrap-446 .glyphicon-bold:before{content:"\e048"}.factory-bootstrap-446 .glyphicon-italic:before{content:"\e049"}.factory-bootstrap-446 .glyphicon-text-height:before{content:"\e050"}.factory-bootstrap-446 .glyphicon-text-width:before{content:"\e051"}.factory-bootstrap-446 .glyphicon-align-left:before{content:"\e052"}.factory-bootstrap-446 .glyphicon-align-center:before{content:"\e053"}.factory-bootstrap-446 .glyphicon-align-right:before{content:"\e054"}.factory-bootstrap-446 .glyphicon-align-justify:before{content:"\e055"}.factory-bootstrap-446 .glyphicon-list:before{content:"\e056"}.factory-bootstrap-446 .glyphicon-indent-left:before{content:"\e057"}.factory-bootstrap-446 .glyphicon-indent-right:before{content:"\e058"}.factory-bootstrap-446 .glyphicon-facetime-video:before{content:"\e059"}.factory-bootstrap-446 .glyphicon-picture:before{content:"\e060"}.factory-bootstrap-446 .glyphicon-map-marker:before{content:"\e062"}.factory-bootstrap-446 .glyphicon-adjust:before{content:"\e063"}.factory-bootstrap-446 .glyphicon-tint:before{content:"\e064"}.factory-bootstrap-446 .glyphicon-edit:before{content:"\e065"}.factory-bootstrap-446 .glyphicon-share:before{content:"\e066"}.factory-bootstrap-446 .glyphicon-check:before{content:"\e067"}.factory-bootstrap-446 .glyphicon-move:before{content:"\e068"}.factory-bootstrap-446 .glyphicon-step-backward:before{content:"\e069"}.factory-bootstrap-446 .glyphicon-fast-backward:before{content:"\e070"}.factory-bootstrap-446 .glyphicon-backward:before{content:"\e071"}.factory-bootstrap-446 .glyphicon-play:before{content:"\e072"}.factory-bootstrap-446 .glyphicon-pause:before{content:"\e073"}.factory-bootstrap-446 .glyphicon-stop:before{content:"\e074"}.factory-bootstrap-446 .glyphicon-forward:before{content:"\e075"}.factory-bootstrap-446 .glyphicon-fast-forward:before{content:"\e076"}.factory-bootstrap-446 .glyphicon-step-forward:before{content:"\e077"}.factory-bootstrap-446 .glyphicon-eject:before{content:"\e078"}.factory-bootstrap-446 .glyphicon-chevron-left:before{content:"\e079"}.factory-bootstrap-446 .glyphicon-chevron-right:before{content:"\e080"}.factory-bootstrap-446 .glyphicon-plus-sign:before{content:"\e081"}.factory-bootstrap-446 .glyphicon-minus-sign:before{content:"\e082"}.factory-bootstrap-446 .glyphicon-remove-sign:before{content:"\e083"}.factory-bootstrap-446 .glyphicon-ok-sign:before{content:"\e084"}.factory-bootstrap-446 .glyphicon-question-sign:before{content:"\e085"}.factory-bootstrap-446 .glyphicon-info-sign:before{content:"\e086"}.factory-bootstrap-446 .glyphicon-screenshot:before{content:"\e087"}.factory-bootstrap-446 .glyphicon-remove-circle:before{content:"\e088"}.factory-bootstrap-446 .glyphicon-ok-circle:before{content:"\e089"}.factory-bootstrap-446 .glyphicon-ban-circle:before{content:"\e090"}.factory-bootstrap-446 .glyphicon-arrow-left:before{content:"\e091"}.factory-bootstrap-446 .glyphicon-arrow-right:before{content:"\e092"}.factory-bootstrap-446 .glyphicon-arrow-up:before{content:"\e093"}.factory-bootstrap-446 .glyphicon-arrow-down:before{content:"\e094"}.factory-bootstrap-446 .glyphicon-share-alt:before{content:"\e095"}.factory-bootstrap-446 .glyphicon-resize-full:before{content:"\e096"}.factory-bootstrap-446 .glyphicon-resize-small:before{content:"\e097"}.factory-bootstrap-446 .glyphicon-exclamation-sign:before{content:"\e101"}.factory-bootstrap-446 .glyphicon-gift:before{content:"\e102"}.factory-bootstrap-446 .glyphicon-leaf:before{content:"\e103"}.factory-bootstrap-446 .glyphicon-fire:before{content:"\e104"}.factory-bootstrap-446 .glyphicon-eye-open:before{content:"\e105"}.factory-bootstrap-446 .glyphicon-eye-close:before{content:"\e106"}.factory-bootstrap-446 .glyphicon-warning-sign:before{content:"\e107"}.factory-bootstrap-446 .glyphicon-plane:before{content:"\e108"}.factory-bootstrap-446 .glyphicon-calendar:before{content:"\e109"}.factory-bootstrap-446 .glyphicon-random:before{content:"\e110"}.factory-bootstrap-446 .glyphicon-comment:before{content:"\e111"}.factory-bootstrap-446 .glyphicon-magnet:before{content:"\e112"}.factory-bootstrap-446 .glyphicon-chevron-up:before{content:"\e113"}.factory-bootstrap-446 .glyphicon-chevron-down:before{content:"\e114"}.factory-bootstrap-446 .glyphicon-retweet:before{content:"\e115"}.factory-bootstrap-446 .glyphicon-shopping-cart:before{content:"\e116"}.factory-bootstrap-446 .glyphicon-folder-close:before{content:"\e117"}.factory-bootstrap-446 .glyphicon-folder-open:before{content:"\e118"}.factory-bootstrap-446 .glyphicon-resize-vertical:before{content:"\e119"}.factory-bootstrap-446 .glyphicon-resize-horizontal:before{content:"\e120"}.factory-bootstrap-446 .glyphicon-hdd:before{content:"\e121"}.factory-bootstrap-446 .glyphicon-bullhorn:before{content:"\e122"}.factory-bootstrap-446 .glyphicon-bell:before{content:"\e123"}.factory-bootstrap-446 .glyphicon-certificate:before{content:"\e124"}.factory-bootstrap-446 .glyphicon-thumbs-up:before{content:"\e125"}.factory-bootstrap-446 .glyphicon-thumbs-down:before{content:"\e126"}.factory-bootstrap-446 .glyphicon-hand-right:before{content:"\e127"}.factory-bootstrap-446 .glyphicon-hand-left:before{content:"\e128"}.factory-bootstrap-446 .glyphicon-hand-up:before{content:"\e129"}.factory-bootstrap-446 .glyphicon-hand-down:before{content:"\e130"}.factory-bootstrap-446 .glyphicon-circle-arrow-right:before{content:"\e131"}.factory-bootstrap-446 .glyphicon-circle-arrow-left:before{content:"\e132"}.factory-bootstrap-446 .glyphicon-circle-arrow-up:before{content:"\e133"}.factory-bootstrap-446 .glyphicon-circle-arrow-down:before{content:"\e134"}.factory-bootstrap-446 .glyphicon-globe:before{content:"\e135"}.factory-bootstrap-446 .glyphicon-wrench:before{content:"\e136"}.factory-bootstrap-446 .glyphicon-tasks:before{content:"\e137"}.factory-bootstrap-446 .glyphicon-filter:before{content:"\e138"}.factory-bootstrap-446 .glyphicon-briefcase:before{content:"\e139"}.factory-bootstrap-446 .glyphicon-fullscreen:before{content:"\e140"}.factory-bootstrap-446 .glyphicon-dashboard:before{content:"\e141"}.factory-bootstrap-446 .glyphicon-paperclip:before{content:"\e142"}.factory-bootstrap-446 .glyphicon-heart-empty:before{content:"\e143"}.factory-bootstrap-446 .glyphicon-link:before{content:"\e144"}.factory-bootstrap-446 .glyphicon-phone:before{content:"\e145"}.factory-bootstrap-446 .glyphicon-pushpin:before{content:"\e146"}.factory-bootstrap-446 .glyphicon-usd:before{content:"\e148"}.factory-bootstrap-446 .glyphicon-gbp:before{content:"\e149"}.factory-bootstrap-446 .glyphicon-sort:before{content:"\e150"}.factory-bootstrap-446 .glyphicon-sort-by-alphabet:before{content:"\e151"}.factory-bootstrap-446 .glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.factory-bootstrap-446 .glyphicon-sort-by-order:before{content:"\e153"}.factory-bootstrap-446 .glyphicon-sort-by-order-alt:before{content:"\e154"}.factory-bootstrap-446 .glyphicon-sort-by-attributes:before{content:"\e155"}.factory-bootstrap-446 .glyphicon-sort-by-attributes-alt:before{content:"\e156"}.factory-bootstrap-446 .glyphicon-unchecked:before{content:"\e157"}.factory-bootstrap-446 .glyphicon-expand:before{content:"\e158"}.factory-bootstrap-446 .glyphicon-collapse-down:before{content:"\e159"}.factory-bootstrap-446 .glyphicon-collapse-up:before{content:"\e160"}.factory-bootstrap-446 .glyphicon-log-in:before{content:"\e161"}.factory-bootstrap-446 .glyphicon-flash:before{content:"\e162"}.factory-bootstrap-446 .glyphicon-log-out:before{content:"\e163"}.factory-bootstrap-446 .glyphicon-new-window:before{content:"\e164"}.factory-bootstrap-446 .glyphicon-record:before{content:"\e165"}.factory-bootstrap-446 .glyphicon-save:before{content:"\e166"}.factory-bootstrap-446 .glyphicon-open:before{content:"\e167"}.factory-bootstrap-446 .glyphicon-saved:before{content:"\e168"}.factory-bootstrap-446 .glyphicon-import:before{content:"\e169"}.factory-bootstrap-446 .glyphicon-export:before{content:"\e170"}.factory-bootstrap-446 .glyphicon-send:before{content:"\e171"}.factory-bootstrap-446 .glyphicon-floppy-disk:before{content:"\e172"}.factory-bootstrap-446 .glyphicon-floppy-saved:before{content:"\e173"}.factory-bootstrap-446 .glyphicon-floppy-remove:before{content:"\e174"}.factory-bootstrap-446 .glyphicon-floppy-save:before{content:"\e175"}.factory-bootstrap-446 .glyphicon-floppy-open:before{content:"\e176"}.factory-bootstrap-446 .glyphicon-credit-card:before{content:"\e177"}.factory-bootstrap-446 .glyphicon-transfer:before{content:"\e178"}.factory-bootstrap-446 .glyphicon-cutlery:before{content:"\e179"}.factory-bootstrap-446 .glyphicon-header:before{content:"\e180"}.factory-bootstrap-446 .glyphicon-compressed:before{content:"\e181"}.factory-bootstrap-446 .glyphicon-earphone:before{content:"\e182"}.factory-bootstrap-446 .glyphicon-phone-alt:before{content:"\e183"}.factory-bootstrap-446 .glyphicon-tower:before{content:"\e184"}.factory-bootstrap-446 .glyphicon-stats:before{content:"\e185"}.factory-bootstrap-446 .glyphicon-sd-video:before{content:"\e186"}.factory-bootstrap-446 .glyphicon-hd-video:before{content:"\e187"}.factory-bootstrap-446 .glyphicon-subtitles:before{content:"\e188"}.factory-bootstrap-446 .glyphicon-sound-stereo:before{content:"\e189"}.factory-bootstrap-446 .glyphicon-sound-dolby:before{content:"\e190"}.factory-bootstrap-446 .glyphicon-sound-5-1:before{content:"\e191"}.factory-bootstrap-446 .glyphicon-sound-6-1:before{content:"\e192"}.factory-bootstrap-446 .glyphicon-sound-7-1:before{content:"\e193"}.factory-bootstrap-446 .glyphicon-copyright-mark:before{content:"\e194"}.factory-bootstrap-446 .glyphicon-registration-mark:before{content:"\e195"}.factory-bootstrap-446 .glyphicon-cloud-download:before{content:"\e197"}.factory-bootstrap-446 .glyphicon-cloud-upload:before{content:"\e198"}.factory-bootstrap-446 .glyphicon-tree-conifer:before{content:"\e199"}.factory-bootstrap-446 .glyphicon-tree-deciduous:before{content:"\e200"}.factory-bootstrap-446 .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.factory-bootstrap-446 .dropdown{position:relative}.factory-bootstrap-446 .dropdown-toggle:focus{outline:0}.factory-bootstrap-446 .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.factory-bootstrap-446 .dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-446 .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-446 .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}.factory-bootstrap-446 .dropdown-menu>li>a:focus,.factory-bootstrap-446 .dropdown-menu>li>a:hover{color:#262626;text-decoration:none}.factory-bootstrap-446 .dropdown-menu>.active>a,.factory-bootstrap-446 .dropdown-menu>.active>a:focus,.factory-bootstrap-446 .dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0}.factory-bootstrap-446 .dropdown-menu>.disabled>a,.factory-bootstrap-446 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-446 .dropdown-menu>.disabled>a:hover{color:#999}.factory-bootstrap-446 .dropdown-menu>.disabled>a:focus,.factory-bootstrap-446 .dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-446 .open>.dropdown-menu{display:block}.factory-bootstrap-446 .open>a{outline:0}.factory-bootstrap-446 .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.factory-bootstrap-446 .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.factory-bootstrap-446 .pull-right>.dropdown-menu{right:0;left:auto}.factory-bootstrap-446 .dropup .caret,.factory-bootstrap-446 .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.factory-bootstrap-446 .dropup .dropdown-menu,.factory-bootstrap-446 .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.factory-bootstrap-446 .btn-group,.factory-bootstrap-446 .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.factory-bootstrap-446 .btn-group-vertical>.btn,.factory-bootstrap-446 .btn-group>.btn{position:relative;float:left}.factory-bootstrap-446 .btn-group-vertical>.btn.active,.factory-bootstrap-446 .btn-group-vertical>.btn:active,.factory-bootstrap-446 .btn-group-vertical>.btn:focus,.factory-bootstrap-446 .btn-group-vertical>.btn:hover,.factory-bootstrap-446 .btn-group>.btn.active,.factory-bootstrap-446 .btn-group>.btn:active,.factory-bootstrap-446 .btn-group>.btn:focus,.factory-bootstrap-446 .btn-group>.btn:hover{z-index:2}.factory-bootstrap-446 .btn-group-vertical>.btn:focus,.factory-bootstrap-446 .btn-group>.btn:focus{outline:0}.factory-bootstrap-446 .btn-group .btn+.btn,.factory-bootstrap-446 .btn-group .btn+.btn-group,.factory-bootstrap-446 .btn-group .btn-group+.btn,.factory-bootstrap-446 .btn-group .btn-group+.btn-group{margin-left:-1px}.factory-bootstrap-446 .btn-toolbar:after,.factory-bootstrap-446 .btn-toolbar:before{display:table;content:" "}.factory-bootstrap-446 .btn-toolbar:after{clear:both}.factory-bootstrap-446 .btn-toolbar .btn-group{float:left}.factory-bootstrap-446 .btn-toolbar>.btn+.btn,.factory-bootstrap-446 .btn-toolbar>.btn+.btn-group,.factory-bootstrap-446 .btn-toolbar>.btn-group+.btn,.factory-bootstrap-446 .btn-toolbar>.btn-group+.btn-group{margin-left:5px}.factory-bootstrap-446 .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.factory-bootstrap-446 .btn-group>.btn:first-child{margin-left:0}.factory-bootstrap-446 .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-446 .btn-group>.btn:last-child:not(:first-child),.factory-bootstrap-446 .btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .btn-group>.btn-group{float:left}.factory-bootstrap-446 .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-446 .btn-group>.btn-group:first-child>.btn:last-child,.factory-bootstrap-446 .btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-446 .btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .btn-group .dropdown-toggle:active,.factory-bootstrap-446 .btn-group.open .dropdown-toggle{outline:0}.factory-bootstrap-446 .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 .btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-446 .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.factory-bootstrap-446 .btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.factory-bootstrap-446 .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.factory-bootstrap-446 .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-446 .btn-group{border:4px solid #f9f9f9;border-radius:4px}.factory-bootstrap-446 .btn-group .btn.active.value{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-446 .btn .caret{margin-left:0}.factory-bootstrap-446 .btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.factory-bootstrap-446 .dropup .btn-lg .caret{border-width:0 5px 5px}.factory-bootstrap-446 .btn-group-vertical>.btn,.factory-bootstrap-446 .btn-group-vertical>.btn-group,.factory-bootstrap-446 .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.factory-bootstrap-446 .btn-group-vertical>.btn-group:after,.factory-bootstrap-446 .btn-group-vertical>.btn-group:before{display:table;content:" "}.factory-bootstrap-446 .btn-group-vertical>.btn-group:after{clear:both}.factory-bootstrap-446 .btn-group-vertical>.btn-group>.btn{float:none}.factory-bootstrap-446 .btn-group-vertical>.btn+.btn,.factory-bootstrap-446 .btn-group-vertical>.btn+.btn-group,.factory-bootstrap-446 .btn-group-vertical>.btn-group+.btn,.factory-bootstrap-446 .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.factory-bootstrap-446 .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-446 .btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-446 .btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.factory-bootstrap-446 .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.factory-bootstrap-446 .btn-group-vertical>.btn-group:first-child>.btn:last-child,.factory-bootstrap-446 .btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-446 .btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.factory-bootstrap-446 .btn-group-justified>.btn,.factory-bootstrap-446 .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.factory-bootstrap-446 .btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.factory-bootstrap-446 .input-group{position:relative;display:table;border-collapse:separate}.factory-bootstrap-446 .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.factory-bootstrap-446 .input-group .form-control{width:100%;margin-bottom:0}.factory-bootstrap-446 .input-group-lg>.form-control,.factory-bootstrap-446 .input-group-lg>.input-group-addon,.factory-bootstrap-446 .input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.factory-bootstrap-446 select.input-group-lg>.form-control,.factory-bootstrap-446 select.input-group-lg>.input-group-addon,.factory-bootstrap-446 select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}.factory-bootstrap-446 textarea.input-group-lg>.form-control,.factory-bootstrap-446 textarea.input-group-lg>.input-group-addon,.factory-bootstrap-446 textarea.input-group-lg>.input-group-btn>.btn{height:auto}.factory-bootstrap-446 .input-group-sm>.form-control,.factory-bootstrap-446 .input-group-sm>.input-group-addon,.factory-bootstrap-446 .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.factory-bootstrap-446 select.input-group-sm>.form-control,.factory-bootstrap-446 select.input-group-sm>.input-group-addon,.factory-bootstrap-446 select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}.factory-bootstrap-446 textarea.input-group-sm>.form-control,.factory-bootstrap-446 textarea.input-group-sm>.input-group-addon,.factory-bootstrap-446 textarea.input-group-sm>.input-group-btn>.btn{height:auto}.factory-bootstrap-446 .input-group .form-control,.factory-bootstrap-446 .input-group-addon,.factory-bootstrap-446 .input-group-btn{display:table-cell}.factory-bootstrap-446 .input-group .form-control:not(:first-child):not(:last-child),.factory-bootstrap-446 .input-group-addon:not(:first-child):not(:last-child),.factory-bootstrap-446 .input-group-btn:not(:first-child):not(:last-child){border-radius:0}.factory-bootstrap-446 .input-group-addon,.factory-bootstrap-446 .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.factory-bootstrap-446 .input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.factory-bootstrap-446 .input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.factory-bootstrap-446 .input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.factory-bootstrap-446 .input-group-addon input[type=checkbox],.factory-bootstrap-446 .input-group-addon input[type=radio]{margin-top:0}.factory-bootstrap-446 .input-group .form-control:first-child,.factory-bootstrap-446 .input-group-addon:first-child,.factory-bootstrap-446 .input-group-btn:first-child>.btn,.factory-bootstrap-446 .input-group-btn:first-child>.dropdown-toggle,.factory-bootstrap-446 .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.factory-bootstrap-446 .input-group-addon:first-child{border-right:0}.factory-bootstrap-446 .input-group .form-control:last-child,.factory-bootstrap-446 .input-group-addon:last-child,.factory-bootstrap-446 .input-group-btn:first-child>.btn:not(:first-child),.factory-bootstrap-446 .input-group-btn:last-child>.btn,.factory-bootstrap-446 .input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .input-group-addon:last-child{border-left:0}.factory-bootstrap-446 .input-group-btn{position:relative;white-space:nowrap}.factory-bootstrap-446 .input-group-btn:first-child>.btn{margin-right:-1px}.factory-bootstrap-446 .input-group-btn:last-child>.btn{margin-left:-1px}.factory-bootstrap-446 .input-group-btn>.btn{position:relative}.factory-bootstrap-446 .input-group-btn>.btn+.btn{margin-left:-4px}.factory-bootstrap-446 .input-group-btn>.btn:active,.factory-bootstrap-446 .input-group-btn>.btn:hover{z-index:2}.factory-bootstrap-446 .nav{padding-left:0;margin-bottom:0;list-style:none}.factory-bootstrap-446 .nav:after,.factory-bootstrap-446 .nav:before{display:table;content:" "}.factory-bootstrap-446 .nav:after{clear:both}.factory-bootstrap-446 .nav>li{position:relative;display:block}.factory-bootstrap-446 .nav>li>a{position:relative;display:block;padding:10px 15px}.factory-bootstrap-446 .nav>li>a:focus,.factory-bootstrap-446 .nav>li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-446 .nav>li.disabled>a{color:#999}.factory-bootstrap-446 .nav>li.disabled>a:focus,.factory-bootstrap-446 .nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.factory-bootstrap-446 .nav .open>a,.factory-bootstrap-446 .nav .open>a:focus,.factory-bootstrap-446 .nav .open>a:hover{background-color:#eee;border-color:#428bca}.factory-bootstrap-446 .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.factory-bootstrap-446 .nav>li>a>img{max-width:none}.factory-bootstrap-446 .nav-tabs{border-bottom:1px solid #ddd}.factory-bootstrap-446 .nav-tabs>li{float:left;margin-bottom:-1px}.factory-bootstrap-446 .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.factory-bootstrap-446 .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.factory-bootstrap-446 .nav-tabs>li.active>a,.factory-bootstrap-446 .nav-tabs>li.active>a:focus,.factory-bootstrap-446 .nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.factory-bootstrap-446 .nav-tabs.nav-justified{width:100%;border-bottom:0}.factory-bootstrap-446 .nav-tabs.nav-justified>li{float:none}.factory-bootstrap-446 .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-446 .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-446 .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-446 .nav-tabs.nav-justified>.active>a,.factory-bootstrap-446 .nav-tabs.nav-justified>.active>a:focus,.factory-bootstrap-446 .nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-446 .nav-pills>li{float:left}.factory-bootstrap-446 .nav-pills>li>a{border-radius:4px}.factory-bootstrap-446 .nav-pills>li+li{margin-left:2px}.factory-bootstrap-446 .nav-pills>li.active>a,.factory-bootstrap-446 .nav-pills>li.active>a:focus,.factory-bootstrap-446 .nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.factory-bootstrap-446 .nav-stacked>li{float:none}.factory-bootstrap-446 .nav-stacked>li+li{margin-top:2px;margin-left:0}.factory-bootstrap-446 .nav-justified{width:100%}.factory-bootstrap-446 .nav-justified>li{float:none}.factory-bootstrap-446 .nav-justified>li>a{margin-bottom:5px;text-align:center}.factory-bootstrap-446 .nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.factory-bootstrap-446 .nav-tabs-justified{border-bottom:0}.factory-bootstrap-446 .nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.factory-bootstrap-446 .nav-tabs-justified>.active>a,.factory-bootstrap-446 .nav-tabs-justified>.active>a:focus,.factory-bootstrap-446 .nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.factory-bootstrap-446 .tab-content>.tab-pane{display:none}.factory-bootstrap-446 .tab-content>.active{display:block}.factory-bootstrap-446 .nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.factory-bootstrap-446 .navbar:after,.factory-bootstrap-446 .navbar:before{display:table;content:" "}.factory-bootstrap-446 .navbar:after{clear:both}@media (min-width:768px){.navbar{border-radius:4px}}.factory-bootstrap-446 .navbar-header:after,.factory-bootstrap-446 .navbar-header:before{display:table;content:" "}.factory-bootstrap-446 .navbar-header:after{clear:both}@media (min-width:768px){.navbar-header{float:left}}.factory-bootstrap-446 .navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.factory-bootstrap-446 .navbar-collapse:after,.factory-bootstrap-446 .navbar-collapse:before{display:table;content:" "}.factory-bootstrap-446 .navbar-collapse:after{clear:both}.factory-bootstrap-446 .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.factory-bootstrap-446 .container>.navbar-collapse,.factory-bootstrap-446 .container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.factory-bootstrap-446 .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.factory-bootstrap-446 .navbar-fixed-bottom,.factory-bootstrap-446 .navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.factory-bootstrap-446 .navbar-fixed-top{top:0;border-width:0 0 1px}.factory-bootstrap-446 .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.factory-bootstrap-446 .navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.factory-bootstrap-446 .navbar-brand:focus,.factory-bootstrap-446 .navbar-brand:hover{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.factory-bootstrap-446 .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.factory-bootstrap-446 .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.factory-bootstrap-446 .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.factory-bootstrap-446 .navbar-nav{margin:7.5px -15px}.factory-bootstrap-446 .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.factory-bootstrap-446 .navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{float:none;margin-left:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.factory-bootstrap-446 .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.factory-bootstrap-446 .navbar-nav.pull-right>li>.dropdown-menu,.factory-bootstrap-446 .navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.factory-bootstrap-446 .navbar-btn{margin-top:8px;margin-bottom:8px}.factory-bootstrap-446 .navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.factory-bootstrap-446 .navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.factory-bootstrap-446 .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.factory-bootstrap-446 .navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.factory-bootstrap-446 .navbar-default .navbar-brand{color:#777}.factory-bootstrap-446 .navbar-default .navbar-brand:focus,.factory-bootstrap-446 .navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.factory-bootstrap-446 .navbar-default .navbar-nav>li>a,.factory-bootstrap-446 .navbar-default .navbar-text{color:#777}.factory-bootstrap-446 .navbar-default .navbar-nav>li>a:focus,.factory-bootstrap-446 .navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.factory-bootstrap-446 .navbar-default .navbar-nav>.active>a,.factory-bootstrap-446 .navbar-default .navbar-nav>.active>a:focus,.factory-bootstrap-446 .navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.factory-bootstrap-446 .navbar-default .navbar-nav>.disabled>a,.factory-bootstrap-446 .navbar-default .navbar-nav>.disabled>a:focus,.factory-bootstrap-446 .navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.factory-bootstrap-446 .navbar-default .navbar-toggle{border-color:#ddd}.factory-bootstrap-446 .navbar-default .navbar-toggle:focus,.factory-bootstrap-446 .navbar-default .navbar-toggle:hover{background-color:#ddd}.factory-bootstrap-446 .navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.factory-bootstrap-446 .navbar-default .navbar-collapse,.factory-bootstrap-446 .navbar-default .navbar-form{border-color:#e7e7e7}.factory-bootstrap-446 .navbar-default .navbar-nav>.open>a,.factory-bootstrap-446 .navbar-default .navbar-nav>.open>a:focus,.factory-bootstrap-446 .navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.factory-bootstrap-446 .navbar-default .navbar-link{color:#777}.factory-bootstrap-446 .navbar-default .navbar-link:hover{color:#333}.factory-bootstrap-446 .navbar-inverse{background-color:#222;border-color:#080808}.factory-bootstrap-446 .navbar-inverse .navbar-brand{color:#999}.factory-bootstrap-446 .navbar-inverse .navbar-brand:focus,.factory-bootstrap-446 .navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.factory-bootstrap-446 .navbar-inverse .navbar-nav>li>a,.factory-bootstrap-446 .navbar-inverse .navbar-text{color:#999}.factory-bootstrap-446 .navbar-inverse .navbar-nav>li>a:focus,.factory-bootstrap-446 .navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.factory-bootstrap-446 .navbar-inverse .navbar-nav>.active>a,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.active>a:focus,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.factory-bootstrap-446 .navbar-inverse .navbar-nav>.disabled>a,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.disabled>a:focus,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.factory-bootstrap-446 .navbar-inverse .navbar-toggle{border-color:#333}.factory-bootstrap-446 .navbar-inverse .navbar-toggle:focus,.factory-bootstrap-446 .navbar-inverse .navbar-toggle:hover{background-color:#333}.factory-bootstrap-446 .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.factory-bootstrap-446 .navbar-inverse .navbar-collapse,.factory-bootstrap-446 .navbar-inverse .navbar-form{border-color:#101010}.factory-bootstrap-446 .navbar-inverse .navbar-nav>.open>a,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.open>a:focus,.factory-bootstrap-446 .navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.factory-bootstrap-446 .navbar-inverse .navbar-link{color:#999}.factory-bootstrap-446 .navbar-inverse .navbar-link:hover{color:#fff}.factory-bootstrap-446 .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.factory-bootstrap-446 .breadcrumb>li{display:inline-block}.factory-bootstrap-446 .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.factory-bootstrap-446 .breadcrumb>.active{color:#999}.factory-bootstrap-446 .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.factory-bootstrap-446 .pagination>li{display:inline}.factory-bootstrap-446 .pagination>li>a,.factory-bootstrap-446 .pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-446 .pagination>li:first-child>a,.factory-bootstrap-446 .pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.factory-bootstrap-446 .pagination>li:last-child>a,.factory-bootstrap-446 .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.factory-bootstrap-446 .pagination>li>a:focus,.factory-bootstrap-446 .pagination>li>a:hover,.factory-bootstrap-446 .pagination>li>span:focus,.factory-bootstrap-446 .pagination>li>span:hover{background-color:#eee}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#1e8cbe;border-color:#0074a2}.factory-bootstrap-446 .pagination>.disabled>a,.factory-bootstrap-446 .pagination>.disabled>a:focus,.factory-bootstrap-446 .pagination>.disabled>a:hover,.factory-bootstrap-446 .pagination>.disabled>span,.factory-bootstrap-446 .pagination>.disabled>span:focus,.factory-bootstrap-446 .pagination>.disabled>span:hover{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.factory-bootstrap-446 .pagination-lg>li>a,.factory-bootstrap-446 .pagination-lg>li>span{padding:10px 16px;font-size:18px}.factory-bootstrap-446 .pagination-lg>li:first-child>a,.factory-bootstrap-446 .pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.factory-bootstrap-446 .pagination-lg>li:last-child>a,.factory-bootstrap-446 .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.factory-bootstrap-446 .pagination-sm>li>a,.factory-bootstrap-446 .pagination-sm>li>span{padding:5px 10px;font-size:12px}.factory-bootstrap-446 .pagination-sm>li:first-child>a,.factory-bootstrap-446 .pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.factory-bootstrap-446 .pagination-sm>li:last-child>a,.factory-bootstrap-446 .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.factory-bootstrap-446 .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.factory-bootstrap-446 .pager:after,.factory-bootstrap-446 .pager:before{display:table;content:" "}.factory-bootstrap-446 .pager:after{clear:both}.factory-bootstrap-446 .pager li{display:inline}.factory-bootstrap-446 .pager li>a,.factory-bootstrap-446 .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.factory-bootstrap-446 .pager li>a:focus,.factory-bootstrap-446 .pager li>a:hover{text-decoration:none;background-color:#eee}.factory-bootstrap-446 .pager .next>a,.factory-bootstrap-446 .pager .next>span{float:right}.factory-bootstrap-446 .pager .previous>a,.factory-bootstrap-446 .pager .previous>span{float:left}.factory-bootstrap-446 .pager .disabled>a,.factory-bootstrap-446 .pager .disabled>a:focus,.factory-bootstrap-446 .pager .disabled>a:hover,.factory-bootstrap-446 .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.factory-bootstrap-446 .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.factory-bootstrap-446 .label[href]:focus,.factory-bootstrap-446 .label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-446 .label:empty{display:none}.factory-bootstrap-446 .btn .label{position:relative;top:-1px}.factory-bootstrap-446 .label-default{background-color:#999}.factory-bootstrap-446 .label-default[href]:focus,.factory-bootstrap-446 .label-default[href]:hover{background-color:gray}.factory-bootstrap-446 .label-primary{background-color:#428bca}.factory-bootstrap-446 .label-primary[href]:focus,.factory-bootstrap-446 .label-primary[href]:hover{background-color:#3071a9}.factory-bootstrap-446 .label-success{background-color:#5cb85c}.factory-bootstrap-446 .label-success[href]:focus,.factory-bootstrap-446 .label-success[href]:hover{background-color:#449d44}.factory-bootstrap-446 .label-info{background-color:#5bc0de}.factory-bootstrap-446 .label-info[href]:focus,.factory-bootstrap-446 .label-info[href]:hover{background-color:#31b0d5}.factory-bootstrap-446 .label-warning{background-color:#f0ad4e}.factory-bootstrap-446 .label-warning[href]:focus,.factory-bootstrap-446 .label-warning[href]:hover{background-color:#ec971f}.factory-bootstrap-446 .label-danger{background-color:#d9534f}.factory-bootstrap-446 .label-danger[href]:focus,.factory-bootstrap-446 .label-danger[href]:hover{background-color:#c9302c}.factory-bootstrap-446 .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.factory-bootstrap-446 .badge:empty{display:none}.factory-bootstrap-446 .btn .badge{position:relative;top:-1px}.factory-bootstrap-446 a.badge:focus,.factory-bootstrap-446 a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.factory-bootstrap-446 .nav-pills>.active>a>.badge,.factory-bootstrap-446 a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.factory-bootstrap-446 .nav-pills>li>a>.badge{margin-left:3px}.factory-bootstrap-446 .jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.factory-bootstrap-446 .jumbotron .h1,.factory-bootstrap-446 .jumbotron h1{line-height:1;color:inherit}.factory-bootstrap-446 .jumbotron p{line-height:1.4}.factory-bootstrap-446 .container .jumbotron{border-radius:6px}.factory-bootstrap-446 .jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.factory-bootstrap-446 .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.factory-bootstrap-446 .thumbnail a>img,.factory-bootstrap-446 .thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}.factory-bootstrap-446 a.thumbnail.active,.factory-bootstrap-446 a.thumbnail:focus,.factory-bootstrap-446 a.thumbnail:hover{border-color:#428bca}.factory-bootstrap-446 .thumbnail .caption{padding:9px;color:#333}.factory-bootstrap-446 .alert{border:1px solid transparent;border-radius:4px}.factory-bootstrap-446 .alert h4{margin-top:0;color:inherit}.factory-bootstrap-446 .alert .alert-link{font-weight:700}.factory-bootstrap-446 .alert>p,.factory-bootstrap-446 .alert>ul{margin-bottom:0}.factory-bootstrap-446 .alert>p+p{margin-top:5px}.factory-bootstrap-446 .alert-dismissable{padding-right:35px}.factory-bootstrap-446 .alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.factory-bootstrap-446 .alert-info{color:#31708f;background-color:#d9edf7}.factory-bootstrap-446 .alert-info hr{border-top-color:#a6e1ec}.factory-bootstrap-446 .alert-info .alert-link{color:#245269}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.factory-bootstrap-446 .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.factory-bootstrap-446 .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#2ea2cc;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.factory-bootstrap-446 .progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.factory-bootstrap-446 .progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.factory-bootstrap-446 .progress-bar-success{background-color:#5cb85c}.factory-bootstrap-446 .progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-446 .progress-bar-info{background-color:#5bc0de}.factory-bootstrap-446 .progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-446 .progress-bar-warning{background-color:#f0ad4e}.factory-bootstrap-446 .progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-446 .progress-bar-danger{background-color:#d9534f}.factory-bootstrap-446 .progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.factory-bootstrap-446 .media,.factory-bootstrap-446 .media-body{overflow:hidden;zoom:1}.factory-bootstrap-446 .media,.factory-bootstrap-446 .media .media{margin-top:15px}.factory-bootstrap-446 .media:first-child{margin-top:0}.factory-bootstrap-446 .media-object{display:block}.factory-bootstrap-446 .media-heading{margin:0 0 5px}.factory-bootstrap-446 .media>.pull-left{margin-right:10px}.factory-bootstrap-446 .media>.pull-right{margin-left:10px}.factory-bootstrap-446 .media-list{padding-left:0;list-style:none}.factory-bootstrap-446 .list-group{padding-left:0;margin-bottom:20px}.factory-bootstrap-446 .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.factory-bootstrap-446 .list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.factory-bootstrap-446 .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.factory-bootstrap-446 .list-group-item>.badge{float:right}.factory-bootstrap-446 .list-group-item>.badge+.badge{margin-right:5px}.factory-bootstrap-446 a.list-group-item{color:#555}.factory-bootstrap-446 a.list-group-item .list-group-item-heading{color:#333}.factory-bootstrap-446 a.list-group-item:focus,.factory-bootstrap-446 a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.factory-bootstrap-446 a.list-group-item.active,.factory-bootstrap-446 a.list-group-item.active:focus,.factory-bootstrap-446 a.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-446 a.list-group-item.active .list-group-item-heading,.factory-bootstrap-446 a.list-group-item.active:focus .list-group-item-heading,.factory-bootstrap-446 a.list-group-item.active:hover .list-group-item-heading{color:inherit}.factory-bootstrap-446 a.list-group-item.active .list-group-item-text,.factory-bootstrap-446 a.list-group-item.active:focus .list-group-item-text,.factory-bootstrap-446 a.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.factory-bootstrap-446 .list-group-item-heading{margin-top:0;margin-bottom:5px}.factory-bootstrap-446 .list-group-item-text{margin-bottom:0;line-height:1.3}.factory-bootstrap-446 .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px}.factory-bootstrap-446 .panel-body{padding:15px}.factory-bootstrap-446 .panel-body:after,.factory-bootstrap-446 .panel-body:before{display:table;content:" "}.factory-bootstrap-446 .panel-body:after{clear:both}.factory-bootstrap-446 .panel>.list-group{margin-bottom:0}.factory-bootstrap-446 .panel>.list-group .list-group-item{border-width:1px 0}.factory-bootstrap-446 .panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.factory-bootstrap-446 .panel>.list-group .list-group-item:last-child{border-bottom:0}.factory-bootstrap-446 .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.factory-bootstrap-446 .panel>.table,.factory-bootstrap-446 .panel>.table-responsive>.table{margin-bottom:0}.factory-bootstrap-446 .panel>.panel-body+.table,.factory-bootstrap-446 .panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.factory-bootstrap-446 .panel>.table>tbody:first-child td,.factory-bootstrap-446 .panel>.table>tbody:first-child th{border-top:0}.factory-bootstrap-446 .panel>.table-bordered,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered{border:0}.factory-bootstrap-446 .panel>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-446 .panel>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-446 .panel>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-446 .panel>.table-bordered>thead>tr>th:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.factory-bootstrap-446 .panel>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-446 .panel>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-446 .panel>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-446 .panel>.table-bordered>thead>tr>th:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.factory-bootstrap-446 .panel>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-446 .panel>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-446 .panel>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-446 .panel>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-446 .panel>.table-bordered>thead>tr:last-child>th,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.factory-bootstrap-446 .panel>.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}.factory-bootstrap-446 .panel>.table-responsive{margin-bottom:0;border:0}.factory-bootstrap-446 .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.factory-bootstrap-446 .panel-heading>.dropdown .dropdown-toggle{color:inherit}.factory-bootstrap-446 .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.factory-bootstrap-446 .panel-title>a{color:inherit}.factory-bootstrap-446 .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.factory-bootstrap-446 .panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.factory-bootstrap-446 .panel-group .panel+.panel{margin-top:5px}.factory-bootstrap-446 .panel-group .panel-heading{border-bottom:0}.factory-bootstrap-446 .panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.factory-bootstrap-446 .panel-group .panel-footer{border-top:0}.factory-bootstrap-446 .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.factory-bootstrap-446 .panel-default{border-color:#ddd}.factory-bootstrap-446 .panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.factory-bootstrap-446 .panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.factory-bootstrap-446 .panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.factory-bootstrap-446 .panel-primary{border-color:#428bca}.factory-bootstrap-446 .panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.factory-bootstrap-446 .panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.factory-bootstrap-446 .panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.factory-bootstrap-446 .panel-success{border-color:#d6e9c6}.factory-bootstrap-446 .panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.factory-bootstrap-446 .panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.factory-bootstrap-446 .panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.factory-bootstrap-446 .panel-warning{border-color:#faebcc}.factory-bootstrap-446 .panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.factory-bootstrap-446 .panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.factory-bootstrap-446 .panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.factory-bootstrap-446 .panel-danger{border-color:#ebccd1}.factory-bootstrap-446 .panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.factory-bootstrap-446 .panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.factory-bootstrap-446 .panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.factory-bootstrap-446 .panel-info{border-color:#bce8f1}.factory-bootstrap-446 .panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.factory-bootstrap-446 .panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.factory-bootstrap-446 .panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.factory-bootstrap-446 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px}.factory-bootstrap-446 .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.factory-bootstrap-446 .well-lg{padding:24px;border-radius:6px}.factory-bootstrap-446 .well-sm{padding:9px;border-radius:3px}.factory-bootstrap-446 .close{float:right;font-size:14px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.3;filter:alpha(opacity=30)}.factory-bootstrap-446 .alert .close{position:relative;top:-8px;right:-7px}.factory-bootstrap-446 .close:focus,.factory-bootstrap-446 .close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-446 button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.factory-bootstrap-446 .modal-open{overflow:hidden}.factory-bootstrap-446 .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll;width:auto;margin-left:0;background-color:transparent;border:0}.factory-bootstrap-446 .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.factory-bootstrap-446 .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.factory-bootstrap-446 .modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.factory-bootstrap-446 .modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box}.factory-bootstrap-446 .modal-backdrop,.factory-bootstrap-446-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.factory-bootstrap-446 .modal-backdrop.fade,.factory-bootstrap-446-modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.factory-bootstrap-446 .modal-backdrop.in,.factory-bootstrap-446-modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-446 .modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.factory-bootstrap-446 .modal-header .close{margin-top:-2px}.factory-bootstrap-446 .modal-title{margin:0;line-height:1.428571429}.factory-bootstrap-446 .modal-body{position:relative;padding:20px;max-height:none}.factory-bootstrap-446 .modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.factory-bootstrap-446 .modal-footer:after,.factory-bootstrap-446 .modal-footer:before{display:table;content:" "}.factory-bootstrap-446 .modal-footer:after{clear:both}.factory-bootstrap-446 .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.factory-bootstrap-446 .modal-footer .btn-group .btn+.btn{margin-left:-1px}.factory-bootstrap-446 .modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.factory-bootstrap-446 .modal-dialog{width:600px;margin:30px auto}.factory-bootstrap-446 .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}}.factory-bootstrap-446 .tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.factory-bootstrap-446 .tooltip.in{opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-446 .tooltip.top{padding:5px 0;margin-top:-3px}.factory-bootstrap-446 .tooltip.right{padding:0 5px;margin-left:3px}.factory-bootstrap-446 .tooltip.bottom{padding:5px 0;margin-top:3px}.factory-bootstrap-446 .tooltip.left{padding:0 5px;margin-left:-3px}.factory-bootstrap-446 .tooltip-inner{width:400px;padding:15px 20px;color:#fff;text-align:left;text-decoration:none;background-color:#673ab7;border-radius:3px}.factory-bootstrap-446 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-446 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-446 .tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-446 .tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#673ab7;border-width:5px 5px 0}.factory-bootstrap-446 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#673ab7;border-width:5px 5px 5px 0}.factory-bootstrap-446 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#673ab7;border-width:5px 0 5px 5px}.factory-bootstrap-446 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-446 .tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-446 .tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#673ab7;border-width:0 5px 5px}.factory-bootstrap-446 .popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box}.factory-bootstrap-446 .popover.top{margin-top:-10px}.factory-bootstrap-446 .popover.right{margin-left:10px}.factory-bootstrap-446 .popover.bottom{margin-top:10px}.factory-bootstrap-446 .popover.left{margin-left:-10px}.factory-bootstrap-446 .popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.factory-bootstrap-446 .popover-content{padding:9px 14px}.factory-bootstrap-446 .popover .arrow,.factory-bootstrap-446 .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.factory-bootstrap-446 .popover .arrow{border-width:11px}.factory-bootstrap-446 .popover .arrow:after{border-width:10px;content:""}.factory-bootstrap-446 .popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.factory-bootstrap-446 .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.factory-bootstrap-446 .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.factory-bootstrap-446 .popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.factory-bootstrap-446 .popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.factory-bootstrap-446 .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.factory-bootstrap-446 .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.factory-bootstrap-446 .popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.factory-bootstrap-446 .carousel{position:relative}.factory-bootstrap-446 .carousel-inner{position:relative;width:100%;overflow:hidden}.factory-bootstrap-446 .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.factory-bootstrap-446 .carousel-inner>.item>a>img,.factory-bootstrap-446 .carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.factory-bootstrap-446 .carousel-inner>.active,.factory-bootstrap-446 .carousel-inner>.next,.factory-bootstrap-446 .carousel-inner>.prev{display:block}.factory-bootstrap-446 .carousel-inner>.active{left:0}.factory-bootstrap-446 .carousel-inner>.next,.factory-bootstrap-446 .carousel-inner>.prev{position:absolute;top:0;width:100%}.factory-bootstrap-446 .carousel-inner>.next{left:100%}.factory-bootstrap-446 .carousel-inner>.prev{left:-100%}.factory-bootstrap-446 .carousel-inner>.next.left,.factory-bootstrap-446 .carousel-inner>.prev.right{left:0}.factory-bootstrap-446 .carousel-inner>.active.left{left:-100%}.factory-bootstrap-446 .carousel-inner>.active.right{left:100%}.factory-bootstrap-446 .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5;filter:alpha(opacity=50)}.factory-bootstrap-446 .carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.factory-bootstrap-446 .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.factory-bootstrap-446 .carousel-control:focus,.factory-bootstrap-446 .carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.factory-bootstrap-446 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-446 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-446 .carousel-control .icon-next,.factory-bootstrap-446 .carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.factory-bootstrap-446 .carousel-control .glyphicon-chevron-left,.factory-bootstrap-446 .carousel-control .icon-prev{left:50%}.factory-bootstrap-446 .carousel-control .glyphicon-chevron-right,.factory-bootstrap-446 .carousel-control .icon-next{right:50%}.factory-bootstrap-446 .carousel-control .icon-next,.factory-bootstrap-446 .carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.factory-bootstrap-446 .carousel-control .icon-prev:before{content:'\2039'}.factory-bootstrap-446 .carousel-control .icon-next:before{content:'\203a'}.factory-bootstrap-446 .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.factory-bootstrap-446 .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.factory-bootstrap-446 .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.factory-bootstrap-446 .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.factory-bootstrap-446 .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.factory-bootstrap-446 .clearfix:after,.factory-bootstrap-446 .clearfix:before{display:table;content:" "}.factory-bootstrap-446 .clearfix:after{clear:both}.factory-bootstrap-446 .center-block{display:block;margin-right:auto;margin-left:auto}.factory-bootstrap-446 .pull-right{float:right!important}.factory-bootstrap-446 .pull-left{float:left!important}.factory-bootstrap-446 .hide{display:none!important}.factory-bootstrap-446 .show{display:block!important}.factory-bootstrap-446 .invisible{visibility:hidden}.factory-bootstrap-446 .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.factory-bootstrap-446 .hidden{display:none!important;visibility:hidden!important}.factory-bootstrap-446 .affix{position:fixed}@-ms-viewport{width:device-width}.factory-bootstrap-446 .visible-lg,.factory-bootstrap-446 .visible-md,.factory-bootstrap-446 .visible-sm,.factory-bootstrap-446 .visible-xs,.factory-bootstrap-446 td.visible-lg,.factory-bootstrap-446 td.visible-md,.factory-bootstrap-446 td.visible-sm,.factory-bootstrap-446 td.visible-xs,.factory-bootstrap-446 th.visible-lg,.factory-bootstrap-446 th.visible-md,.factory-bootstrap-446 th.visible-sm,.factory-bootstrap-446 th.visible-xs,.factory-bootstrap-446 tr.visible-lg,.factory-bootstrap-446 tr.visible-md,.factory-bootstrap-446 tr.visible-sm,.factory-bootstrap-446 tr.visible-xs{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}td.visible-xs.visible-sm,th.visible-xs.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}td.visible-xs.visible-md,th.visible-xs.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}td.visible-xs.visible-lg,th.visible-xs.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}td.visible-sm.visible-xs,th.visible-sm.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}td.visible-sm.visible-md,th.visible-sm.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}td.visible-sm.visible-lg,th.visible-sm.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}td.visible-md.visible-xs,th.visible-md.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}td.visible-md.visible-sm,th.visible-md.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}td.visible-md.visible-lg,th.visible-md.visible-lg{display:table-cell!important}}@media (max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}td.visible-lg.visible-xs,th.visible-lg.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}td.visible-lg.visible-sm,th.visible-lg.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}td.visible-lg.visible-md,th.visible-lg.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}.factory-bootstrap-446 .hidden-xs{display:block!important}.factory-bootstrap-446 table.hidden-xs{display:table}.factory-bootstrap-446 tr.hidden-xs{display:table-row!important}.factory-bootstrap-446 td.hidden-xs,.factory-bootstrap-446 th.hidden-xs{display:table-cell!important}@media (max-width:767px){.hidden-xs,td.hidden-xs,th.hidden-xs,tr.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,td.hidden-xs.hidden-md,th.hidden-xs.hidden-md,tr.hidden-xs.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg{display:none!important}}.factory-bootstrap-446 .hidden-sm{display:block!important}.factory-bootstrap-446 table.hidden-sm{display:table}.factory-bootstrap-446 tr.hidden-sm{display:table-row!important}.factory-bootstrap-446 td.hidden-sm,.factory-bootstrap-446 th.hidden-sm{display:table-cell!important}@media (max-width:767px){.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,td.hidden-sm,th.hidden-sm,tr.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,td.hidden-sm.hidden-md,th.hidden-sm.hidden-md,tr.hidden-sm.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg{display:none!important}}.factory-bootstrap-446 .hidden-md{display:block!important}.factory-bootstrap-446 table.hidden-md{display:table}.factory-bootstrap-446 tr.hidden-md{display:table-row!important}.factory-bootstrap-446 td.hidden-md,.factory-bootstrap-446 th.hidden-md{display:table-cell!important}@media (max-width:767px){.hidden-md.hidden-xs,td.hidden-md.hidden-xs,th.hidden-md.hidden-xs,tr.hidden-md.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,td.hidden-md.hidden-sm,th.hidden-md.hidden-sm,tr.hidden-md.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,td.hidden-md,th.hidden-md,tr.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-md.hidden-lg,td.hidden-md.hidden-lg,th.hidden-md.hidden-lg,tr.hidden-md.hidden-lg{display:none!important}}.factory-bootstrap-446 .hidden-lg{display:block!important}.factory-bootstrap-446 table.hidden-lg{display:table}.factory-bootstrap-446 tr.hidden-lg{display:table-row!important}.factory-bootstrap-446 td.hidden-lg,.factory-bootstrap-446 th.hidden-lg{display:table-cell!important}@media (max-width:767px){.factory-bootstrap-446 .hidden-lg.hidden-xs,.factory-bootstrap-446 td.hidden-lg.hidden-xs,.factory-bootstrap-446 th.hidden-lg.hidden-xs,.factory-bootstrap-446 tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.factory-bootstrap-446 .hidden-lg.hidden-sm,.factory-bootstrap-446 td.hidden-lg.hidden-sm,.factory-bootstrap-446 th.hidden-lg.hidden-sm,.factory-bootstrap-446 tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.factory-bootstrap-446 .hidden-lg.hidden-md,.factory-bootstrap-446 td.hidden-lg.hidden-md,.factory-bootstrap-446 th.hidden-lg.hidden-md,.factory-bootstrap-446 tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.factory-bootstrap-446 .hidden-lg,.factory-bootstrap-446 td.hidden-lg,.factory-bootstrap-446 th.hidden-lg,.factory-bootstrap-446 tr.hidden-lg{display:none!important}}.factory-bootstrap-446 .visible-print,.factory-bootstrap-446 td.visible-print,.factory-bootstrap-446 th.visible-print,.factory-bootstrap-446 tr.visible-print{display:none!important}@media print{.factory-bootstrap-446 .visible-print{display:block!important}.factory-bootstrap-446 table.visible-print{display:table}.factory-bootstrap-446 tr.visible-print{display:table-row!important}.factory-bootstrap-446 td.visible-print,.factory-bootstrap-446 th.visible-print{display:table-cell!important}.factory-bootstrap-446 .hidden-print,.factory-bootstrap-446 td.hidden-print,.factory-bootstrap-446 th.hidden-print,.factory-bootstrap-446 tr.hidden-print{display:none!important}}/*!
|
12 |
+
* Factory Default Bootstrap Theme
|
13 |
+
*
|
14 |
+
* The code is based on Bootstrap v2.1.1
|
15 |
+
*
|
16 |
+
* Bootstrap v3.0.3 (http://getbootstrap.com)
|
17 |
+
* Copyright 2013 Twitter, Inc.
|
18 |
+
* Licensed under http://www.apache.org/licenses/LICENSE-2.0
|
19 |
+
*
|
20 |
+
* @author Paul Kashtanoff <paul@byonepress.com>
|
21 |
+
* @copyright (c) 2013, OnePress Ltd
|
22 |
+
*
|
23 |
+
* @package factory-bootstrap
|
24 |
+
* @since 1.0.0
|
25 |
+
*/.factory-bootstrap-446 .btn-danger,.factory-bootstrap-446 .btn-default,.factory-bootstrap-446 .btn-info,.factory-bootstrap-446 .btn-primary,.factory-bootstrap-446 .btn-success,.factory-bootstrap-446 .btn-warning{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.factory-bootstrap-446 .btn-danger.active,.factory-bootstrap-446 .btn-danger:active,.factory-bootstrap-446 .btn-default.active,.factory-bootstrap-446 .btn-default:active,.factory-bootstrap-446 .btn-info.active,.factory-bootstrap-446 .btn-info:active,.factory-bootstrap-446 .btn-primary.active,.factory-bootstrap-446 .btn-primary:active,.factory-bootstrap-446 .btn-success.active,.factory-bootstrap-446 .btn-success:active,.factory-bootstrap-446 .btn-warning.active,.factory-bootstrap-446 .btn-warning:active{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.factory-bootstrap-446 .btn.active,.factory-bootstrap-446 .btn:active{background-image:none}.factory-bootstrap-446 .btn-default{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);vertical-align:top}.factory-bootstrap-446 .btn-default.active,.factory-bootstrap-446 .btn-default:active{background-color:#fff;border-color:#dbdbdb}.factory-bootstrap-446 .btn-gold{font-weight:700;padding:7px 12px;cursor:pointer;line-height:16px;display:inline-block;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;box-shadow:#e3e3e3 0 1px 1px;-moz-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);-webkit-box-shadow:0 1px 1px rgba(000,000,000,.1),inset 0 1px 1px rgba(255,255,255,.7);text-shadow:1px 1px 0 #ffe8b2;color:#7c5d1b;border:1px solid #d6a437;background:#feeb80}.factory-bootstrap-446 .btn-gold:focus,.factory-bootstrap-446 .btn-gold:hover{background:#fef0a1}.factory-bootstrap-446 .btn-gold.active,.factory-bootstrap-446 .btn-gold:active{background:#fef0a1;-webkit-box-shadow:inset 0 3px 8px 0 #f8ba36;box-shadow:inset 0 3px 8px 0 #f8ba36}.factory-bootstrap-446 .btn-primary{background:#2ea2cc;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);color:#fff;text-decoration:none}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#1e8cbe;border-color:#0074a2;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.6);box-shadow:inset 0 1px 0 rgba(120,200,230,.6);color:#fff}.factory-bootstrap-446 .btn-primary.active,.factory-bootstrap-446 .btn-primary:active{background-color:#2d6ca2;border-color:#2b669a}.factory-bootstrap-446 .btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-446 .btn-success:focus,.factory-bootstrap-446 .btn-success:hover{background-color:#419641;background-position:0 -15px}.factory-bootstrap-446 .btn-success.active,.factory-bootstrap-446 .btn-success:active{background-color:#419641;border-color:#3e8f3e}.factory-bootstrap-446 .btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-446 .btn-warning:focus,.factory-bootstrap-446 .btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.factory-bootstrap-446 .btn-warning.active,.factory-bootstrap-446 .btn-warning:active{background-color:#eb9316;border-color:#e38d13}.factory-bootstrap-446 .btn-danger{color:#fff;background:#d9534f;border-color:#d43f3a}.factory-bootstrap-446 .btn-danger.active,.factory-bootstrap-446 .btn-danger:active,.factory-bootstrap-446 .btn-danger:focus,.factory-bootstrap-446 .btn-danger:hover,.factory-bootstrap-446 .open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.factory-bootstrap-446 .btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-446 .btn-info:focus,.factory-bootstrap-446 .btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.factory-bootstrap-446 .btn-info.active,.factory-bootstrap-446 .btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.factory-bootstrap-446 .img-thumbnail,.factory-bootstrap-446 .thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-446 .dropdown-menu>li>a:focus,.factory-bootstrap-446 .dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-446 .dropdown-menu>.active>a,.factory-bootstrap-446 .dropdown-menu>.active>a:focus,.factory-bootstrap-446 .dropdown-menu>.active>a:hover{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-446 .navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.factory-bootstrap-446 .navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.factory-bootstrap-446 .navbar-brand,.factory-bootstrap-446 .navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.factory-bootstrap-446 .navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.factory-bootstrap-446 .navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.factory-bootstrap-446 .navbar-inverse .navbar-brand,.factory-bootstrap-446 .navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.factory-bootstrap-446 .navbar-fixed-bottom,.factory-bootstrap-446 .navbar-fixed-top,.factory-bootstrap-446 .navbar-static-top{border-radius:0}.factory-bootstrap-446 .alert{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-446 .alert .actions{padding-top:10px}.factory-bootstrap-446 .alert-success{color:#3c763d;background-color:#dff0d8;border-bottom:2px solid #c8e5bc}.factory-bootstrap-446 .alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0)}.factory-bootstrap-446 .alert{text-shadow:none;box-shadow:none;margin:0;margin-top:10px;margin-bottom:10px;padding:10px}.factory-bootstrap-446 .alert-normal,.factory-bootstrap-446 .alert-warning{background:#fcf8e3;color:#8a6d3b;border:1px solid #b8823b}.factory-bootstrap-446 .alert-danger{background:#cf4944;color:#fff;border-bottom:2px solid #b23e3a}.factory-bootstrap-446 .alert-danger a:not(.btn),.factory-bootstrap-446 .alert-error a:not(.btn){color:#fff}.factory-bootstrap-446 .progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.factory-bootstrap-446 .progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0)}.factory-bootstrap-446 .progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.factory-bootstrap-446 .progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.factory-bootstrap-446 .progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.factory-bootstrap-446 .progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.factory-bootstrap-446 .list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.factory-bootstrap-446 .list-group-item.active,.factory-bootstrap-446 .list-group-item.active:focus,.factory-bootstrap-446 .list-group-item.active:hover{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0)}.factory-bootstrap-446 .panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.factory-bootstrap-446 .panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.factory-bootstrap-446 .panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.factory-bootstrap-446 .panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.factory-bootstrap-446 .panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.factory-bootstrap-446 .panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.factory-bootstrap-446 .panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.factory-bootstrap-446 .well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}.factory-bootstrap-446 .factory-after{margin-left:7px;display:inline-block}.factory-bootstrap-446 .factory-hidden{display:none}.factory-bootstrap-446 .factory-ajax-loader{width:25px;height:25px;background:url(../assets/images/loader-sm-tr.gif)}.factory-control-error{background-color:rgba(0,0,0,.8);white-space:normal;z-index:10;font-weight:400;line-height:150%;border-radius:4px;color:#fff;font-size:13px;margin-top:5px;padding:4px 10px 3px;max-width:500px;display:inline-block}.factory-control-error i{margin:0 7px 0 1px}
|
libs/factory/bootstrap/assets/css-min/bootstrap.datepicker.min.css
CHANGED
@@ -1,17 +1,17 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
/*!
|
12 |
-
* Datepicker for Bootstrap v1.5.0-dev (https://github.com/eternicode/bootstrap-datepicker)
|
13 |
-
*
|
14 |
-
* Copyright 2012 Stefan Petre
|
15 |
-
* Improvements by Andrew Rowls
|
16 |
-
* Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
|
17 |
*/.datepicker{border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-top:0;border-bottom-color:rgba(0,0,0,.2);position:absolute}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-top:before{top:-7px}.datepicker-dropdown.datepicker-orient-top:after{top:-6px}.datepicker-dropdown.datepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker>div{display:none}.datepicker.days .datepicker-days,.datepicker.months .datepicker-months,.datepicker.years .datepicker-years{display:block}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker table tr td,.datepicker table tr th{text-align:center;width:30px;height:30px;border-radius:4px;border:0}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{background:#eee;cursor:pointer}.datepicker table tr td.new,.datepicker table tr td.old{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{color:#000;background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.disabled:hover:focus,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:focus,.datepicker table tr td.today:hover,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today:hover:focus,.datepicker table tr td.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{color:#000;background-color:#ffcd70;border-color:#f59e00}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{background-image:none}.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled.disabled.active,.datepicker table tr td.today.disabled.disabled:active,.datepicker table tr td.today.disabled.disabled:focus,.datepicker table tr td.today.disabled.disabled:hover,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today.disabled:hover.disabled.active,.datepicker table tr td.today.disabled:hover.disabled:active,.datepicker table tr td.today.disabled:hover.disabled:focus,.datepicker table tr td.today.disabled:hover.disabled:hover,.datepicker table tr td.today.disabled:hover[disabled],.datepicker table tr td.today.disabled:hover[disabled].active,.datepicker table tr td.today.disabled:hover[disabled]:active,.datepicker table tr td.today.disabled:hover[disabled]:focus,.datepicker table tr td.today.disabled:hover[disabled]:hover,.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled[disabled].active,.datepicker table tr td.today.disabled[disabled]:active,.datepicker table tr td.today.disabled[disabled]:focus,.datepicker table tr td.today.disabled[disabled]:hover,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today:hover.disabled.active,.datepicker table tr td.today:hover.disabled:active,.datepicker table tr td.today:hover.disabled:focus,.datepicker table tr td.today:hover.disabled:hover,.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today:hover[disabled].active,.datepicker table tr td.today:hover[disabled]:active,.datepicker table tr td.today:hover[disabled]:focus,.datepicker table tr td.today:hover[disabled]:hover,.datepicker table tr td.today[disabled],.datepicker table tr td.today[disabled].active,.datepicker table tr td.today[disabled]:active,.datepicker table tr td.today[disabled]:focus,.datepicker table tr td.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.today,fieldset[disabled] .datepicker table tr td.today.active,fieldset[disabled] .datepicker table tr td.today.disabled,fieldset[disabled] .datepicker table tr td.today.disabled.active,fieldset[disabled] .datepicker table tr td.today.disabled:active,fieldset[disabled] .datepicker table tr td.today.disabled:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover,fieldset[disabled] .datepicker table tr td.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.today:active,fieldset[disabled] .datepicker table tr td.today:focus,fieldset[disabled] .datepicker table tr td.today:hover,fieldset[disabled] .datepicker table tr td.today:hover.active,fieldset[disabled] .datepicker table tr td.today:hover:active,fieldset[disabled] .datepicker table tr td.today:hover:focus,fieldset[disabled] .datepicker table tr td.today:hover:hover{background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{background:#eee;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today:hover{color:#000;background-color:#f7ca77;border-color:#f1a417;border-radius:0}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.disabled:hover:focus,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:focus,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today:hover:focus,.datepicker table tr td.range.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover{color:#000;background-color:#f4bb51;border-color:#bf800c}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover{background-image:none}.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled.disabled.active,.datepicker table tr td.range.today.disabled.disabled:active,.datepicker table tr td.range.today.disabled.disabled:focus,.datepicker table tr td.range.today.disabled.disabled:hover,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today.disabled:hover.disabled.active,.datepicker table tr td.range.today.disabled:hover.disabled:active,.datepicker table tr td.range.today.disabled:hover.disabled:focus,.datepicker table tr td.range.today.disabled:hover.disabled:hover,.datepicker table tr td.range.today.disabled:hover[disabled],.datepicker table tr td.range.today.disabled:hover[disabled].active,.datepicker table tr td.range.today.disabled:hover[disabled]:active,.datepicker table tr td.range.today.disabled:hover[disabled]:focus,.datepicker table tr td.range.today.disabled:hover[disabled]:hover,.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled[disabled].active,.datepicker table tr td.range.today.disabled[disabled]:active,.datepicker table tr td.range.today.disabled[disabled]:focus,.datepicker table tr td.range.today.disabled[disabled]:hover,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today:hover.disabled.active,.datepicker table tr td.range.today:hover.disabled:active,.datepicker table tr td.range.today:hover.disabled:focus,.datepicker table tr td.range.today:hover.disabled:hover,.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today:hover[disabled].active,.datepicker table tr td.range.today:hover[disabled]:active,.datepicker table tr td.range.today:hover[disabled]:focus,.datepicker table tr td.range.today:hover[disabled]:hover,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today[disabled].active,.datepicker table tr td.range.today[disabled]:active,.datepicker table tr td.range.today[disabled]:focus,.datepicker table tr td.range.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.today,fieldset[disabled] .datepicker table tr td.range.today.active,fieldset[disabled] .datepicker table tr td.range.today.disabled,fieldset[disabled] .datepicker table tr td.range.today.disabled.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.range.today:active,fieldset[disabled] .datepicker table tr td.range.today:focus,fieldset[disabled] .datepicker table tr td.range.today:hover,fieldset[disabled] .datepicker table tr td.range.today:hover.active,fieldset[disabled] .datepicker table tr td.range.today:hover:active,fieldset[disabled] .datepicker table tr td.range.today:hover:focus,fieldset[disabled] .datepicker table tr td.range.today:hover:hover{background-color:#f7ca77;border-color:#f1a417}.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover{color:#fff;background-color:#999;border-color:#555;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.disabled:hover:focus,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:focus,.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected:hover:focus,.datepicker table tr td.selected:hover:hover,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{color:#fff;background-color:#858585;border-color:#373737}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{background-image:none}.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled.disabled.active,.datepicker table tr td.selected.disabled.disabled:active,.datepicker table tr td.selected.disabled.disabled:focus,.datepicker table tr td.selected.disabled.disabled:hover,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected.disabled:hover.disabled.active,.datepicker table tr td.selected.disabled:hover.disabled:active,.datepicker table tr td.selected.disabled:hover.disabled:focus,.datepicker table tr td.selected.disabled:hover.disabled:hover,.datepicker table tr td.selected.disabled:hover[disabled],.datepicker table tr td.selected.disabled:hover[disabled].active,.datepicker table tr td.selected.disabled:hover[disabled]:active,.datepicker table tr td.selected.disabled:hover[disabled]:focus,.datepicker table tr td.selected.disabled:hover[disabled]:hover,.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled[disabled].active,.datepicker table tr td.selected.disabled[disabled]:active,.datepicker table tr td.selected.disabled[disabled]:focus,.datepicker table tr td.selected.disabled[disabled]:hover,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected:hover.disabled.active,.datepicker table tr td.selected:hover.disabled:active,.datepicker table tr td.selected:hover.disabled:focus,.datepicker table tr td.selected:hover.disabled:hover,.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected:hover[disabled].active,.datepicker table tr td.selected:hover[disabled]:active,.datepicker table tr td.selected:hover[disabled]:focus,.datepicker table tr td.selected:hover[disabled]:hover,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected[disabled].active,.datepicker table tr td.selected[disabled]:active,.datepicker table tr td.selected[disabled]:focus,.datepicker table tr td.selected[disabled]:hover,fieldset[disabled] .datepicker table tr td.selected,fieldset[disabled] .datepicker table tr td.selected.active,fieldset[disabled] .datepicker table tr td.selected.disabled,fieldset[disabled] .datepicker table tr td.selected.disabled.active,fieldset[disabled] .datepicker table tr td.selected.disabled:active,fieldset[disabled] .datepicker table tr td.selected.disabled:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover,fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.selected:active,fieldset[disabled] .datepicker table tr td.selected:focus,fieldset[disabled] .datepicker table tr td.selected:hover,fieldset[disabled] .datepicker table tr td.selected:hover.active,fieldset[disabled] .datepicker table tr td.selected:hover:active,fieldset[disabled] .datepicker table tr td.selected:hover:focus,fieldset[disabled] .datepicker table tr td.selected:hover:hover{background-color:#999;border-color:#555}.datepicker table tr td.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.disabled:hover:focus,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:focus,.datepicker table tr td.active:hover,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active:hover:focus,.datepicker table tr td.active:hover:hover,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover{color:#fff;background-color:#3276b1;border-color:#285e8e}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active:active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover{background-image:none}.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled.disabled.active,.datepicker table tr td.active.disabled.disabled:active,.datepicker table tr td.active.disabled.disabled:focus,.datepicker table tr td.active.disabled.disabled:hover,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active.disabled:hover.disabled.active,.datepicker table tr td.active.disabled:hover.disabled:active,.datepicker table tr td.active.disabled:hover.disabled:focus,.datepicker table tr td.active.disabled:hover.disabled:hover,.datepicker table tr td.active.disabled:hover[disabled],.datepicker table tr td.active.disabled:hover[disabled].active,.datepicker table tr td.active.disabled:hover[disabled]:active,.datepicker table tr td.active.disabled:hover[disabled]:focus,.datepicker table tr td.active.disabled:hover[disabled]:hover,.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled[disabled].active,.datepicker table tr td.active.disabled[disabled]:active,.datepicker table tr td.active.disabled[disabled]:focus,.datepicker table tr td.active.disabled[disabled]:hover,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active:hover.disabled.active,.datepicker table tr td.active:hover.disabled:active,.datepicker table tr td.active:hover.disabled:focus,.datepicker table tr td.active:hover.disabled:hover,.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active:hover[disabled].active,.datepicker table tr td.active:hover[disabled]:active,.datepicker table tr td.active:hover[disabled]:focus,.datepicker table tr td.active:hover[disabled]:hover,.datepicker table tr td.active[disabled],.datepicker table tr td.active[disabled].active,.datepicker table tr td.active[disabled]:active,.datepicker table tr td.active[disabled]:focus,.datepicker table tr td.active[disabled]:hover,fieldset[disabled] .datepicker table tr td.active,fieldset[disabled] .datepicker table tr td.active.active,fieldset[disabled] .datepicker table tr td.active.disabled,fieldset[disabled] .datepicker table tr td.active.disabled.active,fieldset[disabled] .datepicker table tr td.active.disabled:active,fieldset[disabled] .datepicker table tr td.active.disabled:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover,fieldset[disabled] .datepicker table tr td.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.active:active,fieldset[disabled] .datepicker table tr td.active:focus,fieldset[disabled] .datepicker table tr td.active:hover,fieldset[disabled] .datepicker table tr td.active:hover.active,fieldset[disabled] .datepicker table tr td.active:hover:active,fieldset[disabled] .datepicker table tr td.active:hover:focus,fieldset[disabled] .datepicker table tr td.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:focus,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:focus,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:focus,.datepicker table tr td span.active:hover:hover,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{color:#fff;background-color:#3276b1;border-color:#285e8e}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{background-image:none}.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled.disabled.active,.datepicker table tr td span.active.disabled.disabled:active,.datepicker table tr td span.active.disabled.disabled:focus,.datepicker table tr td span.active.disabled.disabled:hover,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active.disabled:hover.disabled.active,.datepicker table tr td span.active.disabled:hover.disabled:active,.datepicker table tr td span.active.disabled:hover.disabled:focus,.datepicker table tr td span.active.disabled:hover.disabled:hover,.datepicker table tr td span.active.disabled:hover[disabled],.datepicker table tr td span.active.disabled:hover[disabled].active,.datepicker table tr td span.active.disabled:hover[disabled]:active,.datepicker table tr td span.active.disabled:hover[disabled]:focus,.datepicker table tr td span.active.disabled:hover[disabled]:hover,.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled[disabled].active,.datepicker table tr td span.active.disabled[disabled]:active,.datepicker table tr td span.active.disabled[disabled]:focus,.datepicker table tr td span.active.disabled[disabled]:hover,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active:hover.disabled.active,.datepicker table tr td span.active:hover.disabled:active,.datepicker table tr td span.active:hover.disabled:focus,.datepicker table tr td span.active:hover.disabled:hover,.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active:hover[disabled].active,.datepicker table tr td span.active:hover[disabled]:active,.datepicker table tr td span.active:hover[disabled]:focus,.datepicker table tr td span.active:hover[disabled]:hover,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active[disabled].active,.datepicker table tr td span.active[disabled]:active,.datepicker table tr td span.active[disabled]:focus,.datepicker table tr td span.active[disabled]:hover,fieldset[disabled] .datepicker table tr td span.active,fieldset[disabled] .datepicker table tr td span.active.active,fieldset[disabled] .datepicker table tr td span.active.disabled,fieldset[disabled] .datepicker table tr td span.active.disabled.active,fieldset[disabled] .datepicker table tr td span.active.disabled:active,fieldset[disabled] .datepicker table tr td span.active.disabled:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover,fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td span.active:active,fieldset[disabled] .datepicker table tr td span.active:focus,fieldset[disabled] .datepicker table tr td span.active:hover,fieldset[disabled] .datepicker table tr td span.active:hover.active,fieldset[disabled] .datepicker table tr td span.active:hover:active,fieldset[disabled] .datepicker table tr td span.active:hover:focus,fieldset[disabled] .datepicker table tr td span.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker tfoot tr th,.datepicker thead tr:first-child th{cursor:pointer}.datepicker tfoot tr th:hover,.datepicker thead tr:first-child th:hover{background:#eee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child .cw{cursor:default;background-color:transparent}.input-group.date .input-group-addon{cursor:pointer}.input-daterange{width:100%}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .input-group-addon{width:auto;min-width:16px;padding:4px 5px;font-weight:400;line-height:1.42857143;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:solid #ccc;border-width:1px 0;margin-left:-5px;margin-right:-5px}.datepicker.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;color:#333;font-size:13px;line-height:1.42857143}.datepicker.datepicker-inline td,.datepicker.datepicker-inline th,.datepicker.dropdown-menu td,.datepicker.dropdown-menu th{padding:0 5px}
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
/*!
|
12 |
+
* Datepicker for Bootstrap v1.5.0-dev (https://github.com/eternicode/bootstrap-datepicker)
|
13 |
+
*
|
14 |
+
* Copyright 2012 Stefan Petre
|
15 |
+
* Improvements by Andrew Rowls
|
16 |
+
* Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
|
17 |
*/.datepicker{border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-top:0;border-bottom-color:rgba(0,0,0,.2);position:absolute}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-top:before{top:-7px}.datepicker-dropdown.datepicker-orient-top:after{top:-6px}.datepicker-dropdown.datepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker>div{display:none}.datepicker.days .datepicker-days,.datepicker.months .datepicker-months,.datepicker.years .datepicker-years{display:block}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker table tr td,.datepicker table tr th{text-align:center;width:30px;height:30px;border-radius:4px;border:0}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{background:#eee;cursor:pointer}.datepicker table tr td.new,.datepicker table tr td.old{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{color:#000;background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.disabled:hover:focus,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:focus,.datepicker table tr td.today:hover,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today:hover:focus,.datepicker table tr td.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{color:#000;background-color:#ffcd70;border-color:#f59e00}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{background-image:none}.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled.disabled.active,.datepicker table tr td.today.disabled.disabled:active,.datepicker table tr td.today.disabled.disabled:focus,.datepicker table tr td.today.disabled.disabled:hover,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today.disabled:hover.disabled.active,.datepicker table tr td.today.disabled:hover.disabled:active,.datepicker table tr td.today.disabled:hover.disabled:focus,.datepicker table tr td.today.disabled:hover.disabled:hover,.datepicker table tr td.today.disabled:hover[disabled],.datepicker table tr td.today.disabled:hover[disabled].active,.datepicker table tr td.today.disabled:hover[disabled]:active,.datepicker table tr td.today.disabled:hover[disabled]:focus,.datepicker table tr td.today.disabled:hover[disabled]:hover,.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled[disabled].active,.datepicker table tr td.today.disabled[disabled]:active,.datepicker table tr td.today.disabled[disabled]:focus,.datepicker table tr td.today.disabled[disabled]:hover,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today:hover.disabled.active,.datepicker table tr td.today:hover.disabled:active,.datepicker table tr td.today:hover.disabled:focus,.datepicker table tr td.today:hover.disabled:hover,.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today:hover[disabled].active,.datepicker table tr td.today:hover[disabled]:active,.datepicker table tr td.today:hover[disabled]:focus,.datepicker table tr td.today:hover[disabled]:hover,.datepicker table tr td.today[disabled],.datepicker table tr td.today[disabled].active,.datepicker table tr td.today[disabled]:active,.datepicker table tr td.today[disabled]:focus,.datepicker table tr td.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.today,fieldset[disabled] .datepicker table tr td.today.active,fieldset[disabled] .datepicker table tr td.today.disabled,fieldset[disabled] .datepicker table tr td.today.disabled.active,fieldset[disabled] .datepicker table tr td.today.disabled:active,fieldset[disabled] .datepicker table tr td.today.disabled:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover,fieldset[disabled] .datepicker table tr td.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.today:active,fieldset[disabled] .datepicker table tr td.today:focus,fieldset[disabled] .datepicker table tr td.today:hover,fieldset[disabled] .datepicker table tr td.today:hover.active,fieldset[disabled] .datepicker table tr td.today:hover:active,fieldset[disabled] .datepicker table tr td.today:hover:focus,fieldset[disabled] .datepicker table tr td.today:hover:hover{background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{background:#eee;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today:hover{color:#000;background-color:#f7ca77;border-color:#f1a417;border-radius:0}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.disabled:hover:focus,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:focus,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today:hover:focus,.datepicker table tr td.range.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover{color:#000;background-color:#f4bb51;border-color:#bf800c}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover{background-image:none}.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled.disabled.active,.datepicker table tr td.range.today.disabled.disabled:active,.datepicker table tr td.range.today.disabled.disabled:focus,.datepicker table tr td.range.today.disabled.disabled:hover,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today.disabled:hover.disabled.active,.datepicker table tr td.range.today.disabled:hover.disabled:active,.datepicker table tr td.range.today.disabled:hover.disabled:focus,.datepicker table tr td.range.today.disabled:hover.disabled:hover,.datepicker table tr td.range.today.disabled:hover[disabled],.datepicker table tr td.range.today.disabled:hover[disabled].active,.datepicker table tr td.range.today.disabled:hover[disabled]:active,.datepicker table tr td.range.today.disabled:hover[disabled]:focus,.datepicker table tr td.range.today.disabled:hover[disabled]:hover,.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled[disabled].active,.datepicker table tr td.range.today.disabled[disabled]:active,.datepicker table tr td.range.today.disabled[disabled]:focus,.datepicker table tr td.range.today.disabled[disabled]:hover,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today:hover.disabled.active,.datepicker table tr td.range.today:hover.disabled:active,.datepicker table tr td.range.today:hover.disabled:focus,.datepicker table tr td.range.today:hover.disabled:hover,.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today:hover[disabled].active,.datepicker table tr td.range.today:hover[disabled]:active,.datepicker table tr td.range.today:hover[disabled]:focus,.datepicker table tr td.range.today:hover[disabled]:hover,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today[disabled].active,.datepicker table tr td.range.today[disabled]:active,.datepicker table tr td.range.today[disabled]:focus,.datepicker table tr td.range.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.today,fieldset[disabled] .datepicker table tr td.range.today.active,fieldset[disabled] .datepicker table tr td.range.today.disabled,fieldset[disabled] .datepicker table tr td.range.today.disabled.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.range.today:active,fieldset[disabled] .datepicker table tr td.range.today:focus,fieldset[disabled] .datepicker table tr td.range.today:hover,fieldset[disabled] .datepicker table tr td.range.today:hover.active,fieldset[disabled] .datepicker table tr td.range.today:hover:active,fieldset[disabled] .datepicker table tr td.range.today:hover:focus,fieldset[disabled] .datepicker table tr td.range.today:hover:hover{background-color:#f7ca77;border-color:#f1a417}.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover{color:#fff;background-color:#999;border-color:#555;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.disabled:hover:focus,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:focus,.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected:hover:focus,.datepicker table tr td.selected:hover:hover,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{color:#fff;background-color:#858585;border-color:#373737}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{background-image:none}.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled.disabled.active,.datepicker table tr td.selected.disabled.disabled:active,.datepicker table tr td.selected.disabled.disabled:focus,.datepicker table tr td.selected.disabled.disabled:hover,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected.disabled:hover.disabled.active,.datepicker table tr td.selected.disabled:hover.disabled:active,.datepicker table tr td.selected.disabled:hover.disabled:focus,.datepicker table tr td.selected.disabled:hover.disabled:hover,.datepicker table tr td.selected.disabled:hover[disabled],.datepicker table tr td.selected.disabled:hover[disabled].active,.datepicker table tr td.selected.disabled:hover[disabled]:active,.datepicker table tr td.selected.disabled:hover[disabled]:focus,.datepicker table tr td.selected.disabled:hover[disabled]:hover,.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled[disabled].active,.datepicker table tr td.selected.disabled[disabled]:active,.datepicker table tr td.selected.disabled[disabled]:focus,.datepicker table tr td.selected.disabled[disabled]:hover,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected:hover.disabled.active,.datepicker table tr td.selected:hover.disabled:active,.datepicker table tr td.selected:hover.disabled:focus,.datepicker table tr td.selected:hover.disabled:hover,.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected:hover[disabled].active,.datepicker table tr td.selected:hover[disabled]:active,.datepicker table tr td.selected:hover[disabled]:focus,.datepicker table tr td.selected:hover[disabled]:hover,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected[disabled].active,.datepicker table tr td.selected[disabled]:active,.datepicker table tr td.selected[disabled]:focus,.datepicker table tr td.selected[disabled]:hover,fieldset[disabled] .datepicker table tr td.selected,fieldset[disabled] .datepicker table tr td.selected.active,fieldset[disabled] .datepicker table tr td.selected.disabled,fieldset[disabled] .datepicker table tr td.selected.disabled.active,fieldset[disabled] .datepicker table tr td.selected.disabled:active,fieldset[disabled] .datepicker table tr td.selected.disabled:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover,fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.selected:active,fieldset[disabled] .datepicker table tr td.selected:focus,fieldset[disabled] .datepicker table tr td.selected:hover,fieldset[disabled] .datepicker table tr td.selected:hover.active,fieldset[disabled] .datepicker table tr td.selected:hover:active,fieldset[disabled] .datepicker table tr td.selected:hover:focus,fieldset[disabled] .datepicker table tr td.selected:hover:hover{background-color:#999;border-color:#555}.datepicker table tr td.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.disabled:hover:focus,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:focus,.datepicker table tr td.active:hover,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active:hover:focus,.datepicker table tr td.active:hover:hover,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover{color:#fff;background-color:#3276b1;border-color:#285e8e}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active:active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover{background-image:none}.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled.disabled.active,.datepicker table tr td.active.disabled.disabled:active,.datepicker table tr td.active.disabled.disabled:focus,.datepicker table tr td.active.disabled.disabled:hover,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active.disabled:hover.disabled.active,.datepicker table tr td.active.disabled:hover.disabled:active,.datepicker table tr td.active.disabled:hover.disabled:focus,.datepicker table tr td.active.disabled:hover.disabled:hover,.datepicker table tr td.active.disabled:hover[disabled],.datepicker table tr td.active.disabled:hover[disabled].active,.datepicker table tr td.active.disabled:hover[disabled]:active,.datepicker table tr td.active.disabled:hover[disabled]:focus,.datepicker table tr td.active.disabled:hover[disabled]:hover,.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled[disabled].active,.datepicker table tr td.active.disabled[disabled]:active,.datepicker table tr td.active.disabled[disabled]:focus,.datepicker table tr td.active.disabled[disabled]:hover,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active:hover.disabled.active,.datepicker table tr td.active:hover.disabled:active,.datepicker table tr td.active:hover.disabled:focus,.datepicker table tr td.active:hover.disabled:hover,.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active:hover[disabled].active,.datepicker table tr td.active:hover[disabled]:active,.datepicker table tr td.active:hover[disabled]:focus,.datepicker table tr td.active:hover[disabled]:hover,.datepicker table tr td.active[disabled],.datepicker table tr td.active[disabled].active,.datepicker table tr td.active[disabled]:active,.datepicker table tr td.active[disabled]:focus,.datepicker table tr td.active[disabled]:hover,fieldset[disabled] .datepicker table tr td.active,fieldset[disabled] .datepicker table tr td.active.active,fieldset[disabled] .datepicker table tr td.active.disabled,fieldset[disabled] .datepicker table tr td.active.disabled.active,fieldset[disabled] .datepicker table tr td.active.disabled:active,fieldset[disabled] .datepicker table tr td.active.disabled:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover,fieldset[disabled] .datepicker table tr td.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.active:active,fieldset[disabled] .datepicker table tr td.active:focus,fieldset[disabled] .datepicker table tr td.active:hover,fieldset[disabled] .datepicker table tr td.active:hover.active,fieldset[disabled] .datepicker table tr td.active:hover:active,fieldset[disabled] .datepicker table tr td.active:hover:focus,fieldset[disabled] .datepicker table tr td.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:focus,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:focus,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:focus,.datepicker table tr td span.active:hover:hover,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{color:#fff;background-color:#3276b1;border-color:#285e8e}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{background-image:none}.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled.disabled.active,.datepicker table tr td span.active.disabled.disabled:active,.datepicker table tr td span.active.disabled.disabled:focus,.datepicker table tr td span.active.disabled.disabled:hover,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active.disabled:hover.disabled.active,.datepicker table tr td span.active.disabled:hover.disabled:active,.datepicker table tr td span.active.disabled:hover.disabled:focus,.datepicker table tr td span.active.disabled:hover.disabled:hover,.datepicker table tr td span.active.disabled:hover[disabled],.datepicker table tr td span.active.disabled:hover[disabled].active,.datepicker table tr td span.active.disabled:hover[disabled]:active,.datepicker table tr td span.active.disabled:hover[disabled]:focus,.datepicker table tr td span.active.disabled:hover[disabled]:hover,.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled[disabled].active,.datepicker table tr td span.active.disabled[disabled]:active,.datepicker table tr td span.active.disabled[disabled]:focus,.datepicker table tr td span.active.disabled[disabled]:hover,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active:hover.disabled.active,.datepicker table tr td span.active:hover.disabled:active,.datepicker table tr td span.active:hover.disabled:focus,.datepicker table tr td span.active:hover.disabled:hover,.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active:hover[disabled].active,.datepicker table tr td span.active:hover[disabled]:active,.datepicker table tr td span.active:hover[disabled]:focus,.datepicker table tr td span.active:hover[disabled]:hover,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active[disabled].active,.datepicker table tr td span.active[disabled]:active,.datepicker table tr td span.active[disabled]:focus,.datepicker table tr td span.active[disabled]:hover,fieldset[disabled] .datepicker table tr td span.active,fieldset[disabled] .datepicker table tr td span.active.active,fieldset[disabled] .datepicker table tr td span.active.disabled,fieldset[disabled] .datepicker table tr td span.active.disabled.active,fieldset[disabled] .datepicker table tr td span.active.disabled:active,fieldset[disabled] .datepicker table tr td span.active.disabled:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover,fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td span.active:active,fieldset[disabled] .datepicker table tr td span.active:focus,fieldset[disabled] .datepicker table tr td span.active:hover,fieldset[disabled] .datepicker table tr td span.active:hover.active,fieldset[disabled] .datepicker table tr td span.active:hover:active,fieldset[disabled] .datepicker table tr td span.active:hover:focus,fieldset[disabled] .datepicker table tr td span.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker tfoot tr th,.datepicker thead tr:first-child th{cursor:pointer}.datepicker tfoot tr th:hover,.datepicker thead tr:first-child th:hover{background:#eee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child .cw{cursor:default;background-color:transparent}.input-group.date .input-group-addon{cursor:pointer}.input-daterange{width:100%}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .input-group-addon{width:auto;min-width:16px;padding:4px 5px;font-weight:400;line-height:1.42857143;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:solid #ccc;border-width:1px 0;margin-left:-5px;margin-right:-5px}.datepicker.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;color:#333;font-size:13px;line-height:1.42857143}.datepicker.datepicker-inline td,.datepicker.datepicker-inline th,.datepicker.dropdown-menu td,.datepicker.dropdown-menu th{padding:0 5px}
|
libs/factory/bootstrap/assets/css-min/bootstrap.ectoplasm.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .btn-primary{background:#a3b745;border-color:#839237;color:#fff;-webkit-box-shadow:inset 0 1px 0 #c0cd7b,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #c0cd7b,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#89993a;border-color:#727f30;color:#fff;-webkit-box-shadow:inset 0 1px 0 #b7c669,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #b7c669,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#89993a;border-color:#727f30;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#cfd1c7!important;background:#89993a!important;border-color:#727f30!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#a3b745;border-color:#839237}
|
libs/factory/bootstrap/assets/css-min/bootstrap.form-group.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .factory-form-group .factory-legend{padding:9px 12px;background-color:#f9f9f9}.factory-bootstrap-446 .factory-form-group .factory-title{font-weight:700;font-size:14px;line-height:14px;color:#555;margin:0}.factory-bootstrap-446 .factory-form-group .factory-hint-icon{display:block;width:16px;height:16px;line-height:13px;padding:0;font-size:11px;text-align:center;position:absolute;top:-5px;right:-3px;color:#fff;background:#E91E63;border-radius:3px}.factory-bootstrap-446 .factory-form-group .factory-hint-icon.factory-hint-icon-green{background:#8bc34a}.factory-bootstrap-446 .factory-form-group .factory-hint-icon.factory-hint-icon-grey{background:#9e9e9e}.factory-bootstrap-446 .factory-form-group .factory-hint-icon.factory-hint-icon-red{background:#E91E63}.factory-bootstrap-446 .factory-form-group .factory-hint{margin:0;font-size:12px;line-height:16px;margin-top:6px}.factory-bootstrap-446 .factory-form-group+.factory-form-group{margin-top:30px}.factory-bootstrap-446 .factory-form-group legend+.control-group{margin-top:0}
|
libs/factory/bootstrap/assets/css-min/bootstrap.light.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .btn-primary{background:#04a4cc;border-color:#037c9a;color:#fff;-webkit-box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #22cffb,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#0384a4;border-color:#036881;color:#fff;-webkit-box-shadow:inset 0 1px 0 #09cafa,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #09cafa,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#0384a4;border-color:#036881;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#c7cfd1!important;background:#0384a4!important;border-color:#036881!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#04a4cc;border-color:#037c9a}
|
libs/factory/bootstrap/assets/css-min/bootstrap.midnight.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .btn-primary{background:#e14d43;border-color:#d02a21;color:#fff;-webkit-box-shadow:inset 0 1px 0 #ec8a85,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #ec8a85,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#d92c23;border-color:#ba251e;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8756f,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8756f,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#d92c23;border-color:#ba251e;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#d1c7c7!important;background:#d92c23!important;border-color:#ba251e!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#e14d43;border-color:#d02a21}
|
libs/factory/bootstrap/assets/css-min/bootstrap.ocean.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .btn-primary{background:#9ebaa0;border-color:#80a583;color:#fff;-webkit-box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #cbdacc,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#86a988;border-color:#719a74;color:#fff;-webkit-box-shadow:inset 0 1px 0 #bccfbd,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #bccfbd,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#86a988;border-color:#719a74;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#c7d1c8!important;background:#86a988!important;border-color:#719a74!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#9ebaa0;border-color:#80a583}
|
libs/factory/bootstrap/assets/css-min/bootstrap.separator.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .factory-separator{border-bottom:1px solid #f9f9f9;border-top:1px solid #d1d1d1;margin-bottom:25px}
|
libs/factory/bootstrap/assets/css-min/bootstrap.sunrise.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .btn-primary{background:#dd823b;border-color:#c36822;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e8ab7c,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e8ab7c,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:focus,.factory-bootstrap-446 .btn-primary:hover{background:#cc6c23;border-color:#ad5c1e;color:#fff;-webkit-box-shadow:inset 0 1px 0 #e59d66,0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 #e59d66,0 1px 0 rgba(0,0,0,.15)}.factory-bootstrap-446 .btn-primary:active{background:#cc6c23;border-color:#ad5c1e;color:#fff;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5)}.factory-bootstrap-446 .btn-primary:disabled,.factory-bootstrap-446 .btn-primary[disabled]{color:#d1cbc7!important;background:#cc6c23!important;border-color:#ad5c1e!important;text-shadow:none!important}.factory-bootstrap-446 .btn-group .btn.active.value{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}.factory-bootstrap-446 .pagination>.active>a,.factory-bootstrap-446 .pagination>.active>a:focus,.factory-bootstrap-446 .pagination>.active>a:hover,.factory-bootstrap-446 .pagination>.active>span,.factory-bootstrap-446 .pagination>.active>span:focus,.factory-bootstrap-446 .pagination>.active>span:hover{background-color:#dd823b;border-color:#c36822}
|
libs/factory/bootstrap/assets/css-min/control.checkbox.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
#side-sortables .factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
#side-sortables .factory-bootstrap-446 .factory-buttons-way{float:right;position:relative;top:-25px;left:5px;border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-446 .factory-checkbox-disabled button,.factory-bootstrap-446 .factory-checkbox-disabled input{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.factory-bootstrap-446 .factory-buttons-way{border:3px solid #f9f9f9;border-radius:4px}.factory-bootstrap-446 .factory-buttons-way button{padding-left:10px;padding-right:10px}.factory-bootstrap-446 .factory-buttons-way .factory-on.active{text-shadow:none;color:#fff;background-color:#33aad5;-webkit-box-shadow:inset 0 1px 1px #0074a2;box-shadow:inset 0 1px 3px #0074a2;border-top:1px solid #0074a2;border-bottom:1px solid #0074a2;border-left:1px solid #0074a2}.factory-bootstrap-446 .factory-checkbox-tumbler-hint{margin-top:5px}.factory-bootstrap-446 .factory-checkbox-tumbler-hint .factory-tumbler-content{display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.admin-color-blue .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.admin-color-coffee .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.admin-color-ectoplasm .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.admin-color-midnight .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.admin-color-ocean .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.admin-color-sunrise .factory-bootstrap-446 .factory-buttons-way .factory-on.active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}
|
libs/factory/bootstrap/assets/css-min/control.dropdown.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .factory-dropdown.factory-buttons-way .fa{margin-right:6px;position:relative}.factory-bootstrap-446 .factory-dropdown.factory-buttons-way{border:0;border-radius:0}.factory-bootstrap-446 .factory-hints .factory-hint{margin-top:5px;display:inline-block;background-color:#ffd;padding:1px 5px}.admin-color-light .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#04a4cc;-webkit-box-shadow:inset 0 1px 2px #037c9a;box-shadow:inset 0 1px 2px #037c9a;border-top:1px solid #037c9a;border-bottom:1px solid #037c9a;border-left:1px solid #037c9a}.admin-color-blue .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#e1a948;-webkit-box-shadow:inset 0 1px 2px #d39323;box-shadow:inset 0 1px 2px #d39323;border-top:1px solid #d39323;border-bottom:1px solid #d39323;border-left:1px solid #d39323}.admin-color-coffee .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#c7a589;-webkit-box-shadow:inset 0 1px 2px #b78a66;box-shadow:inset 0 1px 2px #b78a66;border-top:1px solid #b78a66;border-bottom:1px solid #b78a66;border-left:1px solid #b78a66}.admin-color-ectoplasm .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#a3b745;-webkit-box-shadow:inset 0 1px 2px #839237;box-shadow:inset 0 1px 2px #839237;border-top:1px solid #839237;border-bottom:1px solid #839237;border-left:1px solid #839237}.admin-color-midnight .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#e14d43;-webkit-box-shadow:inset 0 1px 2px #d02a21;box-shadow:inset 0 1px 2px #d02a21;border-top:1px solid #d02a21;border-bottom:1px solid #d02a21;border-left:1px solid #d02a21}.admin-color-ocean .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#9ebaa0;-webkit-box-shadow:inset 0 1px 2px #80a583;box-shadow:inset 0 1px 2px #80a583;border-top:1px solid #80a583;border-bottom:1px solid #80a583;border-left:1px solid #80a583}.admin-color-sunrise .factory-bootstrap-446 .factory-dropdown.factory-buttons-way .active{background-color:#dd823b;-webkit-box-shadow:inset 0 1px 2px #c36822;box-shadow:inset 0 1px 2px #c36822;border-top:1px solid #c36822;border-bottom:1px solid #c36822;border-left:1px solid #c36822}.factory-bootstrap-446 .factory-dropdown.factory-ddslick-way .dd-select{background-color:#fff!important}.factory-bootstrap-446 .factory-dropdown.factory-ddslick-way label{margin-bottom:1px}.factory-bootstrap-446 .factory-dropdown.factory-ddslick-way .dd-option,.factory-bootstrap-446 .factory-dropdown.factory-ddslick-way .dd-selected{padding:8px 12px 8px 11px!important}
|
libs/factory/bootstrap/assets/css-min/control.multiple-textbox.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .factory-mtextbox-item{position:relative;margin-bottom:5px}.factory-bootstrap-446 .factory-mtextbox-item input,.factory-mtextbox-remove-item{display:inline-block}.factory-bootstrap-446 .factory-mtextbox-item .factory-mtextbox-remove-item{position:absolute;top:0;right:0;bottom:0;width:40px;border-radius:0 3px 3px 0;outline:0}.factory-bootstrap-446 .factory-mtextbox-item .factory-mtextbox-remove-item:focus,.factory-bootstrap-446 .factory-mtextbox-item .factory-mtextbox-remove-item:hover{box-shadow:none;outline:0}.factory-bootstrap-446 .factory-mtextbox-add-item{display:block;margin-top:10px}
|
libs/factory/bootstrap/assets/css-min/holder.more-link.min.css
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
.factory-bootstrap-
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
.factory-bootstrap-446 .factory-more-link-content{border-top:1px dashed #DDD;padding-top:25px;width:100%;padding-right:20px;position:relative}.factory-bootstrap-446 .factory-tab .factory-more-link-show{display:inline-block;text-decoration:none;border-bottom:1px dotted #21759b;position:relative}.factory-bootstrap-446 .factory-tab .factory-more-link-show:hover{border-color:#d54e21}.factory-bootstrap-446 .factory-tab .factory-more-link-hide{position:absolute;margin-top:-35px;background-color:#fff;padding:0 5px;right:20px;color:#bbb;text-decoration:none}.factory-bootstrap-446 .factory-tab .factory-more-link-hide:hover{color:#999}
|
libs/factory/bootstrap/assets/js-min/bootstrap.dropdown.min.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=factory-dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}},a.fn.
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=factory-dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}},a.fn.factoryBootstrap446_dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.factoryBootstrap446_dropdown.Constructor=f,a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(jQuery);
|
libs/factory/bootstrap/assets/js-min/bootstrap.tooltip.min.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this},a(function(){a('[data-toggle="factory-tooltip"]').tooltip({html:!0})})}(jQuery);
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this},a(function(){a('[data-toggle="factory-tooltip"]').tooltip({html:!0})})}(jQuery);
|
libs/factory/bootstrap/assets/js-min/control.checkbox.min.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
!function(a){var b=function(b){var c=this;this.$element=a(b),this.$result=this.$element.find(".factory-result"),this.$on=this.$element.find(".factory-on"),this.$off=this.$element.find(".factory-off");var d=this.$element.is(".factory-tumbler"),e=this.$element.is(".factory-has-tumbler-hint"),f=this.$element.data("tumbler-function"),g=this.$element.data("tumbler-delay");g||(g=3e3),this.callByPath=function(a,b){for(var c=a.split("."),d=window,e=0;e<c.length;e++)d=d[c[e]];d.apply(d,b)},this.$on.click(function(){return c.$off.removeClass("active"),c.$on.addClass("active"),d?setTimeout(function(){c.$on.removeClass("active"),c.$off.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
!function(a){var b=function(b){var c=this;this.$element=a(b),this.$result=this.$element.find(".factory-result"),this.$on=this.$element.find(".factory-on"),this.$off=this.$element.find(".factory-off");var d=this.$element.is(".factory-tumbler"),e=this.$element.is(".factory-has-tumbler-hint"),f=this.$element.data("tumbler-function"),g=this.$element.data("tumbler-delay");g||(g=3e3),this.callByPath=function(a,b){for(var c=a.split("."),d=window,e=0;e<c.length;e++)d=d[c[e]];d.apply(d,b)},this.$on.click(function(){return c.$off.removeClass("active"),c.$on.addClass("active"),d?setTimeout(function(){c.$on.removeClass("active"),c.$off.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.prop("checked",!0),c.$result.val(1),c.$result.trigger("change")),!1}),this.$off.click(function(){return c.$on.removeClass("active"),c.$off.addClass("active"),d?setTimeout(function(){c.$off.removeClass("active"),c.$on.addClass("active");var a=e?c.$element.next():null;f?c.callByPath(f,[c.$element,a]):e&&(c.$element.next().fadeIn(300),setTimeout(function(){c.$element.next().fadeOut(500)},g))},300):(c.$result.prop("checked",!1),c.$result.val(0),c.$result.trigger("change")),!1}),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){(void 0!==window.__factory_checkbox_control_events_off_data||void 0!==window.__factory_checkbox_control_events_on_data)&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.prop("checked"),f=window.__factory_checkbox_control_events_on_data[d],g=window.__factory_checkbox_control_events_off_data[d];if(f||g){var h,i;void 0===window.__factory_checkbox_control_detach_elements&&(window.__factory_checkbox_control_detach_elements={}),h=window.__factory_checkbox_control_detach_elements,i=e?f:g;for(var j in i)if(i.hasOwnProperty(j)){var k,l=i[j];a.isArray(l)||(k=c.hashCode(d+l));var m;switch(j){case"hide":"string"==typeof l&&a(l).hide(0);break;case"show":"string"==typeof l&&a(l).fadeIn(200);break;case"detach":"string"==typeof l&&a(l).each(function(b){h[k]||(h[k]={}),h[k][b]||(h[k][b]={}),h[k][b].recovery_contanier=a(this).parent(),h[k][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(h[k]){for(var n in h[k])h[k].hasOwnProperty(n)&&h[k][n].recovery_contanier&&h[k][n].element&&h[k][n].recovery_contanier.append(h[k][n].element);delete h[k]}break;case"removeClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).removeClass(l[m]);break;case"addClasses":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&l[m]&&a(m).addClass(l[m]);break;case"setValue":if("object"==typeof l)for(m in l)l.hasOwnProperty(m)&&void 0!==l[m]&&null!==l[m]&&a(m).val(l[m])}}}},this.executeEvents(this.$result)};a.fn.factoryBootstrap446_checkboxControl=function(c){if("string"==typeof c){var d=a(this).data("factory.checkbox.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.checkbox.control");d||c.data("factory.checkbox.control",d=new b(this))})},a.fn.factoryBootstrap446_checkboxControl.Constructor=b,a(function(){a(".factory-bootstrap-446 .factory-checkbox.factory-buttons-way").factoryBootstrap446_checkboxControl(),a(".factory-bootstrap-446 .factory-checkbox").not(".factory-buttons-way").click(function(){a(this).prop("checked")?a(this).val(1):a(this).val(0)})})}(jQuery);
|
libs/factory/bootstrap/assets/js-min/control.dropdown.min.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
!function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name")||this.$element.attr("name"),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){void 0!==window.factory_dropdown_control_events_data&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.val(),f=window.factory_dropdown_control_events_data[d];if(f&&f[e]){var g;void 0===window.__factory_dropdown_control_detach_elements&&(window.__factory_dropdown_control_detach_elements={}),g=window.__factory_dropdown_control_detach_elements;for(var h in f[e])if(f[e].hasOwnProperty(h)){var i,j=f[e][h];switch(a.isArray(j)||(i=c.hashCode(d+j)),h){case"hide":"string"==typeof j&&a(j).hide(0);break;case"show":"string"==typeof j&&a(j).fadeIn(200);break;case"detach":"string"==typeof j&&a(j).each(function(b){g[i]||(g[i]={}),g[i][b]||(g[i][b]={}),g[i][b].recovery_contanier=a(this).parent(),g[i][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(g[i]){for(var k in g[i])g[i].hasOwnProperty(k)&&g[i][k].recovery_contanier&&g[i][k].element&&g[i][k].recovery_contanier.append(g[i][k].element);delete g[i]}break;case"removeClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).removeClass(j[l]);break;case"addClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).addClass(j[l])}}}},"buttons"===this.way)this.$result=this.$element.find(".factory-result"),this.$hints=this.$element.find(".factory-hints"),this.$buttons=this.$element.find(".btn"),c.executeEvents(this.$result),this.$buttons.click(function(){var b=a(this).data("value");return c.$buttons.removeClass("active"),a(this).addClass("active"),c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+b).fadeIn(),c.$result.val(b),c.$result.trigger("change"),!1});else if("ddslick"===this.way){c.executeEvents(c.$element.find(".factory-result"));var d=window["factory_"+this.name+"_data"],e=this.$element.find(".factory-ddslick"),f=this.$element.data("width")||300,g=this.$element.data("align")||"right";a(d).each(function(){return this.imageHoverSrc?void(a("<img/>")[0].src=this.imageHoverSrc):!0}),e.ddslick({data:d,width:f,imagePosition:g,selectText:"- select -",onSelected:function(a){a.selectedData.imageHoverSrc&&c.$element.find(".dd-selected-image").attr("src",a.selectedData.imageHoverSrc);var b=c.$element.find(".factory-result").val(a.selectedData.value);b.change()}})}else{c.executeEvents(this.$element),this.$hints=this.$element.next(),this.$hints.hasClass("factory-hints")&&(this.$element.change(function(){return c.updateHints(),!1}),this.updateHints=function(){var a=c.$element.val();c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+a).show()},c.updateHints()),this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(a){console&&console.log&&console.log(a.responseText),c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length)for(var d in a){var e=a[d];c.addListItem(e)}else this.$element.append("<option>"+b.emptyList+"</li>");this.$element.trigger("factory-loaded")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<option />").attr("value",b.value).text(b.title).appendTo(this.$element),e=c.getAjaxData();e.selected&&e.selected==b.value&&d.attr("selected","selected")},this.showError=function(b){this.clearList();var d=a("<div class='factory-control-error'></div>").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),e=c.getAjaxData();this.$element.append("<option>"+e.emptyList+"</li>"),this.$element.after(d),this.$element.addClass("factory-has-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var h=this.$element.data("ajax");h&&this.loadData()}};a.fn.
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
!function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name")||this.$element.attr("name"),this.hashCode=function(a){var b=0;if(!a||0===a.length)return b;for(var c=0;c<a.length;c++){var d=a.charCodeAt(c);b=(b<<5)-b+d,b&=b}return b=b.toString(16),b=b.replace("-","")},this.executeEvents=function(a){void 0!==window.factory_dropdown_control_events_data&&(a.change(function(){c.eventsProcess(a)}),c.eventsProcess(a))},this.eventsProcess=function(b){var d=b.attr("name"),e=b.val(),f=window.factory_dropdown_control_events_data[d];if(f&&f[e]){var g;void 0===window.__factory_dropdown_control_detach_elements&&(window.__factory_dropdown_control_detach_elements={}),g=window.__factory_dropdown_control_detach_elements;for(var h in f[e])if(f[e].hasOwnProperty(h)){var i,j=f[e][h];switch(a.isArray(j)||(i=c.hashCode(d+j)),h){case"hide":"string"==typeof j&&a(j).hide(0);break;case"show":"string"==typeof j&&a(j).fadeIn(200);break;case"detach":"string"==typeof j&&a(j).each(function(b){g[i]||(g[i]={}),g[i][b]||(g[i][b]={}),g[i][b].recovery_contanier=a(this).parent(),g[i][b].element=a(this).clone(!0),a(this).remove()});break;case"recovery":if(g[i]){for(var k in g[i])g[i].hasOwnProperty(k)&&g[i][k].recovery_contanier&&g[i][k].element&&g[i][k].recovery_contanier.append(g[i][k].element);delete g[i]}break;case"removeClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).removeClass(j[l]);break;case"addClasses":if("object"==typeof j)for(var l in j)j.hasOwnProperty(l)&&j[l]&&a(l).addClass(j[l])}}}},"buttons"===this.way)this.$result=this.$element.find(".factory-result"),this.$hints=this.$element.find(".factory-hints"),this.$buttons=this.$element.find(".btn"),c.executeEvents(this.$result),this.$buttons.click(function(){var b=a(this).data("value");return c.$buttons.removeClass("active"),a(this).addClass("active"),c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+b).fadeIn(),c.$result.val(b),c.$result.trigger("change"),!1});else if("ddslick"===this.way){c.executeEvents(c.$element.find(".factory-result"));var d=window["factory_"+this.name+"_data"],e=this.$element.find(".factory-ddslick"),f=this.$element.data("width")||300,g=this.$element.data("align")||"right";a(d).each(function(){return this.imageHoverSrc?void(a("<img/>")[0].src=this.imageHoverSrc):!0}),e.ddslick({data:d,width:f,imagePosition:g,selectText:"- select -",onSelected:function(a){a.selectedData.imageHoverSrc&&c.$element.find(".dd-selected-image").attr("src",a.selectedData.imageHoverSrc);var b=c.$element.find(".factory-result").val(a.selectedData.value);b.change()}})}else{c.executeEvents(this.$element),this.$hints=this.$element.next(),this.$hints.hasClass("factory-hints")&&(this.$element.change(function(){return c.updateHints(),!1}),this.updateHints=function(){var a=c.$element.val();c.$hints.find(".factory-hint").hide(),c.$hints.find(".factory-hint-"+a).show()},c.updateHints()),this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(a){console&&console.log&&console.log(a.responseText),c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length)for(var d in a){var e=a[d];c.addListItem(e)}else this.$element.append("<option>"+b.emptyList+"</li>");this.$element.trigger("factory-loaded")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<option />").attr("value",b.value).text(b.title).appendTo(this.$element),e=c.getAjaxData();e.selected&&e.selected==b.value&&d.attr("selected","selected")},this.showError=function(b){this.clearList();var d=a("<div class='factory-control-error'></div>").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),e=c.getAjaxData();this.$element.append("<option>"+e.emptyList+"</li>"),this.$element.after(d),this.$element.addClass("factory-has-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var h=this.$element.data("ajax");h&&this.loadData()}};a.fn.factoryBootstrap446_dropdownControl=function(c){if("string"==typeof c){var d=a(this).data("factory.dropdown.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.dropdown.control");d||c.data("factory.dropdown.control",d=new b(this))})},a.fn.factoryBootstrap446_dropdownControl.Constructor=b,a(function(){a(".factory-bootstrap-446 .factory-dropdown").factoryBootstrap446_dropdownControl()})}(jQuery);
|
libs/factory/bootstrap/assets/js-min/control.list.min.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
!function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name"),"checklist"===this.way){this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(){c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length){this.$element.removeClass("factory-empty");for(var d in a){var e=a[d];c.addListItem(e)}}else this.$element.addClass("factory-empty"),this.$element.append("<li>"+b.emptyList+"</li>")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<li>"),e=a("<label>").attr("for","factory-checklist-"+c.name+"-"+b.value).appendTo(d),f=a("<span>").appendTo(e),g=a("<input />").attr("type","checkbox").attr("name",c.name+"[]").val(b.value).attr("id","factory-checklist-"+c.name+"-"+b.value).appendTo(f),h=(a("<span>"+b.title+"</span>").appendTo(e),c.getAjaxData());h.selected.length&&a.inArray(b.value,h.selected)>=0&&g.attr("checked","checked"),this.$element.append(d)},this.showError=function(b){this.$element.html("").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),this.$element.addClass("factory-list-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var d=this.$element.data("ajax");d&&this.loadData()}};a.fn.
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
!function(a){var b=function(b){var c=this;if(this.$element=a(b),this.way=this.$element.data("way"),this.name=this.$element.data("name"),"checklist"===this.way){this.getAjaxData=function(){var a=c.$element.data("ajax-data-id");return window[a]},this.loadData=function(){var b=c.getAjaxData();a.ajax({url:b.url,data:b.data,dataType:"json",success:function(a){return a.error?c.showError(a.error):void c.fill(a.items)},error:function(){c.showError("Unexpected error occurred during the ajax request.")},complete:function(){c.removeLoader()}})},this.fill=function(a){this.clearList();var b=c.getAjaxData();if(a&&a.length){this.$element.removeClass("factory-empty");for(var d in a){var e=a[d];c.addListItem(e)}}else this.$element.addClass("factory-empty"),this.$element.append("<li>"+b.emptyList+"</li>")},this.clearList=function(){this.$element.html("")},this.addListItem=function(b){var d=a("<li>"),e=a("<label>").attr("for","factory-checklist-"+c.name+"-"+b.value).appendTo(d),f=a("<span>").appendTo(e),g=a("<input />").attr("type","checkbox").attr("name",c.name+"[]").val(b.value).attr("id","factory-checklist-"+c.name+"-"+b.value).appendTo(f),h=(a("<span>"+b.title+"</span>").appendTo(e),c.getAjaxData());h.selected.length&&a.inArray(b.value,h.selected)>=0&&g.attr("checked","checked"),this.$element.append(d)},this.showError=function(b){this.$element.html("").append(a("<i class='fa fa-exclamation-triangle'></i>")).append(b),this.$element.addClass("factory-list-error")},this.removeLoader=function(){this.$element.removeClass("factory-hidden");var b=c.getAjaxData();a(b.loader).remove()};var d=this.$element.data("ajax");d&&this.loadData()}};a.fn.factoryBootstrap446_listControl=function(c){if("string"==typeof c){var d=a(this).data("factory.list.control");return d?d[c]():null}return this.each(function(){var c=a(this),d=c.data("factory.list.control");d||c.data("factory.list.control",d=new b(this))})},a.fn.factoryBootstrap446_listControl.Constructor=b,a(function(){a(".factory-bootstrap-446 .factory-list").factoryBootstrap446_listControl()})}(jQuery);
|
libs/factory/bootstrap/assets/js-min/control.multiple-textbox.min.js
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
/*!
|
2 |
-
* Bootstrap generator - v1.0.1,
|
3 |
-
* Webcraftic factory build
|
4 |
-
*
|
5 |
-
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
-
* Site: http://webcraftic.com
|
7 |
-
* Support: http://webcraftic.com/contact-us/
|
8 |
-
*/
|
9 |
-
|
10 |
-
!function(a){"use strict";var b=function(b){this.$element=a(b);var c=a(".factory-mtextbox-item",this.$element).eq(0).clone(!0);a(".factory-mtextbox-add-item",this.$element).on("click",function(){var b=a(this).closest(".factory-multiple-textbox-group").find(".factory-mtextbox-items"),d=c.clone(!0),e=a('<button class="btn btn-default btn-small factory-mtextbox-remove-item"><i class="fa fa-times" aria-hidden="true"></i></button>');return b.append(d.append(e)),d.find('input[type="text"]').val("").focus(),!1}),a(document).on("click",".factory-mtextbox-remove-item",function(){return a(this).closest(".factory-mtextbox-item").remove(),!1})};a.fn.
|
1 |
+
/*!
|
2 |
+
* Bootstrap generator - v1.0.1, 2021-02-04
|
3 |
+
* Webcraftic factory build
|
4 |
+
*
|
5 |
+
* Copyright 2018, Alex Kovalev <alex.kovalevv@gmail.com>, Webcraftic <wordpress.webraftic@gmail.com>
|
6 |
+
* Site: http://webcraftic.com
|
7 |
+
* Support: http://webcraftic.com/contact-us/
|
8 |
+
*/
|
9 |
+
|
10 |
+
!function(a){"use strict";var b=function(b){this.$element=a(b);var c=a(".factory-mtextbox-item",this.$element).eq(0).clone(!0);a(".factory-mtextbox-add-item",this.$element).on("click",function(){var b=a(this).closest(".factory-multiple-textbox-group").find(".factory-mtextbox-items"),d=c.clone(!0),e=a('<button class="btn btn-default btn-small factory-mtextbox-remove-item"><i class="fa fa-times" aria-hidden="true"></i></button>');return b.append(d.append(e)),d.find('input[type="text"]').val("").focus(),!1}),a(document).on("click",".factory-mtextbox-remove-item",function(){return a(this).closest(".factory-mtextbox-item").remove(),!1})};a.fn.factoryBootstrap446_MultipleTextboxControl=function(){return this.each(function(){new b(this)})},a(function(){a(".factory-bootstrap-446 .factory-multiple-textbox-group").factoryBootstrap446_MultipleTextboxControl()})}(jQuery);
|
libs/factory/bootstrap/boot.php
CHANGED
@@ -1,46 +1,46 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Factory Bootstrap
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>
|
6 |
-
* @since 1.0.0
|
7 |
-
* @package factory-bootstrap
|
8 |
-
* @copyright (c) 2018, Webcraftic Ltd
|
9 |
-
*
|
10 |
-
*/
|
11 |
-
|
12 |
-
// Exit if accessed directly
|
13 |
-
if
|
14 |
-
exit;
|
15 |
-
}
|
16 |
-
|
17 |
-
// module provides function only for the admin area
|
18 |
-
if
|
19 |
-
return;
|
20 |
-
}
|
21 |
-
|
22 |
-
if
|
23 |
-
return;
|
24 |
-
}
|
25 |
-
|
26 |
-
define(
|
27 |
-
define(
|
28 |
-
|
29 |
-
if
|
30 |
-
define(
|
31 |
-
}
|
32 |
-
|
33 |
-
define(
|
34 |
-
define(
|
35 |
-
|
36 |
-
require_once(
|
37 |
-
|
38 |
-
/**
|
39 |
-
* @param
|
40 |
-
*/
|
41 |
-
add_action(
|
42 |
-
$manager = new
|
43 |
-
$plugin->setBootstap(
|
44 |
-
}
|
45 |
-
|
46 |
-
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Factory Bootstrap
|
4 |
+
*
|
5 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>
|
6 |
+
* @since 1.0.0
|
7 |
+
* @package factory-bootstrap
|
8 |
+
* @copyright (c) 2018, Webcraftic Ltd
|
9 |
+
*
|
10 |
+
*/
|
11 |
+
|
12 |
+
// Exit if accessed directly
|
13 |
+
if( !defined('ABSPATH') ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
// module provides function only for the admin area
|
18 |
+
if( !is_admin() ) {
|
19 |
+
return;
|
20 |
+
}
|
21 |
+
|
22 |
+
if( defined('FACTORY_BOOTSTRAP_446_LOADED') ) {
|
23 |
+
return;
|
24 |
+
}
|
25 |
+
|
26 |
+
define('FACTORY_BOOTSTRAP_446_VERSION', '4.4.6');
|
27 |
+
define('FACTORY_BOOTSTRAP_446_LOADED', true);
|
28 |
+
|
29 |
+
if( !defined('FACTORY_FLAT_ADMIN') ) {
|
30 |
+
define('FACTORY_FLAT_ADMIN', true);
|
31 |
+
}
|
32 |
+
|
33 |
+
define('FACTORY_BOOTSTRAP_446_DIR', dirname(__FILE__));
|
34 |
+
define('FACTORY_BOOTSTRAP_446_URL', plugins_url(null, __FILE__));
|
35 |
+
|
36 |
+
require_once(FACTORY_BOOTSTRAP_446_DIR . '/includes/functions.php');
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @param Wbcr_Factory446_Plugin $plugin
|
40 |
+
*/
|
41 |
+
add_action('wbcr_factory_bootstrap_446_plugin_created', function ($plugin) {
|
42 |
+
$manager = new Wbcr_FactoryBootstrap446_Manager($plugin);
|
43 |
+
$plugin->setBootstap($manager);
|
44 |
+
});
|
45 |
+
|
46 |
+
|
libs/factory/bootstrap/includes/functions.php
CHANGED
@@ -1,286 +1,236 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* This file manages assets of the Factory Bootstap.
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex@byonepress.com>
|
6 |
-
* @author Paul Kashtanoff <paul@byonepress.com>
|
7 |
-
* @since 1.0.0
|
8 |
-
* @package factory-bootstrap
|
9 |
-
* @copyright (c) 2018, OnePress Ltd
|
10 |
-
*
|
11 |
-
*/
|
12 |
-
|
13 |
-
// Exit if accessed directly
|
14 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
15 |
-
exit;
|
16 |
-
}
|
17 |
-
|
18 |
-
/**
|
19 |
-
* The Bootstrap Manager class.
|
20 |
-
*
|
21 |
-
* @since 3.2.0
|
22 |
-
*/
|
23 |
-
class
|
24 |
-
|
25 |
-
/**
|
26 |
-
* A plugin for which the manager was created.
|
27 |
-
*
|
28 |
-
* @since 3.2.0
|
29 |
-
* @var
|
30 |
-
*/
|
31 |
-
public $plugin;
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Contains scripts to include.
|
35 |
-
*
|
36 |
-
* @since 3.2.0
|
37 |
-
* @var string[]
|
38 |
-
*/
|
39 |
-
public $scripts = [];
|
40 |
-
|
41 |
-
/**
|
42 |
-
* Contains styles to include.
|
43 |
-
*
|
44 |
-
* @since 3.2.0
|
45 |
-
* @var string[]
|
46 |
-
*/
|
47 |
-
public $styles = [];
|
48 |
-
|
49 |
-
/**
|
50 |
-
* Createas a new instance of the license api for a given plugin.
|
51 |
-
*
|
52 |
-
* @since 1.0.0
|
53 |
-
*/
|
54 |
-
public function __construct(
|
55 |
-
$this->plugin = $plugin;
|
56 |
-
|
57 |
-
add_action( 'admin_enqueue_scripts', [ $this, 'loadAssets' ] );
|
58 |
-
add_filter( 'admin_body_class', [ $this, 'adminBodyClass' ] );
|
59 |
-
}
|
60 |
-
|
61 |
-
/**
|
62 |
-
* Includes the Bootstrap scripts.
|
63 |
-
*
|
64 |
-
* @since 3.2.0
|
65 |
-
*
|
66 |
-
* @param array|string $scripts
|
67 |
-
*/
|
68 |
-
public function enqueueScript( $scripts ) {
|
69 |
-
if ( is_array( $scripts ) ) {
|
70 |
-
foreach ( $scripts as $script ) {
|
71 |
-
if ( ! in_array( $script, $this->scripts ) ) {
|
72 |
-
$this->scripts[] = $script;
|
73 |
-
}
|
74 |
-
}
|
75 |
-
} else {
|
76 |
-
if ( ! in_array( $scripts, $this->scripts ) ) {
|
77 |
-
$this->scripts[] = $scripts;
|
78 |
-
}
|
79 |
-
}
|
80 |
-
}
|
81 |
-
|
82 |
-
/**
|
83 |
-
* * Includes the Bootstrap styles.
|
84 |
-
*
|
85 |
-
* @since 3.2.0
|
86 |
-
*
|
87 |
-
* @param array|string $styles
|
88 |
-
*/
|
89 |
-
public function enqueueStyle( $styles ) {
|
90 |
-
|
91 |
-
if ( is_array( $styles ) ) {
|
92 |
-
foreach ( $styles as $style ) {
|
93 |
-
if ( ! in_array( $style, $this->styles ) ) {
|
94 |
-
$this->styles[] = $style;
|
95 |
-
}
|
96 |
-
}
|
97 |
-
} else {
|
98 |
-
if ( ! in_array( $styles, $this->styles ) ) {
|
99 |
-
$this->styles[] = $styles;
|
100 |
-
}
|
101 |
-
}
|
102 |
-
}
|
103 |
-
|
104 |
-
/**
|
105 |
-
* Loads Bootstrap assets.
|
106 |
-
*
|
107 |
-
* @since 3.2.0
|
108 |
-
* @return void
|
109 |
-
* @see admin_enqueue_scripts
|
110 |
-
*
|
111 |
-
*/
|
112 |
-
public function loadAssets( $hook ) {
|
113 |
-
|
114 |
-
do_action( '
|
115 |
-
do_action( '
|
116 |
-
|
117 |
-
$dependencies = [];
|
118 |
-
if ( ! empty( $this->scripts ) ) {
|
119 |
-
$dependencies[] = 'jquery';
|
120 |
-
$dependencies[] = 'jquery-ui-core';
|
121 |
-
$dependencies[] = 'jquery-ui-widget';
|
122 |
-
}
|
123 |
-
|
124 |
-
foreach ( $this->scripts as $script ) {
|
125 |
-
switch ( $script ) {
|
126 |
-
case 'plugin.iris':
|
127 |
-
$dependencies[] = 'jquery-ui-widget';
|
128 |
-
$dependencies[] = 'jquery-ui-slider';
|
129 |
-
$dependencies[] = 'jquery-ui-draggable';
|
130 |
-
break;
|
131 |
-
}
|
132 |
-
}
|
133 |
-
|
134 |
-
if ( ! empty( $this->scripts ) ) {
|
135 |
-
$this->enqueueScripts( $this->scripts, 'js', $dependencies );
|
136 |
-
}
|
137 |
-
if ( ! empty( $this->styles ) ) {
|
138 |
-
$this->enqueueScripts( $this->styles, 'css', $dependencies );
|
139 |
-
}
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
$
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
} else {
|
172 |
-
$
|
173 |
-
$
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
}
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
$fname = FACTORY_BOOTSTRAP_421_DIR . "/assets/$type-min/$script_to_load.min." . $type;
|
238 |
-
if ( file_exists( $fname ) ) {
|
239 |
-
$f = @fopen( $fname, 'r' );
|
240 |
-
$concat_files[] = @fread( $f, filesize( $fname ) );
|
241 |
-
@fclose( $f );
|
242 |
-
}
|
243 |
-
} else {
|
244 |
-
if ( $type == 'js' ) {
|
245 |
-
wp_enqueue_script( md5( $script_to_load ), FACTORY_BOOTSTRAP_421_URL . "/assets/$type-min/$script_to_load.min." . $type, $is_first ? $dependencies : false, $this->plugin->getPluginVersion() );
|
246 |
-
} else {
|
247 |
-
wp_enqueue_style( md5( $script_to_load ), FACTORY_BOOTSTRAP_421_URL . "/assets/$type-min/$script_to_load.min." . $type, [], $this->plugin->getPluginVersion() );
|
248 |
-
}
|
249 |
-
$is_first = false;
|
250 |
-
}
|
251 |
-
}
|
252 |
-
|
253 |
-
if ( $cache_enable && $cache_dir_exists && ! empty( $concat_files ) ) {
|
254 |
-
|
255 |
-
$cf = @fopen( $cache_filepath, 'w' );
|
256 |
-
$write_content = implode( PHP_EOL, $concat_files );
|
257 |
-
@fwrite( $cf, $write_content );
|
258 |
-
@fclose( $cf );
|
259 |
-
chmod( $cache_filepath, 0755 );
|
260 |
-
|
261 |
-
if ( file_exists( $cache_filepath ) ) {
|
262 |
-
if ( $type == 'js' ) {
|
263 |
-
wp_enqueue_script( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion() );
|
264 |
-
} else {
|
265 |
-
wp_enqueue_style( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, [], $this->plugin->getPluginVersion() );
|
266 |
-
}
|
267 |
-
}
|
268 |
-
}
|
269 |
-
}
|
270 |
-
}
|
271 |
-
|
272 |
-
/**
|
273 |
-
* Adds the body classes: 'factory-flat or 'factory-volumetric'.
|
274 |
-
*
|
275 |
-
* @since 3.2.0
|
276 |
-
*
|
277 |
-
* @param string $classes
|
278 |
-
*
|
279 |
-
* @return string
|
280 |
-
*/
|
281 |
-
public function adminBodyClass( $classes ) {
|
282 |
-
$classes .= FACTORY_FLAT_ADMIN ? ' factory-flat ' : ' factory-volumetric ';
|
283 |
-
|
284 |
-
return $classes;
|
285 |
-
}
|
286 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* This file manages assets of the Factory Bootstap.
|
4 |
+
*
|
5 |
+
* @author Alex Kovalev <alex@byonepress.com>
|
6 |
+
* @author Paul Kashtanoff <paul@byonepress.com>
|
7 |
+
* @since 1.0.0
|
8 |
+
* @package factory-bootstrap
|
9 |
+
* @copyright (c) 2018, OnePress Ltd
|
10 |
+
*
|
11 |
+
*/
|
12 |
+
|
13 |
+
// Exit if accessed directly
|
14 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
15 |
+
exit;
|
16 |
+
}
|
17 |
+
|
18 |
+
/**
|
19 |
+
* The Bootstrap Manager class.
|
20 |
+
*
|
21 |
+
* @since 3.2.0
|
22 |
+
*/
|
23 |
+
class Wbcr_FactoryBootstrap446_Manager {
|
24 |
+
|
25 |
+
/**
|
26 |
+
* A plugin for which the manager was created.
|
27 |
+
*
|
28 |
+
* @since 3.2.0
|
29 |
+
* @var Wbcr_Factory446_Plugin
|
30 |
+
*/
|
31 |
+
public $plugin;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Contains scripts to include.
|
35 |
+
*
|
36 |
+
* @since 3.2.0
|
37 |
+
* @var string[]
|
38 |
+
*/
|
39 |
+
public $scripts = [];
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Contains styles to include.
|
43 |
+
*
|
44 |
+
* @since 3.2.0
|
45 |
+
* @var string[]
|
46 |
+
*/
|
47 |
+
public $styles = [];
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Createas a new instance of the license api for a given plugin.
|
51 |
+
*
|
52 |
+
* @since 1.0.0
|
53 |
+
*/
|
54 |
+
public function __construct( Wbcr_Factory446_Plugin $plugin ) {
|
55 |
+
$this->plugin = $plugin;
|
56 |
+
|
57 |
+
add_action( 'admin_enqueue_scripts', [ $this, 'loadAssets' ] );
|
58 |
+
add_filter( 'admin_body_class', [ $this, 'adminBodyClass' ] );
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Includes the Bootstrap scripts.
|
63 |
+
*
|
64 |
+
* @since 3.2.0
|
65 |
+
*
|
66 |
+
* @param array|string $scripts
|
67 |
+
*/
|
68 |
+
public function enqueueScript( $scripts ) {
|
69 |
+
if ( is_array( $scripts ) ) {
|
70 |
+
foreach ( $scripts as $script ) {
|
71 |
+
if ( ! in_array( $script, $this->scripts ) ) {
|
72 |
+
$this->scripts[] = $script;
|
73 |
+
}
|
74 |
+
}
|
75 |
+
} else {
|
76 |
+
if ( ! in_array( $scripts, $this->scripts ) ) {
|
77 |
+
$this->scripts[] = $scripts;
|
78 |
+
}
|
79 |
+
}
|
80 |
+
}
|
81 |
+
|
82 |
+
/**
|
83 |
+
* * Includes the Bootstrap styles.
|
84 |
+
*
|
85 |
+
* @since 3.2.0
|
86 |
+
*
|
87 |
+
* @param array|string $styles
|
88 |
+
*/
|
89 |
+
public function enqueueStyle( $styles ) {
|
90 |
+
|
91 |
+
if ( is_array( $styles ) ) {
|
92 |
+
foreach ( $styles as $style ) {
|
93 |
+
if ( ! in_array( $style, $this->styles ) ) {
|
94 |
+
$this->styles[] = $style;
|
95 |
+
}
|
96 |
+
}
|
97 |
+
} else {
|
98 |
+
if ( ! in_array( $styles, $this->styles ) ) {
|
99 |
+
$this->styles[] = $styles;
|
100 |
+
}
|
101 |
+
}
|
102 |
+
}
|
103 |
+
|
104 |
+
/**
|
105 |
+
* Loads Bootstrap assets.
|
106 |
+
*
|
107 |
+
* @since 3.2.0
|
108 |
+
* @return void
|
109 |
+
* @see admin_enqueue_scripts
|
110 |
+
*
|
111 |
+
*/
|
112 |
+
public function loadAssets( $hook ) {
|
113 |
+
|
114 |
+
do_action( 'wbcr_factory_446_bootstrap_enqueue_scripts', $hook );
|
115 |
+
do_action( 'wbcr_factory_446_bootstrap_enqueue_scripts_' . $this->plugin->getPluginName(), $hook );
|
116 |
+
|
117 |
+
$dependencies = [];
|
118 |
+
if ( ! empty( $this->scripts ) ) {
|
119 |
+
$dependencies[] = 'jquery';
|
120 |
+
$dependencies[] = 'jquery-ui-core';
|
121 |
+
$dependencies[] = 'jquery-ui-widget';
|
122 |
+
}
|
123 |
+
|
124 |
+
foreach ( $this->scripts as $script ) {
|
125 |
+
switch ( $script ) {
|
126 |
+
case 'plugin.iris':
|
127 |
+
$dependencies[] = 'jquery-ui-widget';
|
128 |
+
$dependencies[] = 'jquery-ui-slider';
|
129 |
+
$dependencies[] = 'jquery-ui-draggable';
|
130 |
+
break;
|
131 |
+
}
|
132 |
+
}
|
133 |
+
|
134 |
+
if ( ! empty( $this->scripts ) ) {
|
135 |
+
$this->enqueueScripts( $this->scripts, 'js', $dependencies );
|
136 |
+
}
|
137 |
+
if ( ! empty( $this->styles ) ) {
|
138 |
+
$this->enqueueScripts( $this->styles, 'css', $dependencies );
|
139 |
+
}
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* @param array $scripts
|
144 |
+
* @param string $type
|
145 |
+
* @param array $dependencies
|
146 |
+
*/
|
147 |
+
protected function enqueueScripts( array $scripts, $type, array $dependencies ) {
|
148 |
+
|
149 |
+
$is_first = true;
|
150 |
+
|
151 |
+
/**
|
152 |
+
* Sets permission for file caching and combining into one file.
|
153 |
+
*
|
154 |
+
* @since 4.1.0
|
155 |
+
*/
|
156 |
+
$cache_enable = apply_filters( 'wbcr/factory/bootstrap/cache_enable', true );
|
157 |
+
|
158 |
+
$cache_id = md5( implode( ',', $this->scripts ) . $type . $this->plugin->getPluginVersion() );
|
159 |
+
$cache_dir_path = FACTORY_BOOTSTRAP_446_DIR . '/assets/cache/';
|
160 |
+
$cache_dir_url = FACTORY_BOOTSTRAP_446_URL . '/assets/cache/';
|
161 |
+
|
162 |
+
$cache_filepath = $cache_dir_path . $cache_id . ".min." . $type;
|
163 |
+
$cache_fileurl = $cache_dir_url . $cache_id . ".min." . $type;
|
164 |
+
|
165 |
+
if ( $cache_enable && file_exists( $cache_filepath ) ) {
|
166 |
+
if ( $type == 'js' ) {
|
167 |
+
wp_enqueue_script( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion() );
|
168 |
+
} else {
|
169 |
+
wp_enqueue_style( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, [], $this->plugin->getPluginVersion() );
|
170 |
+
}
|
171 |
+
} else {
|
172 |
+
$cache_dir_exists = false;
|
173 |
+
if ( ! file_exists( $cache_dir_path ) ) {
|
174 |
+
if ( @mkdir( $cache_dir_path, 0755 ) && wp_is_writable( $cache_dir_path ) ) {
|
175 |
+
$cache_dir_exists = true;
|
176 |
+
}
|
177 |
+
} else {
|
178 |
+
if ( wp_is_writable( $cache_dir_path ) ) {
|
179 |
+
$cache_dir_exists = true;
|
180 |
+
}
|
181 |
+
}
|
182 |
+
|
183 |
+
$concat_files = [];
|
184 |
+
foreach ( $scripts as $script_to_load ) {
|
185 |
+
$script_to_load = sanitize_text_field( $script_to_load );
|
186 |
+
if ( $cache_enable && $cache_dir_exists ) {
|
187 |
+
$fname = FACTORY_BOOTSTRAP_446_DIR . "/assets/$type-min/$script_to_load.min." . $type;
|
188 |
+
if ( file_exists( $fname ) ) {
|
189 |
+
$f = @fopen( $fname, 'r' );
|
190 |
+
$concat_files[] = @fread( $f, filesize( $fname ) );
|
191 |
+
@fclose( $f );
|
192 |
+
}
|
193 |
+
} else {
|
194 |
+
if ( $type == 'js' ) {
|
195 |
+
wp_enqueue_script( md5( $script_to_load ), FACTORY_BOOTSTRAP_446_URL . "/assets/$type-min/$script_to_load.min." . $type, $is_first ? $dependencies : false, $this->plugin->getPluginVersion() );
|
196 |
+
} else {
|
197 |
+
wp_enqueue_style( md5( $script_to_load ), FACTORY_BOOTSTRAP_446_URL . "/assets/$type-min/$script_to_load.min." . $type, [], $this->plugin->getPluginVersion() );
|
198 |
+
}
|
199 |
+
$is_first = false;
|
200 |
+
}
|
201 |
+
}
|
202 |
+
|
203 |
+
if ( $cache_enable && $cache_dir_exists && ! empty( $concat_files ) ) {
|
204 |
+
|
205 |
+
$cf = @fopen( $cache_filepath, 'w' );
|
206 |
+
$write_content = implode( PHP_EOL, $concat_files );
|
207 |
+
@fwrite( $cf, $write_content );
|
208 |
+
@fclose( $cf );
|
209 |
+
chmod( $cache_filepath, 0755 );
|
210 |
+
|
211 |
+
if ( file_exists( $cache_filepath ) ) {
|
212 |
+
if ( $type == 'js' ) {
|
213 |
+
wp_enqueue_script( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, $dependencies, $this->plugin->getPluginVersion() );
|
214 |
+
} else {
|
215 |
+
wp_enqueue_style( 'wbcr-factory-bootstrap-' . $cache_id, $cache_fileurl, [], $this->plugin->getPluginVersion() );
|
216 |
+
}
|
217 |
+
}
|
218 |
+
}
|
219 |
+
}
|
220 |
+
}
|
221 |
+
|
222 |
+
/**
|
223 |
+
* Adds the body classes: 'factory-flat or 'factory-volumetric'.
|
224 |
+
*
|
225 |
+
* @since 3.2.0
|
226 |
+
*
|
227 |
+
* @param string $classes
|
228 |
+
*
|
229 |
+
* @return string
|
230 |
+
*/
|
231 |
+
public function adminBodyClass( $classes ) {
|
232 |
+
$classes .= FACTORY_FLAT_ADMIN ? ' factory-flat ' : ' factory-volumetric ';
|
233 |
+
|
234 |
+
return $classes;
|
235 |
+
}
|
236 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/bootstrap/includes/index.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
<?php
|
2 |
// Silence is golden.
|
1 |
+
<?php
|
2 |
// Silence is golden.
|
libs/factory/bootstrap/index.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
<?php
|
2 |
// Silence is golden.
|
1 |
+
<?php
|
2 |
// Silence is golden.
|
libs/factory/bootstrap/package-lock.json
ADDED
@@ -0,0 +1,1810 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "bootstrap-generator",
|
3 |
+
"version": "1.0.1",
|
4 |
+
"lockfileVersion": 1,
|
5 |
+
"requires": true,
|
6 |
+
"dependencies": {
|
7 |
+
"abbrev": {
|
8 |
+
"version": "1.1.1",
|
9 |
+
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
|
10 |
+
"integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg="
|
11 |
+
},
|
12 |
+
"amdefine": {
|
13 |
+
"version": "1.0.1",
|
14 |
+
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
|
15 |
+
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
|
16 |
+
"dev": true
|
17 |
+
},
|
18 |
+
"argparse": {
|
19 |
+
"version": "0.1.16",
|
20 |
+
"resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz",
|
21 |
+
"integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=",
|
22 |
+
"dev": true,
|
23 |
+
"requires": {
|
24 |
+
"underscore": "~1.7.0",
|
25 |
+
"underscore.string": "~2.4.0"
|
26 |
+
},
|
27 |
+
"dependencies": {
|
28 |
+
"underscore.string": {
|
29 |
+
"version": "2.4.0",
|
30 |
+
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
|
31 |
+
"integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
|
32 |
+
"dev": true
|
33 |
+
}
|
34 |
+
}
|
35 |
+
},
|
36 |
+
"arr-diff": {
|
37 |
+
"version": "4.0.0",
|
38 |
+
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
|
39 |
+
"integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
|
40 |
+
},
|
41 |
+
"arr-flatten": {
|
42 |
+
"version": "1.1.0",
|
43 |
+
"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
|
44 |
+
"integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
|
45 |
+
},
|
46 |
+
"arr-union": {
|
47 |
+
"version": "3.1.0",
|
48 |
+
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
|
49 |
+
"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
|
50 |
+
},
|
51 |
+
"array-each": {
|
52 |
+
"version": "1.0.1",
|
53 |
+
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
|
54 |
+
"integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8="
|
55 |
+
},
|
56 |
+
"array-slice": {
|
57 |
+
"version": "1.1.0",
|
58 |
+
"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
|
59 |
+
"integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w=="
|
60 |
+
},
|
61 |
+
"array-unique": {
|
62 |
+
"version": "0.3.2",
|
63 |
+
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
|
64 |
+
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
|
65 |
+
},
|
66 |
+
"assign-symbols": {
|
67 |
+
"version": "1.0.0",
|
68 |
+
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
|
69 |
+
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
|
70 |
+
},
|
71 |
+
"async": {
|
72 |
+
"version": "0.1.22",
|
73 |
+
"resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz",
|
74 |
+
"integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
|
75 |
+
"dev": true
|
76 |
+
},
|
77 |
+
"atob": {
|
78 |
+
"version": "2.1.2",
|
79 |
+
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
|
80 |
+
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
|
81 |
+
},
|
82 |
+
"base": {
|
83 |
+
"version": "0.11.2",
|
84 |
+
"resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
|
85 |
+
"integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
|
86 |
+
"requires": {
|
87 |
+
"cache-base": "^1.0.1",
|
88 |
+
"class-utils": "^0.3.5",
|
89 |
+
"component-emitter": "^1.2.1",
|
90 |
+
"define-property": "^1.0.0",
|
91 |
+
"isobject": "^3.0.1",
|
92 |
+
"mixin-deep": "^1.2.0",
|
93 |
+
"pascalcase": "^0.1.1"
|
94 |
+
},
|
95 |
+
"dependencies": {
|
96 |
+
"define-property": {
|
97 |
+
"version": "1.0.0",
|
98 |
+
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
|
99 |
+
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
|
100 |
+
"requires": {
|
101 |
+
"is-descriptor": "^1.0.0"
|
102 |
+
}
|
103 |
+
},
|
104 |
+
"is-accessor-descriptor": {
|
105 |
+
"version": "1.0.0",
|
106 |
+
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
|
107 |
+
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
|
108 |
+
"requires": {
|
109 |
+
"kind-of": "^6.0.0"
|
110 |
+
}
|
111 |
+
},
|
112 |
+
"is-data-descriptor": {
|
113 |
+
"version": "1.0.0",
|
114 |
+
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
|
115 |
+
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
|
116 |
+
"requires": {
|
117 |
+
"kind-of": "^6.0.0"
|
118 |
+
}
|
119 |
+
},
|
120 |
+
"is-descriptor": {
|
121 |
+
"version": "1.0.2",
|
122 |
+
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
|
123 |
+
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
|
124 |
+
"requires": {
|
125 |
+
"is-accessor-descriptor": "^1.0.0",
|
126 |
+
"is-data-descriptor": "^1.0.0",
|
127 |
+
"kind-of": "^6.0.2"
|
128 |
+
}
|
129 |
+
}
|
130 |
+
}
|
131 |
+
},
|
132 |
+
"braces": {
|
133 |
+
"version": "2.3.2",
|
134 |
+
"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
|
135 |
+
"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
|
136 |
+
"requires": {
|
137 |
+
"arr-flatten": "^1.1.0",
|
138 |
+
"array-unique": "^0.3.2",
|
139 |
+
"extend-shallow": "^2.0.1",
|
140 |
+
"fill-range": "^4.0.0",
|
141 |
+
"isobject": "^3.0.1",
|
142 |
+
"repeat-element": "^1.1.2",
|
143 |
+
"snapdragon": "^0.8.1",
|
144 |
+
"snapdragon-node": "^2.0.1",
|
145 |
+
"split-string": "^3.0.2",
|
146 |
+
"to-regex": "^3.0.1"
|
147 |
+
},
|
148 |
+
"dependencies": {
|
149 |
+
"extend-shallow": {
|
150 |
+
"version": "2.0.1",
|
151 |
+
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
|
152 |
+
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
|
153 |
+
"requires": {
|
154 |
+
"is-extendable": "^0.1.0"
|
155 |
+
}
|
156 |
+
}
|
157 |
+
}
|
158 |
+
},
|
159 |
+
"cache-base": {
|
160 |
+
"version": "1.0.1",
|
161 |
+
"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
|
162 |
+
"integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
|
163 |
+
"requires": {
|
164 |
+
"collection-visit": "^1.0.0",
|
165 |
+
"component-emitter": "^1.2.1",
|
166 |
+
"get-value": "^2.0.6",
|
167 |
+
"has-value": "^1.0.0",
|
168 |
+
"isobject": "^3.0.1",
|
169 |
+
"set-value": "^2.0.0",
|
170 |
+
"to-object-path": "^0.3.0",
|
171 |
+
"union-value": "^1.0.0",
|
172 |
+
"unset-value": "^1.0.0"
|
173 |
+
}
|
174 |
+
},
|
175 |
+
"camelcase": {
|
176 |
+
"version": "1.2.1",
|
177 |
+
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
|
178 |
+
"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
|
179 |
+
"dev": true
|
180 |
+
},
|
181 |
+
"class-utils": {
|
182 |
+
"version": "0.3.6",
|
183 |
+
"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
|
184 |
+
"integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
|
185 |
+
"requires": {
|
186 |
+
"arr-union": "^3.1.0",
|
187 |
+
"define-property": "^0.2.5",
|
188 |
+
"isobject": "^3.0.0",
|
189 |
+
"static-extend": "^0.1.1"
|
190 |
+
},
|
191 |
+
"dependencies": {
|
192 |
+
"define-property": {
|
193 |
+
"version": "0.2.5",
|
194 |
+
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
|
195 |
+
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
|
196 |
+
"requires": {
|
197 |
+
"is-descriptor": "^0.1.0"
|
198 |
+
}
|
199 |
+
}
|
200 |
+
}
|
201 |
+
},
|
202 |
+
"clean-css": {
|
203 |
+
"version": "2.0.8",
|
204 |
+
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-2.0.8.tgz",
|
205 |
+
"integrity": "sha1-6TfN/cxXgaAIF67EB56Fs+wVeiA=",
|
206 |
+
"dev": true,
|
207 |
+
"requires": {
|
208 |
+
"commander": "2.0.x"
|
209 |
+
}
|
210 |
+
},
|
211 |
+
"cli": {
|
212 |
+
"version": "0.4.5",
|
213 |
+
"resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz",
|
214 |
+
"integrity": "sha1-ePlIXNFhtWbppsctcXDEJw6B22E=",
|
215 |
+
"dev": true,
|
216 |
+
"requires": {
|
217 |
+
"glob": ">= 3.1.4"
|
218 |
+
}
|
219 |
+
},
|
220 |
+
"coffee-script": {
|
221 |
+
"version": "1.3.3",
|
222 |
+
"resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz",
|
223 |
+
"integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=",
|
224 |
+
"dev": true
|
225 |
+
},
|
226 |
+
"collection-visit": {
|
227 |
+
"version": "1.0.0",
|
228 |
+
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
|
229 |
+
"integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
|
230 |
+
"requires": {
|
231 |
+
"map-visit": "^1.0.0",
|
232 |
+
"object-visit": "^1.0.0"
|
233 |
+
}
|
234 |
+
},
|
235 |
+
"colors": {
|
236 |
+
"version": "0.6.2",
|
237 |
+
"resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
|
238 |
+
"integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
|
239 |
+
"dev": true
|
240 |
+
},
|
241 |
+
"commander": {
|
242 |
+
"version": "2.0.0",
|
243 |
+
"resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz",
|
244 |
+
"integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=",
|
245 |
+
"dev": true
|
246 |
+
},
|
247 |
+
"component-emitter": {
|
248 |
+
"version": "1.3.0",
|
249 |
+
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
|
250 |
+
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
|
251 |
+
},
|
252 |
+
"console-browserify": {
|
253 |
+
"version": "0.1.6",
|
254 |
+
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz",
|
255 |
+
"integrity": "sha1-0SijwLuINQ61YmxufHGm8P1ImDw=",
|
256 |
+
"dev": true
|
257 |
+
},
|
258 |
+
"copy-descriptor": {
|
259 |
+
"version": "0.1.1",
|
260 |
+
"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
|
261 |
+
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
|
262 |
+
},
|
263 |
+
"dateformat": {
|
264 |
+
"version": "1.0.2-1.2.3",
|
265 |
+
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz",
|
266 |
+
"integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=",
|
267 |
+
"dev": true
|
268 |
+
},
|
269 |
+
"debug": {
|
270 |
+
"version": "2.6.9",
|
271 |
+
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
272 |
+
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
273 |
+
"requires": {
|
274 |
+
"ms": "2.0.0"
|
275 |
+
}
|
276 |
+
},
|
277 |
+
"decamelize": {
|
278 |
+
"version": "1.2.0",
|
279 |
+
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
280 |
+
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
|
281 |
+
"dev": true
|
282 |
+
},
|
283 |
+
"decode-uri-component": {
|
284 |
+
"version": "0.2.0",
|
285 |
+
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
|
286 |
+
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
|
287 |
+
},
|
288 |
+
"define-property": {
|
289 |
+
"version": "2.0.2",
|
290 |
+
"resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
|
291 |
+
"integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
|
292 |
+
"requires": {
|
293 |
+
"is-descriptor": "^1.0.2",
|
294 |
+
"isobject": "^3.0.1"
|
295 |
+
},
|
296 |
+
"dependencies": {
|
297 |
+
"is-accessor-descriptor": {
|
298 |
+
"version": "1.0.0",
|
299 |
+
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
|
300 |
+
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
|
301 |
+
"requires": {
|
302 |
+
"kind-of": "^6.0.0"
|
303 |
+
}
|
304 |
+
},
|
305 |
+
"is-data-descriptor": {
|
306 |
+
"version": "1.0.0",
|
307 |
+
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
|
308 |
+
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
|
309 |
+
"requires": {
|
310 |
+
"kind-of": "^6.0.0"
|
311 |
+
}
|
312 |
+
},
|
313 |
+
"is-descriptor": {
|
314 |
+
"version": "1.0.2",
|
315 |
+
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
|
316 |
+
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
|
317 |
+
"requires": {
|
318 |
+
"is-accessor-descriptor": "^1.0.0",
|
319 |
+
"is-data-descriptor": "^1.0.0",
|
320 |
+
"kind-of": "^6.0.2"
|
321 |
+
}
|
322 |
+
}
|
323 |
+
}
|
324 |
+
},
|
325 |
+
"detect-file": {
|
326 |
+
"version": "1.0.0",
|
327 |
+
"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
|
328 |
+
"integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc="
|
329 |
+
},
|
330 |
+
"esprima": {
|
331 |
+
"version": "1.0.4",
|
332 |
+
"resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz",
|
333 |
+
"integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=",
|
334 |
+
"dev": true
|
335 |
+
},
|
336 |
+
"eventemitter2": {
|
337 |
+
"version": "0.4.14",
|
338 |
+
"resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
|
339 |
+
"integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
|
340 |
+
"dev": true
|
341 |
+
},
|
342 |
+
"exit": {
|
343 |
+
"version": "0.1.2",
|
344 |
+
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
|
345 |
+
"integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
|
346 |
+
"dev": true
|
347 |
+
},
|
348 |
+
"expand-brackets": {
|
349 |
+
"version": "2.1.4",
|
350 |
+
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
|
351 |
+
"integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
|
352 |
+
"requires": {
|
353 |
+
"debug": "^2.3.3",
|
354 |
+
"define-property": "^0.2.5",
|
355 |
+
"extend-shallow": "^2.0.1",
|
356 |
+
"posix-character-classes": "^0.1.0",
|
357 |
+
"regex-not": "^1.0.0",
|
358 |
+
"snapdragon": "^0.8.1",
|
359 |
+
"to-regex": "^3.0.1"
|
360 |
+
},
|
361 |
+
"dependencies": {
|
362 |
+
"define-property": {
|
363 |
+
"version": "0.2.5",
|
364 |
+
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
|
365 |
+
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
|
366 |
+
"requires": {
|
367 |
+
"is-descriptor": "^0.1.0"
|
368 |
+
}
|
369 |
+
},
|
370 |
+
"extend-shallow": {
|
371 |
+
"version": "2.0.1",
|
372 |
+
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
|
373 |
+
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
|
374 |
+
"requires": {
|
375 |
+
"is-extendable": "^0.1.0"
|
376 |
+
}
|
377 |
+
}
|
378 |
+
}
|
379 |
+
},
|
380 |
+
"expand-tilde": {
|
381 |
+
"version": "2.0.2",
|
382 |
+
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
|
383 |
+
"integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
|
384 |
+
"requires": {
|
385 |
+
"homedir-polyfill": "^1.0.1"
|
386 |
+
}
|
387 |
+
},
|
388 |
+
"extend": {
|
389 |
+
"version": "3.0.2",
|
390 |
+
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
391 |
+
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
|
392 |
+
},
|
393 |
+
"extend-shallow": {
|
394 |
+
"version": "3.0.2",
|
395 |
+
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
|
396 |
+
"integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
|
397 |
+
"requires": {
|
398 |
+
"assign-symbols": "^1.0.0",
|
399 |
+
"is-extendable": "^1.0.1"
|
400 |
+
},
|
401 |
+
"dependencies": {
|
402 |
+
"is-extendable": {
|
403 |
+
"version": "1.0.1",
|
404 |
+
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
|
405 |
+
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
|
406 |
+
"requires": {
|
407 |
+
"is-plain-object": "^2.0.4"
|
408 |
+
}
|
409 |
+
}
|
410 |
+
}
|
411 |
+
},
|
412 |
+
"extglob": {
|
413 |
+
"version": "2.0.4",
|
414 |
+
"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
|
415 |
+
"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
|
416 |
+
"requires": {
|
417 |
+
"array-unique": "^0.3.2",
|
418 |
+
"define-property": "^1.0.0",
|
419 |
+
"expand-brackets": "^2.1.4",
|
420 |
+
"extend-shallow": "^2.0.1",
|
421 |
+
"fragment-cache": "^0.2.1",
|
422 |
+
"regex-not": "^1.0.0",
|
423 |
+
"snapdragon": "^0.8.1",
|
424 |
+
"to-regex": "^3.0.1"
|
425 |
+
},
|
426 |
+
"dependencies": {
|
427 |
+
"define-property": {
|
428 |
+
"version": "1.0.0",
|
429 |
+
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
|
430 |
+
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
|
431 |
+
"requires": {
|
432 |
+
"is-descriptor": "^1.0.0"
|
433 |
+
}
|
434 |
+
},
|
435 |
+
"extend-shallow": {
|
436 |
+
"version": "2.0.1",
|
437 |
+
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
|
438 |
+
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
|
439 |
+
"requires": {
|
440 |
+
"is-extendable": "^0.1.0"
|
441 |
+
}
|
442 |
+
},
|
443 |
+
"is-accessor-descriptor": {
|
444 |
+
"version": "1.0.0",
|
445 |
+
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
|
446 |
+
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
|
447 |
+
"requires": {
|
448 |
+
"kind-of": "^6.0.0"
|
449 |
+
}
|
450 |
+
},
|
451 |
+
"is-data-descriptor": {
|
452 |
+
"version": "1.0.0",
|
453 |
+
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
|
454 |
+
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
|
455 |
+
"requires": {
|
456 |
+
"kind-of": "^6.0.0"
|
457 |
+
}
|
458 |
+
},
|
459 |
+
"is-descriptor": {
|
460 |
+
"version": "1.0.2",
|
461 |
+
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
|
462 |
+
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
|
463 |
+
"requires": {
|
464 |
+
"is-accessor-descriptor": "^1.0.0",
|
465 |
+
"is-data-descriptor": "^1.0.0",
|
466 |
+
"kind-of": "^6.0.2"
|
467 |
+
}
|
468 |
+
}
|
469 |
+
}
|
470 |
+
},
|
471 |
+
"fill-range": {
|
472 |
+
"version": "4.0.0",
|
473 |
+
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
|
474 |
+
"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
|
475 |
+
"requires": {
|
476 |
+
"extend-shallow": "^2.0.1",
|
477 |
+
"is-number": "^3.0.0",
|
478 |
+
"repeat-string": "^1.6.1",
|
479 |
+
"to-regex-range": "^2.1.0"
|
480 |
+
},
|
481 |
+
"dependencies": {
|
482 |
+
"extend-shallow": {
|
483 |
+
"version": "2.0.1",
|
484 |
+
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
|
485 |
+
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
|
486 |
+
"requires": {
|
487 |
+
"is-extendable": "^0.1.0"
|
488 |
+
}
|
489 |
+
}
|
490 |
+
}
|
491 |
+
},
|
492 |
+
"findup-sync": {
|
493 |
+
"version": "0.1.3",
|
494 |
+
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz",
|
495 |
+
"integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=",
|
496 |
+
"dev": true,
|
497 |
+
"requires": {
|
498 |
+
"glob": "~3.2.9",
|
499 |
+
"lodash": "~2.4.1"
|
500 |
+
},
|
501 |
+
"dependencies": {
|
502 |
+
"glob": {
|
503 |
+
"version": "3.2.11",
|
504 |
+
"resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
|
505 |
+
"integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=",
|
506 |
+
"dev": true,
|
507 |
+
"requires": {
|
508 |
+
"inherits": "2",
|
509 |
+
"minimatch": "0.3"
|
510 |
+
}
|
511 |
+
},
|
512 |
+
"lodash": {
|
513 |
+
"version": "2.4.2",
|
514 |
+
"resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
|
515 |
+
"integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
|
516 |
+
"dev": true
|
517 |
+
},
|
518 |
+
"minimatch": {
|
519 |
+
"version": "0.3.0",
|
520 |
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
|
521 |
+
"integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=",
|
522 |
+
"dev": true,
|
523 |
+
"requires": {
|
524 |
+
"lru-cache": "2",
|
525 |
+
"sigmund": "~1.0.0"
|
526 |
+
}
|
527 |
+
}
|
528 |
+
}
|
529 |
+
},
|
530 |
+
"fined": {
|
531 |
+
"version": "1.2.0",
|
532 |
+
"resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
|
533 |
+
"integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
|
534 |
+
"requires": {
|
535 |
+
"expand-tilde": "^2.0.2",
|
536 |
+
"is-plain-object": "^2.0.3",
|
537 |
+
"object.defaults": "^1.1.0",
|
538 |
+
"object.pick": "^1.2.0",
|
539 |
+
"parse-filepath": "^1.0.1"
|
540 |
+
}
|
541 |
+
},
|
542 |
+
"flagged-respawn": {
|
543 |
+
"version": "1.0.1",
|
544 |
+
"resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
|
545 |
+
"integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q=="
|
546 |
+
},
|
547 |
+
"for-in": {
|
548 |
+
"version": "1.0.2",
|
549 |
+
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
|
550 |
+
"integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
|
551 |
+
},
|
552 |
+
"for-own": {
|
553 |
+
"version": "1.0.0",
|
554 |
+
"resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
|
555 |
+
"integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
|
556 |
+
"requires": {
|
557 |
+
"for-in": "^1.0.1"
|
558 |
+
}
|
559 |
+
},
|
560 |
+
"fragment-cache": {
|
561 |
+
"version": "0.2.1",
|
562 |
+
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
|
563 |
+
"integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
|
564 |
+
"requires": {
|
565 |
+
"map-cache": "^0.2.2"
|
566 |
+
}
|
567 |
+
},
|
568 |
+
"function-bind": {
|
569 |
+
"version": "1.1.1",
|
570 |
+
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
571 |
+
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
|
572 |
+
},
|
573 |
+
"get-value": {
|
574 |
+
"version": "2.0.6",
|
575 |
+
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
|
576 |
+
"integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
|
577 |
+
},
|
578 |
+
"getobject": {
|
579 |
+
"version": "0.1.0",
|
580 |
+
"resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
|
581 |
+
"integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
|
582 |
+
"dev": true
|
583 |
+
},
|
584 |
+
"glob": {
|
585 |
+
"version": "3.1.21",
|
586 |
+
"resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
|
587 |
+
"integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
|
588 |
+
"dev": true,
|
589 |
+
"requires": {
|
590 |
+
"graceful-fs": "~1.2.0",
|
591 |
+
"inherits": "1",
|
592 |
+
"minimatch": "~0.2.11"
|
593 |
+
},
|
594 |
+
"dependencies": {
|
595 |
+
"inherits": {
|
596 |
+
"version": "1.0.2",
|
597 |
+
"resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
|
598 |
+
"integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
|
599 |
+
"dev": true
|
600 |
+
}
|
601 |
+
}
|
602 |
+
},
|
603 |
+
"global-modules": {
|
604 |
+
"version": "1.0.0",
|
605 |
+
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
|
606 |
+
"integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
|
607 |
+
"requires": {
|
608 |
+
"global-prefix": "^1.0.1",
|
609 |
+
"is-windows": "^1.0.1",
|
610 |
+
"resolve-dir": "^1.0.0"
|
611 |
+
}
|
612 |
+
},
|
613 |
+
"global-prefix": {
|
614 |
+
"version": "1.0.2",
|
615 |
+
"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
|
616 |
+
"integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
|
617 |
+
"requires": {
|
618 |
+
"expand-tilde": "^2.0.2",
|
619 |
+
"homedir-polyfill": "^1.0.1",
|
620 |
+
"ini": "^1.3.4",
|
621 |
+
"is-windows": "^1.0.1",
|
622 |
+
"which": "^1.2.14"
|
623 |
+
},
|
624 |
+
"dependencies": {
|
625 |
+
"which": {
|
626 |
+
"version": "1.3.1",
|
627 |
+
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
|
628 |
+
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
|
629 |
+
"requires": {
|
630 |
+
"isexe": "^2.0.0"
|
631 |
+
}
|
632 |
+
}
|
633 |
+
}
|
634 |
+
},
|
635 |
+
"graceful-fs": {
|
636 |
+
"version": "1.2.3",
|
637 |
+
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
|
638 |
+
"integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
|
639 |
+
"dev": true
|
640 |
+
},
|
641 |
+
"grunt": {
|
642 |
+
"version": "0.4.5",
|
643 |
+
"resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
|
644 |
+
"integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=",
|
645 |
+
"dev": true,
|
646 |
+
"requires": {
|
647 |
+
"async": "~0.1.22",
|
648 |
+
"coffee-script": "~1.3.3",
|
649 |
+
"colors": "~0.6.2",
|
650 |
+
"dateformat": "1.0.2-1.2.3",
|
651 |
+
"eventemitter2": "~0.4.13",
|
652 |
+
"exit": "~0.1.1",
|
653 |
+
"findup-sync": "~0.1.2",
|
654 |
+
"getobject": "~0.1.0",
|
655 |
+
"glob": "~3.1.21",
|
656 |
+
"grunt-legacy-log": "~0.1.0",
|
657 |
+
"grunt-legacy-util": "~0.2.0",
|
658 |
+
"hooker": "~0.2.3",
|
659 |
+
"iconv-lite": "~0.2.11",
|
660 |
+
"js-yaml": "~2.0.5",
|
661 |
+
"lodash": "~0.9.2",
|
662 |
+
"minimatch": "~0.2.12",
|
663 |
+
"nopt": "~1.0.10",
|
664 |
+
"rimraf": "~2.2.8",
|
665 |
+
"underscore.string": "~2.2.1",
|
666 |
+
"which": "~1.0.5"
|
667 |
+
}
|
668 |
+
},
|
669 |
+
"grunt-cli": {
|
670 |
+
"version": "1.3.2",
|
671 |
+
"resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz",
|
672 |
+
"integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==",
|
673 |
+
"requires": {
|
674 |
+
"grunt-known-options": "~1.1.0",
|
675 |
+
"interpret": "~1.1.0",
|
676 |
+
"liftoff": "~2.5.0",
|
677 |
+
"nopt": "~4.0.1",
|
678 |
+
"v8flags": "~3.1.1"
|
679 |
+
},
|
680 |
+
"dependencies": {
|
681 |
+
"nopt": {
|
682 |
+
"version": "4.0.3",
|
683 |
+
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
|
684 |
+
"integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
|
685 |
+
"requires": {
|
686 |
+
"abbrev": "1",
|
687 |
+
"osenv": "^0.1.4"
|
688 |
+
}
|
689 |
+
}
|
690 |
+
}
|
691 |
+
},
|
692 |
+
"grunt-contrib-clean": {
|
693 |
+
"version": "0.5.0",
|
694 |
+
"resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz",
|
695 |
+
"integrity": "sha1-9T397ghJsce0Dp67umn0jExgecU=",
|
696 |
+
"dev": true,
|
697 |
+
"requires": {
|
698 |
+
"rimraf": "~2.2.1"
|
699 |
+
}
|
700 |
+
},
|
701 |
+
"grunt-contrib-concat": {
|
702 |
+
"version": "0.3.0",
|
703 |
+
"resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.3.0.tgz",
|
704 |
+
"integrity": "sha1-SPoNQzbSm2U62CJaa9b4VrRIPjI=",
|
705 |
+
"dev": true
|
706 |
+
},
|
707 |
+
"grunt-contrib-copy": {
|
708 |
+
"version": "0.5.0",
|
709 |
+
"resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.5.0.tgz",
|
710 |
+
"integrity": "sha1-QQB1rEWlhWuhkbHMclclRQ1KAhU=",
|
711 |
+
"dev": true
|
712 |
+
},
|
713 |
+
"grunt-contrib-cssmin": {
|
714 |
+
"version": "0.7.0",
|
715 |
+
"resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.7.0.tgz",
|
716 |
+
"integrity": "sha1-pXNenx0mMUnkn+A1KU5CnYxnC6s=",
|
717 |
+
"dev": true,
|
718 |
+
"requires": {
|
719 |
+
"clean-css": "~2.0.0",
|
720 |
+
"grunt-lib-contrib": "~0.6.0"
|
721 |
+
}
|
722 |
+
},
|
723 |
+
"grunt-contrib-jshint": {
|
724 |
+
"version": "0.6.5",
|
725 |
+
"resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.6.5.tgz",
|
726 |
+
"integrity": "sha1-OvtGdnRTZMxKGe7nk0wOBgCLVm4=",
|
727 |
+
"dev": true,
|
728 |
+
"requires": {
|
729 |
+
"jshint": "~2.1.10"
|
730 |
+
}
|
731 |
+
},
|
732 |
+
"grunt-contrib-uglify": {
|
733 |
+
"version": "0.2.7",
|
734 |
+
"resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.2.7.tgz",
|
735 |
+
"integrity": "sha1-5r2lHgxAoUWfbOrUI8Ze/XJaG/c=",
|
736 |
+
"dev": true,
|
737 |
+
"requires": {
|
738 |
+
"grunt-lib-contrib": "~0.6.1",
|
739 |
+
"uglify-js": "~2.4.0"
|
740 |
+
}
|
741 |
+
},
|
742 |
+
"grunt-known-options": {
|
743 |
+
"version": "1.1.1",
|
744 |
+
"resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
|
745 |
+
"integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ=="
|
746 |
+
},
|
747 |
+
"grunt-legacy-log": {
|
748 |
+
"version": "0.1.3",
|
749 |
+
"resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz",
|
750 |
+
"integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=",
|
751 |
+
"dev": true,
|
752 |
+
"requires": {
|
753 |
+
"colors": "~0.6.2",
|
754 |
+
"grunt-legacy-log-utils": "~0.1.1",
|
755 |
+
"hooker": "~0.2.3",
|
756 |
+
"lodash": "~2.4.1",
|
757 |
+
"underscore.string": "~2.3.3"
|
758 |
+
},
|
759 |
+
"dependencies": {
|
760 |
+
"lodash": {
|
761 |
+
"version": "2.4.2",
|
762 |
+
"resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
|
763 |
+
"integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
|
764 |
+
"dev": true
|
765 |
+
},
|
766 |
+
"underscore.string": {
|
767 |
+
"version": "2.3.3",
|
768 |
+
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
|
769 |
+
"integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
|
770 |
+
"dev": true
|
771 |
+
}
|
772 |
+
}
|
773 |
+
},
|
774 |
+
"grunt-legacy-log-utils": {
|
775 |
+
"version": "0.1.1",
|
776 |
+
"resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz",
|
777 |
+
"integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=",
|
778 |
+
"dev": true,
|
779 |
+
"requires": {
|
780 |
+
"colors": "~0.6.2",
|
781 |
+
"lodash": "~2.4.1",
|
782 |
+
"underscore.string": "~2.3.3"
|
783 |
+
},
|
784 |
+
"dependencies": {
|
785 |
+
"lodash": {
|
786 |
+
"version": "2.4.2",
|
787 |
+
"resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
|
788 |
+
"integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
|
789 |
+
"dev": true
|
790 |
+
},
|
791 |
+
"underscore.string": {
|
792 |
+
"version": "2.3.3",
|
793 |
+
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
|
794 |
+
"integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
|
795 |
+
"dev": true
|
796 |
+
}
|
797 |
+
}
|
798 |
+
},
|
799 |
+
"grunt-legacy-util": {
|
800 |
+
"version": "0.2.0",
|
801 |
+
"resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz",
|
802 |
+
"integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=",
|
803 |
+
"dev": true,
|
804 |
+
"requires": {
|
805 |
+
"async": "~0.1.22",
|
806 |
+
"exit": "~0.1.1",
|
807 |
+
"getobject": "~0.1.0",
|
808 |
+
"hooker": "~0.2.3",
|
809 |
+
"lodash": "~0.9.2",
|
810 |
+
"underscore.string": "~2.2.1",
|
811 |
+
"which": "~1.0.5"
|
812 |
+
}
|
813 |
+
},
|
814 |
+
"grunt-lib-contrib": {
|
815 |
+
"version": "0.6.1",
|
816 |
+
"resolved": "https://registry.npmjs.org/grunt-lib-contrib/-/grunt-lib-contrib-0.6.1.tgz",
|
817 |
+
"integrity": "sha1-P1att9oG6BR5XuJBWw6+X7iQPrs=",
|
818 |
+
"dev": true,
|
819 |
+
"requires": {
|
820 |
+
"zlib-browserify": "0.0.1"
|
821 |
+
}
|
822 |
+
},
|
823 |
+
"grunt-preprocess": {
|
824 |
+
"version": "4.2.0",
|
825 |
+
"resolved": "https://registry.npmjs.org/grunt-preprocess/-/grunt-preprocess-4.2.0.tgz",
|
826 |
+
"integrity": "sha1-SJUTzet1A1NEmn9lbVAXWvc/FfY=",
|
827 |
+
"dev": true,
|
828 |
+
"requires": {
|
829 |
+
"preprocess": "~2.3.1"
|
830 |
+
}
|
831 |
+
},
|
832 |
+
"has": {
|
833 |
+
"version": "1.0.3",
|
834 |
+
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
835 |
+
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
836 |
+
"requires": {
|
837 |
+
"function-bind": "^1.1.1"
|
838 |
+
}
|
839 |
+
},
|
840 |
+
"has-value": {
|
841 |
+
"version": "1.0.0",
|
842 |
+
"resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
|
843 |
+
"integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
|
844 |
+
"requires": {
|
845 |
+
"get-value": "^2.0.6",
|
846 |
+
"has-values": "^1.0.0",
|
847 |
+
"isobject": "^3.0.0"
|
848 |
+
}
|
849 |
+
},
|
850 |
+
"has-values": {
|
851 |
+
"version": "1.0.0",
|
852 |
+
"resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
|
853 |
+
"integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
|
854 |
+
"requires": {
|
855 |
+
"is-number": "^3.0.0",
|
856 |
+
"kind-of": "^4.0.0"
|
857 |
+
},
|
858 |
+
"dependencies": {
|
859 |
+
"kind-of": {
|
860 |
+
"version": "4.0.0",
|
861 |
+
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
|
862 |
+
"integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
|
863 |
+
"requires": {
|
864 |
+
"is-buffer": "^1.1.5"
|
865 |
+
}
|
866 |
+
}
|
867 |
+
}
|
868 |
+
},
|
869 |
+
"homedir-polyfill": {
|
870 |
+
"version": "1.0.3",
|
871 |
+
"resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
|
872 |
+
"integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
|
873 |
+
"requires": {
|
874 |
+
"parse-passwd": "^1.0.0"
|
875 |
+
}
|
876 |
+
},
|
877 |
+
"hooker": {
|
878 |
+
"version": "0.2.3",
|
879 |
+
"resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
|
880 |
+
"integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
|
881 |
+
"dev": true
|
882 |
+
},
|
883 |
+
"iconv-lite": {
|
884 |
+
"version": "0.2.11",
|
885 |
+
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
|
886 |
+
"integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
|
887 |
+
"dev": true
|
888 |
+
},
|
889 |
+
"inherits": {
|
890 |
+
"version": "2.0.3",
|
891 |
+
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
892 |
+
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
893 |
+
"dev": true
|
894 |
+
},
|
895 |
+
"ini": {
|
896 |
+
"version": "1.3.5",
|
897 |
+
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
|
898 |
+
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
|
899 |
+
},
|
900 |
+
"interpret": {
|
901 |
+
"version": "1.1.0",
|
902 |
+
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
|
903 |
+
"integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
|
904 |
+
},
|
905 |
+
"is-absolute": {
|
906 |
+
"version": "1.0.0",
|
907 |
+
"resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
|
908 |
+
"integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
|
909 |
+
"requires": {
|
910 |
+
"is-relative": "^1.0.0",
|
911 |
+
"is-windows": "^1.0.1"
|
912 |
+
}
|
913 |
+
},
|
914 |
+
"is-accessor-descriptor": {
|
915 |
+
"version": "0.1.6",
|
916 |
+
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
917 |
+
"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
|
918 |
+
"requires": {
|
919 |
+
"kind-of": "^3.0.2"
|
920 |
+
},
|
921 |
+
"dependencies": {
|
922 |
+
"kind-of": {
|
923 |
+
"version": "3.2.2",
|
924 |
+
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
925 |
+
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
926 |
+
"requires": {
|
927 |
+
"is-buffer": "^1.1.5"
|
928 |
+
}
|
929 |
+
}
|
930 |
+
}
|
931 |
+
},
|
932 |
+
"is-buffer": {
|
933 |
+
"version": "1.1.6",
|
934 |
+
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
935 |
+
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
936 |
+
},
|
937 |
+
"is-core-module": {
|
938 |
+
"version": "2.1.0",
|
939 |
+
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
|
940 |
+
"integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
|
941 |
+
"requires": {
|
942 |
+
"has": "^1.0.3"
|
943 |
+
}
|
944 |
+
},
|
945 |
+
"is-data-descriptor": {
|
946 |
+
"version": "0.1.4",
|
947 |
+
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
948 |
+
"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
|
949 |
+
"requires": {
|
950 |
+
"kind-of": "^3.0.2"
|
951 |
+
},
|
952 |
+
"dependencies": {
|
953 |
+
"kind-of": {
|
954 |
+
"version": "3.2.2",
|
955 |
+
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
956 |
+
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
957 |
+
"requires": {
|
958 |
+
"is-buffer": "^1.1.5"
|
959 |
+
}
|
960 |
+
}
|
961 |
+
}
|
962 |
+
},
|
963 |
+
"is-descriptor": {
|
964 |
+
"version": "0.1.6",
|
965 |
+
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
966 |
+
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
|
967 |
+
"requires": {
|
968 |
+
"is-accessor-descriptor": "^0.1.6",
|
969 |
+
"is-data-descriptor": "^0.1.4",
|
970 |
+
"kind-of": "^5.0.0"
|
971 |
+
},
|
972 |
+
"dependencies": {
|
973 |
+
"kind-of": {
|
974 |
+
"version": "5.1.0",
|
975 |
+
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
|
976 |
+
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
|
977 |
+
}
|
978 |
+
}
|
979 |
+
},
|
980 |
+
"is-extendable": {
|
981 |
+
"version": "0.1.1",
|
982 |
+
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
|
983 |
+
"integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
|
984 |
+
},
|
985 |
+
"is-extglob": {
|
986 |
+
"version": "2.1.1",
|
987 |
+
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
988 |
+
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
|
989 |
+
},
|
990 |
+
"is-glob": {
|
991 |
+
"version": "3.1.0",
|
992 |
+
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
|
993 |
+
"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
|
994 |
+
"requires": {
|
995 |
+
"is-extglob": "^2.1.0"
|
996 |
+
}
|
997 |
+
},
|
998 |
+
"is-number": {
|
999 |
+
"version": "3.0.0",
|
1000 |
+
"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
|
1001 |
+
"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
|
1002 |
+
"requires": {
|
1003 |
+
"kind-of": "^3.0.2"
|
1004 |
+
},
|
1005 |
+
"dependencies": {
|
1006 |
+
"kind-of": {
|
1007 |
+
"version": "3.2.2",
|
1008 |
+
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
1009 |
+
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
1010 |
+
"requires": {
|
1011 |
+
"is-buffer": "^1.1.5"
|
1012 |
+
}
|
1013 |
+
}
|
1014 |
+
}
|
1015 |
+
},
|
1016 |
+
"is-plain-object": {
|
1017 |
+
"version": "2.0.4",
|
1018 |
+
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
|
1019 |
+
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
|
1020 |
+
"requires": {
|
1021 |
+
"isobject": "^3.0.1"
|
1022 |
+
}
|
1023 |
+
},
|
1024 |
+
"is-relative": {
|
1025 |
+
"version": "1.0.0",
|
1026 |
+
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
|
1027 |
+
"integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
|
1028 |
+
"requires": {
|
1029 |
+
"is-unc-path": "^1.0.0"
|
1030 |
+
}
|
1031 |
+
},
|
1032 |
+
"is-unc-path": {
|
1033 |
+
"version": "1.0.0",
|
1034 |
+
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
|
1035 |
+
"integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
|
1036 |
+
"requires": {
|
1037 |
+
"unc-path-regex": "^0.1.2"
|
1038 |
+
}
|
1039 |
+
},
|
1040 |
+
"is-windows": {
|
1041 |
+
"version": "1.0.2",
|
1042 |
+
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
|
1043 |
+
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
|
1044 |
+
},
|
1045 |
+
"isarray": {
|
1046 |
+
"version": "1.0.0",
|
1047 |
+
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
1048 |
+
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
1049 |
+
},
|
1050 |
+
"isexe": {
|
1051 |
+
"version": "2.0.0",
|
1052 |
+
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
|
1053 |
+
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
|
1054 |
+
},
|
1055 |
+
"isobject": {
|
1056 |
+
"version": "3.0.1",
|
1057 |
+
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
|
1058 |
+
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
|
1059 |
+
},
|
1060 |
+
"js-yaml": {
|
1061 |
+
"version": "2.0.5",
|
1062 |
+
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz",
|
1063 |
+
"integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=",
|
1064 |
+
"dev": true,
|
1065 |
+
"requires": {
|
1066 |
+
"argparse": "~ 0.1.11",
|
1067 |
+
"esprima": "~ 1.0.2"
|
1068 |
+
}
|
1069 |
+
},
|
1070 |
+
"jshint": {
|
1071 |
+
"version": "2.1.11",
|
1072 |
+
"resolved": "https://registry.npmjs.org/jshint/-/jshint-2.1.11.tgz",
|
1073 |
+
"integrity": "sha1-61EI/vm6Xd67gwmD9XLSQuSeP5Y=",
|
1074 |
+
"dev": true,
|
1075 |
+
"requires": {
|
1076 |
+
"cli": "0.4.x",
|
1077 |
+
"console-browserify": "0.1.x",
|
1078 |
+
"minimatch": "0.x.x",
|
1079 |
+
"shelljs": "0.1.x",
|
1080 |
+
"underscore": "1.4.x"
|
1081 |
+
},
|
1082 |
+
"dependencies": {
|
1083 |
+
"underscore": {
|
1084 |
+
"version": "1.4.4",
|
1085 |
+
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz",
|
1086 |
+
"integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=",
|
1087 |
+
"dev": true
|
1088 |
+
}
|
1089 |
+
}
|
1090 |
+
},
|
1091 |
+
"kind-of": {
|
1092 |
+
"version": "6.0.3",
|
1093 |
+
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
1094 |
+
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
|
1095 |
+
},
|
1096 |
+
"liftoff": {
|
1097 |
+
"version": "2.5.0",
|
1098 |
+
"resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
|
1099 |
+
"integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
|
1100 |
+
"requires": {
|
1101 |
+
"extend": "^3.0.0",
|
1102 |
+
"findup-sync": "^2.0.0",
|
1103 |
+
"fined": "^1.0.1",
|
1104 |
+
"flagged-respawn": "^1.0.0",
|
1105 |
+
"is-plain-object": "^2.0.4",
|
1106 |
+
"object.map": "^1.0.0",
|
1107 |
+
"rechoir": "^0.6.2",
|
1108 |
+
"resolve": "^1.1.7"
|
1109 |
+
},
|
1110 |
+
"dependencies": {
|
1111 |
+
"findup-sync": {
|
1112 |
+
"version": "2.0.0",
|
1113 |
+
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
|
1114 |
+
"integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
|
1115 |
+
"requires": {
|
1116 |
+
"detect-file": "^1.0.0",
|
1117 |
+
"is-glob": "^3.1.0",
|
1118 |
+
"micromatch": "^3.0.4",
|
1119 |
+
"resolve-dir": "^1.0.1"
|
1120 |
+
}
|
1121 |
+
}
|
1122 |
+
}
|
1123 |
+
},
|
1124 |
+
"lodash": {
|
1125 |
+
"version": "0.9.2",
|
1126 |
+
"resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
|
1127 |
+
"integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=",
|
1128 |
+
"dev": true
|
1129 |
+
},
|
1130 |
+
"lru-cache": {
|
1131 |
+
"version": "2.7.3",
|
1132 |
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
|
1133 |
+
"integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
|
1134 |
+
"dev": true
|
1135 |
+
},
|
1136 |
+
"make-iterator": {
|
1137 |
+
"version": "1.0.1",
|
1138 |
+
"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
|
1139 |
+
"integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
|
1140 |
+
"requires": {
|
1141 |
+
"kind-of": "^6.0.2"
|
1142 |
+
}
|
1143 |
+
},
|
1144 |
+
"map-cache": {
|
1145 |
+
"version": "0.2.2",
|
1146 |
+
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
|
1147 |
+
"integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
|
1148 |
+
},
|
1149 |
+
"map-visit": {
|
1150 |
+
"version": "1.0.0",
|
1151 |
+
"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
|
1152 |
+
"integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
|
1153 |
+
"requires": {
|
1154 |
+
"object-visit": "^1.0.0"
|
1155 |
+
}
|
1156 |
+
},
|
1157 |
+
"micromatch": {
|
1158 |
+
"version": "3.1.10",
|
1159 |
+
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
|
1160 |
+
"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
|
1161 |
+
"requires": {
|
1162 |
+
"arr-diff": "^4.0.0",
|
1163 |
+
"array-unique": "^0.3.2",
|
1164 |
+
"braces": "^2.3.1",
|
1165 |
+
"define-property": "^2.0.2",
|
1166 |
+
"extend-shallow": "^3.0.2",
|
1167 |
+
"extglob": "^2.0.4",
|
1168 |
+
"fragment-cache": "^0.2.1",
|
1169 |
+
"kind-of": "^6.0.2",
|
1170 |
+
"nanomatch": "^1.2.9",
|
1171 |
+
"object.pick": "^1.3.0",
|
1172 |
+
"regex-not": "^1.0.0",
|
1173 |
+
"snapdragon": "^0.8.1",
|
1174 |
+
"to-regex": "^3.0.2"
|
1175 |
+
}
|
1176 |
+
},
|
1177 |
+
"minimatch": {
|
1178 |
+
"version": "0.2.14",
|
1179 |
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
|
1180 |
+
"integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
|
1181 |
+
"dev": true,
|
1182 |
+
"requires": {
|
1183 |
+
"lru-cache": "2",
|
1184 |
+
"sigmund": "~1.0.0"
|
1185 |
+
}
|
1186 |
+
},
|
1187 |
+
"mixin-deep": {
|
1188 |
+
"version": "1.3.2",
|
1189 |
+
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
|
1190 |
+
"integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
|
1191 |
+
"requires": {
|
1192 |
+
"for-in": "^1.0.2",
|
1193 |
+
"is-extendable": "^1.0.1"
|
1194 |
+
},
|
1195 |
+
"dependencies": {
|
1196 |
+
"is-extendable": {
|
1197 |
+
"version": "1.0.1",
|
1198 |
+
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
|
1199 |
+
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
|
1200 |
+
"requires": {
|
1201 |
+
"is-plain-object": "^2.0.4"
|
1202 |
+
}
|
1203 |
+
}
|
1204 |
+
}
|
1205 |
+
},
|
1206 |
+
"ms": {
|
1207 |
+
"version": "2.0.0",
|
1208 |
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
1209 |
+
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
1210 |
+
},
|
1211 |
+
"nanomatch": {
|
1212 |
+
"version": "1.2.13",
|
1213 |
+
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
|
1214 |
+
"integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
|
1215 |
+
"requires": {
|
1216 |
+
"arr-diff": "^4.0.0",
|
1217 |
+
"array-unique": "^0.3.2",
|
1218 |
+
"define-property": "^2.0.2",
|
1219 |
+
"extend-shallow": "^3.0.2",
|
1220 |
+
"fragment-cache": "^0.2.1",
|
1221 |
+
"is-windows": "^1.0.2",
|
1222 |
+
"kind-of": "^6.0.2",
|
1223 |
+
"object.pick": "^1.3.0",
|
1224 |
+
"regex-not": "^1.0.0",
|
1225 |
+
"snapdragon": "^0.8.1",
|
1226 |
+
"to-regex": "^3.0.1"
|
1227 |
+
}
|
1228 |
+
},
|
1229 |
+
"nopt": {
|
1230 |
+
"version": "1.0.10",
|
1231 |
+
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
|
1232 |
+
"integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
|
1233 |
+
"dev": true,
|
1234 |
+
"requires": {
|
1235 |
+
"abbrev": "1"
|
1236 |
+
}
|
1237 |
+
},
|
1238 |
+
"object-copy": {
|
1239 |
+
"version": "0.1.0",
|
1240 |
+
"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
|
1241 |
+
"integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
|
1242 |
+
"requires": {
|
1243 |
+
"copy-descriptor": "^0.1.0",
|
1244 |
+
"define-property": "^0.2.5",
|
1245 |
+
"kind-of": "^3.0.3"
|
1246 |
+
},
|
1247 |
+
"dependencies": {
|
1248 |
+
"define-property": {
|
1249 |
+
"version": "0.2.5",
|
1250 |
+
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
|
1251 |
+
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
|
1252 |
+
"requires": {
|
1253 |
+
"is-descriptor": "^0.1.0"
|
1254 |
+
}
|
1255 |
+
},
|
1256 |
+
"kind-of": {
|
1257 |
+
"version": "3.2.2",
|
1258 |
+
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
1259 |
+
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
1260 |
+
"requires": {
|
1261 |
+
"is-buffer": "^1.1.5"
|
1262 |
+
}
|
1263 |
+
}
|
1264 |
+
}
|
1265 |
+
},
|
1266 |
+
"object-visit": {
|
1267 |
+
"version": "1.0.1",
|
1268 |
+
"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
|
1269 |
+
"integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
|
1270 |
+
"requires": {
|
1271 |
+
"isobject": "^3.0.0"
|
1272 |
+
}
|
1273 |
+
},
|
1274 |
+
"object.defaults": {
|
1275 |
+
"version": "1.1.0",
|
1276 |
+
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
|
1277 |
+
"integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
|
1278 |
+
"requires": {
|
1279 |
+
"array-each": "^1.0.1",
|
1280 |
+
"array-slice": "^1.0.0",
|
1281 |
+
"for-own": "^1.0.0",
|
1282 |
+
"isobject": "^3.0.0"
|
1283 |
+
}
|
1284 |
+
},
|
1285 |
+
"object.map": {
|
1286 |
+
"version": "1.0.1",
|
1287 |
+
"resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
|
1288 |
+
"integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
|
1289 |
+
"requires": {
|
1290 |
+
"for-own": "^1.0.0",
|
1291 |
+
"make-iterator": "^1.0.0"
|
1292 |
+
}
|
1293 |
+
},
|
1294 |
+
"object.pick": {
|
1295 |
+
"version": "1.3.0",
|
1296 |
+
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
|
1297 |
+
"integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
|
1298 |
+
"requires": {
|
1299 |
+
"isobject": "^3.0.1"
|
1300 |
+
}
|
1301 |
+
},
|
1302 |
+
"os-homedir": {
|
1303 |
+
"version": "1.0.2",
|
1304 |
+
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
|
1305 |
+
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
|
1306 |
+
},
|
1307 |
+
"os-tmpdir": {
|
1308 |
+
"version": "1.0.2",
|
1309 |
+
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
1310 |
+
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
|
1311 |
+
},
|
1312 |
+
"osenv": {
|
1313 |
+
"version": "0.1.5",
|
1314 |
+
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
|
1315 |
+
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
|
1316 |
+
"requires": {
|
1317 |
+
"os-homedir": "^1.0.0",
|
1318 |
+
"os-tmpdir": "^1.0.0"
|
1319 |
+
}
|
1320 |
+
},
|
1321 |
+
"parse-filepath": {
|
1322 |
+
"version": "1.0.2",
|
1323 |
+
"resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
|
1324 |
+
"integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
|
1325 |
+
"requires": {
|
1326 |
+
"is-absolute": "^1.0.0",
|
1327 |
+
"map-cache": "^0.2.0",
|
1328 |
+
"path-root": "^0.1.1"
|
1329 |
+
}
|
1330 |
+
},
|
1331 |
+
"parse-passwd": {
|
1332 |
+
"version": "1.0.0",
|
1333 |
+
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
|
1334 |
+
"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
|
1335 |
+
},
|
1336 |
+
"pascalcase": {
|
1337 |
+
"version": "0.1.1",
|
1338 |
+
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
|
1339 |
+
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
|
1340 |
+
},
|
1341 |
+
"path-parse": {
|
1342 |
+
"version": "1.0.6",
|
1343 |
+
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
|
1344 |
+
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
|
1345 |
+
},
|
1346 |
+
"path-root": {
|
1347 |
+
"version": "0.1.1",
|
1348 |
+
"resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
|
1349 |
+
"integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
|
1350 |
+
"requires": {
|
1351 |
+
"path-root-regex": "^0.1.0"
|
1352 |
+
}
|
1353 |
+
},
|
1354 |
+
"path-root-regex": {
|
1355 |
+
"version": "0.1.2",
|
1356 |
+
"resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
|
1357 |
+
"integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0="
|
1358 |
+
},
|
1359 |
+
"posix-character-classes": {
|
1360 |
+
"version": "0.1.1",
|
1361 |
+
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
|
1362 |
+
"integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
|
1363 |
+
},
|
1364 |
+
"preprocess": {
|
1365 |
+
"version": "2.3.1",
|
1366 |
+
"resolved": "https://registry.npmjs.org/preprocess/-/preprocess-2.3.1.tgz",
|
1367 |
+
"integrity": "sha1-vaMCLmI+m1mdTAgoGG2FvZ8SxQA=",
|
1368 |
+
"dev": true
|
1369 |
+
},
|
1370 |
+
"rechoir": {
|
1371 |
+
"version": "0.6.2",
|
1372 |
+
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
|
1373 |
+
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
|
1374 |
+
"requires": {
|
1375 |
+
"resolve": "^1.1.6"
|
1376 |
+
}
|
1377 |
+
},
|
1378 |
+
"regex-not": {
|
1379 |
+
"version": "1.0.2",
|
1380 |
+
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
|
1381 |
+
"integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
|
1382 |
+
"requires": {
|
1383 |
+
"extend-shallow": "^3.0.2",
|
1384 |
+
"safe-regex": "^1.1.0"
|
1385 |
+
}
|
1386 |
+
},
|
1387 |
+
"repeat-element": {
|
1388 |
+
"version": "1.1.3",
|
1389 |
+
"resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
|
1390 |
+
"integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
|
1391 |
+
},
|
1392 |
+
"repeat-string": {
|
1393 |
+
"version": "1.6.1",
|
1394 |
+
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
1395 |
+
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
|
1396 |
+
},
|
1397 |
+
"resolve": {
|
1398 |
+
"version": "1.18.1",
|
1399 |
+
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
|
1400 |
+
"integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
|
1401 |
+
"requires": {
|
1402 |
+
"is-core-module": "^2.0.0",
|
1403 |
+
"path-parse": "^1.0.6"
|
1404 |
+
}
|
1405 |
+
},
|
1406 |
+
"resolve-dir": {
|
1407 |
+
"version": "1.0.1",
|
1408 |
+
"resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
|
1409 |
+
"integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
|
1410 |
+
"requires": {
|
1411 |
+
"expand-tilde": "^2.0.0",
|
1412 |
+
"global-modules": "^1.0.0"
|
1413 |
+
}
|
1414 |
+
},
|
1415 |
+
"resolve-url": {
|
1416 |
+
"version": "0.2.1",
|
1417 |
+
"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
|
1418 |
+
"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
|
1419 |
+
},
|
1420 |
+
"ret": {
|
1421 |
+
"version": "0.1.15",
|
1422 |
+
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
|
1423 |
+
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
|
1424 |
+
},
|
1425 |
+
"rimraf": {
|
1426 |
+
"version": "2.2.8",
|
1427 |
+
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
|
1428 |
+
"integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
|
1429 |
+
"dev": true
|
1430 |
+
},
|
1431 |
+
"safe-regex": {
|
1432 |
+
"version": "1.1.0",
|
1433 |
+
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
|
1434 |
+
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
|
1435 |
+
"requires": {
|
1436 |
+
"ret": "~0.1.10"
|
1437 |
+
}
|
1438 |
+
},
|
1439 |
+
"set-value": {
|
1440 |
+
"version": "2.0.1",
|
1441 |
+
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
|
1442 |
+
"integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
|
1443 |
+
"requires": {
|
1444 |
+
"extend-shallow": "^2.0.1",
|
1445 |
+
"is-extendable": "^0.1.1",
|
1446 |
+
"is-plain-object": "^2.0.3",
|
1447 |
+
"split-string": "^3.0.1"
|
1448 |
+
},
|
1449 |
+
"dependencies": {
|
1450 |
+
"extend-shallow": {
|
1451 |
+
"version": "2.0.1",
|
1452 |
+
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
|
1453 |
+
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
|
1454 |
+
"requires": {
|
1455 |
+
"is-extendable": "^0.1.0"
|
1456 |
+
}
|
1457 |
+
}
|
1458 |
+
}
|
1459 |
+
},
|
1460 |
+
"shelljs": {
|
1461 |
+
"version": "0.1.4",
|
1462 |
+
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz",
|
1463 |
+
"integrity": "sha1-37vnjVbDwBaNL7eeEOzR28sH7A4=",
|
1464 |
+
"dev": true
|
1465 |
+
},
|
1466 |
+
"sigmund": {
|
1467 |
+
"version": "1.0.1",
|
1468 |
+
"resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
|
1469 |
+
"integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
|
1470 |
+
"dev": true
|
1471 |
+
},
|
1472 |
+
"snapdragon": {
|
1473 |
+
"version": "0.8.2",
|
1474 |
+
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
|
1475 |
+
"integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
|
1476 |
+
"requires": {
|
1477 |
+
"base": "^0.11.1",
|
1478 |
+
"debug": "^2.2.0",
|
1479 |
+
"define-property": "^0.2.5",
|
1480 |
+
"extend-shallow": "^2.0.1",
|
1481 |
+
"map-cache": "^0.2.2",
|
1482 |
+
"source-map": "^0.5.6",
|
1483 |
+
"source-map-resolve": "^0.5.0",
|
1484 |
+
"use": "^3.1.0"
|
1485 |
+
},
|
1486 |
+
"dependencies": {
|
1487 |
+
"define-property": {
|
1488 |
+
"version": "0.2.5",
|
1489 |
+
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
|
1490 |
+
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
|
1491 |
+
"requires": {
|
1492 |
+
"is-descriptor": "^0.1.0"
|
1493 |
+
}
|
1494 |
+
},
|
1495 |
+
"extend-shallow": {
|
1496 |
+
"version": "2.0.1",
|
1497 |
+
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
|
1498 |
+
"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
|
1499 |
+
"requires": {
|
1500 |
+
"is-extendable": "^0.1.0"
|
1501 |
+
}
|
1502 |
+
},
|
1503 |
+
"source-map": {
|
1504 |
+
"version": "0.5.7",
|
1505 |
+
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
|
1506 |
+
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
|
1507 |
+
}
|
1508 |
+
}
|
1509 |
+
},
|
1510 |
+
"snapdragon-node": {
|
1511 |
+
"version": "2.1.1",
|
1512 |
+
"resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
|
1513 |
+
"integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
|
1514 |
+
"requires": {
|
1515 |
+
"define-property": "^1.0.0",
|
1516 |
+
"isobject": "^3.0.0",
|
1517 |
+
"snapdragon-util": "^3.0.1"
|
1518 |
+
},
|
1519 |
+
"dependencies": {
|
1520 |
+
"define-property": {
|
1521 |
+
"version": "1.0.0",
|
1522 |
+
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
|
1523 |
+
"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
|
1524 |
+
"requires": {
|
1525 |
+
"is-descriptor": "^1.0.0"
|
1526 |
+
}
|
1527 |
+
},
|
1528 |
+
"is-accessor-descriptor": {
|
1529 |
+
"version": "1.0.0",
|
1530 |
+
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
|
1531 |
+
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
|
1532 |
+
"requires": {
|
1533 |
+
"kind-of": "^6.0.0"
|
1534 |
+
}
|
1535 |
+
},
|
1536 |
+
"is-data-descriptor": {
|
1537 |
+
"version": "1.0.0",
|
1538 |
+
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
|
1539 |
+
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
|
1540 |
+
"requires": {
|
1541 |
+
"kind-of": "^6.0.0"
|
1542 |
+
}
|
1543 |
+
},
|
1544 |
+
"is-descriptor": {
|
1545 |
+
"version": "1.0.2",
|
1546 |
+
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
|
1547 |
+
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
|
1548 |
+
"requires": {
|
1549 |
+
"is-accessor-descriptor": "^1.0.0",
|
1550 |
+
"is-data-descriptor": "^1.0.0",
|
1551 |
+
"kind-of": "^6.0.2"
|
1552 |
+
}
|
1553 |
+
}
|
1554 |
+
}
|
1555 |
+
},
|
1556 |
+
"snapdragon-util": {
|
1557 |
+
"version": "3.0.1",
|
1558 |
+
"resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
|
1559 |
+
"integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
|
1560 |
+
"requires": {
|
1561 |
+
"kind-of": "^3.2.0"
|
1562 |
+
},
|
1563 |
+
"dependencies": {
|
1564 |
+
"kind-of": {
|
1565 |
+
"version": "3.2.2",
|
1566 |
+
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
1567 |
+
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
1568 |
+
"requires": {
|
1569 |
+
"is-buffer": "^1.1.5"
|
1570 |
+
}
|
1571 |
+
}
|
1572 |
+
}
|
1573 |
+
},
|
1574 |
+
"source-map": {
|
1575 |
+
"version": "0.1.34",
|
1576 |
+
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz",
|
1577 |
+
"integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=",
|
1578 |
+
"dev": true,
|
1579 |
+
"requires": {
|
1580 |
+
"amdefine": ">=0.0.4"
|
1581 |
+
}
|
1582 |
+
},
|
1583 |
+
"source-map-resolve": {
|
1584 |
+
"version": "0.5.3",
|
1585 |
+
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
|
1586 |
+
"integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
|
1587 |
+
"requires": {
|
1588 |
+
"atob": "^2.1.2",
|
1589 |
+
"decode-uri-component": "^0.2.0",
|
1590 |
+
"resolve-url": "^0.2.1",
|
1591 |
+
"source-map-url": "^0.4.0",
|
1592 |
+
"urix": "^0.1.0"
|
1593 |
+
}
|
1594 |
+
},
|
1595 |
+
"source-map-url": {
|
1596 |
+
"version": "0.4.0",
|
1597 |
+
"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
|
1598 |
+
"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
|
1599 |
+
},
|
1600 |
+
"split-string": {
|
1601 |
+
"version": "3.1.0",
|
1602 |
+
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
|
1603 |
+
"integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
|
1604 |
+
"requires": {
|
1605 |
+
"extend-shallow": "^3.0.0"
|
1606 |
+
}
|
1607 |
+
},
|
1608 |
+
"static-extend": {
|
1609 |
+
"version": "0.1.2",
|
1610 |
+
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
|
1611 |
+
"integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
|
1612 |
+
"requires": {
|
1613 |
+
"define-property": "^0.2.5",
|
1614 |
+
"object-copy": "^0.1.0"
|
1615 |
+
},
|
1616 |
+
"dependencies": {
|
1617 |
+
"define-property": {
|
1618 |
+
"version": "0.2.5",
|
1619 |
+
"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
|
1620 |
+
"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
|
1621 |
+
"requires": {
|
1622 |
+
"is-descriptor": "^0.1.0"
|
1623 |
+
}
|
1624 |
+
}
|
1625 |
+
}
|
1626 |
+
},
|
1627 |
+
"to-object-path": {
|
1628 |
+
"version": "0.3.0",
|
1629 |
+
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
|
1630 |
+
"integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
|
1631 |
+
"requires": {
|
1632 |
+
"kind-of": "^3.0.2"
|
1633 |
+
},
|
1634 |
+
"dependencies": {
|
1635 |
+
"kind-of": {
|
1636 |
+
"version": "3.2.2",
|
1637 |
+
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
1638 |
+
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
|
1639 |
+
"requires": {
|
1640 |
+
"is-buffer": "^1.1.5"
|
1641 |
+
}
|
1642 |
+
}
|
1643 |
+
}
|
1644 |
+
},
|
1645 |
+
"to-regex": {
|
1646 |
+
"version": "3.0.2",
|
1647 |
+
"resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
|
1648 |
+
"integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
|
1649 |
+
"requires": {
|
1650 |
+
"define-property": "^2.0.2",
|
1651 |
+
"extend-shallow": "^3.0.2",
|
1652 |
+
"regex-not": "^1.0.2",
|
1653 |
+
"safe-regex": "^1.1.0"
|
1654 |
+
}
|
1655 |
+
},
|
1656 |
+
"to-regex-range": {
|
1657 |
+
"version": "2.1.1",
|
1658 |
+
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
|
1659 |
+
"integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
|
1660 |
+
"requires": {
|
1661 |
+
"is-number": "^3.0.0",
|
1662 |
+
"repeat-string": "^1.6.1"
|
1663 |
+
}
|
1664 |
+
},
|
1665 |
+
"uglify-js": {
|
1666 |
+
"version": "2.4.24",
|
1667 |
+
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz",
|
1668 |
+
"integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=",
|
1669 |
+
"dev": true,
|
1670 |
+
"requires": {
|
1671 |
+
"async": "~0.2.6",
|
1672 |
+
"source-map": "0.1.34",
|
1673 |
+
"uglify-to-browserify": "~1.0.0",
|
1674 |
+
"yargs": "~3.5.4"
|
1675 |
+
},
|
1676 |
+
"dependencies": {
|
1677 |
+
"async": {
|
1678 |
+
"version": "0.2.10",
|
1679 |
+
"resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
|
1680 |
+
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
|
1681 |
+
"dev": true
|
1682 |
+
}
|
1683 |
+
}
|
1684 |
+
},
|
1685 |
+
"uglify-to-browserify": {
|
1686 |
+
"version": "1.0.2",
|
1687 |
+
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
|
1688 |
+
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
|
1689 |
+
"dev": true
|
1690 |
+
},
|
1691 |
+
"unc-path-regex": {
|
1692 |
+
"version": "0.1.2",
|
1693 |
+
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
|
1694 |
+
"integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
|
1695 |
+
},
|
1696 |
+
"underscore": {
|
1697 |
+
"version": "1.7.0",
|
1698 |
+
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
|
1699 |
+
"integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
|
1700 |
+
"dev": true
|
1701 |
+
},
|
1702 |
+
"underscore.string": {
|
1703 |
+
"version": "2.2.1",
|
1704 |
+
"resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
|
1705 |
+
"integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
|
1706 |
+
"dev": true
|
1707 |
+
},
|
1708 |
+
"union-value": {
|
1709 |
+
"version": "1.0.1",
|
1710 |
+
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
|
1711 |
+
"integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
|
1712 |
+
"requires": {
|
1713 |
+
"arr-union": "^3.1.0",
|
1714 |
+
"get-value": "^2.0.6",
|
1715 |
+
"is-extendable": "^0.1.1",
|
1716 |
+
"set-value": "^2.0.1"
|
1717 |
+
}
|
1718 |
+
},
|
1719 |
+
"unset-value": {
|
1720 |
+
"version": "1.0.0",
|
1721 |
+
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
|
1722 |
+
"integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
|
1723 |
+
"requires": {
|
1724 |
+
"has-value": "^0.3.1",
|
1725 |
+
"isobject": "^3.0.0"
|
1726 |
+
},
|
1727 |
+
"dependencies": {
|
1728 |
+
"has-value": {
|
1729 |
+
"version": "0.3.1",
|
1730 |
+
"resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
|
1731 |
+
"integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
|
1732 |
+
"requires": {
|
1733 |
+
"get-value": "^2.0.3",
|
1734 |
+
"has-values": "^0.1.4",
|
1735 |
+
"isobject": "^2.0.0"
|
1736 |
+
},
|
1737 |
+
"dependencies": {
|
1738 |
+
"isobject": {
|
1739 |
+
"version": "2.1.0",
|
1740 |
+
"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
|
1741 |
+
"integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
|
1742 |
+
"requires": {
|
1743 |
+
"isarray": "1.0.0"
|
1744 |
+
}
|
1745 |
+
}
|
1746 |
+
}
|
1747 |
+
},
|
1748 |
+
"has-values": {
|
1749 |
+
"version": "0.1.4",
|
1750 |
+
"resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
|
1751 |
+
"integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
|
1752 |
+
}
|
1753 |
+
}
|
1754 |
+
},
|
1755 |
+
"urix": {
|
1756 |
+
"version": "0.1.0",
|
1757 |
+
"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
|
1758 |
+
"integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
|
1759 |
+
},
|
1760 |
+
"use": {
|
1761 |
+
"version": "3.1.1",
|
1762 |
+
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
|
1763 |
+
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
|
1764 |
+
},
|
1765 |
+
"v8flags": {
|
1766 |
+
"version": "3.1.3",
|
1767 |
+
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
|
1768 |
+
"integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
|
1769 |
+
"requires": {
|
1770 |
+
"homedir-polyfill": "^1.0.1"
|
1771 |
+
}
|
1772 |
+
},
|
1773 |
+
"which": {
|
1774 |
+
"version": "1.0.9",
|
1775 |
+
"resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz",
|
1776 |
+
"integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=",
|
1777 |
+
"dev": true
|
1778 |
+
},
|
1779 |
+
"window-size": {
|
1780 |
+
"version": "0.1.0",
|
1781 |
+
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
|
1782 |
+
"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
|
1783 |
+
"dev": true
|
1784 |
+
},
|
1785 |
+
"wordwrap": {
|
1786 |
+
"version": "0.0.2",
|
1787 |
+
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
|
1788 |
+
"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
|
1789 |
+
"dev": true
|
1790 |
+
},
|
1791 |
+
"yargs": {
|
1792 |
+
"version": "3.5.4",
|
1793 |
+
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz",
|
1794 |
+
"integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=",
|
1795 |
+
"dev": true,
|
1796 |
+
"requires": {
|
1797 |
+
"camelcase": "^1.0.2",
|
1798 |
+
"decamelize": "^1.0.0",
|
1799 |
+
"window-size": "0.1.0",
|
1800 |
+
"wordwrap": "0.0.2"
|
1801 |
+
}
|
1802 |
+
},
|
1803 |
+
"zlib-browserify": {
|
1804 |
+
"version": "0.0.1",
|
1805 |
+
"resolved": "https://registry.npmjs.org/zlib-browserify/-/zlib-browserify-0.0.1.tgz",
|
1806 |
+
"integrity": "sha1-T6akXQDbwV8xikr6HZr8Aljhdsw=",
|
1807 |
+
"dev": true
|
1808 |
+
}
|
1809 |
+
}
|
1810 |
+
}
|
libs/factory/clearfy/assets/css/clearfy-base.css
DELETED
@@ -1,181 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Базовые стили для всех копомпонентов Clearfy
|
3 |
-
|
4 |
-
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
5 |
-
* @copyright Webcraftic 06.10.2018
|
6 |
-
* @sicne 2.0.5
|
7 |
-
*/
|
8 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion {
|
9 |
-
padding: 30px 80px;
|
10 |
-
}
|
11 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion h3 {
|
12 |
-
margin: 0 0 20px;
|
13 |
-
}
|
14 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-inner-contanier {
|
15 |
-
border: 2px dashed #8bc34a;
|
16 |
-
background: #fff;
|
17 |
-
padding: 20px;
|
18 |
-
}
|
19 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-activate-premium {
|
20 |
-
display: inline-block;
|
21 |
-
cursor: pointer;
|
22 |
-
line-height: 16px;
|
23 |
-
font-size: 13px;
|
24 |
-
font-weight: 600;
|
25 |
-
padding: 12px 20px;
|
26 |
-
text-align: center;
|
27 |
-
text-decoration: none;
|
28 |
-
text-transform: uppercase;
|
29 |
-
border-radius: 2px;
|
30 |
-
-moz-border-radius: 2px;
|
31 |
-
-webkit-border-radius: 2px;
|
32 |
-
color: #353535;
|
33 |
-
background: #e8e8e8;
|
34 |
-
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
|
35 |
-
-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
|
36 |
-
-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
|
37 |
-
}
|
38 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-activate-premium:active {
|
39 |
-
box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
|
40 |
-
-moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
|
41 |
-
-webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
|
42 |
-
}
|
43 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-activate-premium:focus {
|
44 |
-
outline: none;
|
45 |
-
border: 0;
|
46 |
-
}
|
47 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-purchase-premium {
|
48 |
-
display: inline-block;
|
49 |
-
cursor: pointer;
|
50 |
-
line-height: 16px;
|
51 |
-
font-size: 13px;
|
52 |
-
font-weight: 600;
|
53 |
-
padding: 12px 20px;
|
54 |
-
text-align: center;
|
55 |
-
text-decoration: none;
|
56 |
-
text-transform: uppercase;
|
57 |
-
border-radius: 2px;
|
58 |
-
-moz-border-radius: 2px;
|
59 |
-
-webkit-border-radius: 2px;
|
60 |
-
color: #755c0e;
|
61 |
-
background: #fdd868;
|
62 |
-
box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
|
63 |
-
-moz-box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
|
64 |
-
-webkit-box-shadow: 0 1px 0 rgba(60, 45, 2, 0.31);
|
65 |
-
}
|
66 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-purchase-premium:active {
|
67 |
-
box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
|
68 |
-
-moz-box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
|
69 |
-
-webkit-box-shadow: inset 0 1px 0 rgba(60, 45, 2, 0.31);
|
70 |
-
}
|
71 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-suggetion .wbcr-factory-purchase-premium:focus {
|
72 |
-
outline: none;
|
73 |
-
border: 0;
|
74 |
-
}
|
75 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion {
|
76 |
-
background: #fff;
|
77 |
-
color: #353535;
|
78 |
-
font-weight: 600;
|
79 |
-
border: 2px dashed #8bc34a;
|
80 |
-
}
|
81 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion h3 {
|
82 |
-
margin: 0 0 20px;
|
83 |
-
padding: 10px 0;
|
84 |
-
text-align: center;
|
85 |
-
border-bottom: 2px solid #e6e6e6;
|
86 |
-
color: #636363;
|
87 |
-
font-size: 17px;
|
88 |
-
font-weight: 600;
|
89 |
-
vertical-align: middle;
|
90 |
-
text-transform: uppercase;
|
91 |
-
}
|
92 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul {
|
93 |
-
position: relative;
|
94 |
-
margin-bottom: 20px;
|
95 |
-
}
|
96 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li {
|
97 |
-
font-size: 15px;
|
98 |
-
padding: 7px;
|
99 |
-
padding-left: 20px;
|
100 |
-
}
|
101 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li:before {
|
102 |
-
content: " ";
|
103 |
-
display: inline-block;
|
104 |
-
width: 0.4em;
|
105 |
-
height: 0.7em;
|
106 |
-
border: solid #8bc34a;
|
107 |
-
border-width: 0 0.2em 0.2em 0;
|
108 |
-
left: 0;
|
109 |
-
margin-right: 10px;
|
110 |
-
-webkit-transform: rotate(45deg);
|
111 |
-
-moz-transform: rotate(45deg);
|
112 |
-
-o-transform: rotate(45deg);
|
113 |
-
transform: rotate(45deg);
|
114 |
-
}
|
115 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium {
|
116 |
-
display: block;
|
117 |
-
cursor: pointer;
|
118 |
-
line-height: 16px;
|
119 |
-
font-size: 13px;
|
120 |
-
font-weight: 600;
|
121 |
-
padding: 12px 20px;
|
122 |
-
text-align: center;
|
123 |
-
text-decoration: none;
|
124 |
-
text-transform: uppercase;
|
125 |
-
border-radius: 2px;
|
126 |
-
-moz-border-radius: 2px;
|
127 |
-
-webkit-border-radius: 2px;
|
128 |
-
color: #353535;
|
129 |
-
background: #e8e8e8;
|
130 |
-
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
|
131 |
-
-moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
|
132 |
-
-webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
|
133 |
-
}
|
134 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium:active {
|
135 |
-
box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
|
136 |
-
-moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
|
137 |
-
-webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.2);
|
138 |
-
}
|
139 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium:focus {
|
140 |
-
outline: none;
|
141 |
-
border: 0;
|
142 |
-
}
|
143 |
-
@media screen and (max-width: 1550px) {
|
144 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-clearfy-212-multisite-pro-suggetion {
|
145 |
-
padding: 10px 80px;
|
146 |
-
}
|
147 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion {
|
148 |
-
padding: 10px;
|
149 |
-
}
|
150 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion h3 {
|
151 |
-
margin: 0 0 20px;
|
152 |
-
padding: 10px 0;
|
153 |
-
font-size: 13px;
|
154 |
-
font-weight: 600;
|
155 |
-
}
|
156 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul {
|
157 |
-
margin-bottom: 20px;
|
158 |
-
}
|
159 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li {
|
160 |
-
font-size: 13px;
|
161 |
-
padding: 2px;
|
162 |
-
padding-left: 10px;
|
163 |
-
}
|
164 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion ul li:before {
|
165 |
-
width: 0.4em;
|
166 |
-
height: 0.7em;
|
167 |
-
border-width: 0 0.2em 0.2em 0;
|
168 |
-
left: 0;
|
169 |
-
margin-right: 10px;
|
170 |
-
}
|
171 |
-
#WBCR .wbcr-factory-pages-420-impressive-page-template .wbcr-factory-right-sidebar-section .wbcr-factory-clearfy-212-pro-suggettion .wbcr-factory-purchase-premium {
|
172 |
-
font-weight: 700;
|
173 |
-
line-height: 16px;
|
174 |
-
font-size: 12px;
|
175 |
-
padding: 8px 12px;
|
176 |
-
border-radius: 2px;
|
177 |
-
-moz-border-radius: 2px;
|
178 |
-
-webkit-border-radius: 2px;
|
179 |
-
}
|
180 |
-
}
|
181 |
-
/*# sourceMappingURL=clearfy-base.css.map */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/clearfy/assets/js/globals.js
DELETED
@@ -1,203 +0,0 @@
|
|
1 |
-
/*!
|
2 |
-
* Глобальный JS файл, который регистрирует глобальные переменные с общими методами для всех компонентов Clearfy
|
3 |
-
* и самого Clearfy.
|
4 |
-
*
|
5 |
-
* $.wbcr_factory_clearfy_212.app - методы для работы с приложением. Скрыть, показать уведомления.
|
6 |
-
* $.wbcr_factory_clearfy_212.hooks - это иммитация хуков и фильтров аналогично тем, что используются в Wordpress
|
7 |
-
*
|
8 |
-
* Copyright 2018, Webcraftic, http://webcraftic.com
|
9 |
-
*
|
10 |
-
* @since 2.0.5
|
11 |
-
* @pacakge clearfy
|
12 |
-
*/
|
13 |
-
(function($) {
|
14 |
-
'use strict';
|
15 |
-
|
16 |
-
if( !$.wbcr_factory_clearfy_212 ) {
|
17 |
-
$.wbcr_factory_clearfy_212 = {};
|
18 |
-
}
|
19 |
-
|
20 |
-
$.wbcr_factory_clearfy_212.app = $.wbcr_factory_clearfy_212.app || {
|
21 |
-
/**
|
22 |
-
* Создает и показывает уведомление внутри интерфейса Clearfy
|
23 |
-
*
|
24 |
-
* @param {string} message - сообщение об ошибке или предупреждение
|
25 |
-
* @param {string} type - тип уведомления (error, warning, success)
|
26 |
-
*/
|
27 |
-
showNotice: function(message, type) {
|
28 |
-
var noticeContanier = $('<div></div>'),
|
29 |
-
noticeInnerWrap = $('<p></p>'),
|
30 |
-
dashicon = $('<span></span>'),
|
31 |
-
dashiconClass,
|
32 |
-
noticeId = this.makeid();
|
33 |
-
|
34 |
-
if( !type ) {
|
35 |
-
type = 'warning';
|
36 |
-
}
|
37 |
-
|
38 |
-
noticeContanier.addClass('alert', 'wbcr-factory-warning-notice')
|
39 |
-
.addClass('alert-' + type).addClass('wbcr-factory-' + type + '-notice');
|
40 |
-
|
41 |
-
noticeContanier.append(noticeInnerWrap);
|
42 |
-
noticeContanier.attr('id', 'uq-' + noticeId);
|
43 |
-
|
44 |
-
if( type == 'success' ) {
|
45 |
-
dashiconClass = 'dashicons-plus';
|
46 |
-
} else if( type == 'error' ) {
|
47 |
-
dashiconClass = 'dashicons-no';
|
48 |
-
} else {
|
49 |
-
dashiconClass = 'dashicons-warning';
|
50 |
-
}
|
51 |
-
|
52 |
-
dashicon.addClass('dashicons').addClass(dashiconClass);
|
53 |
-
noticeInnerWrap.prepend(dashicon);
|
54 |
-
dashicon.after(message);
|
55 |
-
|
56 |
-
$([document.documentElement, document.body]).animate({
|
57 |
-
scrollTop: $('.wbcr-factory-content').offset().top - 100
|
58 |
-
}, 300, function() {
|
59 |
-
noticeContanier.hide();
|
60 |
-
$('.wbcr-factory-content').prepend(noticeContanier);
|
61 |
-
noticeContanier.fadeIn();
|
62 |
-
|
63 |
-
/**
|
64 |
-
* Хук выполняет проивольную функцию, после того как уведомление отображено
|
65 |
-
* Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
|
66 |
-
* Пример регистрации хука $.wbcr_factory_clearfy_212.hooks.add('wbcr/factory_clearfy_212/updated',
|
67 |
-
* function(noticeId) {});
|
68 |
-
* @param {string} noticeId - id уведомления
|
69 |
-
*/
|
70 |
-
$.wbcr_factory_clearfy_212.hooks.run('wbcr/factory_clearfy_212/showed_notice', [noticeId]);
|
71 |
-
$.wbcr_factory_clearfy_212.hooks.run('wbcr/clearfy/showed_notice', [noticeId]);
|
72 |
-
});
|
73 |
-
|
74 |
-
return noticeId;
|
75 |
-
},
|
76 |
-
|
77 |
-
/**
|
78 |
-
* Удаляет уведомление из интерфейса Clearfy
|
79 |
-
*
|
80 |
-
* @param {string} noticeId - id уведомления
|
81 |
-
*/
|
82 |
-
hideNotice: function(noticeId) {
|
83 |
-
var el;
|
84 |
-
if( !noticeId ) {
|
85 |
-
el = $('.wbcr-factory-content').find('.alert');
|
86 |
-
} else {
|
87 |
-
el = $('#uq-' + noticeId);
|
88 |
-
}
|
89 |
-
|
90 |
-
el.fadeOut(500, function(e) {
|
91 |
-
$(e).remove();
|
92 |
-
|
93 |
-
/**
|
94 |
-
* Хук выполняет проивольную функцию, после того как уведомление скрыто
|
95 |
-
* Реализация системы фильтров и хуков в файле libs/clearfy/admin/assests/js/global.js
|
96 |
-
* Пример регистрации хука $.wbcr_factory_clearfy_212.hooks.add('wbcr/factory_clearfy_212/updated',
|
97 |
-
* function(noticeId)
|
98 |
-
* {});
|
99 |
-
* @param {string} noticeId - id уведомления
|
100 |
-
*/
|
101 |
-
$.wbcr_factory_clearfy_212.hooks.run('wbcr/factory_clearfy_212/hidded_notice', [noticeId]);
|
102 |
-
$.wbcr_factory_clearfy_212.hooks.run('wbcr/clearfy/hidded_notice', [noticeId]);
|
103 |
-
});
|
104 |
-
},
|
105 |
-
|
106 |
-
makeid: function() {
|
107 |
-
var text = "";
|
108 |
-
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
109 |
-
|
110 |
-
for( var i = 0; i < 32; i++ ) {
|
111 |
-
text += possible.charAt(Math.floor(Math.random() * possible.length));
|
112 |
-
}
|
113 |
-
|
114 |
-
return text;
|
115 |
-
}
|
116 |
-
|
117 |
-
};
|
118 |
-
|
119 |
-
$.wbcr_factory_clearfy_212.filters = $.wbcr_factory_clearfy_212.filters || {
|
120 |
-
|
121 |
-
/**
|
122 |
-
* A set of registered filters.
|
123 |
-
*/
|
124 |
-
_items: {},
|
125 |
-
|
126 |
-
/**
|
127 |
-
* A set of priorities of registered filters.
|
128 |
-
*/
|
129 |
-
_priorities: {},
|
130 |
-
|
131 |
-
/**
|
132 |
-
* Applies filters to a given input value.
|
133 |
-
*/
|
134 |
-
run: function(filterName, args) {
|
135 |
-
var input = args && args.length > 0 ? args[0] : null;
|
136 |
-
if( !this._items[filterName] ) {
|
137 |
-
return input;
|
138 |
-
}
|
139 |
-
|
140 |
-
for( var i in this._priorities[filterName] ) {
|
141 |
-
if( !this._priorities[filterName].hasOwnProperty(i) ) {
|
142 |
-
continue;
|
143 |
-
}
|
144 |
-
|
145 |
-
var priority = this._priorities[filterName][i];
|
146 |
-
|
147 |
-
for( var k = 0; k < this._items[filterName][priority].length; k++ ) {
|
148 |
-
var f = this._items[filterName][priority][k];
|
149 |
-
input = f.apply(f, args);
|
150 |
-
}
|
151 |
-
}
|
152 |
-
|
153 |
-
return input;
|
154 |
-
},
|
155 |
-
|
156 |
-
/**
|
157 |
-
* Registers a new filter.
|
158 |
-
*/
|
159 |
-
add: function(filterName, callback, priority) {
|
160 |
-
|
161 |
-
if( !priority ) {
|
162 |
-
priority = 10;
|
163 |
-
}
|
164 |
-
|
165 |
-
if( !this._items[filterName] ) {
|
166 |
-
this._items[filterName] = {};
|
167 |
-
}
|
168 |
-
if( !this._items[filterName][priority] ) {
|
169 |
-
this._items[filterName][priority] = [];
|
170 |
-
}
|
171 |
-
this._items[filterName][priority].push(callback);
|
172 |
-
|
173 |
-
if( !this._priorities[filterName] ) {
|
174 |
-
this._priorities[filterName] = [];
|
175 |
-
}
|
176 |
-
if( $.inArray(priority, this._priorities[filterName]) === -1 ) {
|
177 |
-
this._priorities[filterName].push(priority);
|
178 |
-
}
|
179 |
-
|
180 |
-
this._priorities[filterName].sort(function(a, b) {
|
181 |
-
return a - b;
|
182 |
-
});
|
183 |
-
}
|
184 |
-
};
|
185 |
-
|
186 |
-
$.wbcr_factory_clearfy_212.hooks = $.wbcr_factory_clearfy_212.hooks || {
|
187 |
-
|
188 |
-
/**
|
189 |
-
* Applies filters to a given input value.
|
190 |
-
*/
|
191 |
-
run: function(filterName, args) {
|
192 |
-
$.wbcr_factory_clearfy_212.filters.run(filterName, args);
|
193 |
-
},
|
194 |
-
|
195 |
-
/**
|
196 |
-
* Registers a new filter.
|
197 |
-
*/
|
198 |
-
add: function(filterName, callback, priority) {
|
199 |
-
$.wbcr_factory_clearfy_212.filters.add(filterName, callback, priority);
|
200 |
-
}
|
201 |
-
};
|
202 |
-
|
203 |
-
})(jQuery);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/clearfy/boot.php
DELETED
@@ -1,49 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Factory clearfy
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
6 |
-
* @since 1.0.0
|
7 |
-
* @package clearfy
|
8 |
-
* @copyright (c) 2018, Webcraftic Ltd
|
9 |
-
*
|
10 |
-
*/
|
11 |
-
|
12 |
-
// Exit if accessed directly
|
13 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
-
exit;
|
15 |
-
}
|
16 |
-
|
17 |
-
if ( defined( 'FACTORY_CLEARFY_212_LOADED' ) ) {
|
18 |
-
return;
|
19 |
-
}
|
20 |
-
|
21 |
-
define( 'FACTORY_CLEARFY_212_LOADED', true );
|
22 |
-
|
23 |
-
define( 'FACTORY_CLEARFY_212', '2.1.2' );
|
24 |
-
|
25 |
-
define( 'FACTORY_CLEARFY_212_DIR', dirname( __FILE__ ) );
|
26 |
-
define( 'FACTORY_CLEARFY_212_URL', plugins_url( null, __FILE__ ) );
|
27 |
-
|
28 |
-
load_plugin_textdomain( 'wbcr_factory_clearfy_212', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' );
|
29 |
-
|
30 |
-
require( FACTORY_CLEARFY_212_DIR . '/includes/ajax-handlers.php' );
|
31 |
-
require( FACTORY_CLEARFY_212_DIR . '/includes/class-helpers.php' );
|
32 |
-
require( FACTORY_CLEARFY_212_DIR . '/includes/class-configurate.php' );
|
33 |
-
|
34 |
-
// module provides function only for the admin area
|
35 |
-
if ( is_admin() ) {
|
36 |
-
/**
|
37 |
-
* Подключаем скрипты для установки компонентов Clearfy
|
38 |
-
* на все страницы админпанели.
|
39 |
-
*/
|
40 |
-
add_action( 'admin_enqueue_scripts', function () {
|
41 |
-
wp_enqueue_script( 'wbcr-factory-clearfy-212-global', FACTORY_CLEARFY_212_URL . '/assets/js/globals.js', [ 'jquery' ], FACTORY_CLEARFY_212 );
|
42 |
-
} );
|
43 |
-
|
44 |
-
if ( defined( 'FACTORY_PAGES_420_LOADED' ) ) {
|
45 |
-
require( FACTORY_CLEARFY_212_DIR . '/pages/class-pages.php' );
|
46 |
-
require( FACTORY_CLEARFY_212_DIR . '/pages/class-page-more-features.php' );
|
47 |
-
require( FACTORY_CLEARFY_212_DIR . '/pages/class-page-license.php' );
|
48 |
-
}
|
49 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/clearfy/includes/ajax-handlers.php
DELETED
@@ -1,92 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Ajax handlers
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
6 |
-
* @copyright (c) 2017 Webraftic Ltd
|
7 |
-
* @version 1.0
|
8 |
-
*/
|
9 |
-
|
10 |
-
// Exit if accessed directly
|
11 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
12 |
-
exit;
|
13 |
-
}
|
14 |
-
|
15 |
-
/**
|
16 |
-
* Обработчик ajax запросов для проверки, активации, деактивации лицензионного ключа
|
17 |
-
*
|
18 |
-
* @since 2.0.7
|
19 |
-
*
|
20 |
-
* @param Wbcr_Factory420_Plugin $plugin_instance
|
21 |
-
*
|
22 |
-
*/
|
23 |
-
function wbcr_factory_clearfy_212_check_license( $plugin_instance ) {
|
24 |
-
check_admin_referer( 'license' );
|
25 |
-
|
26 |
-
$action = $plugin_instance->request->post( 'license_action', false, true );
|
27 |
-
$license_key = $plugin_instance->request->post( 'licensekey', null );
|
28 |
-
|
29 |
-
if ( empty( $action ) || ! in_array( $action, [ 'activate', 'deactivate', 'sync', 'unsubscribe' ] ) ) {
|
30 |
-
wp_send_json_error( [ 'error_message' => __( 'Licensing action not passed or this action is prohibited!', 'wbcr_factory_clearfy_212' ) ] );
|
31 |
-
die();
|
32 |
-
}
|
33 |
-
|
34 |
-
$result = null;
|
35 |
-
$success_message = '';
|
36 |
-
|
37 |
-
try {
|
38 |
-
switch ( $action ) {
|
39 |
-
case 'activate':
|
40 |
-
if ( empty( $license_key ) || strlen( $license_key ) > 32 ) {
|
41 |
-
wp_send_json_error( [ 'error_message' => __( 'License key is empty or license key too long (license key is 32 characters long)', 'wbcr_factory_clearfy_212' ) ] );
|
42 |
-
} else {
|
43 |
-
$plugin_instance->premium->activate( $license_key );
|
44 |
-
$success_message = __( 'Your license has been successfully activated', 'wbcr_factory_clearfy_212' );
|
45 |
-
}
|
46 |
-
break;
|
47 |
-
case 'deactivate':
|
48 |
-
$plugin_instance->premium->deactivate();
|
49 |
-
$success_message = __( 'The license is deactivated', 'wbcr_factory_clearfy_212' );
|
50 |
-
break;
|
51 |
-
case 'sync':
|
52 |
-
$plugin_instance->premium->sync();
|
53 |
-
$success_message = __( 'The license has been updated', 'wbcr_factory_clearfy_212' );
|
54 |
-
break;
|
55 |
-
case 'unsubscribe':
|
56 |
-
$plugin_instance->premium->cancel_paid_subscription();
|
57 |
-
$success_message = __( 'Subscription success cancelled', 'wbcr_factory_clearfy_212' );
|
58 |
-
break;
|
59 |
-
}
|
60 |
-
} catch( Exception $e ) {
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Экшен выполняетяс, когда проверка лицензии вернула ошибку
|
64 |
-
*
|
65 |
-
* @since 2.0.7
|
66 |
-
*
|
67 |
-
* @param string $license_key
|
68 |
-
* @param string $error_message
|
69 |
-
*
|
70 |
-
* @param string $action
|
71 |
-
*/
|
72 |
-
do_action( 'wbcr/clearfy/check_license_error', $action, $license_key, $e->getMessage() );
|
73 |
-
|
74 |
-
wp_send_json_error( [ 'error_message' => $e->getMessage() ] );
|
75 |
-
die();
|
76 |
-
}
|
77 |
-
|
78 |
-
/**
|
79 |
-
* Экшен выполняет, когда проверка лицензии успешно завершена
|
80 |
-
*
|
81 |
-
* @since 2.0.7
|
82 |
-
*
|
83 |
-
* @param string $license_key
|
84 |
-
*
|
85 |
-
* @param string $action
|
86 |
-
*/
|
87 |
-
do_action( 'wbcr/clearfy/check_license_success', $action, $license_key );
|
88 |
-
|
89 |
-
wp_send_json_success( [ 'message' => $success_message ] );
|
90 |
-
|
91 |
-
die();
|
92 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/clearfy/includes/class-configurate.php
DELETED
@@ -1,116 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
// Exit if accessed directly
|
3 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
-
exit;
|
5 |
-
}
|
6 |
-
|
7 |
-
/**
|
8 |
-
* Configurate clearfy plugins
|
9 |
-
*
|
10 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
11 |
-
* @since 1.0.0
|
12 |
-
* @package clearfy
|
13 |
-
* @copyright (c) 2018, Webcraftic Ltd
|
14 |
-
*
|
15 |
-
*/
|
16 |
-
abstract class Wbcr_FactoryClearfy212_Configurate {
|
17 |
-
|
18 |
-
/**
|
19 |
-
* @param Wbcr_Factory420_Plugin $plugin
|
20 |
-
*/
|
21 |
-
public function __construct( Wbcr_Factory420_Plugin $plugin ) {
|
22 |
-
$this->plugin = $plugin;
|
23 |
-
$this->registerActionsAndFilters();
|
24 |
-
}
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Registers filters and actions
|
28 |
-
*
|
29 |
-
* @return mixed
|
30 |
-
*/
|
31 |
-
abstract protected function registerActionsAndFilters();
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Get options with namespace
|
35 |
-
*
|
36 |
-
* @param $option_name
|
37 |
-
* @param bool $default
|
38 |
-
*
|
39 |
-
* @return mixed|void
|
40 |
-
*/
|
41 |
-
public function getPopulateOption( $option_name, $default = false ) {
|
42 |
-
return $this->plugin->getPopulateOption( $option_name, $default );
|
43 |
-
}
|
44 |
-
|
45 |
-
/**
|
46 |
-
* Get options with namespace
|
47 |
-
*
|
48 |
-
* @param $option_name
|
49 |
-
* @param bool $default
|
50 |
-
*
|
51 |
-
* @return mixed|void
|
52 |
-
*/
|
53 |
-
public function getOption( $option_name, $default = false ) {
|
54 |
-
return $this->plugin->getOption( $option_name, $default );
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* Get network options with namespace
|
59 |
-
*
|
60 |
-
* @param $option_name
|
61 |
-
* @param bool $default
|
62 |
-
*
|
63 |
-
* @return mixed|void
|
64 |
-
*/
|
65 |
-
public function getNetworkOption( $option_name, $default = false ) {
|
66 |
-
return $this->plugin->getNetworkOption( $option_name, $default );
|
67 |
-
}
|
68 |
-
|
69 |
-
/**
|
70 |
-
* @param $option_name
|
71 |
-
* @param $value
|
72 |
-
*
|
73 |
-
* @return bool
|
74 |
-
*/
|
75 |
-
public function updatePopulateOption( $option_name, $value ) {
|
76 |
-
$this->plugin->updatePopulateOption( $option_name, $value );
|
77 |
-
}
|
78 |
-
|
79 |
-
/**
|
80 |
-
* @param $option_name
|
81 |
-
* @param $value
|
82 |
-
*
|
83 |
-
* @return bool
|
84 |
-
*/
|
85 |
-
public function updateNetworkOption( $option_name, $value ) {
|
86 |
-
$this->plugin->updateNetworkOption( $option_name, $value );
|
87 |
-
}
|
88 |
-
|
89 |
-
/**
|
90 |
-
* @param $option_name
|
91 |
-
* @param $value
|
92 |
-
*
|
93 |
-
* @return bool
|
94 |
-
*/
|
95 |
-
public function updateOption( $option_name, $value ) {
|
96 |
-
$this->plugin->updateOption( $option_name, $value );
|
97 |
-
}
|
98 |
-
|
99 |
-
/**
|
100 |
-
* @param $option_name
|
101 |
-
*
|
102 |
-
* @return bool
|
103 |
-
*/
|
104 |
-
public function deletePopulateOption( $option_name ) {
|
105 |
-
$this->plugin->deletePopulateOption( $option_name );
|
106 |
-
}
|
107 |
-
|
108 |
-
/**
|
109 |
-
* @param $option_name
|
110 |
-
*
|
111 |
-
* @return bool
|
112 |
-
*/
|
113 |
-
public function deleteOption( $option_name ) {
|
114 |
-
$this->plugin->deleteOption( $option_name );
|
115 |
-
}
|
116 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/clearfy/includes/class-helpers.php
DELETED
@@ -1,362 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
// Exit if accessed directly
|
3 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
-
exit;
|
5 |
-
}
|
6 |
-
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Helpers functions
|
10 |
-
*
|
11 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
12 |
-
* @since 1.0.0
|
13 |
-
* @package clearfy
|
14 |
-
* @copyright (c) 2018, Webcraftic Ltd
|
15 |
-
*
|
16 |
-
*/
|
17 |
-
class WbcrFactoryClearfy212_Helpers {
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Ссылка по умолчанию (анг)
|
21 |
-
*/
|
22 |
-
const WEBCRAFTIC_SITE_URL = 'https://clearfy.pro';
|
23 |
-
|
24 |
-
/**
|
25 |
-
* Русская локализация сайта
|
26 |
-
*/
|
27 |
-
const WEBCRAFTIC_RU_SITE_URL = 'https://ru.clearfy.pro';
|
28 |
-
/**
|
29 |
-
* Украинская локализация сайта
|
30 |
-
*/
|
31 |
-
const WEBCRAFTIC_UA_SITE_URL = 'https://ua.clearfy.pro';
|
32 |
-
/**
|
33 |
-
* Испанская
|
34 |
-
*/
|
35 |
-
const WEBCRAFTIC_ES_SITE_URL = 'https://es.clearfy.pro';
|
36 |
-
/**
|
37 |
-
* Французкая
|
38 |
-
*/
|
39 |
-
const WEBCRAFTIC_DE_SITE_URL = 'https://de.clearfy.pro';
|
40 |
-
|
41 |
-
/**
|
42 |
-
* @since 2.0.5
|
43 |
-
*
|
44 |
-
* @param int $price
|
45 |
-
*
|
46 |
-
* @return int
|
47 |
-
*/
|
48 |
-
public static function getClearfyBusinessPrice( $price = 19 ) {
|
49 |
-
return (int) apply_filters( 'wbcr/clearfy/business_price', $price );
|
50 |
-
}
|
51 |
-
|
52 |
-
/**
|
53 |
-
* @since 2.0.5
|
54 |
-
*
|
55 |
-
* @param int $price
|
56 |
-
*
|
57 |
-
* @return int
|
58 |
-
*/
|
59 |
-
public static function getClearfyBusinessRevPrice( $price = 69 ) {
|
60 |
-
return (int) apply_filters( 'wbcr/clearfy/business_rev_price', $price );
|
61 |
-
}
|
62 |
-
|
63 |
-
/**
|
64 |
-
* Get a link to the official website of the developer
|
65 |
-
*
|
66 |
-
* @return string|null
|
67 |
-
*/
|
68 |
-
public static function getWebcrafticSiteUrl() {
|
69 |
-
if ( get_locale() == 'ru_RU' ) {
|
70 |
-
return self::WEBCRAFTIC_RU_SITE_URL;
|
71 |
-
}
|
72 |
-
|
73 |
-
return self::WEBCRAFTIC_SITE_URL;
|
74 |
-
}
|
75 |
-
|
76 |
-
/**
|
77 |
-
* /**
|
78 |
-
* Get a link to the official website of the developer
|
79 |
-
*
|
80 |
-
* @since 2.0.5
|
81 |
-
*
|
82 |
-
* @param string $plugin_name
|
83 |
-
* @param string $page - page address
|
84 |
-
* @param string $utm_content - from which page or part of the plugin user moved to the site
|
85 |
-
* @param string $urm_source
|
86 |
-
*
|
87 |
-
* @return string
|
88 |
-
*/
|
89 |
-
public static function getWebcrafticSitePageUrl( $plugin_name, $page, $utm_content = null, $urm_source = 'wordpress.org' ) {
|
90 |
-
$args = [ 'utm_source' => $urm_source ];
|
91 |
-
|
92 |
-
if ( ! empty( $plugin_name ) ) {
|
93 |
-
$args['utm_campaign'] = $plugin_name;
|
94 |
-
}
|
95 |
-
|
96 |
-
if ( ! empty( $utm_content ) ) {
|
97 |
-
$args['utm_content'] = $utm_content;
|
98 |
-
}
|
99 |
-
|
100 |
-
$raw_url = add_query_arg( $args, self::getWebcrafticSiteUrl() . '/' . $page . '/' );
|
101 |
-
$url = esc_url( $raw_url );
|
102 |
-
|
103 |
-
/**
|
104 |
-
* @param string $url
|
105 |
-
* @param string $raw_url
|
106 |
-
* @param string $plugin_name
|
107 |
-
* @param string $page - page address
|
108 |
-
* @param string $utm_content - from which page or part of the plugin user moved to the site
|
109 |
-
* @param string $urm_source
|
110 |
-
*/
|
111 |
-
|
112 |
-
return apply_filters( 'wbcr/clearfy/webcraftic_site_page_url', $url, $raw_url, $plugin_name, $page, $utm_content, $urm_source );
|
113 |
-
}
|
114 |
-
|
115 |
-
/**
|
116 |
-
* Recursive sanitation for an array
|
117 |
-
*
|
118 |
-
* @since 2.0.5
|
119 |
-
*
|
120 |
-
* @param $array
|
121 |
-
*
|
122 |
-
* @return mixed
|
123 |
-
*/
|
124 |
-
public static function recursiveSanitizeArray( $array, $function ) {
|
125 |
-
foreach ( $array as $key => &$value ) {
|
126 |
-
if ( is_array( $value ) ) {
|
127 |
-
$value = self::recursiveSanitizeArray( $value, $function );
|
128 |
-
} else {
|
129 |
-
if ( function_exists( $function ) ) {
|
130 |
-
$value = $function( $value );
|
131 |
-
}
|
132 |
-
}
|
133 |
-
}
|
134 |
-
|
135 |
-
return $array;
|
136 |
-
}
|
137 |
-
|
138 |
-
/**
|
139 |
-
* Is permalink enabled?
|
140 |
-
*
|
141 |
-
* @since 1.0.0
|
142 |
-
* @return bool
|
143 |
-
* @global WP_Rewrite $wp_rewrite
|
144 |
-
*/
|
145 |
-
public static function isPermalink() {
|
146 |
-
global $wp_rewrite;
|
147 |
-
|
148 |
-
if ( ! isset( $wp_rewrite ) || ! is_object( $wp_rewrite ) || ! $wp_rewrite->using_permalinks() ) {
|
149 |
-
return false;
|
150 |
-
}
|
151 |
-
|
152 |
-
return true;
|
153 |
-
}
|
154 |
-
|
155 |
-
/**
|
156 |
-
* Display 404 page to bump bots and bad guys
|
157 |
-
*
|
158 |
-
* @param bool $simple If true force displaying basic 404 page
|
159 |
-
*/
|
160 |
-
public static function setError404() {
|
161 |
-
global $wp_query;
|
162 |
-
|
163 |
-
if ( function_exists( 'status_header' ) ) {
|
164 |
-
status_header( '404' );
|
165 |
-
nocache_headers();
|
166 |
-
}
|
167 |
-
|
168 |
-
if ( $wp_query && is_object( $wp_query ) ) {
|
169 |
-
$wp_query->set_404();
|
170 |
-
get_template_part( 404 );
|
171 |
-
} else {
|
172 |
-
global $pagenow;
|
173 |
-
|
174 |
-
$pagenow = 'index.php';
|
175 |
-
|
176 |
-
if ( ! defined( 'WP_USE_THEMES' ) ) {
|
177 |
-
define( 'WP_USE_THEMES', true );
|
178 |
-
}
|
179 |
-
|
180 |
-
wp();
|
181 |
-
|
182 |
-
$_SERVER['REQUEST_URI'] = self::userTrailingslashit( '/hmwp_404' );
|
183 |
-
|
184 |
-
require_once( ABSPATH . WPINC . '/template-loader.php' );
|
185 |
-
}
|
186 |
-
|
187 |
-
exit();
|
188 |
-
}
|
189 |
-
|
190 |
-
public static function useTrailingSlashes() {
|
191 |
-
return ( '/' === substr( get_option( 'permalink_structure' ), - 1, 1 ) );
|
192 |
-
}
|
193 |
-
|
194 |
-
public static function userTrailingslashit( $string ) {
|
195 |
-
return self::useTrailingSlashes() ? trailingslashit( $string ) : untrailingslashit( $string );
|
196 |
-
}
|
197 |
-
|
198 |
-
/**
|
199 |
-
* Returns true if a needle can be found in a haystack
|
200 |
-
*
|
201 |
-
* @param string $string
|
202 |
-
* @param string $find
|
203 |
-
* @param bool $case_sensitive
|
204 |
-
*
|
205 |
-
* @return bool
|
206 |
-
*/
|
207 |
-
public static function strContains( $string, $find, $case_sensitive = true ) {
|
208 |
-
if ( empty( $string ) || empty( $find ) ) {
|
209 |
-
return false;
|
210 |
-
}
|
211 |
-
|
212 |
-
$pos = $case_sensitive ? strpos( $string, $find ) : stripos( $string, $find );
|
213 |
-
|
214 |
-
return ! ( $pos === false );
|
215 |
-
}
|
216 |
-
|
217 |
-
/**
|
218 |
-
* Tests if a text starts with an given string.
|
219 |
-
*
|
220 |
-
* @param string $string
|
221 |
-
* @param string $find
|
222 |
-
* @param bool $case_sensitive
|
223 |
-
*
|
224 |
-
* @return bool
|
225 |
-
*/
|
226 |
-
public static function strStartsWith( $string, $find, $case_sensitive = true ) {
|
227 |
-
if ( $case_sensitive ) {
|
228 |
-
return strpos( $string, $find ) === 0;
|
229 |
-
}
|
230 |
-
|
231 |
-
return stripos( $string, $find ) === 0;
|
232 |
-
}
|
233 |
-
|
234 |
-
/**
|
235 |
-
* Tests if a text ends with an given string.
|
236 |
-
*
|
237 |
-
* @param $string
|
238 |
-
* @param $find
|
239 |
-
* @param bool $case_sensitive
|
240 |
-
*
|
241 |
-
* @return bool
|
242 |
-
*/
|
243 |
-
public static function strEndsWith( $string, $find, $case_sensitive = true ) {
|
244 |
-
$expected_position = strlen( $string ) - strlen( $find );
|
245 |
-
|
246 |
-
if ( $case_sensitive ) {
|
247 |
-
return strrpos( $string, $find, 0 ) === $expected_position;
|
248 |
-
}
|
249 |
-
|
250 |
-
return strripos( $string, $find, 0 ) === $expected_position;
|
251 |
-
}
|
252 |
-
|
253 |
-
public static function arrayMergeInsert( array $arr, array $inserted, $position = 'bottom', $key = null ) {
|
254 |
-
if ( $position == 'top' ) {
|
255 |
-
return array_merge( $inserted, $arr );
|
256 |
-
}
|
257 |
-
$key_position = ( $key === null ) ? false : array_search( $key, array_keys( $arr ) );
|
258 |
-
if ( $key_position === false OR ( $position != 'before' AND $position != 'after' ) ) {
|
259 |
-
return array_merge( $arr, $inserted );
|
260 |
-
}
|
261 |
-
if ( $position == 'after' ) {
|
262 |
-
$key_position ++;
|
263 |
-
}
|
264 |
-
|
265 |
-
return array_merge( array_slice( $arr, 0, $key_position, true ), $inserted, array_slice( $arr, $key_position, null, true ) );
|
266 |
-
}
|
267 |
-
|
268 |
-
public static function maybeGetPostJson( $name ) {
|
269 |
-
if ( isset( $_POST[ $name ] ) AND is_string( $_POST[ $name ] ) ) {
|
270 |
-
$result = json_decode( stripslashes( $_POST[ $name ] ), true );
|
271 |
-
if ( ! is_array( $result ) ) {
|
272 |
-
$result = [];
|
273 |
-
}
|
274 |
-
|
275 |
-
return $result;
|
276 |
-
} else {
|
277 |
-
return [];
|
278 |
-
}
|
279 |
-
}
|
280 |
-
|
281 |
-
public static function getEscapeJson( array $data ) {
|
282 |
-
return htmlspecialchars( json_encode( $data ), ENT_QUOTES, 'UTF-8' );
|
283 |
-
}
|
284 |
-
|
285 |
-
/**
|
286 |
-
* Replace url for multisite
|
287 |
-
*
|
288 |
-
* @param $string
|
289 |
-
*
|
290 |
-
* @return string
|
291 |
-
*/
|
292 |
-
public static function replaceMsUrl( $string ) {
|
293 |
-
if ( is_multisite() && BLOG_ID_CURRENT_SITE != get_current_blog_id() ) {
|
294 |
-
return str_replace( get_site_url( BLOG_ID_CURRENT_SITE ), get_site_url( get_current_blog_id() ), $string );
|
295 |
-
}
|
296 |
-
|
297 |
-
return $string;
|
298 |
-
}
|
299 |
-
|
300 |
-
/*
|
301 |
-
* Flushes as many page cache plugin's caches as possible.
|
302 |
-
*
|
303 |
-
* @return void
|
304 |
-
*/
|
305 |
-
public static function flushPageCache() {
|
306 |
-
if ( function_exists( 'wp_cache_clear_cache' ) ) {
|
307 |
-
if ( is_multisite() ) {
|
308 |
-
$blog_id = get_current_blog_id();
|
309 |
-
wp_cache_clear_cache( $blog_id );
|
310 |
-
} else {
|
311 |
-
wp_cache_clear_cache();
|
312 |
-
}
|
313 |
-
} else if ( has_action( 'cachify_flush_cache' ) ) {
|
314 |
-
do_action( 'cachify_flush_cache' );
|
315 |
-
} else if ( function_exists( 'w3tc_pgcache_flush' ) ) {
|
316 |
-
w3tc_pgcache_flush();
|
317 |
-
} else if ( function_exists( 'wp_fast_cache_bulk_delete_all' ) ) {
|
318 |
-
wp_fast_cache_bulk_delete_all();
|
319 |
-
} else if ( class_exists( 'WpFastestCache' ) ) {
|
320 |
-
$wpfc = new WpFastestCache();
|
321 |
-
$wpfc->deleteCache();
|
322 |
-
} else if ( class_exists( 'c_ws_plugin__qcache_purging_routines' ) ) {
|
323 |
-
c_ws_plugin__qcache_purging_routines::purge_cache_dir(); // quick cache
|
324 |
-
} else if ( class_exists( 'zencache' ) ) {
|
325 |
-
zencache::clear();
|
326 |
-
} else if ( class_exists( 'comet_cache' ) ) {
|
327 |
-
comet_cache::clear();
|
328 |
-
} else if ( class_exists( 'WpeCommon' ) ) {
|
329 |
-
// WPEngine cache purge/flush methods to call by default
|
330 |
-
$wpe_methods = [
|
331 |
-
'purge_varnish_cache',
|
332 |
-
];
|
333 |
-
|
334 |
-
// More agressive clear/flush/purge behind a filter
|
335 |
-
if ( apply_filters( 'wbcr/factory/flush_wpengine_aggressive', false ) ) {
|
336 |
-
$wpe_methods = array_merge( $wpe_methods, [ 'purge_memcached', 'clear_maxcdn_cache' ] );
|
337 |
-
}
|
338 |
-
|
339 |
-
// Filtering the entire list of WpeCommon methods to be called (for advanced usage + easier testing)
|
340 |
-
$wpe_methods = apply_filters( 'wbcr/factory/wpengine_methods', $wpe_methods );
|
341 |
-
|
342 |
-
foreach ( $wpe_methods as $wpe_method ) {
|
343 |
-
if ( method_exists( 'WpeCommon', $wpe_method ) ) {
|
344 |
-
WpeCommon::$wpe_method();
|
345 |
-
}
|
346 |
-
}
|
347 |
-
} else if ( function_exists( 'sg_cachepress_purge_cache' ) ) {
|
348 |
-
sg_cachepress_purge_cache();
|
349 |
-
} else if ( file_exists( WP_CONTENT_DIR . '/wp-cache-config.php' ) && function_exists( 'prune_super_cache' ) ) {
|
350 |
-
// fallback for WP-Super-Cache
|
351 |
-
global $cache_path;
|
352 |
-
if ( is_multisite() ) {
|
353 |
-
$blog_id = get_current_blog_id();
|
354 |
-
prune_super_cache( get_supercache_dir( $blog_id ), true );
|
355 |
-
prune_super_cache( $cache_path . 'blogs/', true );
|
356 |
-
} else {
|
357 |
-
prune_super_cache( $cache_path . 'supercache/', true );
|
358 |
-
prune_super_cache( $cache_path, true );
|
359 |
-
}
|
360 |
-
}
|
361 |
-
}
|
362 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/clearfy/pages/class-page-license.php
DELETED
@@ -1,365 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
// Exit if accessed directly
|
4 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
5 |
-
exit;
|
6 |
-
}
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Class Wbcr_FactoryLicense000_LicensePage is used as template to display form to active premium functionality.
|
10 |
-
*
|
11 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
12 |
-
* @since 2.0.7
|
13 |
-
*/
|
14 |
-
class Wbcr_FactoryClearfy212_LicensePage extends Wbcr_FactoryClearfy212_PageBase {
|
15 |
-
|
16 |
-
/**
|
17 |
-
* {@inheritdoc}
|
18 |
-
*/
|
19 |
-
public $type = "page";
|
20 |
-
|
21 |
-
/**
|
22 |
-
* {@inheritdoc}
|
23 |
-
*/
|
24 |
-
public $page_menu_dashicon = 'dashicons-admin-network';
|
25 |
-
|
26 |
-
/**
|
27 |
-
* {@inheritdoc}
|
28 |
-
*/
|
29 |
-
public $show_right_sidebar_in_options = false;
|
30 |
-
|
31 |
-
/**
|
32 |
-
* {@inheritdoc}
|
33 |
-
*/
|
34 |
-
public $page_menu_position = 0;
|
35 |
-
|
36 |
-
/**
|
37 |
-
* {@inheritdoc}
|
38 |
-
*/
|
39 |
-
public $available_for_multisite = true;
|
40 |
-
|
41 |
-
/**
|
42 |
-
* @var string Name of the paid plan.
|
43 |
-
*/
|
44 |
-
public $plan_name;
|
45 |
-
|
46 |
-
// PREMIUM SECTION
|
47 |
-
// ------------------------------------------------------------------
|
48 |
-
/**
|
49 |
-
* @since 2.0.7
|
50 |
-
* @var bool
|
51 |
-
*/
|
52 |
-
protected $is_premium;
|
53 |
-
|
54 |
-
/**
|
55 |
-
* @since 2.0.7
|
56 |
-
* @var \WBCR\Factory_420\Premium\Provider
|
57 |
-
*/
|
58 |
-
protected $premium;
|
59 |
-
|
60 |
-
/**
|
61 |
-
* @since 2.0.7
|
62 |
-
* @var bool
|
63 |
-
*/
|
64 |
-
protected $is_premium_active;
|
65 |
-
|
66 |
-
/**
|
67 |
-
* @since 2.0.7
|
68 |
-
* @var bool
|
69 |
-
*/
|
70 |
-
protected $premium_has_subscription;
|
71 |
-
|
72 |
-
/**
|
73 |
-
* @since 2.0.7
|
74 |
-
* @var \WBCR\Factory_420\Premium\Interfaces\License
|
75 |
-
*/
|
76 |
-
protected $premium_license;
|
77 |
-
|
78 |
-
// END PREMIUM SECTION
|
79 |
-
// ------------------------------------------------------------------
|
80 |
-
|
81 |
-
/**
|
82 |
-
* {@inheritdoc}
|
83 |
-
* @param Wbcr_Factory420_Plugin $plugin
|
84 |
-
*/
|
85 |
-
public function __construct( Wbcr_Factory420_Plugin $plugin ) {
|
86 |
-
$this->plugin = $plugin;
|
87 |
-
|
88 |
-
parent::__construct( $plugin );
|
89 |
-
|
90 |
-
if ( ! $this->id ) {
|
91 |
-
$this->id = $this->plugin->getPrefix() . 'license';
|
92 |
-
}
|
93 |
-
$this->premium = WRIO_Plugin::app()->premium;
|
94 |
-
$this->is_premium = $this->premium->is_activate();
|
95 |
-
$this->is_premium_active = $this->premium->is_active();
|
96 |
-
$this->premium_has_subscription = $this->premium->has_paid_subscription();
|
97 |
-
$this->premium_license = $this->premium->get_license();
|
98 |
-
|
99 |
-
add_action( 'wp_ajax_wbcr-clearfy-activate-license', [ $this, 'ajax_handler' ] );
|
100 |
-
}
|
101 |
-
|
102 |
-
/**
|
103 |
-
* [MAGIC] Magic method that configures assets for a page.
|
104 |
-
*/
|
105 |
-
public function assets( $scripts, $styles ) {
|
106 |
-
parent::assets( $scripts, $styles );
|
107 |
-
|
108 |
-
$this->styles->add( FACTORY_CLEARFY_212_URL . '/assets/css/license-manager.css' );
|
109 |
-
$this->scripts->add( FACTORY_CLEARFY_212_URL . '/assets/js/license-manager.js' );
|
110 |
-
}
|
111 |
-
|
112 |
-
/**
|
113 |
-
* Регистрируем ajax обработчик для текущей страницы
|
114 |
-
*
|
115 |
-
* @since 2.0.7
|
116 |
-
*/
|
117 |
-
public function ajax_handler() {
|
118 |
-
wbcr_factory_clearfy_212_check_license( $this->plugin );
|
119 |
-
}
|
120 |
-
|
121 |
-
/**
|
122 |
-
* {@inheritdoc}
|
123 |
-
*/
|
124 |
-
public function showPageContent() {
|
125 |
-
?>
|
126 |
-
<?php wp_nonce_field( 'license' ); ?>
|
127 |
-
<div id="wcl-license-wrapper"
|
128 |
-
data-loader="<?php echo FACTORY_CLEARFY_212_URL . '/assets/img/loader.gif'; ?>"
|
129 |
-
data-plugin="<?php echo get_class( $this->plugin ) ?>">
|
130 |
-
<?php $this->show_license_form(); ?>
|
131 |
-
</div>
|
132 |
-
<?php
|
133 |
-
}
|
134 |
-
|
135 |
-
/**
|
136 |
-
* Get before content.
|
137 |
-
*
|
138 |
-
* @return string Before content.
|
139 |
-
*/
|
140 |
-
protected function get_plan_description() {
|
141 |
-
return '';
|
142 |
-
}
|
143 |
-
|
144 |
-
/**
|
145 |
-
* @return string
|
146 |
-
*/
|
147 |
-
protected function get_hidden_license_key() {
|
148 |
-
if ( ! $this->is_premium ) {
|
149 |
-
return '';
|
150 |
-
}
|
151 |
-
|
152 |
-
return $this->premium_license->get_hidden_key();
|
153 |
-
}
|
154 |
-
|
155 |
-
/**
|
156 |
-
* @return string
|
157 |
-
*/
|
158 |
-
protected function get_plan() {
|
159 |
-
if ( ! $this->is_premium ) {
|
160 |
-
return 'free';
|
161 |
-
}
|
162 |
-
|
163 |
-
return $this->premium->get_plan();
|
164 |
-
}
|
165 |
-
|
166 |
-
/**
|
167 |
-
* @return mixed
|
168 |
-
*/
|
169 |
-
protected function get_expiration_days() {
|
170 |
-
return $this->premium_license->get_expiration_time( 'days' );
|
171 |
-
}
|
172 |
-
|
173 |
-
/**
|
174 |
-
* @return string
|
175 |
-
*/
|
176 |
-
protected function get_billing_cycle_readable() {
|
177 |
-
if ( ! $this->is_premium ) {
|
178 |
-
return '';
|
179 |
-
}
|
180 |
-
|
181 |
-
$billing_cycle = $this->premium->get_billing_cycle();
|
182 |
-
$billing = 'lifetime';
|
183 |
-
|
184 |
-
if ( 1 == $billing_cycle ) {
|
185 |
-
$billing = 'month';
|
186 |
-
} else if ( 12 == $billing_cycle ) {
|
187 |
-
$billing = 'year';
|
188 |
-
}
|
189 |
-
|
190 |
-
return $billing;
|
191 |
-
}
|
192 |
-
|
193 |
-
/**
|
194 |
-
* Тип лицензии, цветовое оформление для формы лицензирования
|
195 |
-
* free - бесплатная
|
196 |
-
* gift - пожизненная лицензия, лицензия на особых условиях
|
197 |
-
* trial - красный цвет, применяется для триалов, если лиценизия истекла или заблокирована
|
198 |
-
* paid - обычная оплаченная лицензия, в данный момент активна.
|
199 |
-
*
|
200 |
-
* @return string
|
201 |
-
*/
|
202 |
-
protected function get_license_type() {
|
203 |
-
if ( ! $this->is_premium ) {
|
204 |
-
return 'free';
|
205 |
-
}
|
206 |
-
|
207 |
-
$license = $this->premium_license;
|
208 |
-
|
209 |
-
if ( $license->is_lifetime() ) {
|
210 |
-
return 'gift';
|
211 |
-
} else if ( $license->get_expiration_time( 'days' ) < 1 ) {
|
212 |
-
return 'trial';
|
213 |
-
}
|
214 |
-
|
215 |
-
return 'paid';
|
216 |
-
}
|
217 |
-
|
218 |
-
/**
|
219 |
-
* @param bool|WP_Error $notice
|
220 |
-
*/
|
221 |
-
public function show_license_form( $notice = false ) {
|
222 |
-
?>
|
223 |
-
<div class="factory-bootstrap-421 onp-page-wrap <?= $this->get_license_type() ?>-license-manager-content"
|
224 |
-
id="license-manager">
|
225 |
-
<div>
|
226 |
-
<h3><?php printf( __( 'Activate %s', 'wbcr_factory_clearfy_212' ), $this->plan_name ) ?></h3>
|
227 |
-
<?php echo $this->get_plan_description() ?>
|
228 |
-
</div>
|
229 |
-
<br>
|
230 |
-
<?php if ( is_wp_error( $notice ) ) : ?>
|
231 |
-
<div class="license-message <?= $this->get_license_type() ?>-license-message">
|
232 |
-
<div class="alert <?php echo esc_attr( $notice->get_error_code() ); ?>">
|
233 |
-
<h4 class="alert-heading"><?php _e( $notice->get_error_message(), 'wbcr_factory_clearfy_212' ) ?></h4>
|
234 |
-
</div>
|
235 |
-
</div>
|
236 |
-
<?php endif; ?>
|
237 |
-
<div class="onp-container">
|
238 |
-
<div class="license-details">
|
239 |
-
<?php if ( $this->get_license_type() == 'free' ): ?>
|
240 |
-
<a href="<?php echo $this->plugin->get_support()->get_pricing_url( true, 'license_page' ); ?>"
|
241 |
-
class="purchase-premium" target="_blank" rel="noopener">
|
242 |
-
<span class="btn btn-gold btn-inner-wrap">
|
243 |
-
<?php printf( __( 'Upgrade to Premium for $%s', 'wbcr_factory_clearfy_212' ), $this->premium->get_price() ) ?>
|
244 |
-
</span>
|
245 |
-
</a>
|
246 |
-
<p><?php printf( __( 'Your current license for %1$s:', 'wbcr_factory_clearfy_212' ), $this->plugin->getPluginTitle() ) ?></p>
|
247 |
-
<?php endif; ?>
|
248 |
-
<div class="license-details-block <?= $this->get_license_type() ?>-details-block">
|
249 |
-
<?php if ( $this->is_premium ): ?>
|
250 |
-
<a data-action="deactivate" href="#"
|
251 |
-
class="btn btn-default btn-small license-delete-button wcl-control-btn">
|
252 |
-
<?php _e( 'Delete Key', 'wbcr_factory_clearfy_212' ) ?>
|
253 |
-
</a>
|
254 |
-
<a data-action="sync" href="#"
|
255 |
-
class="btn btn-default btn-small license-synchronization-button wcl-control-btn">
|
256 |
-
<?php _e( 'Synchronization', 'wbcr_factory_clearfy_212' ) ?>
|
257 |
-
</a>
|
258 |
-
<?php endif; ?>
|
259 |
-
<h3>
|
260 |
-
<?php echo ucfirst( $this->get_plan() ); ?>
|
261 |
-
|
262 |
-
<?php if ( $this->is_premium && $this->premium_has_subscription ): ?>
|
263 |
-
<span style="font-size: 15px;">
|
264 |
-
(<?php printf( __( 'Automatic renewal, every %s', '' ), esc_attr( $this->get_billing_cycle_readable() ) ); ?>)
|
265 |
-
</span>
|
266 |
-
<?php endif; ?>
|
267 |
-
</h3>
|
268 |
-
<?php if ( $this->is_premium ): ?>
|
269 |
-
<div class="license-key-identity">
|
270 |
-
<code><?= esc_attr( $this->get_hidden_license_key() ) ?></code>
|
271 |
-
</div>
|
272 |
-
<?php endif; ?>
|
273 |
-
<div class="license-key-description">
|
274 |
-
<p><?php _e( 'Public License is a GPLv2 compatible license allowing you to change and use this version of the plugin for free. Please keep in mind this license covers only free edition of the plugin. Premium versions are distributed with other type of a license.', 'wbcr_factory_clearfy_212' ) ?>
|
275 |
-
</p>
|
276 |
-
<?php if ( $this->is_premium && $this->premium_has_subscription ): ?>
|
277 |
-
<p class="activate-trial-hint">
|
278 |
-
<?php _e( 'You use a paid subscription for the plugin updates. In case you don’t want to receive paid updates, please, click <a data-action="unsubscribe" class="wcl-control-btn" href="#">cancel subscription</a>', 'wbcr_factory_clearfy_212' ) ?>
|
279 |
-
</p>
|
280 |
-
<?php endif; ?>
|
281 |
-
|
282 |
-
<?php if ( $this->get_license_type() == 'trial' ): ?>
|
283 |
-
<p class="activate-error-hint">
|
284 |
-
<?php printf( __( 'Your license has expired, please extend the license to get updates and support.', 'wbcr_factory_clearfy_212' ), '' ) ?>
|
285 |
-
</p>
|
286 |
-
<?php endif; ?>
|
287 |
-
</div>
|
288 |
-
<table class="license-params" colspacing="0" colpadding="0">
|
289 |
-
<tr>
|
290 |
-
<!--<td class="license-param license-param-domain">
|
291 |
-
<span class="license-value"><?php echo esc_attr( $_SERVER['SERVER_NAME'] ); ?></span>
|
292 |
-
<span class="license-value-name"><?php _e( 'domain', 'wbcr_factory_clearfy_212' ) ?></span>
|
293 |
-
</td>-->
|
294 |
-
<td class="license-param license-param-days">
|
295 |
-
<span class="license-value"><?= $this->get_plan() ?></span>
|
296 |
-
<span class="license-value-name"><?php _e( 'plan', 'wbcr_factory_clearfy_212' ) ?></span>
|
297 |
-
</td>
|
298 |
-
<?php if ( $this->is_premium ) : ?>
|
299 |
-
<td class="license-param license-param-sites">
|
300 |
-
<span class="license-value">
|
301 |
-
<?php echo esc_attr( $this->premium_license->get_count_active_sites() ); ?>
|
302 |
-
<?php _e( 'of', 'wbcr_factory_clearfy_212' ) ?>
|
303 |
-
<?php echo esc_attr( $this->premium_license->get_sites_quota() ); ?></span>
|
304 |
-
<span class="license-value-name"><?php _e( 'active sites', 'wbcr_factory_clearfy_212' ) ?></span>
|
305 |
-
</td>
|
306 |
-
<?php endif; ?>
|
307 |
-
<td class="license-param license-param-version">
|
308 |
-
<span class="license-value"><?= $this->plugin->getPluginVersion() ?></span>
|
309 |
-
<span class="license-value-name"><span>version</span></span>
|
310 |
-
</td>
|
311 |
-
<?php if ( $this->is_premium ): ?>
|
312 |
-
<td class="license-param license-param-days">
|
313 |
-
<?php if ( $this->get_license_type() == 'trial' ): ?>
|
314 |
-
<span class="license-value"><?php _e( 'EXPIRED!', 'wbcr_factory_clearfy_212' ) ?></span>
|
315 |
-
<span class="license-value-name"><?php _e( 'please update the key', 'wbcr_factory_clearfy_212' ) ?></span>
|
316 |
-
<?php else: ?>
|
317 |
-
<span class="license-value">
|
318 |
-
<?php
|
319 |
-
if ( $this->premium_license->is_lifetime() ) {
|
320 |
-
echo 'infiniate';
|
321 |
-
} else {
|
322 |
-
echo $this->get_expiration_days();
|
323 |
-
}
|
324 |
-
?>
|
325 |
-
<small> <?php _e( 'day(s)', 'wbcr_factory_clearfy_212' ) ?></small>
|
326 |
-
</span>
|
327 |
-
<span class="license-value-name"><?php _e( 'remained', 'wbcr_factory_clearfy_212' ) ?></span>
|
328 |
-
<?php endif; ?>
|
329 |
-
</td>
|
330 |
-
<?php endif; ?>
|
331 |
-
</tr>
|
332 |
-
</table>
|
333 |
-
</div>
|
334 |
-
</div>
|
335 |
-
<div class="license-input">
|
336 |
-
<form action="" method="post">
|
337 |
-
<?php if ( $this->is_premium ): ?>
|
338 |
-
<p><?php _e( 'Have a key to activate the premium version? Paste it here:', 'wbcr_factory_clearfy_212' ) ?><p>
|
339 |
-
<?php else: ?>
|
340 |
-
<p><?php _e( 'Have a key to activate the plugin? Paste it here:', 'wbcr_factory_clearfy_212' ) ?>
|
341 |
-
<p>
|
342 |
-
<?php endif; ?>
|
343 |
-
<button data-action="activate" class="btn btn-default wcl-control-btn" type="button"
|
344 |
-
id="license-submit">
|
345 |
-
<?php _e( 'Submit Key', 'wbcr_factory_clearfy_212' ) ?>
|
346 |
-
</button>
|
347 |
-
<div class="license-key-wrap">
|
348 |
-
<input type="text" id="license-key" name="licensekey" value="" class="form-control"/>
|
349 |
-
</div>
|
350 |
-
<?php if ( $this->is_premium ): ?>
|
351 |
-
<p style="margin-top: 10px;">
|
352 |
-
<?php printf( __( '<a href="%s" target="_blank" rel="noopener">Lean more</a> about the premium version and get the license key to activate it now!', 'wbcr_factory_clearfy_212' ), $this->plugin->get_support()->get_pricing_url( true, 'license_page' ) ); ?>
|
353 |
-
</p>
|
354 |
-
<?php else: ?>
|
355 |
-
<p style="margin-top: 10px;">
|
356 |
-
<?php printf( __( 'Can’t find your key? Go to <a href="%s" target="_blank" rel="noopener">this page</a> and login using the e-mail address associated with your purchase.', 'wbcr_factory_clearfy_212' ), $this->plugin->get_support()->get_contacts_url( true, 'license_page' ) ) ?>
|
357 |
-
</p>
|
358 |
-
<?php endif; ?>
|
359 |
-
</form>
|
360 |
-
</div>
|
361 |
-
</div>
|
362 |
-
</div>
|
363 |
-
<?php
|
364 |
-
}
|
365 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/clearfy/pages/class-page-more-features.php
DELETED
@@ -1,170 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* The page Settings.
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
6 |
-
* @since 1.0.1
|
7 |
-
* @package clearfy
|
8 |
-
* @copyright (c) 2018, Webcraftic Ltd
|
9 |
-
*
|
10 |
-
*/
|
11 |
-
|
12 |
-
// Exit if accessed directly
|
13 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
-
exit;
|
15 |
-
}
|
16 |
-
|
17 |
-
|
18 |
-
class Wbcr_FactoryClearfy212_MoreFeaturesPage extends Wbcr_FactoryPages420_ImpressiveThemplate {
|
19 |
-
|
20 |
-
/**
|
21 |
-
* {@inheritDoc}
|
22 |
-
*
|
23 |
-
* @var string
|
24 |
-
*/
|
25 |
-
public $id = "more_features";
|
26 |
-
|
27 |
-
/**
|
28 |
-
* {@inheritDoc}
|
29 |
-
*
|
30 |
-
* @var string
|
31 |
-
*/
|
32 |
-
public $page_menu_dashicon = 'dashicons-star-filled wbcr-factory-orange-color';
|
33 |
-
|
34 |
-
/**
|
35 |
-
* {@inheritDoc}
|
36 |
-
*
|
37 |
-
* @var string
|
38 |
-
*/
|
39 |
-
public $page_menu_position = 5;
|
40 |
-
|
41 |
-
/**
|
42 |
-
* {@inheritDoc}
|
43 |
-
*
|
44 |
-
* @var string
|
45 |
-
*/
|
46 |
-
public $type = 'page';
|
47 |
-
|
48 |
-
/**
|
49 |
-
* {@inheritDoc}
|
50 |
-
*
|
51 |
-
* @var bool
|
52 |
-
*/
|
53 |
-
public $available_for_multisite = true;
|
54 |
-
|
55 |
-
/**
|
56 |
-
* {@inheritDoc}
|
57 |
-
*
|
58 |
-
* @since 2.0.6 - добавлен
|
59 |
-
* @var bool
|
60 |
-
*/
|
61 |
-
public $internal = true;
|
62 |
-
|
63 |
-
public function __construct( Wbcr_Factory420_Plugin $plugin ) {
|
64 |
-
$this->menu_title = __( 'More features (<b>free</b>)', 'wbcr_factory_clearfy_212' );
|
65 |
-
|
66 |
-
parent::__construct( $plugin );
|
67 |
-
|
68 |
-
$this->plugin = $plugin;
|
69 |
-
}
|
70 |
-
|
71 |
-
/**
|
72 |
-
* {@inheritDoc}
|
73 |
-
*
|
74 |
-
* @return string
|
75 |
-
*/
|
76 |
-
public function getPageTitle() {
|
77 |
-
return __( 'More features', 'wbcr_factory_clearfy_212' );
|
78 |
-
}
|
79 |
-
|
80 |
-
/**
|
81 |
-
* {@inheritDoc}
|
82 |
-
*
|
83 |
-
* @return void
|
84 |
-
*/
|
85 |
-
public function showPageContent() {
|
86 |
-
?>
|
87 |
-
<div class="row">
|
88 |
-
<div class="col-sm-4">
|
89 |
-
<div class="wbcr-factory-feature-box">
|
90 |
-
<span class="dashicons dashicons-yes"></span>
|
91 |
-
<h3><?php _e( 'Code cleaning', 'wbcr_factory_clearfy_212' ) ?></h3>
|
92 |
-
<p><?php _e( 'Clears the source code of the page from unused code.', 'wbcr_factory_clearfy_212' ) ?></p>
|
93 |
-
</div>
|
94 |
-
</div>
|
95 |
-
<div class="col-sm-4">
|
96 |
-
<div class="wbcr-factory-feature-box">
|
97 |
-
<span class="dashicons dashicons-chart-bar"></span>
|
98 |
-
<h3><?php _e( 'Improve SEO', 'wbcr_factory_clearfy_212' ) ?></h3>
|
99 |
-
<p><?php _e( 'Removes duplicate pages, closes external links, changes the headers of the server.', 'wbcr_factory_clearfy_212' ) ?></p>
|
100 |
-
</div>
|
101 |
-
</div>
|
102 |
-
<div class="col-sm-4">
|
103 |
-
<div class="wbcr-factory-feature-box">
|
104 |
-
<span class="dashicons dashicons-shield-alt"></span>
|
105 |
-
<h3><?php _e( 'Site protection', 'wbcr_factory_clearfy_212' ) ?></h3>
|
106 |
-
<p><?php _e( 'Enables and disables features that improve the protection of your site.', 'wbcr_factory_clearfy_212' ) ?></p>
|
107 |
-
</div>
|
108 |
-
</div>
|
109 |
-
<div class="col-sm-4">
|
110 |
-
<div class="wbcr-factory-feature-box">
|
111 |
-
<span class="dashicons dashicons-welcome-comments"></span>
|
112 |
-
<h3><?php _e( 'Disable comments', 'wbcr_factory_clearfy_212' ) ?></h3>
|
113 |
-
<p><?php _e( 'Disables comments on the entire site or on specific pages.', 'wbcr_factory_clearfy_212' ) ?></p>
|
114 |
-
</div>
|
115 |
-
</div>
|
116 |
-
<div class="col-sm-4">
|
117 |
-
<div class="wbcr-factory-feature-box">
|
118 |
-
<span class="dashicons dashicons-update"></span>
|
119 |
-
<h3><?php _e( 'Manage updates', 'wbcr_factory_clearfy_212' ) ?></h3>
|
120 |
-
<p><?php _e( 'Enables or disables automatically updates for plugins, themes and core. It is also possible
|
121 |
-
to disable all updates.', 'wbcr_factory_clearfy_212' ) ?></p>
|
122 |
-
</div>
|
123 |
-
</div>
|
124 |
-
<div class="col-sm-4">
|
125 |
-
<div class="wbcr-factory-feature-box">
|
126 |
-
<span class="dashicons dashicons-admin-plugins"></span>
|
127 |
-
<h3><?php _e( 'Manage widgets', 'wbcr_factory_clearfy_212' ) ?></h3>
|
128 |
-
<p><?php _e( 'Allows you to remove unused widgets.', 'wbcr_factory_clearfy_212' ) ?></p>
|
129 |
-
</div>
|
130 |
-
</div>
|
131 |
-
<div class="col-sm-4">
|
132 |
-
<div class="wbcr-factory-feature-box">
|
133 |
-
<span class="dashicons dashicons-dashboard"></span>
|
134 |
-
<h3><?php _e( 'Speed Optimization', 'wbcr_factory_clearfy_212' ) ?></h3>
|
135 |
-
<p><?php _e( 'Increases performance by disabling unused functions and reducing the number of requests.', 'wbcr_factory_clearfy_212' ) ?></p>
|
136 |
-
</div>
|
137 |
-
</div>
|
138 |
-
<div class="col-sm-4">
|
139 |
-
<div class="wbcr-factory-feature-box">
|
140 |
-
<span class="dashicons dashicons-visibility"></span>
|
141 |
-
<h3><?php _e( 'Site privacy', 'wbcr_factory_clearfy_212' ) ?></h3>
|
142 |
-
<p><?php _e( 'Allows you to hide the version of the site and plugins. Allows you to hide your
|
143 |
-
WordPress.', 'wbcr_factory_clearfy_212' ) ?></p>
|
144 |
-
</div>
|
145 |
-
</div>
|
146 |
-
<div class="col-sm-4">
|
147 |
-
<div class="wbcr-factory-feature-box">
|
148 |
-
<span class="dashicons dashicons-admin-settings"></span>
|
149 |
-
<h3><?php _e( 'Easy setup', 'wbcr_factory_clearfy_212' ) ?></h3>
|
150 |
-
<p><?php _e( 'In quick mode, you can easily configure the plugin according to your needs.', 'wbcr_factory_clearfy_212' ) ?></p>
|
151 |
-
</div>
|
152 |
-
</div>
|
153 |
-
</div>
|
154 |
-
<div class="wbcr-factory-buttons-wrap">
|
155 |
-
<?php
|
156 |
-
$url = 'https://clearfy.pro';
|
157 |
-
|
158 |
-
if ( get_locale() == 'ru_RU' ) {
|
159 |
-
$url = 'https://ru.clearfy.pro';
|
160 |
-
}
|
161 |
-
$url .= '?utm_source=wordpress.org&utm_campaign=' . $this->plugin->getPluginName();
|
162 |
-
?>
|
163 |
-
<a href="<?= $url ?>" class="wbcr-factory-premium-button" target="_blank">
|
164 |
-
<?php _e( 'Get the ultimate plugin 100% FREE', 'wbcr_factory_clearfy_212' ) ?>
|
165 |
-
</a>
|
166 |
-
</div>
|
167 |
-
<?php
|
168 |
-
}
|
169 |
-
}
|
170 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/clearfy/pages/class-pages.php
DELETED
@@ -1,440 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Общий класс прослойка для страниц Clearfy и его компоннетов.
|
5 |
-
* В этом классе добавляются общие ресурсы и элементы, необходимые для всех связанных плагинов.
|
6 |
-
*
|
7 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, Github: https://github.com/alexkovalevv
|
8 |
-
* @since 2.0.5
|
9 |
-
*/
|
10 |
-
|
11 |
-
// Exit if accessed directly
|
12 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
13 |
-
exit;
|
14 |
-
}
|
15 |
-
|
16 |
-
/**
|
17 |
-
* Class Wbcr_FactoryPages420_ImpressiveThemplate
|
18 |
-
*
|
19 |
-
* @method string getInfoWidget() - get widget content information
|
20 |
-
* @method string getRatingWidget( array $args = [] ) - get widget content rating
|
21 |
-
* @method string getDonateWidget() - get widget content donate
|
22 |
-
* @method string getBusinessSuggetionWidget()
|
23 |
-
* @method string getSupportWidget
|
24 |
-
*/
|
25 |
-
class Wbcr_FactoryClearfy212_PageBase extends Wbcr_FactoryPages420_ImpressiveThemplate {
|
26 |
-
|
27 |
-
/**
|
28 |
-
* {@inheritDoc}
|
29 |
-
*
|
30 |
-
* @since 2.0.5 - добавлен
|
31 |
-
* @var bool
|
32 |
-
*/
|
33 |
-
public $show_right_sidebar_in_options = true;
|
34 |
-
|
35 |
-
/**
|
36 |
-
* {@inheritDoc}
|
37 |
-
*
|
38 |
-
* @since 2.0.5 - добавлен
|
39 |
-
* @var bool
|
40 |
-
*/
|
41 |
-
public $available_for_multisite = true;
|
42 |
-
|
43 |
-
/**
|
44 |
-
* {@inheritDoc}
|
45 |
-
*
|
46 |
-
* @since 2.0.6 - добавлен
|
47 |
-
* @var bool
|
48 |
-
*/
|
49 |
-
public $internal = true;
|
50 |
-
|
51 |
-
/**
|
52 |
-
* @param Wbcr_Factory420_Plugin $plugin
|
53 |
-
*/
|
54 |
-
public function __construct( Wbcr_Factory420_Plugin $plugin ) {
|
55 |
-
parent::__construct( $plugin );
|
56 |
-
}
|
57 |
-
|
58 |
-
/**
|
59 |
-
* @param $name
|
60 |
-
* @param $arguments
|
61 |
-
*
|
62 |
-
* @return null|string
|
63 |
-
*/
|
64 |
-
public function __call( $name, $arguments ) {
|
65 |
-
if ( substr( $name, 0, 3 ) == 'get' ) {
|
66 |
-
$called_method_name = 'show' . substr( $name, 3 );
|
67 |
-
if ( method_exists( $this, $called_method_name ) ) {
|
68 |
-
ob_start();
|
69 |
-
|
70 |
-
$this->$called_method_name( $arguments );
|
71 |
-
$content = ob_get_contents();
|
72 |
-
ob_end_clean();
|
73 |
-
|
74 |
-
return $content;
|
75 |
-
}
|
76 |
-
}
|
77 |
-
|
78 |
-
return null;
|
79 |
-
}
|
80 |
-
|
81 |
-
/**
|
82 |
-
* Requests assets (js and css) for the page.
|
83 |
-
*
|
84 |
-
* @param Wbcr_Factory420_ScriptList $scripts
|
85 |
-
* @param Wbcr_Factory420_StyleList $styles
|
86 |
-
*
|
87 |
-
* @return void
|
88 |
-
* @see Wbcr_FactoryPages420_AdminPage
|
89 |
-
*
|
90 |
-
*/
|
91 |
-
public function assets( $scripts, $styles ) {
|
92 |
-
parent::assets( $scripts, $styles );
|
93 |
-
|
94 |
-
$this->styles->add( FACTORY_CLEARFY_212_URL . '/assets/css/clearfy-base.css' );
|
95 |
-
|
96 |
-
// todo: вынести все общие скрипты и стили фреймворка, продумать совместимость с другими плагинами
|
97 |
-
if ( defined( 'WCL_PLUGIN_URL' ) ) {
|
98 |
-
$this->styles->add( WCL_PLUGIN_URL . '/admin/assets/css/general.css' );
|
99 |
-
}
|
100 |
-
|
101 |
-
wbcr_factory_420_do_action_deprecated( 'wbcr_clearfy_page_enqueue_scripts', [
|
102 |
-
$this->getResultId(),
|
103 |
-
$scripts,
|
104 |
-
$styles
|
105 |
-
], '1.4.0', 'wbcr/clearfy/page_assets' );
|
106 |
-
|
107 |
-
/**
|
108 |
-
* Allows you to enqueue scripts to the internal pages of the plugin.
|
109 |
-
* $this->getResultId() - page id + plugin name = quick_start-wbcr_clearfy
|
110 |
-
*
|
111 |
-
* @since 2.0.5
|
112 |
-
*/
|
113 |
-
do_action( 'wbcr/clearfy/page_assets', $this->getResultId(), $scripts, $styles );
|
114 |
-
}
|
115 |
-
|
116 |
-
/**
|
117 |
-
* @return Wbcr_Factory420_Request
|
118 |
-
*/
|
119 |
-
public function request() {
|
120 |
-
return $this->plugin->request;
|
121 |
-
}
|
122 |
-
|
123 |
-
/**
|
124 |
-
* @since 2.0.5
|
125 |
-
*
|
126 |
-
* @param $option_name
|
127 |
-
* @param bool $default *
|
128 |
-
*
|
129 |
-
* @return mixed|void
|
130 |
-
*/
|
131 |
-
public function getPopulateOption( $option_name, $default = false ) {
|
132 |
-
return $this->plugin->getPopulateOption( $option_name, $default );
|
133 |
-
}
|
134 |
-
|
135 |
-
/**
|
136 |
-
* @param $option_name
|
137 |
-
* @param bool $default
|
138 |
-
*
|
139 |
-
* @return mixed|void
|
140 |
-
*/
|
141 |
-
public function getOption( $option_name, $default = false ) {
|
142 |
-
return $this->plugin->getOption( $option_name, $default );
|
143 |
-
}
|
144 |
-
|
145 |
-
/**
|
146 |
-
* @param $option_name
|
147 |
-
* @param $value
|
148 |
-
*
|
149 |
-
* @return void
|
150 |
-
*/
|
151 |
-
public function updatePopulateOption( $option_name, $value ) {
|
152 |
-
$this->plugin->updatePopulateOption( $option_name, $value );
|
153 |
-
}
|
154 |
-
|
155 |
-
/**
|
156 |
-
* @param $option_name
|
157 |
-
* @param $value
|
158 |
-
*
|
159 |
-
* @return void
|
160 |
-
*/
|
161 |
-
public function updateOption( $option_name, $value ) {
|
162 |
-
$this->plugin->updateOption( $option_name, $value );
|
163 |
-
}
|
164 |
-
|
165 |
-
/**
|
166 |
-
* @param $option_name
|
167 |
-
*
|
168 |
-
* @return void
|
169 |
-
*/
|
170 |
-
public function deletePopulateOption( $option_name ) {
|
171 |
-
$this->plugin->deletePopulateOption( $option_name );
|
172 |
-
}
|
173 |
-
|
174 |
-
/**
|
175 |
-
* @param $option_name
|
176 |
-
*
|
177 |
-
* @return void
|
178 |
-
*/
|
179 |
-
public function deleteOption( $option_name ) {
|
180 |
-
$this->plugin->deleteOption( $option_name );
|
181 |
-
}
|
182 |
-
|
183 |
-
|
184 |
-
/**
|
185 |
-
* Действие выполняется для всех страниц Clearfy и его компонентах.
|
186 |
-
* Это простое предложение перейти на PRO версию.
|
187 |
-
*/
|
188 |
-
public function multisiteProAction() {
|
189 |
-
if ( is_multisite() && $this->plugin->isNetworkActive() ) {
|
190 |
-
|
191 |
-
$license_page_url = $this->getBaseUrl( 'license' );
|
192 |
-
$upgrade_url = WbcrFactoryClearfy212_Helpers::getWebcrafticSitePageUrl( $this->plugin->getPluginName(), 'pricing', 'multisite_save_settings' );
|
193 |
-
$upgrade_price = WbcrFactoryClearfy212_Helpers::getClearfyBusinessPrice();
|
194 |
-
|
195 |
-
$html = '<div class="wbcr-factory-clearfy-212-multisite-suggetion">';
|
196 |
-
$html .= '<div class="wbcr-factory-inner-contanier">';
|
197 |
-
$html .= '<h3>' . __( 'Upgrade to Clearfy Business', 'wbcr_factory_clearfy_212' ) . '</h3>';
|
198 |
-
$html .= '<p>' . __( 'Oops... Sorry for the inconvenience caused!', 'wbcr_factory_clearfy_212' ) . '</p>';
|
199 |
-
$html .= '<p>' . __( 'Complete multisite support is available in Clearfy Business and Clearfy Business Revolution packages only!', 'wbcr_factory_clearfy_212' ) . '</p>';
|
200 |
-
$html .= '<p>' . __( 'You can activate the plugin on each website and use it with zero limitations. But you can’t save the plugin’s settings under the Super Administrator role!', 'wbcr_factory_clearfy_212' ) . '</p>';
|
201 |
-
$html .= '<p style="margin-top:20px">';
|
202 |
-
$html .= '<a href="' . $license_page_url . '" class="wbcr-factory-activate-premium" rel="noopener">' . __( 'Activate license ', 'wbcr_factory_clearfy_212' ) . '</a> ';
|
203 |
-
$html .= '<a href="' . $upgrade_url . '" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">' . sprintf( __( 'Upgrade to Clearfy Business for $%d', 'wbcr_factory_clearfy_212' ), $upgrade_price ) . '</a>';
|
204 |
-
$html .= '</p>';
|
205 |
-
$html .= '</div>';
|
206 |
-
$html .= '</div>';
|
207 |
-
|
208 |
-
$this->showPage( $html );
|
209 |
-
|
210 |
-
return;
|
211 |
-
}
|
212 |
-
|
213 |
-
$this->redirectToAction( 'index' );
|
214 |
-
}
|
215 |
-
|
216 |
-
/**
|
217 |
-
* @param string $position
|
218 |
-
*
|
219 |
-
* @return mixed|void
|
220 |
-
*/
|
221 |
-
protected function getPageWidgets( $position = 'bottom' ) {
|
222 |
-
$widgets = [];
|
223 |
-
|
224 |
-
if ( $position == 'bottom' ) {
|
225 |
-
$widgets['info_widget'] = $this->getInfoWidget();
|
226 |
-
$widgets['rating_widget'] = $this->getRatingWidget();
|
227 |
-
$widgets['support_widget'] = $this->getSupportWidget();
|
228 |
-
//$widgets['donate_widget'] = $this->getDonateWidget();
|
229 |
-
} else if ( $position == 'right' ) {
|
230 |
-
$widgets['business_suggetion'] = $this->getBusinessSuggetionWidget();
|
231 |
-
$widgets['info_widget'] = $this->getInfoWidget();
|
232 |
-
$widgets['rating_widget'] = $this->getRatingWidget();
|
233 |
-
}
|
234 |
-
|
235 |
-
/**
|
236 |
-
* @since 4.0.9 - является устаревшим
|
237 |
-
*/
|
238 |
-
$widgets = wbcr_factory_420_apply_filters_deprecated( 'wbcr_factory_pages_420_imppage_get_widgets', [
|
239 |
-
$widgets,
|
240 |
-
$position,
|
241 |
-
$this->plugin,
|
242 |
-
$this
|
243 |
-
], '4.0.9', 'wbcr/factory/pages/impressive/widgets' );
|
244 |
-
|
245 |
-
/**
|
246 |
-
* @since 4.0.1 - добавлен
|
247 |
-
* @since 4.0.9 - изменено имя
|
248 |
-
*/
|
249 |
-
$widgets = apply_filters( 'wbcr/factory/pages/impressive/widgets', $widgets, $position, $this->plugin, $this );
|
250 |
-
|
251 |
-
return $widgets;
|
252 |
-
}
|
253 |
-
|
254 |
-
/**
|
255 |
-
* Создает Html разметку виджета для рекламы премиум версии
|
256 |
-
*
|
257 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
258 |
-
* @since 2.0.2
|
259 |
-
*/
|
260 |
-
public function showBusinessSuggetionWidget() {
|
261 |
-
$plugin_name = $this->plugin->getPluginName();
|
262 |
-
$upgrade_price = $this->plugin->has_premium() ? $this->plugin->premium->get_price() : 0;
|
263 |
-
$purchase_url = $this->plugin->get_support()->get_pricing_url( true, 'right_sidebar_ads' );
|
264 |
-
|
265 |
-
$default_features = [
|
266 |
-
'4_premium' => __( '4 premium components now;', 'wbcr_factory_clearfy_212' ),
|
267 |
-
'40_premium' => __( '40 new premium components within a year for the single price;', 'wbcr_factory_clearfy_212' ),
|
268 |
-
'multisite_support' => __( 'Multisite support;', 'wbcr_factory_clearfy_212' ),
|
269 |
-
'advance_settings' => __( 'Advanced settings;', 'wbcr_factory_clearfy_212' ),
|
270 |
-
'no_ads' => __( 'No ads;', 'wbcr_factory_clearfy_212' ),
|
271 |
-
'perfect_support' => __( 'Perfect support.', 'wbcr_factory_clearfy_212' )
|
272 |
-
];
|
273 |
-
|
274 |
-
/**
|
275 |
-
* @since 2.0.8 - added
|
276 |
-
*/
|
277 |
-
$suggetion_title = __( 'MORE IN CLEARFY <span>BUSINESS</span>', 'wbcr_factory_clearfy_212' );
|
278 |
-
$suggetion_title = apply_filters( 'wbcr/clearfy/pages/suggetion_title', $suggetion_title, $plugin_name, $this->id );
|
279 |
-
|
280 |
-
/**
|
281 |
-
* @since 2.0.8 - deprecated
|
282 |
-
*/
|
283 |
-
$suggetion_features = wbcr_factory_420_apply_filters_deprecated( 'wbcr/clearfy/page_bussines_suggetion_features', [
|
284 |
-
$default_features,
|
285 |
-
$this->plugin->getPluginName(),
|
286 |
-
$this->id
|
287 |
-
], '2.0.8', 'wbcr/clearfy/pages/suggetion_features' );
|
288 |
-
|
289 |
-
/**
|
290 |
-
* @since 2.0.8 - renamed
|
291 |
-
* @since 2.0.6
|
292 |
-
*/
|
293 |
-
$suggetion_features = apply_filters( 'wbcr/clearfy/pages/suggetion_features', $suggetion_features, $plugin_name, $this->id );
|
294 |
-
|
295 |
-
if ( empty( $suggetion_features ) ) {
|
296 |
-
$suggetion_features = $default_features;
|
297 |
-
}
|
298 |
-
?>
|
299 |
-
<div class="wbcr-factory-sidebar-widget wbcr-factory-clearfy-212-pro-suggettion">
|
300 |
-
<h3><?php echo $suggetion_title; ?></h3>
|
301 |
-
<ul>
|
302 |
-
<?php if ( ! empty( $suggetion_features ) ): ?>
|
303 |
-
<?php foreach ( $suggetion_features as $feature ): ?>
|
304 |
-
<li><?= $feature ?></li>
|
305 |
-
<?php endforeach; ?>
|
306 |
-
<?php endif; ?>
|
307 |
-
</ul>
|
308 |
-
<a href="<?php echo $purchase_url ?>" class="wbcr-factory-purchase-premium" target="_blank" rel="noopener">
|
309 |
-
<?php printf( __( 'Upgrade for $%s', 'wbcr_factory_clearfy_212' ), $upgrade_price ) ?>
|
310 |
-
</a>
|
311 |
-
</div>
|
312 |
-
<?php
|
313 |
-
}
|
314 |
-
|
315 |
-
/**
|
316 |
-
* Создает html разметку виджета с информационными маркерами
|
317 |
-
*
|
318 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
319 |
-
* @since 2.0.0
|
320 |
-
*/
|
321 |
-
public function showInfoWidget() {
|
322 |
-
?>
|
323 |
-
<div class="wbcr-factory-sidebar-widget">
|
324 |
-
<ul>
|
325 |
-
<li>
|
326 |
-
<span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-red">
|
327 |
-
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
|
328 |
-
</span>
|
329 |
-
- <?php _e( 'A neutral setting that can not harm your site, but you must be sure that you need to use it.', 'wbcr_factory_clearfy_212' ); ?>
|
330 |
-
</li>
|
331 |
-
<li>
|
332 |
-
<span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-grey">
|
333 |
-
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
|
334 |
-
</span>
|
335 |
-
- <?php _e( 'When set this option, you must be careful. Plugins and themes may depend on this function. You must be sure that you can disable this feature for the site.', 'wbcr_factory_clearfy_212' ); ?>
|
336 |
-
</li>
|
337 |
-
<li>
|
338 |
-
<span class="wbcr-factory-hint-icon-simple wbcr-factory-simple-green">
|
339 |
-
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAQAAABKmM6bAAAAUUlEQVQIHU3BsQ1AQABA0X/komIrnQHYwyhqQ1hBo9KZRKL9CBfeAwy2ri42JA4mPQ9rJ6OVt0BisFM3Po7qbEliru7m/FkY+TN64ZVxEzh4ndrMN7+Z+jXCAAAAAElFTkSuQmCC" alt=""/>
|
340 |
-
</span>
|
341 |
-
- <?php _e( 'Absolutely safe setting, We recommend to use.', 'wbcr_factory_clearfy_212' ); ?>
|
342 |
-
</li>
|
343 |
-
</ul>
|
344 |
-
----------<br>
|
345 |
-
<p><?php _e( 'Hover to the icon to get help for the feature you selected.', 'wbcr_factory_clearfy_212' ); ?></p>
|
346 |
-
</div>
|
347 |
-
<?php
|
348 |
-
}
|
349 |
-
|
350 |
-
/**
|
351 |
-
* Создает html разметку виджета рейтинга
|
352 |
-
*
|
353 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
354 |
-
* @since 2.0.0
|
355 |
-
*
|
356 |
-
* @param array $args
|
357 |
-
*/
|
358 |
-
public function showRatingWidget( array $args ) {
|
359 |
-
if ( ! isset( $args[0] ) || empty( $args[0] ) ) {
|
360 |
-
$page_url = "https://goo.gl/tETE2X";
|
361 |
-
} else {
|
362 |
-
$page_url = $args[0];
|
363 |
-
}
|
364 |
-
|
365 |
-
$page_url = apply_filters( 'wbcr_factory_pages_420_imppage_rating_widget_url', $page_url, $this->plugin->getPluginName(), $this->getResultId() );
|
366 |
-
|
367 |
-
?>
|
368 |
-
<div class="wbcr-factory-sidebar-widget">
|
369 |
-
<p>
|
370 |
-
<strong><?php _e( 'Do you want the plugin to improved and update?', 'wbcr_factory_clearfy_212' ); ?></strong>
|
371 |
-
</p>
|
372 |
-
<p><?php _e( 'Help the author, leave a review on wordpress.org. Thanks to feedback, I will know that the plugin is really useful to you and is needed.', 'wbcr_factory_clearfy_212' ); ?></p>
|
373 |
-
<p><?php _e( 'And also write your ideas on how to extend or improve the plugin.', 'wbcr_factory_clearfy_212' ); ?></p>
|
374 |
-
<p>
|
375 |
-
<i class="wbcr-factory-icon-5stars"></i>
|
376 |
-
<a href="<?= $page_url ?>" title="Go rate us" target="_blank">
|
377 |
-
<strong><?php _e( 'Go rate us and push ideas', 'wbcr_factory_clearfy_212' ); ?></strong>
|
378 |
-
</a>
|
379 |
-
</p>
|
380 |
-
</div>
|
381 |
-
<?php
|
382 |
-
}
|
383 |
-
|
384 |
-
/**
|
385 |
-
* Создает html размету виджета доната
|
386 |
-
*
|
387 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
388 |
-
* @since 2.0.0
|
389 |
-
*/
|
390 |
-
public function showDonateWidget() {
|
391 |
-
?>
|
392 |
-
<div class="wbcr-factory-sidebar-widget">
|
393 |
-
<p>
|
394 |
-
<strong><?php _e( 'Donation for plugin development', 'wbcr_factory_clearfy_212' ); ?></strong>
|
395 |
-
</p>
|
396 |
-
<?php if ( get_locale() !== 'ru_RU' ): ?>
|
397 |
-
<form id="wbcr-factory-paypal-donation-form" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
|
398 |
-
<input type="hidden" name="cmd" value="_s-xclick">
|
399 |
-
<input type="hidden" name="hosted_button_id" value="VDX7JNTQPNPFW">
|
400 |
-
<div class="wbcr-factory-donation-price">5$</div>
|
401 |
-
<input type="image" src="<?= FACTORY_PAGES_420_URL ?>/templates/assets/img/paypal-donate.png" border="0" name="submit" alt="PayPal – The safer, easier way to pay online!">
|
402 |
-
</form>
|
403 |
-
<?php else: ?>
|
404 |
-
<iframe frameborder="0" allowtransparency="true" scrolling="no" src="https://money.yandex.ru/embed/donate.xml?account=410011242846510&quickpay=donate&payment-type-choice=on&mobile-payment-type-choice=on&default-sum=300&targets=%D0%9D%D0%B0+%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D1%83+%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%B0+%D0%B8+%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D1%83+%D0%BD%D0%BE%D0%B2%D1%8B%D1%85+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9.+&target-visibility=on&project-name=Webcraftic&project-site=&button-text=05&comment=on&hint=%D0%9A%D0%B0%D0%BA%D1%83%D1%8E+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8E+%D0%BD%D1%83%D0%B6%D0%BD%D0%BE+%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D0%B2+%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%3F&mail=on&successURL=" width="508" height="187"></iframe>
|
405 |
-
<?php endif; ?>
|
406 |
-
</div>
|
407 |
-
<?php
|
408 |
-
}
|
409 |
-
|
410 |
-
/**
|
411 |
-
* Создает html разметку виджета поддержки
|
412 |
-
*
|
413 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
414 |
-
* @since 2.0.8
|
415 |
-
*/
|
416 |
-
public function showSupportWidget() {
|
417 |
-
$free_support_url = $this->plugin->get_support()->get_contacts_url();
|
418 |
-
$hot_support_url = 'https://webcraftic.com/other-questions-support/';
|
419 |
-
?>
|
420 |
-
<div id="wbcr-clr-support-widget" class="wbcr-factory-sidebar-widget">
|
421 |
-
<p><strong><?php _e( 'Having Issues?', 'clearfy' ); ?></strong></p>
|
422 |
-
<div class="wbcr-clr-support-widget-body">
|
423 |
-
<p>
|
424 |
-
<?php _e( 'We provide free support for this plugin. If you are pushed with a problem, just create a new ticket. We will definitely help you!', 'clearfy' ); ?>
|
425 |
-
</p>
|
426 |
-
<ul>
|
427 |
-
<li><span class="dashicons dashicons-sos"></span>
|
428 |
-
<a href="<?= $free_support_url ?>" target="_blank" rel="noopener"><?php _e( 'Get starting free support', 'clearfy' ); ?></a>
|
429 |
-
</li>
|
430 |
-
<li style="margin-top: 15px;background: #fff4f1;padding: 10px;color: #a58074;">
|
431 |
-
<span class="dashicons dashicons-warning"></span>
|
432 |
-
<?php printf( __( 'If you find a php error or a vulnerability in plugin, you can <a href="%s" target="_blank" rel="noopener">create ticket</a> in hot support that we responded instantly.', 'clearfy' ), $hot_support_url ); ?>
|
433 |
-
</li>
|
434 |
-
</ul>
|
435 |
-
</div>
|
436 |
-
</div>
|
437 |
-
<?php
|
438 |
-
}
|
439 |
-
}
|
440 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
libs/factory/core/README.md
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
# Core Factory Framework
|
2 |
-
|
3 |
-
It performs the connection of system modules of the framework, is responsible for migrations, plugin updates, admin notifications, initialization of the plugin.
|
1 |
+
# Core Factory Framework
|
2 |
+
|
3 |
+
It performs the connection of system modules of the framework, is responsible for migrations, plugin updates, admin notifications, initialization of the plugin.
|
libs/factory/core/ajax/install-addons.php
ADDED
@@ -0,0 +1,228 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Ajax plugin configuration
|
4 |
+
*
|
5 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>
|
6 |
+
* @copyright (c) 2017 Webraftic Ltd
|
7 |
+
* @version 1.0
|
8 |
+
*/
|
9 |
+
|
10 |
+
// Exit if accessed directly
|
11 |
+
if( !defined('ABSPATH') ) {
|
12 |
+
exit;
|
13 |
+
}
|
14 |
+
|
15 |
+
/**
|
16 |
+
* This action allows you to process Ajax requests to activate external components Clearfy
|
17 |
+
*/
|
18 |
+
function wfactory_446_install_components($plugin_instance)
|
19 |
+
{
|
20 |
+
check_ajax_referer('updates');
|
21 |
+
|
22 |
+
$slug = $plugin_instance->request->post('plugin', null, true);
|
23 |
+
$action = $plugin_instance->request->post('plugin_action', null, true);
|
24 |
+
$storage = $plugin_instance->request->post('storage', null, true);
|
25 |
+
|
26 |
+
if( !current_user_can('update_plugins') ) {
|
27 |
+
wp_die(__('You don\'t have enough capability to edit this information.', 'wbcr_factory_446'), __('Something went wrong.'), 403);
|
28 |
+
}
|
29 |
+
|
30 |
+
if( empty($slug) || empty($action) ) {
|
31 |
+
wp_send_json_error(['error_message' => __('Required attributes are not passed or empty.', 'wbcr_factory_446')]);
|
32 |
+
}
|
33 |
+
$success = false;
|
34 |
+
$send_data = [];
|
35 |
+
|
36 |
+
if( $storage == 'internal' ) {
|
37 |
+
if( $action == 'activate' ) {
|
38 |
+
if( $plugin_instance->activateComponent($slug) ) {
|
39 |
+
$success = true;
|
40 |
+
}
|
41 |
+
} else if( $action == 'deactivate' ) {
|
42 |
+
|
43 |
+
if( $plugin_instance->deactivateComponent($slug) ) {
|
44 |
+
$success = true;
|
45 |
+
}
|
46 |
+
} else {
|
47 |
+
wp_send_json_error(['error_message' => __('You are trying to perform an invalid action.', 'wbcr_factory_446')]);
|
48 |
+
}
|
49 |
+
} else if( $storage == 'wordpress' || $storage == 'creativemotion' ) {
|
50 |
+
if( !empty($slug) ) {
|
51 |
+
$network_wide = $plugin_instance->isNetworkActive();
|
52 |
+
|
53 |
+
if( $action == 'activate' ) {
|
54 |
+
$result = activate_plugin($slug, '', $network_wide);
|
55 |
+
|
56 |
+
if( is_wp_error($result) ) {
|
57 |
+
wp_send_json_error(['error_message' => $result->get_error_message()]);
|
58 |
+
}
|
59 |
+
} else if( $action == 'deactivate' ) {
|
60 |
+
deactivate_plugins($slug, false, $network_wide);
|
61 |
+
}
|
62 |
+
|
63 |
+
$success = true;
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
if( $action == 'install' || $action == 'deactivate' ) {
|
68 |
+
try {
|
69 |
+
// Delete button
|
70 |
+
$delete_button = $plugin_instance->get_delete_component_button($storage, $slug);
|
71 |
+
$send_data['delete_button'] = $delete_button->get_button();
|
72 |
+
} catch( Exception $e ) {
|
73 |
+
wp_send_json_error(['error_message' => $e->getMessage()]);
|
74 |
+
}
|
75 |
+
}
|
76 |
+
|
77 |
+
// Если требуется обновить постоянные ссылки, даем сигнал, что пользователю, нужно показать
|
78 |
+
// всплывающее уведомление.
|
79 |
+
// todo: сделать более красивое решение с передачей текстовых сообщений
|
80 |
+
/*if ( $action == 'deactivate' ) {
|
81 |
+
$is_need_rewrite_rules = $plugin_instance->getPopulateOption( 'need_rewrite_rules' );
|
82 |
+
if ( $is_need_rewrite_rules ) {
|
83 |
+
$send_data['need_rewrite_rules'] = sprintf( '<span class="wbcr-clr-need-rewrite-rules-message">' . __( 'When you deactivate some components, permanent links may work incorrectly. If this happens, please, <a href="%s">update the permalinks</a>, so you could complete the deactivation.', 'wbcr_factory_446' ), admin_url( 'options-permalink.php' ) . '</span>' );
|
84 |
+
}
|
85 |
+
}*/
|
86 |
+
|
87 |
+
if( $success ) {
|
88 |
+
// todo: для совместимости с плагином Clearfy
|
89 |
+
if( "wbcr_clearfy" === $plugin_instance->getPluginName() ) {
|
90 |
+
do_action('wbcr_clearfy_update_component', $slug, $action, $storage);
|
91 |
+
}
|
92 |
+
do_action("wfactory/updated_{$plugin_instance->getPluginName()}_component", $slug, $action, $storage);
|
93 |
+
|
94 |
+
wp_send_json_success($send_data);
|
95 |
+
}
|
96 |
+
|
97 |
+
wp_send_json_error(['error_message' => __('An unknown error occurred during the activation of the component.', 'wbcr_factory_446')]);
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Ajax event that calls the wbcr/clearfy/activated_component action,
|
102 |
+
* to get the component to work. Usually this is a call to the installation functions,
|
103 |
+
* but in some cases, overwriting permanent references or compatibility checks.
|
104 |
+
*/
|
105 |
+
function wfactory_446_prepare_component($plugin_instance)
|
106 |
+
{
|
107 |
+
check_ajax_referer('updates');
|
108 |
+
|
109 |
+
$component_name = $plugin_instance->request->post('plugin', null, true);
|
110 |
+
|
111 |
+
if( !current_user_can('update_plugins') ) {
|
112 |
+
wp_send_json_error(['error_message' => __('You don\'t have enough capability to edit this information.', 'wbcr_factory_446')], 403);
|
113 |
+
}
|
114 |
+
|
115 |
+
if( empty($component_name) ) {
|
116 |
+
wp_send_json_error(['error_message' => __('Required attribute [component_name] is empty.', 'wbcr_factory_446')]);
|
117 |
+
}
|
118 |
+
// todo: для совместимости с плагином Clearfy
|
119 |
+
if( "wbcr_clearfy" === $plugin_instance->getPluginName() ) {
|
120 |
+
do_action('wbcr/clearfy/activated_component', $component_name);
|
121 |
+
}
|
122 |
+
do_action("wfactory/activated_{$plugin_instance->getPluginName()}_component", $component_name);
|
123 |
+
|
124 |
+
wp_send_json_success();
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Ajax handler for installing a plugin.
|
129 |
+
*
|
130 |
+
* @since 4.6.0
|
131 |
+
*
|
132 |
+
* @see Plugin_Upgrader
|
133 |
+
*
|
134 |
+
* @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
|
135 |
+
*/
|
136 |
+
function wfactory_446_creativemotion_install_plugin($plugin_instance)
|
137 |
+
{
|
138 |
+
check_ajax_referer('updates');
|
139 |
+
|
140 |
+
if( empty($_POST['slug']) ) {
|
141 |
+
wp_send_json_error(array(
|
142 |
+
'slug' => '',
|
143 |
+
'errorCode' => 'no_plugin_specified',
|
144 |
+
'errorMessage' => __('No plugin specified.'),
|
145 |
+
));
|
146 |
+
}
|
147 |
+
|
148 |
+
$status = array(
|
149 |
+
'install' => 'plugin',
|
150 |
+
'slug' => sanitize_key(wp_unslash($_POST['slug'])),
|
151 |
+
);
|
152 |
+
|
153 |
+
if( !current_user_can('install_plugins') ) {
|
154 |
+
$status['errorMessage'] = __('Sorry, you are not allowed to install plugins on this site.');
|
155 |
+
wp_send_json_error($status);
|
156 |
+
}
|
157 |
+
|
158 |
+
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
|
159 |
+
include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
|
160 |
+
|
161 |
+
$api = plugins_api('plugin_information', array(
|
162 |
+
'slug' => sanitize_key(wp_unslash($_POST['slug'])),
|
163 |
+
'fields' => array(
|
164 |
+
'sections' => false,
|
165 |
+
),
|
166 |
+
));
|
167 |
+
|
168 |
+
if( is_wp_error($api) ) {
|
169 |
+
$status['errorMessage'] = $api->get_error_message();
|
170 |
+
wp_send_json_error($status);
|
171 |
+
}
|
172 |
+
|
173 |
+
$status['pluginName'] = $api->name;
|
174 |
+
|
175 |
+
$skin = new WP_Ajax_Upgrader_Skin();
|
176 |
+
$upgrader = new Plugin_Upgrader($skin);
|
177 |
+
//$result = $upgrader->install($api->download_link);
|
178 |
+
$result = $upgrader->install('https://clearfy.pro/components/download.php');
|
179 |
+
|
180 |
+
if( defined('WP_DEBUG') && WP_DEBUG ) {
|
181 |
+
$status['debug'] = $skin->get_upgrade_messages();
|
182 |
+
}
|
183 |
+
|
184 |
+
if( is_wp_error($result) ) {
|
185 |
+
$status['errorCode'] = $result->get_error_code();
|
186 |
+
$status['errorMessage'] = $result->get_error_message();
|
187 |
+
wp_send_json_error($status);
|
188 |
+
} elseif( is_wp_error($skin->result) ) {
|
189 |
+
$status['errorCode'] = $skin->result->get_error_code();
|
190 |
+
$status['errorMessage'] = $skin->result->get_error_message();
|
191 |
+
wp_send_json_error($status);
|
192 |
+
} elseif( $skin->get_errors()->has_errors() ) {
|
193 |
+
$status['errorMessage'] = $skin->get_error_messages();
|
194 |
+
wp_send_json_error($status);
|
195 |
+
} elseif( is_null($result) ) {
|
196 |
+
global $wp_filesystem;
|
197 |
+
|
198 |
+
$status['errorCode'] = 'unable_to_connect_to_filesystem';
|
199 |
+
$status['errorMessage'] = __('Unable to connect to the filesystem. Please confirm your credentials.');
|
200 |
+
|
201 |
+
// Pass through the error from WP_Filesystem if one was raised.
|
202 |
+
if( $wp_filesystem instanceof WP_Filesystem_Base && is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->has_errors() ) {
|
203 |
+
$status['errorMessage'] = esc_html($wp_filesystem->errors->get_error_message());
|
204 |
+
}
|
205 |
+
|
206 |
+
wp_send_json_error($status);
|
207 |
+
}
|
208 |
+
|
209 |
+
$install_status = install_plugin_install_status($api);
|
210 |
+
$pagenow = isset($_POST['pagenow']) ? sanitize_key($_POST['pagenow']) : '';
|
211 |
+
|
212 |
+
// If installation request is coming from import page, do not return network activation link.
|
213 |
+
$plugins_url = ('import' === $pagenow) ? admin_url('plugins.php') : network_admin_url('plugins.php');
|
214 |
+
|
215 |
+
if( current_user_can('activate_plugin', $install_status['file']) && is_plugin_inactive($install_status['file']) ) {
|
216 |
+
$status['activateUrl'] = add_query_arg(array(
|
217 |
+
'_wpnonce' => wp_create_nonce('activate-plugin_' . $install_status['file']),
|
218 |
+
'action' => 'activate',
|
219 |
+
'plugin' => $install_status['file'],
|
220 |
+
), $plugins_url);
|
221 |
+
}
|
222 |
+
|
223 |
+
if( is_multisite() && current_user_can('manage_network_plugins') && 'import' !== $pagenow ) {
|
224 |
+
$status['activateUrl'] = add_query_arg(array('networkwide' => 1), $status['activateUrl']);
|
225 |
+
}
|
226 |
+
|
227 |
+
wp_send_json_success($status);
|
228 |
+
}
|
libs/factory/core/assets/js/core-components.js
ADDED
@@ -0,0 +1,227 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* This code provides tools for downloading, installing external add-ons for the Clearfy plugin
|
3 |
+
*
|
4 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>
|
5 |
+
* @copyright (c) 10.09.2017, Webcraftic
|
6 |
+
* @version 1.0
|
7 |
+
*/
|
8 |
+
|
9 |
+
(function($) {
|
10 |
+
'use strict';
|
11 |
+
|
12 |
+
var externalAddon = {
|
13 |
+
init: function() {
|
14 |
+
this.events();
|
15 |
+
},
|
16 |
+
events: function() {
|
17 |
+
var self = this;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* This event is intended for installation, removal, activation, deactivation of external add-ons
|
21 |
+
*/
|
22 |
+
|
23 |
+
$(document).on('click', '.wfactory-446-process-button', function() {
|
24 |
+
var $this = $(this),
|
25 |
+
button_i18n = $(this).data('i18n'),
|
26 |
+
plugin_slug = $(this).data('slug'),
|
27 |
+
plugin_action = $(this).data('plugin-action'),
|
28 |
+
plugin = $(this).data('plugin'),
|
29 |
+
storage = $(this).data('storage'),
|
30 |
+
wpnonce = $(this).data('wpnonce');
|
31 |
+
|
32 |
+
var action = ('creativemotion' === storage)
|
33 |
+
? 'wfactory-446-creativemotion-install-plugin'
|
34 |
+
: 'install-plugin';
|
35 |
+
|
36 |
+
if( storage === 'freemius' || ((storage === 'wordpress' || storage === 'creativemotion' || storage === 'internal') && (plugin_action === 'activate' || plugin_action === 'deactivate')) ) {
|
37 |
+
action = 'wfactory-446-intall-component';
|
38 |
+
} else if( storage === 'wordpress' && plugin_action === 'delete' ) {
|
39 |
+
action = 'delete-plugin';
|
40 |
+
}
|
41 |
+
|
42 |
+
var data = {
|
43 |
+
action: action,
|
44 |
+
slug: plugin_slug,
|
45 |
+
storage: storage,
|
46 |
+
plugin: plugin,
|
47 |
+
plugin_action: plugin_action,
|
48 |
+
_wpnonce: wpnonce
|
49 |
+
};
|
50 |
+
|
51 |
+
if( plugin_action === 'install' ) {
|
52 |
+
$this.addClass('updating-message');
|
53 |
+
}
|
54 |
+
|
55 |
+
$this.addClass('disabled').text(button_i18n.loading);
|
56 |
+
|
57 |
+
$.wfactory_446.hooks.run('core/components/pre_update', [$this, data]);
|
58 |
+
|
59 |
+
self.sendRequest(data, function(response) {
|
60 |
+
if( !response || !response.success ) {
|
61 |
+
$.wfactory_446.hooks.run('core/components/update_error', [
|
62 |
+
$this,
|
63 |
+
data,
|
64 |
+
response
|
65 |
+
]);
|
66 |
+
|
67 |
+
return;
|
68 |
+
}
|
69 |
+
|
70 |
+
if( response.success ) {
|
71 |
+
$this.removeClass('disabled').removeClass('updating-message');
|
72 |
+
|
73 |
+
if( plugin_action === 'install' ) {
|
74 |
+
|
75 |
+
plugin_action = 'activate';
|
76 |
+
$this.data('plugin-action', 'activate');
|
77 |
+
$this.attr('data-plugin-action', 'activate');
|
78 |
+
|
79 |
+
if( $this.hasClass('button') ) {
|
80 |
+
$this.removeClass('button-default').addClass('button-primary');
|
81 |
+
}
|
82 |
+
|
83 |
+
$.wfactory_446.hooks.run('core/components/installed', [
|
84 |
+
$this,
|
85 |
+
data,
|
86 |
+
response
|
87 |
+
]);
|
88 |
+
|
89 |
+
} else if( plugin_action === 'activate' ) {
|
90 |
+
|
91 |
+
plugin_action = 'deactivate';
|
92 |
+
$this.data('plugin-action', 'deactivate');
|
93 |
+
$this.attr('data-plugin-action', 'deactivate');
|
94 |
+
|
95 |
+
if( $this.hasClass('button') ) {
|
96 |
+
$this.removeClass('button-primary').addClass('button-default');
|
97 |
+
}
|
98 |
+
|
99 |
+
$.wfactory_446.hooks.run('core/components/pre_activate', [
|
100 |
+
$this,
|
101 |
+
data,
|
102 |
+
response
|
103 |
+
]);
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Send an additional request for activation of the component, during activation
|
107 |
+
* perform the action wbcr/clearfy/activated_component.
|
108 |
+
*
|
109 |
+
* Basically, this is necessary to prepare the plugin to work, write the necessary rows and
|
110 |
+
* tables in the database, rewriting permalinks, checking conflicts, etc.
|
111 |
+
*/
|
112 |
+
if( storage === 'freemius' || storage === 'internal' ) {
|
113 |
+
self.sendRequestToComponentActivationPrepare($this, data, button_i18n);
|
114 |
+
return;
|
115 |
+
}
|
116 |
+
|
117 |
+
} else if( plugin_action === 'deactivate' ) {
|
118 |
+
|
119 |
+
plugin_action = 'activate';
|
120 |
+
$this.data('plugin-action', 'activate');
|
121 |
+
$this.attr('data-plugin-action', 'activate');
|
122 |
+
|
123 |
+
if( $this.hasClass('button') ) {
|
124 |
+
$this.removeClass('button-default').addClass('button-primary');
|
125 |
+
}
|
126 |
+
|
127 |
+
$.wfactory_446.hooks.run('core/components/deactivated', [
|
128 |
+
$this,
|
129 |
+
data,
|
130 |
+
response
|
131 |
+
]);
|
132 |
+
|
133 |
+
} else if( plugin_action === 'delete' ) {
|
134 |
+
|
135 |
+
plugin_action = 'install';
|
136 |
+
|
137 |
+
$.wfactory_446.hooks.run('core/components/deleted', [$this, data, response]);
|
138 |
+
}
|
139 |
+
} else {
|
140 |
+
if( plugin_action === 'install' ) {
|
141 |
+
$this.removeClass('updating-message');
|
142 |
+
}
|
143 |
+
}
|
144 |
+
|
145 |
+
$this.text(button_i18n[plugin_action]);
|
146 |
+
|
147 |
+
$.wfactory_446.hooks.run('core/components/updated', [$this, data, response]);
|
148 |
+
});
|
149 |
+
|
150 |
+
return false;
|
151 |
+
});
|
152 |
+
},
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Отправляет дополнительный запрос на активацию компонента, во время активации
|
156 |
+
* выполняет хук wbcr/clearfy/activated_component.
|
157 |
+
*
|
158 |
+
* В принципе, это необходимо для подготовки плагина к работе, записи необходимых строк и таблиц в
|
159 |
+
* базу данных, перепись постоянных ссылок, проверка конфликтов и т.д.
|
160 |
+
*
|
161 |
+
* @param {object} componentButton
|
162 |
+
* @param {object} sendData
|
163 |
+
* @param {object} button_i18n
|
164 |
+
*/
|
165 |
+
sendRequestToComponentActivationPrepare: function(componentButton, sendData, button_i18n) {
|
166 |
+
var self = this;
|
167 |
+
|
168 |
+
componentButton.addClass('button-primary')
|
169 |
+
.addClass('disabled')
|
170 |
+
.text(button_i18n.preparation);
|
171 |
+
|
172 |
+
sendData.action = 'wfactory-446-prepare-component';
|
173 |
+
|
174 |
+
this.sendRequest(sendData, function(response) {
|
175 |
+
componentButton.removeClass('disabled');
|
176 |
+
|
177 |
+
if( !response || !response.success ) {
|
178 |
+
componentButton.text(button_i18n['activate']);
|
179 |
+
|
180 |
+
$.wfactory_446.hooks.run('core/components/activation_error', [
|
181 |
+
componentButton,
|
182 |
+
sendData,
|
183 |
+
response
|
184 |
+
]);
|
185 |
+
return;
|
186 |
+
}
|
187 |
+
|
188 |
+
componentButton.removeClass('button-primary').text(button_i18n['deactivate']);
|
189 |
+
|
190 |
+
$.wfactory_446.hooks.run('core/components/activated', [
|
191 |
+
componentButton,
|
192 |
+
sendData,
|
193 |
+
response
|
194 |
+
]);
|
195 |
+
});
|
196 |
+
},
|
197 |
+
|
198 |
+
sendRequest: function(data, callback) {
|
199 |
+
var self = this;
|
200 |
+
|
201 |
+
$.ajax(ajaxurl, {
|
202 |
+
type: 'post',
|
203 |
+
dataType: 'json',
|
204 |
+
data: data,
|
205 |
+
success: function(data, textStatus, jqXHR) {
|
206 |
+
callback && callback(data);
|
207 |
+
},
|
208 |
+
error: function(xhr, ajaxOptions, thrownError) {
|
209 |
+
console.log(xhr.status);
|
210 |
+
console.log(xhr.responseText);
|
211 |
+
console.log(thrownError);
|
212 |
+
|
213 |
+
$.wfactory_446.hooks.run('core/components/ajax_error', [
|
214 |
+
xhr,
|
215 |
+
ajaxOptions,
|
216 |
+
thrownError
|
217 |
+
]);
|
218 |
+
}
|
219 |
+
});
|
220 |
+
}
|
221 |
+
};
|
222 |
+
|
223 |
+
$(document).ready(function() {
|
224 |
+
externalAddon.init();
|
225 |
+
});
|
226 |
+
|
227 |
+
})(jQuery);
|
libs/factory/core/assets/js/core-general.js
ADDED
@@ -0,0 +1,99 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
*
|
3 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>
|
4 |
+
* @copyright (c) 02.09.2020, Webcraftic
|
5 |
+
* @version 1.0
|
6 |
+
*/
|
7 |
+
|
8 |
+
(function($) {
|
9 |
+
'use strict';
|
10 |
+
|
11 |
+
if( !$.wfactory_446 ) {
|
12 |
+
$.wfactory_446 = {};
|
13 |
+
}
|
14 |
+
|
15 |
+
$.wfactory_446.filters = $.wfactory_446.filters || {
|
16 |
+
|
17 |
+
/**
|
18 |
+
* A set of registered filters.
|
19 |
+
*/
|
20 |
+
_items: {},
|
21 |
+
|
22 |
+
/**
|
23 |
+
* A set of priorities of registered filters.
|
24 |
+
*/
|
25 |
+
_priorities: {},
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Applies filters to a given input value.
|
29 |
+
*/
|
30 |
+
run: function(filterName, args) {
|
31 |
+
var input = args && args.length > 0 ? args[0] : null;
|
32 |
+
if( !this._items[filterName] ) {
|
33 |
+
return input;
|
34 |
+
}
|
35 |
+
|
36 |
+
for( var i in this._priorities[filterName] ) {
|
37 |
+
if( !this._priorities[filterName].hasOwnProperty(i) ) {
|
38 |
+
continue;
|
39 |
+
}
|
40 |
+
|
41 |
+
var priority = this._priorities[filterName][i];
|
42 |
+
|
43 |
+
for( var k = 0; k < this._items[filterName][priority].length; k++ ) {
|
44 |
+
var f = this._items[filterName][priority][k];
|
45 |
+
input = f.apply(f, args);
|
46 |
+
}
|
47 |
+
}
|
48 |
+
|
49 |
+
return input;
|
50 |
+
},
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Registers a new filter.
|
54 |
+
*/
|
55 |
+
add: function(filterName, callback, priority) {
|
56 |
+
|
57 |
+
if( !priority ) {
|
58 |
+
priority = 10;
|
59 |
+
}
|
60 |
+
|
61 |
+
if( !this._items[filterName] ) {
|
62 |
+
this._items[filterName] = {};
|
63 |
+
}
|
64 |
+
if( !this._items[filterName][priority] ) {
|
65 |
+
this._items[filterName][priority] = [];
|
66 |
+
}
|
67 |
+
this._items[filterName][priority].push(callback);
|
68 |
+
|
69 |
+
if( !this._priorities[filterName] ) {
|
70 |
+
this._priorities[filterName] = [];
|
71 |
+
}
|
72 |
+
if( $.inArray(priority, this._priorities[filterName]) === -1 ) {
|
73 |
+
this._priorities[filterName].push(priority);
|
74 |
+
}
|
75 |
+
|
76 |
+
this._priorities[filterName].sort(function(a, b) {
|
77 |
+
return a - b;
|
78 |
+
});
|
79 |
+
}
|
80 |
+
};
|
81 |
+
|
82 |
+
$.wfactory_446.hooks = $.wfactory_446.hooks || {
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Applies filters to a given input value.
|
86 |
+
*/
|
87 |
+
run: function(filterName, args) {
|
88 |
+
$.wfactory_446.filters.run(filterName, args);
|
89 |
+
},
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Registers a new filter.
|
93 |
+
*/
|
94 |
+
add: function(filterName, callback, priority) {
|
95 |
+
$.wfactory_446.filters.add(filterName, callback, priority);
|
96 |
+
}
|
97 |
+
};
|
98 |
+
|
99 |
+
})(jQuery);
|
libs/factory/core/boot.php
CHANGED
@@ -1,62 +1,73 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Factory Plugin
|
4 |
-
*
|
5 |
-
* @author @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
-
* @since 1.0.0
|
7 |
-
* @package core
|
8 |
-
* @copyright (c) 2018, Webcraftic Ltd
|
9 |
-
*
|
10 |
-
*/
|
11 |
-
|
12 |
-
// Exit if accessed directly
|
13 |
-
if
|
14 |
-
exit;
|
15 |
-
}
|
16 |
-
|
17 |
-
if
|
18 |
-
return;
|
19 |
-
}
|
20 |
-
|
21 |
-
define(
|
22 |
-
|
23 |
-
define(
|
24 |
-
|
25 |
-
define(
|
26 |
-
define(
|
27 |
-
|
28 |
-
load_plugin_textdomain(
|
29 |
-
|
30 |
-
#comp merge
|
31 |
-
require_once(
|
32 |
-
|
33 |
-
require_once(
|
34 |
-
require_once(
|
35 |
-
|
36 |
-
require_once(
|
37 |
-
require_once(
|
38 |
-
require_once(
|
39 |
-
require_once(
|
40 |
-
require_once(
|
41 |
-
|
42 |
-
// ASSETS
|
43 |
-
require_once(
|
44 |
-
require_once(
|
45 |
-
require_once(
|
46 |
-
|
47 |
-
// PREMIUM
|
48 |
-
require_once(
|
49 |
-
require_once(
|
50 |
-
require_once(
|
51 |
-
|
52 |
-
// UPDATES
|
53 |
-
require_once(
|
54 |
-
require_once(
|
55 |
-
require_once(
|
56 |
-
require_once(
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
require_once(
|
62 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Factory Plugin
|
4 |
+
*
|
5 |
+
* @author @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
+
* @since 1.0.0
|
7 |
+
* @package core
|
8 |
+
* @copyright (c) 2018, Webcraftic Ltd
|
9 |
+
*
|
10 |
+
*/
|
11 |
+
|
12 |
+
// Exit if accessed directly
|
13 |
+
if( !defined('ABSPATH') ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
if( defined('FACTORY_446_LOADED') ) {
|
18 |
+
return;
|
19 |
+
}
|
20 |
+
|
21 |
+
define('FACTORY_446_LOADED', true);
|
22 |
+
|
23 |
+
define('FACTORY_446_VERSION', '4.4.6');
|
24 |
+
|
25 |
+
define('FACTORY_446_DIR', dirname(__FILE__));
|
26 |
+
define('FACTORY_446_URL', plugins_url(null, __FILE__));
|
27 |
+
|
28 |
+
load_plugin_textdomain('wbcr_factory_446', false, dirname(plugin_basename(__FILE__)) . '/langs');
|
29 |
+
|
30 |
+
#comp merge
|
31 |
+
require_once(FACTORY_446_DIR . '/includes/functions.php');
|
32 |
+
|
33 |
+
require_once(FACTORY_446_DIR . '/includes/entities/class-factory-paths.php');
|
34 |
+
require_once(FACTORY_446_DIR . '/includes/entities/class-factory-support.php');
|
35 |
+
|
36 |
+
require_once(FACTORY_446_DIR . '/includes/class-factory-requests.php');
|
37 |
+
require_once(FACTORY_446_DIR . '/includes/class-factory-options.php');
|
38 |
+
require_once(FACTORY_446_DIR . '/includes/class-factory-plugin-base.php');
|
39 |
+
require_once(FACTORY_446_DIR . '/includes/class-factory-migrations.php');
|
40 |
+
require_once(FACTORY_446_DIR . '/includes/class-factory-notices.php');
|
41 |
+
|
42 |
+
// ASSETS
|
43 |
+
require_once(FACTORY_446_DIR . '/includes/assets-managment/class-factory-assets-list.php');
|
44 |
+
require_once(FACTORY_446_DIR . '/includes/assets-managment/class-factory-script-list.php');
|
45 |
+
require_once(FACTORY_446_DIR . '/includes/assets-managment/class-factory-style-list.php');
|
46 |
+
|
47 |
+
// PREMIUM
|
48 |
+
require_once(FACTORY_446_DIR . '/includes/premium/class-factory-license-interface.php');
|
49 |
+
require_once(FACTORY_446_DIR . '/includes/premium/class-factory-provider-abstract.php');
|
50 |
+
require_once(FACTORY_446_DIR . '/includes/premium/class-factory-manager.php');
|
51 |
+
|
52 |
+
// UPDATES
|
53 |
+
require_once(FACTORY_446_DIR . '/includes/updates/repositories/class-factory-repository-abstract.php');
|
54 |
+
require_once(FACTORY_446_DIR . '/includes/updates/repositories/class-factory-wordpress.php');
|
55 |
+
require_once(FACTORY_446_DIR . '/includes/updates/repositories/class-factory-github.php');
|
56 |
+
require_once(FACTORY_446_DIR . '/includes/updates/class-factory-upgrader.php');
|
57 |
+
require_once(FACTORY_446_DIR . '/includes/updates/class-factory-premium-upgrader.php');
|
58 |
+
|
59 |
+
require_once(FACTORY_446_DIR . '/includes/class-factory-plugin-abstract.php');
|
60 |
+
|
61 |
+
require_once(FACTORY_446_DIR . '/includes/activation/class-factory-activator.php');
|
62 |
+
require_once(FACTORY_446_DIR . '/includes/activation/class-factory-update.php');
|
63 |
+
#endcomp
|
64 |
+
|
65 |
+
add_action('admin_enqueue_scripts', function () {
|
66 |
+
wp_enqueue_script('wfactory-446-core-general', FACTORY_446_URL . '/assets/js/core-general.js', [
|
67 |
+
'jquery'
|
68 |
+
], FACTORY_446_VERSION);
|
69 |
+
wp_enqueue_script('wfactory-446-core-components', FACTORY_446_URL . '/assets/js/core-components.js', [
|
70 |
+
'jquery',
|
71 |
+
'wfactory-446-core-general'
|
72 |
+
], FACTORY_446_VERSION);
|
73 |
+
});
|
libs/factory/core/includes/activation/class-factory-activator.php
CHANGED
@@ -1,43 +1,43 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* The file contains a base class for plugin activators.
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
-
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
7 |
-
*
|
8 |
-
* @package factory-core
|
9 |
-
* @since 1.0.0
|
10 |
-
*/
|
11 |
-
// Exit if accessed directly
|
12 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
13 |
-
exit;
|
14 |
-
}
|
15 |
-
|
16 |
-
|
17 |
-
/**
|
18 |
-
* Plugin Activator
|
19 |
-
*
|
20 |
-
* @since 1.0.0
|
21 |
-
*/
|
22 |
-
abstract class
|
23 |
-
|
24 |
-
/**
|
25 |
-
* Curent plugin.
|
26 |
-
*
|
27 |
-
* @var
|
28 |
-
*/
|
29 |
-
public $plugin;
|
30 |
-
|
31 |
-
public function __construct(
|
32 |
-
$this->plugin = $plugin;
|
33 |
-
}
|
34 |
-
|
35 |
-
public function activate() {
|
36 |
-
}
|
37 |
-
|
38 |
-
public function deactivate() {
|
39 |
-
}
|
40 |
-
|
41 |
-
public function update() {
|
42 |
-
}
|
43 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* The file contains a base class for plugin activators.
|
4 |
+
*
|
5 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
7 |
+
*
|
8 |
+
* @package factory-core
|
9 |
+
* @since 1.0.0
|
10 |
+
*/
|
11 |
+
// Exit if accessed directly
|
12 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
13 |
+
exit;
|
14 |
+
}
|
15 |
+
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Plugin Activator
|
19 |
+
*
|
20 |
+
* @since 1.0.0
|
21 |
+
*/
|
22 |
+
abstract class Wbcr_Factory446_Activator {
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Curent plugin.
|
26 |
+
*
|
27 |
+
* @var Wbcr_Factory446_Plugin
|
28 |
+
*/
|
29 |
+
public $plugin;
|
30 |
+
|
31 |
+
public function __construct( Wbcr_Factory446_Plugin $plugin ) {
|
32 |
+
$this->plugin = $plugin;
|
33 |
+
}
|
34 |
+
|
35 |
+
public function activate() {
|
36 |
+
}
|
37 |
+
|
38 |
+
public function deactivate() {
|
39 |
+
}
|
40 |
+
|
41 |
+
public function update() {
|
42 |
+
}
|
43 |
+
}
|
libs/factory/core/includes/activation/class-factory-update.php
CHANGED
@@ -1,39 +1,39 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* The file contains a base class for update items of plugins.
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
-
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
7 |
-
*
|
8 |
-
* @package factory-core
|
9 |
-
* @since 1.0.0
|
10 |
-
*/
|
11 |
-
|
12 |
-
// Exit if accessed directly
|
13 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
-
exit;
|
15 |
-
}
|
16 |
-
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Plugin Activator
|
20 |
-
*
|
21 |
-
* @since 1.0.0
|
22 |
-
*/
|
23 |
-
abstract class
|
24 |
-
|
25 |
-
/**
|
26 |
-
* Current plugin
|
27 |
-
*
|
28 |
-
* @var
|
29 |
-
*/
|
30 |
-
var $plugin;
|
31 |
-
|
32 |
-
public function __construct(
|
33 |
-
$this->plugin = $plugin;
|
34 |
-
}
|
35 |
-
|
36 |
-
abstract function install();
|
37 |
-
|
38 |
-
//abstract function rollback();
|
39 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* The file contains a base class for update items of plugins.
|
4 |
+
*
|
5 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
7 |
+
*
|
8 |
+
* @package factory-core
|
9 |
+
* @since 1.0.0
|
10 |
+
*/
|
11 |
+
|
12 |
+
// Exit if accessed directly
|
13 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Plugin Activator
|
20 |
+
*
|
21 |
+
* @since 1.0.0
|
22 |
+
*/
|
23 |
+
abstract class Wbcr_Factory446_Update {
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Current plugin
|
27 |
+
*
|
28 |
+
* @var Wbcr_Factory446_Plugin
|
29 |
+
*/
|
30 |
+
var $plugin;
|
31 |
+
|
32 |
+
public function __construct( Wbcr_Factory446_Plugin $plugin ) {
|
33 |
+
$this->plugin = $plugin;
|
34 |
+
}
|
35 |
+
|
36 |
+
abstract function install();
|
37 |
+
|
38 |
+
//abstract function rollback();
|
39 |
+
}
|
libs/factory/core/includes/activation/index.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
<?php
|
2 |
// Silence is golden.
|
1 |
+
<?php
|
2 |
// Silence is golden.
|
libs/factory/core/includes/assets-managment/class-factory-assets-list.php
CHANGED
@@ -1,126 +1,126 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* The class contains a base class for all lists of assets.
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
-
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
7 |
-
*
|
8 |
-
* @package factory-core
|
9 |
-
* @since 1.0.0
|
10 |
-
*/
|
11 |
-
|
12 |
-
// Exit if accessed directly
|
13 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
-
exit;
|
15 |
-
}
|
16 |
-
|
17 |
-
/**
|
18 |
-
* Assets List
|
19 |
-
*
|
20 |
-
* @since 1.0.0
|
21 |
-
*/
|
22 |
-
class
|
23 |
-
|
24 |
-
protected $all = [];
|
25 |
-
public $header_place = [];
|
26 |
-
public $footer_place = [];
|
27 |
-
public $required = [];
|
28 |
-
|
29 |
-
protected $default_place;
|
30 |
-
|
31 |
-
/**
|
32 |
-
* @var
|
33 |
-
*/
|
34 |
-
protected $plugin;
|
35 |
-
|
36 |
-
/**
|
37 |
-
* @param
|
38 |
-
* @param bool $defaultIsFooter
|
39 |
-
*/
|
40 |
-
public function __construct(
|
41 |
-
$this->plugin = $plugin;
|
42 |
-
|
43 |
-
if ( $defaultIsFooter ) {
|
44 |
-
$this->default_place = &$this->footer_place;
|
45 |
-
}
|
46 |
-
if ( ! $defaultIsFooter ) {
|
47 |
-
$this->default_place = &$this->header_place;
|
48 |
-
}
|
49 |
-
}
|
50 |
-
|
51 |
-
/**
|
52 |
-
* Remove items from the collection
|
53 |
-
*
|
54 |
-
* @return $this
|
55 |
-
*/
|
56 |
-
public function deregister() {
|
57 |
-
foreach ( func_get_args() as $item ) {
|
58 |
-
|
59 |
-
if ( ! is_string( $item ) ) {
|
60 |
-
return $this;
|
61 |
-
}
|
62 |
-
|
63 |
-
$key_in_all = array_search( $item, $this->all );
|
64 |
-
$key_in_default_place = array_search( $item, $this->default_place );
|
65 |
-
$key_in_header_place = array_search( $item, $this->header_place );
|
66 |
-
$key_inFooterPlace = array_search( $item, $this->footer_place );
|
67 |
-
|
68 |
-
if ( $key_in_all ) {
|
69 |
-
unset( $this->all[ $key_in_all ] );
|
70 |
-
}
|
71 |
-
if ( $key_in_default_place ) {
|
72 |
-
unset( $this->default_place[ $key_in_default_place ] );
|
73 |
-
}
|
74 |
-
if ( $key_in_header_place ) {
|
75 |
-
unset( $this->header_place[ $key_in_header_place ] );
|
76 |
-
}
|
77 |
-
if ( $key_inFooterPlace ) {
|
78 |
-
unset( $this->footer_place[ $key_inFooterPlace ] );
|
79 |
-
}
|
80 |
-
}
|
81 |
-
|
82 |
-
return $this;
|
83 |
-
}
|
84 |
-
|
85 |
-
/**
|
86 |
-
* Checks whether the collection is empty.
|
87 |
-
*
|
88 |
-
* @param string $source if the 'bootstrap' specified, checks only whether the bootstrap assets were required.
|
89 |
-
*
|
90 |
-
* @return boolean
|
91 |
-
*/
|
92 |
-
public function isEmpty( $source = 'wordpress' ) {
|
93 |
-
if ( 'bootstrap' === $source ) {
|
94 |
-
return empty( $this->required[ $source ] );
|
95 |
-
}
|
96 |
-
|
97 |
-
return empty( $this->all ) && empty( $this->required );
|
98 |
-
}
|
99 |
-
|
100 |
-
public function IsHeaderEmpty() {
|
101 |
-
return empty( $this->header_place );
|
102 |
-
}
|
103 |
-
|
104 |
-
public function IsFooterEmpty() {
|
105 |
-
return empty( $this->footer_place );
|
106 |
-
}
|
107 |
-
|
108 |
-
/**
|
109 |
-
* Adds new items to the requried collection.
|
110 |
-
*
|
111 |
-
* @param mixed
|
112 |
-
*/
|
113 |
-
public function request( $items, $source = 'wordpress' ) {
|
114 |
-
|
115 |
-
if ( is_array( $items ) ) {
|
116 |
-
foreach ( $items as $item ) {
|
117 |
-
$this->required[ $source ][] = $item;
|
118 |
-
}
|
119 |
-
} else {
|
120 |
-
$this->required[ $source ][] = $items;
|
121 |
-
}
|
122 |
-
|
123 |
-
return $this;
|
124 |
-
}
|
125 |
-
}
|
126 |
-
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* The class contains a base class for all lists of assets.
|
4 |
+
*
|
5 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
7 |
+
*
|
8 |
+
* @package factory-core
|
9 |
+
* @since 1.0.0
|
10 |
+
*/
|
11 |
+
|
12 |
+
// Exit if accessed directly
|
13 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Assets List
|
19 |
+
*
|
20 |
+
* @since 1.0.0
|
21 |
+
*/
|
22 |
+
class Wbcr_Factory446_AssetsList {
|
23 |
+
|
24 |
+
protected $all = [];
|
25 |
+
public $header_place = [];
|
26 |
+
public $footer_place = [];
|
27 |
+
public $required = [];
|
28 |
+
|
29 |
+
protected $default_place;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* @var Wbcr_Factory446_Plugin
|
33 |
+
*/
|
34 |
+
protected $plugin;
|
35 |
+
|
36 |
+
/**
|
37 |
+
* @param Wbcr_Factory446_Plugin $plugin
|
38 |
+
* @param bool $defaultIsFooter
|
39 |
+
*/
|
40 |
+
public function __construct( Wbcr_Factory446_Plugin $plugin, $defaultIsFooter = true ) {
|
41 |
+
$this->plugin = $plugin;
|
42 |
+
|
43 |
+
if ( $defaultIsFooter ) {
|
44 |
+
$this->default_place = &$this->footer_place;
|
45 |
+
}
|
46 |
+
if ( ! $defaultIsFooter ) {
|
47 |
+
$this->default_place = &$this->header_place;
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Remove items from the collection
|
53 |
+
*
|
54 |
+
* @return $this
|
55 |
+
*/
|
56 |
+
public function deregister() {
|
57 |
+
foreach ( func_get_args() as $item ) {
|
58 |
+
|
59 |
+
if ( ! is_string( $item ) ) {
|
60 |
+
return $this;
|
61 |
+
}
|
62 |
+
|
63 |
+
$key_in_all = array_search( $item, $this->all );
|
64 |
+
$key_in_default_place = array_search( $item, $this->default_place );
|
65 |
+
$key_in_header_place = array_search( $item, $this->header_place );
|
66 |
+
$key_inFooterPlace = array_search( $item, $this->footer_place );
|
67 |
+
|
68 |
+
if ( $key_in_all ) {
|
69 |
+
unset( $this->all[ $key_in_all ] );
|
70 |
+
}
|
71 |
+
if ( $key_in_default_place ) {
|
72 |
+
unset( $this->default_place[ $key_in_default_place ] );
|
73 |
+
}
|
74 |
+
if ( $key_in_header_place ) {
|
75 |
+
unset( $this->header_place[ $key_in_header_place ] );
|
76 |
+
}
|
77 |
+
if ( $key_inFooterPlace ) {
|
78 |
+
unset( $this->footer_place[ $key_inFooterPlace ] );
|
79 |
+
}
|
80 |
+
}
|
81 |
+
|
82 |
+
return $this;
|
83 |
+
}
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Checks whether the collection is empty.
|
87 |
+
*
|
88 |
+
* @param string $source if the 'bootstrap' specified, checks only whether the bootstrap assets were required.
|
89 |
+
*
|
90 |
+
* @return boolean
|
91 |
+
*/
|
92 |
+
public function isEmpty( $source = 'wordpress' ) {
|
93 |
+
if ( 'bootstrap' === $source ) {
|
94 |
+
return empty( $this->required[ $source ] );
|
95 |
+
}
|
96 |
+
|
97 |
+
return empty( $this->all ) && empty( $this->required );
|
98 |
+
}
|
99 |
+
|
100 |
+
public function IsHeaderEmpty() {
|
101 |
+
return empty( $this->header_place );
|
102 |
+
}
|
103 |
+
|
104 |
+
public function IsFooterEmpty() {
|
105 |
+
return empty( $this->footer_place );
|
106 |
+
}
|
107 |
+
|
108 |
+
/**
|
109 |
+
* Adds new items to the requried collection.
|
110 |
+
*
|
111 |
+
* @param mixed
|
112 |
+
*/
|
113 |
+
public function request( $items, $source = 'wordpress' ) {
|
114 |
+
|
115 |
+
if ( is_array( $items ) ) {
|
116 |
+
foreach ( $items as $item ) {
|
117 |
+
$this->required[ $source ][] = $item;
|
118 |
+
}
|
119 |
+
} else {
|
120 |
+
$this->required[ $source ][] = $items;
|
121 |
+
}
|
122 |
+
|
123 |
+
return $this;
|
124 |
+
}
|
125 |
+
}
|
126 |
+
|
libs/factory/core/includes/assets-managment/class-factory-script-list.php
CHANGED
@@ -1,166 +1,167 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* The file contains a class to manage script assets.
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
-
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
7 |
-
*
|
8 |
-
* @package factory-core
|
9 |
-
* @since 1.0.0
|
10 |
-
*/
|
11 |
-
|
12 |
-
// Exit if accessed directly
|
13 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
-
exit;
|
15 |
-
}
|
16 |
-
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Script List
|
20 |
-
*
|
21 |
-
* @since 1.0.0
|
22 |
-
*/
|
23 |
-
class
|
24 |
-
|
25 |
-
public $localize_data = [];
|
26 |
-
public $use_ajax = false;
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Adds new items to the collection (default place).
|
30 |
-
*
|
31 |
-
* @param mixed
|
32 |
-
*
|
33 |
-
* @version 2.0
|
34 |
-
*/
|
35 |
-
public function add( $file_url, $deps = [ 'jquery' ], $handle = null, $version = false, $place = 'default' ) {
|
36 |
-
|
37 |
-
if ( empty( $file_url ) ) {
|
38 |
-
return $this;
|
39 |
-
}
|
40 |
-
|
41 |
-
$resource = [];
|
42 |
-
$resource['file_url'] = $file_url;
|
43 |
-
$resource['deps'] = $deps;
|
44 |
-
$resource['handle'] = $handle;
|
45 |
-
$resource['version'] = $version;
|
46 |
-
|
47 |
-
$this->all[] = $resource;
|
48 |
-
|
49 |
-
switch ( $place ) {
|
50 |
-
case 'header':
|
51 |
-
$this->header_place[] = $resource;
|
52 |
-
break;
|
53 |
-
case 'footer':
|
54 |
-
$this->footer_place[] = $resource;
|
55 |
-
break;
|
56 |
-
default:
|
57 |
-
$this->default_place[] = $resource;
|
58 |
-
break;
|
59 |
-
}
|
60 |
-
|
61 |
-
return $this;
|
62 |
-
}
|
63 |
-
|
64 |
-
/**
|
65 |
-
* Adds new items to the collection (header).
|
66 |
-
*
|
67 |
-
* @param mixed
|
68 |
-
*/
|
69 |
-
public function addToHeader( $file_url, $deps = [ 'jquery' ], $handle = null ) {
|
70 |
-
return $this->add( $file_url, $deps, $handle, 'header' );
|
71 |
-
}
|
72 |
-
|
73 |
-
/**
|
74 |
-
* Adds new items to the collection (footer).
|
75 |
-
*
|
76 |
-
* @param mixed
|
77 |
-
*/
|
78 |
-
public function addToFooter( $file_url, $deps = [ 'jquery' ], $handle = null ) {
|
79 |
-
return $this->add( $file_url, $deps, $handle, 'footer' );
|
80 |
-
}
|
81 |
-
|
82 |
-
/**
|
83 |
-
* Осуществляет подключение всех зарегистрированных скриптов
|
84 |
-
*
|
85 |
-
* @param string $source
|
86 |
-
*/
|
87 |
-
public function connect( $source = 'wordpress' ) {
|
88 |
-
|
89 |
-
// register all global required scripts
|
90 |
-
if ( ! empty( $this->required[ $source ] ) ) {
|
91 |
-
foreach ( $this->required[ $source ] as $script ) {
|
92 |
-
if ( 'wordpress' === $source ) {
|
93 |
-
wp_enqueue_script( $script );
|
94 |
-
} else if ( 'bootstrap' === $source ) {
|
95 |
-
$this->plugin->bootstrap->enqueueScript( $script );
|
96 |
-
}
|
97 |
-
}
|
98 |
-
}
|
99 |
-
|
100 |
-
if ( $source == 'bootstrap' ) {
|
101 |
-
return;
|
102 |
-
}
|
103 |
-
|
104 |
-
$is_first_script = true;
|
105 |
-
$is_footer = false;
|
106 |
-
|
107 |
-
// register all other scripts
|
108 |
-
foreach ( [ $this->header_place, $this->footer_place ] as $script_place ) {
|
109 |
-
foreach ( $script_place as $script ) {
|
110 |
-
|
111 |
-
if ( empty( $script['file_url'] ) ) {
|
112 |
-
continue;
|
113 |
-
}
|
114 |
-
|
115 |
-
$handle = ! empty( $script['handle'] ) ? $script['handle'] : $script['file_url'];
|
116 |
-
$deps = ! is_array( $script['deps'] ) ? [] : $script['deps'];
|
117 |
-
$version = ! empty( $script['version'] ) ? $script['version'] : $this->plugin->getPluginVersion();
|
118 |
-
|
119 |
-
wp_register_script( $handle, $script['file_url'], $deps, $version, $is_footer );
|
120 |
-
|
121 |
-
if ( $is_first_script && $this->use_ajax ) {
|
122 |
-
wp_localize_script( $handle, 'factory', [ 'ajaxurl' => admin_url( 'admin-ajax.php' ) ] );
|
123 |
-
}
|
124 |
-
|
125 |
-
if ( ! empty( $this->localize_data[ $handle ] ) ) {
|
126 |
-
wp_localize_script( $handle, $this->localize_data[ $handle ][0], $this->localize_data[ $handle ][1] );
|
127 |
-
}
|
128 |
-
|
129 |
-
wp_enqueue_script( $handle );
|
130 |
-
|
131 |
-
$is_first_script = false;
|
132 |
-
}
|
133 |
-
|
134 |
-
$is_footer = true;
|
135 |
-
}
|
136 |
-
}
|
137 |
-
|
138 |
-
/**
|
139 |
-
* Если вызвать этот метод, на странице будет обязательно добавлена
|
140 |
-
* глобальная JS переменная с ссылкой на ajax обработчик
|
141 |
-
*/
|
142 |
-
public function useAjax() {
|
143 |
-
$this->use_ajax = true;
|
144 |
-
}
|
145 |
-
|
146 |
-
/**
|
147 |
-
* Регистрирует глобальную JS переменную с пользовательскими данными
|
148 |
-
*
|
149 |
-
* @param string $varname
|
150 |
-
* @param
|
151 |
-
*
|
152 |
-
* @return
|
153 |
-
*/
|
154 |
-
public function localize( $varname, $data ) {
|
155 |
-
$bindTo = count( $this->all ) == 0 ? null : end( $this->all );
|
156 |
-
|
157 |
-
if ( ! $bindTo ) {
|
158 |
-
return $this;
|
159 |
-
}
|
160 |
-
|
161 |
-
$
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
}
|
166 |
-
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* The file contains a class to manage script assets.
|
4 |
+
*
|
5 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
7 |
+
*
|
8 |
+
* @package factory-core
|
9 |
+
* @since 1.0.0
|
10 |
+
*/
|
11 |
+
|
12 |
+
// Exit if accessed directly
|
13 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Script List
|
20 |
+
*
|
21 |
+
* @since 1.0.0
|
22 |
+
*/
|
23 |
+
class Wbcr_Factory446_ScriptList extends Wbcr_Factory446_AssetsList {
|
24 |
+
|
25 |
+
public $localize_data = [];
|
26 |
+
public $use_ajax = false;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Adds new items to the collection (default place).
|
30 |
+
*
|
31 |
+
* @param mixed
|
32 |
+
*
|
33 |
+
* @version 2.0
|
34 |
+
*/
|
35 |
+
public function add( $file_url, $deps = [ 'jquery' ], $handle = null, $version = false, $place = 'default' ) {
|
36 |
+
|
37 |
+
if ( empty( $file_url ) ) {
|
38 |
+
return $this;
|
39 |
+
}
|
40 |
+
|
41 |
+
$resource = [];
|
42 |
+
$resource['file_url'] = $file_url;
|
43 |
+
$resource['deps'] = $deps;
|
44 |
+
$resource['handle'] = $handle;
|
45 |
+
$resource['version'] = $version;
|
46 |
+
|
47 |
+
$this->all[] = $resource;
|
48 |
+
|
49 |
+
switch ( $place ) {
|
50 |
+
case 'header':
|
51 |
+
$this->header_place[] = $resource;
|
52 |
+
break;
|
53 |
+
case 'footer':
|
54 |
+
$this->footer_place[] = $resource;
|
55 |
+
break;
|
56 |
+
default:
|
57 |
+
$this->default_place[] = $resource;
|
58 |
+
break;
|
59 |
+
}
|
60 |
+
|
61 |
+
return $this;
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Adds new items to the collection (header).
|
66 |
+
*
|
67 |
+
* @param mixed
|
68 |
+
*/
|
69 |
+
public function addToHeader( $file_url, $deps = [ 'jquery' ], $handle = null ) {
|
70 |
+
return $this->add( $file_url, $deps, $handle, 'header' );
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Adds new items to the collection (footer).
|
75 |
+
*
|
76 |
+
* @param mixed
|
77 |
+
*/
|
78 |
+
public function addToFooter( $file_url, $deps = [ 'jquery' ], $handle = null ) {
|
79 |
+
return $this->add( $file_url, $deps, $handle, 'footer' );
|
80 |
+
}
|
81 |
+
|
82 |
+
/**
|
83 |
+
* Осуществляет подключение всех зарегистрированных скриптов
|
84 |
+
*
|
85 |
+
* @param string $source
|
86 |
+
*/
|
87 |
+
public function connect( $source = 'wordpress' ) {
|
88 |
+
|
89 |
+
// register all global required scripts
|
90 |
+
if ( ! empty( $this->required[ $source ] ) ) {
|
91 |
+
foreach ( $this->required[ $source ] as $script ) {
|
92 |
+
if ( 'wordpress' === $source ) {
|
93 |
+
wp_enqueue_script( $script );
|
94 |
+
} else if ( 'bootstrap' === $source ) {
|
95 |
+
$this->plugin->bootstrap->enqueueScript( $script );
|
96 |
+
}
|
97 |
+
}
|
98 |
+
}
|
99 |
+
|
100 |
+
if ( $source == 'bootstrap' ) {
|
101 |
+
return;
|
102 |
+
}
|
103 |
+
|
104 |
+
$is_first_script = true;
|
105 |
+
$is_footer = false;
|
106 |
+
|
107 |
+
// register all other scripts
|
108 |
+
foreach ( [ $this->header_place, $this->footer_place ] as $script_place ) {
|
109 |
+
foreach ( $script_place as $script ) {
|
110 |
+
|
111 |
+
if ( empty( $script['file_url'] ) ) {
|
112 |
+
continue;
|
113 |
+
}
|
114 |
+
|
115 |
+
$handle = ! empty( $script['handle'] ) ? $script['handle'] : $script['file_url'];
|
116 |
+
$deps = ! is_array( $script['deps'] ) ? [] : $script['deps'];
|
117 |
+
$version = ! empty( $script['version'] ) ? $script['version'] : $this->plugin->getPluginVersion();
|
118 |
+
|
119 |
+
wp_register_script( $handle, $script['file_url'], $deps, $version, $is_footer );
|
120 |
+
|
121 |
+
if ( $is_first_script && $this->use_ajax ) {
|
122 |
+
wp_localize_script( $handle, 'factory', [ 'ajaxurl' => admin_url( 'admin-ajax.php' ) ] );
|
123 |
+
}
|
124 |
+
|
125 |
+
if ( ! empty( $this->localize_data[ $handle ] ) ) {
|
126 |
+
wp_localize_script( $handle, $this->localize_data[ $handle ][0], $this->localize_data[ $handle ][1] );
|
127 |
+
}
|
128 |
+
|
129 |
+
wp_enqueue_script( $handle );
|
130 |
+
|
131 |
+
$is_first_script = false;
|
132 |
+
}
|
133 |
+
|
134 |
+
$is_footer = true;
|
135 |
+
}
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Если вызвать этот метод, на странице будет обязательно добавлена
|
140 |
+
* глобальная JS переменная с ссылкой на ajax обработчик
|
141 |
+
*/
|
142 |
+
public function useAjax() {
|
143 |
+
$this->use_ajax = true;
|
144 |
+
}
|
145 |
+
|
146 |
+
/**
|
147 |
+
* Регистрирует глобальную JS переменную с пользовательскими данными
|
148 |
+
*
|
149 |
+
* @param string $varname
|
150 |
+
* @param array $data
|
151 |
+
*
|
152 |
+
* @return Wbcr_Factory446_ScriptList $this
|
153 |
+
*/
|
154 |
+
public function localize( $varname, $data ) {
|
155 |
+
$bindTo = count( $this->all ) == 0 ? null : end( $this->all );
|
156 |
+
|
157 |
+
if ( ! $bindTo ) {
|
158 |
+
return $this;
|
159 |
+
}
|
160 |
+
|
161 |
+
$handle = ! empty( $bindTo['handle'] ) ? $bindTo['handle'] : $bindTo['file_url'];
|
162 |
+
$this->localize_data[ $handle ] = [ $varname, $data ];
|
163 |
+
|
164 |
+
return $this;
|
165 |
+
}
|
166 |
+
}
|
167 |
+
|
libs/factory/core/includes/assets-managment/class-factory-style-list.php
CHANGED
@@ -1,86 +1,86 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* The file contains a class to manage style assets.
|
4 |
-
*
|
5 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
-
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
7 |
-
*
|
8 |
-
* @package factory-core
|
9 |
-
* @since 1.0.0
|
10 |
-
*/
|
11 |
-
|
12 |
-
// Exit if accessed directly
|
13 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
-
exit;
|
15 |
-
}
|
16 |
-
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Style List
|
20 |
-
*
|
21 |
-
* @since 1.0.0
|
22 |
-
*/
|
23 |
-
class
|
24 |
-
|
25 |
-
/**
|
26 |
-
* Adds new items to the collection (default place).
|
27 |
-
*
|
28 |
-
* @param mixed
|
29 |
-
*
|
30 |
-
* @version 2.0
|
31 |
-
*/
|
32 |
-
public function add( $file_url, $deps = [], $handle = null, $version = false, $media = 'all' ) {
|
33 |
-
|
34 |
-
if ( empty( $file_url ) ) {
|
35 |
-
return $this;
|
36 |
-
}
|
37 |
-
|
38 |
-
$resource = [];
|
39 |
-
$resource['file_url'] = $file_url;
|
40 |
-
$resource['deps'] = $deps;
|
41 |
-
$resource['handle'] = $handle;
|
42 |
-
$resource['version'] = $version;
|
43 |
-
$resource['media'] = $media;
|
44 |
-
|
45 |
-
$this->all[] = $resource;
|
46 |
-
|
47 |
-
return $this;
|
48 |
-
}
|
49 |
-
|
50 |
-
public function connect( $source = 'wordpress' ) {
|
51 |
-
// register all global required scripts
|
52 |
-
if ( ! empty( $this->required[ $source ] ) ) {
|
53 |
-
|
54 |
-
foreach ( $this->required[ $source ] as $style ) {
|
55 |
-
if ( 'wordpress' === $source ) {
|
56 |
-
wp_enqueue_style( $style );
|
57 |
-
} else if ( 'bootstrap' === $source ) {
|
58 |
-
$this->plugin->bootstrap->enqueueStyle( $style );
|
59 |
-
}
|
60 |
-
}
|
61 |
-
}
|
62 |
-
|
63 |
-
if ( $source == 'bootstrap' ) {
|
64 |
-
return;
|
65 |
-
}
|
66 |
-
|
67 |
-
if ( empty( $this->all ) ) {
|
68 |
-
return;
|
69 |
-
}
|
70 |
-
|
71 |
-
// register all other styles
|
72 |
-
foreach ( $this->all as $style ) {
|
73 |
-
|
74 |
-
if ( empty( $style['file_url'] ) ) {
|
75 |
-
continue;
|
76 |
-
}
|
77 |
-
|
78 |
-
$handle = ! empty( $style['handle'] ) ? $style['handle'] : md5( $style['file_url'] );
|
79 |
-
$deps = ! is_array( $style['deps'] ) ? [] : $style['deps'];
|
80 |
-
$version = ! empty( $style['version'] ) ? $style['version'] : $this->plugin->getPluginVersion();
|
81 |
-
|
82 |
-
wp_enqueue_style( $handle, $style['file_url'], $deps, $version );
|
83 |
-
}
|
84 |
-
}
|
85 |
-
}
|
86 |
-
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* The file contains a class to manage style assets.
|
4 |
+
*
|
5 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
6 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
7 |
+
*
|
8 |
+
* @package factory-core
|
9 |
+
* @since 1.0.0
|
10 |
+
*/
|
11 |
+
|
12 |
+
// Exit if accessed directly
|
13 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
14 |
+
exit;
|
15 |
+
}
|
16 |
+
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Style List
|
20 |
+
*
|
21 |
+
* @since 1.0.0
|
22 |
+
*/
|
23 |
+
class Wbcr_Factory446_StyleList extends Wbcr_Factory446_AssetsList {
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Adds new items to the collection (default place).
|
27 |
+
*
|
28 |
+
* @param mixed
|
29 |
+
*
|
30 |
+
* @version 2.0
|
31 |
+
*/
|
32 |
+
public function add( $file_url, $deps = [], $handle = null, $version = false, $media = 'all' ) {
|
33 |
+
|
34 |
+
if ( empty( $file_url ) ) {
|
35 |
+
return $this;
|
36 |
+
}
|
37 |
+
|
38 |
+
$resource = [];
|
39 |
+
$resource['file_url'] = $file_url;
|
40 |
+
$resource['deps'] = $deps;
|
41 |
+
$resource['handle'] = $handle;
|
42 |
+
$resource['version'] = $version;
|
43 |
+
$resource['media'] = $media;
|
44 |
+
|
45 |
+
$this->all[] = $resource;
|
46 |
+
|
47 |
+
return $this;
|
48 |
+
}
|
49 |
+
|
50 |
+
public function connect( $source = 'wordpress' ) {
|
51 |
+
// register all global required scripts
|
52 |
+
if ( ! empty( $this->required[ $source ] ) ) {
|
53 |
+
|
54 |
+
foreach ( $this->required[ $source ] as $style ) {
|
55 |
+
if ( 'wordpress' === $source ) {
|
56 |
+
wp_enqueue_style( $style );
|
57 |
+
} else if ( 'bootstrap' === $source ) {
|
58 |
+
$this->plugin->bootstrap->enqueueStyle( $style );
|
59 |
+
}
|
60 |
+
}
|
61 |
+
}
|
62 |
+
|
63 |
+
if ( $source == 'bootstrap' ) {
|
64 |
+
return;
|
65 |
+
}
|
66 |
+
|
67 |
+
if ( empty( $this->all ) ) {
|
68 |
+
return;
|
69 |
+
}
|
70 |
+
|
71 |
+
// register all other styles
|
72 |
+
foreach ( $this->all as $style ) {
|
73 |
+
|
74 |
+
if ( empty( $style['file_url'] ) ) {
|
75 |
+
continue;
|
76 |
+
}
|
77 |
+
|
78 |
+
$handle = ! empty( $style['handle'] ) ? $style['handle'] : md5( $style['file_url'] );
|
79 |
+
$deps = ! is_array( $style['deps'] ) ? [] : $style['deps'];
|
80 |
+
$version = ! empty( $style['version'] ) ? $style['version'] : $this->plugin->getPluginVersion();
|
81 |
+
|
82 |
+
wp_enqueue_style( $handle, $style['file_url'], $deps, $version );
|
83 |
+
}
|
84 |
+
}
|
85 |
+
}
|
86 |
+
|
libs/factory/core/includes/assets-managment/index.php
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
<?php
|
2 |
// Silence is golden.
|
1 |
+
<?php
|
2 |
// Silence is golden.
|
libs/factory/core/includes/class-check-compatibility.php
CHANGED
@@ -1,122 +1,122 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Проверяет совместимость с плагинами Webcraftic, с версиями php, с версиями Wordpress
|
5 |
-
*
|
6 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
7 |
-
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
8 |
-
*
|
9 |
-
* @version 1.0.0
|
10 |
-
* @since 4.0.8
|
11 |
-
*/
|
12 |
-
|
13 |
-
if ( ! class_exists( 'Wbcr_Factory_Compatibility' ) ) {
|
14 |
-
class Wbcr_Factory_Compatibility {
|
15 |
-
|
16 |
-
protected $plugin_prefix;
|
17 |
-
protected $plugin_class_prefix;
|
18 |
-
protected $plugin_name;
|
19 |
-
protected $plugin_title = "(no title)";
|
20 |
-
protected $required_php_version = '5.3';
|
21 |
-
protected $required_wp_version = '4.2.0';
|
22 |
-
|
23 |
-
function __construct( array $plugin_info ) {
|
24 |
-
foreach ( (array) $plugin_info as $property => $value ) {
|
25 |
-
$this->$property = $value;
|
26 |
-
}
|
27 |
-
|
28 |
-
add_action( 'admin_init', [ $this, 'registerNotices' ] );
|
29 |
-
}
|
30 |
-
|
31 |
-
/**
|
32 |
-
* Метод проверяет совместимость плагина с php и wordpress версией
|
33 |
-
*
|
34 |
-
* @return bool
|
35 |
-
*/
|
36 |
-
public function check() {
|
37 |
-
if ( ! $this->isPhpCompatibility() ) {
|
38 |
-
return false;
|
39 |
-
}
|
40 |
-
|
41 |
-
if ( ! $this->isWpCompatibility() ) {
|
42 |
-
return false;
|
43 |
-
}
|
44 |
-
|
45 |
-
return true;
|
46 |
-
}
|
47 |
-
|
48 |
-
/**
|
49 |
-
* Метод проверяет совместимость плагина с php версией сервера
|
50 |
-
*
|
51 |
-
* @return mixed
|
52 |
-
*/
|
53 |
-
public function isPhpCompatibility() {
|
54 |
-
return version_compare( PHP_VERSION, $this->required_php_version, '>=' );
|
55 |
-
}
|
56 |
-
|
57 |
-
/**
|
58 |
-
* Метод проверяет совместимость плагина с Wordpress версией сайта
|
59 |
-
*
|
60 |
-
* @return mixed
|
61 |
-
*/
|
62 |
-
public function isWpCompatibility() {
|
63 |
-
// Get the WP Version global.
|
64 |
-
global $wp_version;
|
65 |
-
|
66 |
-
return version_compare( $wp_version, $this->required_wp_version, '>=' );
|
67 |
-
}
|
68 |
-
|
69 |
-
/**
|
70 |
-
* Метод возвращает текст уведомления
|
71 |
-
*
|
72 |
-
* @return string
|
73 |
-
*/
|
74 |
-
public function getNoticeText() {
|
75 |
-
$notice_text = $notice_default_text = '';
|
76 |
-
$notice_default_text .= '<b>' . $this->plugin_title . ' ' . __( 'warning', '' ) . ':</b>' . '<br>';
|
77 |
-
|
78 |
-
$notice_default_text .= sprintf( __( 'The %s plugin has stopped.', '
|
79 |
-
$notice_default_text .= __( 'Possible reasons:', '' ) . ' <br>';
|
80 |
-
|
81 |
-
$has_one = false;
|
82 |
-
|
83 |
-
if ( ! $this->isPhpCompatibility() ) {
|
84 |
-
$has_one = true;
|
85 |
-
$notice_text .= '- ' . sprintf( __( 'You need to update the PHP version to %s or higher!', '
|
86 |
-
}
|
87 |
-
|
88 |
-
if ( ! $this->isWpCompatibility() ) {
|
89 |
-
$has_one = true;
|
90 |
-
$notice_text .= '- ' . sprintf( __( 'You need to update WordPress to %s or higher!', '
|
91 |
-
}
|
92 |
-
|
93 |
-
if ( $has_one ) {
|
94 |
-
$notice_text = $notice_default_text . $notice_text;
|
95 |
-
}
|
96 |
-
|
97 |
-
return $notice_text;
|
98 |
-
}
|
99 |
-
|
100 |
-
public function registerNotices() {
|
101 |
-
if ( current_user_can( 'activate_plugins' ) && current_user_can( 'edit_plugins' ) && current_user_can( 'install_plugins' ) ) {
|
102 |
-
if ( is_multisite() ) {
|
103 |
-
add_action( 'network_admin_notices', [ $this, 'showNotice' ] );
|
104 |
-
}
|
105 |
-
|
106 |
-
add_action( 'admin_notices', [ $this, 'showNotice' ] );
|
107 |
-
}
|
108 |
-
}
|
109 |
-
|
110 |
-
public function showNotice() {
|
111 |
-
$notice_text = $this->getNoticeText();
|
112 |
-
|
113 |
-
if ( empty( $notice_text ) ) {
|
114 |
-
return;
|
115 |
-
}
|
116 |
-
|
117 |
-
$notice_text = '<p>' . $this->getNoticeText() . '</p>';
|
118 |
-
|
119 |
-
echo '<div class="notice notice-error">' . apply_filters( 'wbcr/factory/check_compatibility/notice_text', $notice_text, $this->plugin_name ) . '</div>';
|
120 |
-
}
|
121 |
-
}
|
122 |
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Проверяет совместимость с плагинами Webcraftic, с версиями php, с версиями Wordpress
|
5 |
+
*
|
6 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
7 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
8 |
+
*
|
9 |
+
* @version 1.0.0
|
10 |
+
* @since 4.0.8
|
11 |
+
*/
|
12 |
+
|
13 |
+
if ( ! class_exists( 'Wbcr_Factory_Compatibility' ) ) {
|
14 |
+
class Wbcr_Factory_Compatibility {
|
15 |
+
|
16 |
+
protected $plugin_prefix;
|
17 |
+
protected $plugin_class_prefix;
|
18 |
+
protected $plugin_name;
|
19 |
+
protected $plugin_title = "(no title)";
|
20 |
+
protected $required_php_version = '5.3';
|
21 |
+
protected $required_wp_version = '4.2.0';
|
22 |
+
|
23 |
+
function __construct( array $plugin_info ) {
|
24 |
+
foreach ( (array) $plugin_info as $property => $value ) {
|
25 |
+
$this->$property = $value;
|
26 |
+
}
|
27 |
+
|
28 |
+
add_action( 'admin_init', [ $this, 'registerNotices' ] );
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Метод проверяет совместимость плагина с php и wordpress версией
|
33 |
+
*
|
34 |
+
* @return bool
|
35 |
+
*/
|
36 |
+
public function check() {
|
37 |
+
if ( ! $this->isPhpCompatibility() ) {
|
38 |
+
return false;
|
39 |
+
}
|
40 |
+
|
41 |
+
if ( ! $this->isWpCompatibility() ) {
|
42 |
+
return false;
|
43 |
+
}
|
44 |
+
|
45 |
+
return true;
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Метод проверяет совместимость плагина с php версией сервера
|
50 |
+
*
|
51 |
+
* @return mixed
|
52 |
+
*/
|
53 |
+
public function isPhpCompatibility() {
|
54 |
+
return version_compare( PHP_VERSION, $this->required_php_version, '>=' );
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Метод проверяет совместимость плагина с Wordpress версией сайта
|
59 |
+
*
|
60 |
+
* @return mixed
|
61 |
+
*/
|
62 |
+
public function isWpCompatibility() {
|
63 |
+
// Get the WP Version global.
|
64 |
+
global $wp_version;
|
65 |
+
|
66 |
+
return version_compare( $wp_version, $this->required_wp_version, '>=' );
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Метод возвращает текст уведомления
|
71 |
+
*
|
72 |
+
* @return string
|
73 |
+
*/
|
74 |
+
public function getNoticeText() {
|
75 |
+
$notice_text = $notice_default_text = '';
|
76 |
+
$notice_default_text .= '<b>' . $this->plugin_title . ' ' . __( 'warning', '' ) . ':</b>' . '<br>';
|
77 |
+
|
78 |
+
$notice_default_text .= sprintf( __( 'The %s plugin has stopped.', 'wbcr_factory_clearfy_000' ), $this->plugin_title ) . ' ';
|
79 |
+
$notice_default_text .= __( 'Possible reasons:', '' ) . ' <br>';
|
80 |
+
|
81 |
+
$has_one = false;
|
82 |
+
|
83 |
+
if ( ! $this->isPhpCompatibility() ) {
|
84 |
+
$has_one = true;
|
85 |
+
$notice_text .= '- ' . sprintf( __( 'You need to update the PHP version to %s or higher!', 'wbcr_factory_446' ), $this->required_php_version ) . '<br>';
|
86 |
+
}
|
87 |
+
|
88 |
+
if ( ! $this->isWpCompatibility() ) {
|
89 |
+
$has_one = true;
|
90 |
+
$notice_text .= '- ' . sprintf( __( 'You need to update WordPress to %s or higher!', 'wbcr_factory_446' ), $this->required_wp_version ) . '<br>';
|
91 |
+
}
|
92 |
+
|
93 |
+
if ( $has_one ) {
|
94 |
+
$notice_text = $notice_default_text . $notice_text;
|
95 |
+
}
|
96 |
+
|
97 |
+
return $notice_text;
|
98 |
+
}
|
99 |
+
|
100 |
+
public function registerNotices() {
|
101 |
+
if ( current_user_can( 'activate_plugins' ) && current_user_can( 'edit_plugins' ) && current_user_can( 'install_plugins' ) ) {
|
102 |
+
if ( is_multisite() ) {
|
103 |
+
add_action( 'network_admin_notices', [ $this, 'showNotice' ] );
|
104 |
+
}
|
105 |
+
|
106 |
+
add_action( 'admin_notices', [ $this, 'showNotice' ] );
|
107 |
+
}
|
108 |
+
}
|
109 |
+
|
110 |
+
public function showNotice() {
|
111 |
+
$notice_text = $this->getNoticeText();
|
112 |
+
|
113 |
+
if ( empty( $notice_text ) ) {
|
114 |
+
return;
|
115 |
+
}
|
116 |
+
|
117 |
+
$notice_text = '<p>' . $this->getNoticeText() . '</p>';
|
118 |
+
|
119 |
+
echo '<div class="notice notice-error">' . apply_filters( 'wbcr/factory/check_compatibility/notice_text', $notice_text, $this->plugin_name ) . '</div>';
|
120 |
+
}
|
121 |
+
}
|
122 |
}
|
libs/factory/core/includes/class-factory-migrations.php
CHANGED
@@ -1,541 +1,541 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace WBCR\
|
4 |
-
|
5 |
-
use Exception;
|
6 |
-
use
|
7 |
-
|
8 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
9 |
-
exit;
|
10 |
-
}
|
11 |
-
|
12 |
-
/**
|
13 |
-
* Often when updating plugins, you need to make some changes to the database.
|
14 |
-
* This class automatically checks for plugin migrations and executes them when
|
15 |
-
* updating.
|
16 |
-
*
|
17 |
-
* The class has a debug mode, to enable the debug mode add constants to your plugin:
|
18 |
-
* define ('FACTORY_MIGRATIONS_DEBUG', true) - enables/disables debugging mode
|
19 |
-
* define ('FACTORY_MIGRATIONS_FORCE_OLD_VERSION', '1.1.9') - sets previous version
|
20 |
-
* for the plugin, if constant isn't set, then the previous version is taken from
|
21 |
-
* the database.
|
22 |
-
*
|
23 |
-
* todo: get_option and get_site_option are used because some caching plugins caching options, which causes problems
|
24 |
-
*
|
25 |
-
*
|
26 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
27 |
-
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
28 |
-
*
|
29 |
-
* @since 4.1.1
|
30 |
-
*/
|
31 |
-
class Migrations {
|
32 |
-
|
33 |
-
protected $plugin;
|
34 |
-
|
35 |
-
/**
|
36 |
-
* Migrations constructor.
|
37 |
-
*
|
38 |
-
* @param
|
39 |
-
*
|
40 |
-
* @throws Exception
|
41 |
-
*/
|
42 |
-
public function __construct(
|
43 |
-
|
44 |
-
$this->plugin = $plugin;
|
45 |
-
$plugin_name = $plugin->getPluginName();
|
46 |
-
|
47 |
-
if ( ! file_exists( $this->plugin->get_paths()->migrations ) ) {
|
48 |
-
throw new Exception( 'Starting with version 4.1.1 of the Core for Factory framework module, you must create a "migrations" folder in the root of your plugin to store the migration of the plugin.' );
|
49 |
-
}
|
50 |
-
|
51 |
-
if ( is_admin() ) {
|
52 |
-
add_action( "admin_init", [ $this, "check_migrations" ] );
|
53 |
-
|
54 |
-
add_action( "wbcr/factory/plugin_{$plugin_name}_activated", [ $this, 'activation_hook' ] );
|
55 |
-
add_action( "wbcr/factory/admin_notices", [ $this, "debug_bar_notice" ], 10, 2 );
|
56 |
-
add_action( "wbcr/factory/admin_notices", [ $this, "migration_error_notice" ], 10, 2 );
|
57 |
-
}
|
58 |
-
}
|
59 |
-
|
60 |
-
/**
|
61 |
-
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
62 |
-
* @since 4.1.1
|
63 |
-
* @return mixed|void
|
64 |
-
*/
|
65 |
-
public function get_plugin_activated_time() {
|
66 |
-
if ( $this->plugin->isNetworkActive() ) {
|
67 |
-
return get_site_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
|
68 |
-
}
|
69 |
-
|
70 |
-
return get_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
|
71 |
-
}
|
72 |
-
|
73 |
-
/**
|
74 |
-
* Check if migration is necessary for plugin and if there are errors from previous migrations.
|
75 |
-
* In debug mode, migrations are not performed automatically.
|
76 |
-
*/
|
77 |
-
public function check_migrations() {
|
78 |
-
if ( $this->is_migration_error() && isset( $_GET['wbcr_factory_fix_migration_error'] ) ) {
|
79 |
-
$this->fix_migration_error();
|
80 |
-
wp_redirect( remove_query_arg( 'wbcr_factory_fix_migration_error' ) );
|
81 |
-
die();
|
82 |
-
}
|
83 |
-
|
84 |
-
if ( $this->is_debug() && isset( $_GET['wbcr_factory_test_migration'] ) ) {
|
85 |
-
$this->make_migration();
|
86 |
-
wp_redirect( remove_query_arg( 'wbcr_factory_test_migration' ) );
|
87 |
-
die();
|
88 |
-
}
|
89 |
-
|
90 |
-
if ( $this->need_migration() && ! $this->is_debug() ) {
|
91 |
-
$this->make_migration();
|
92 |
-
}
|
93 |
-
}
|
94 |
-
|
95 |
-
/**
|
96 |
-
* Notification displays the errors of outstanding migrations to fix errors
|
97 |
-
* you need to follow the instructions in the notification and click
|
98 |
-
* "I fixed, confirm migration".
|
99 |
-
*
|
100 |
-
* What is it for. Migrations are performed in background and on some sites,
|
101 |
-
* due to php errors or for some other reason, migration may be
|
102 |
-
* interrupted, because of what plugin will work incorrectly, you may lose settings.
|
103 |
-
*
|
104 |
-
* When creating new migrations, developer will add error handlers,
|
105 |
-
* and framework will intercept them safely for user and display them
|
106 |
-
* in this notice.
|
107 |
-
*
|
108 |
-
* @param array $notices
|
109 |
-
* @param static $plugin_name
|
110 |
-
*
|
111 |
-
* @return array
|
112 |
-
*/
|
113 |
-
public function migration_error_notice( $notices, $plugin_name ) {
|
114 |
-
|
115 |
-
if ( $this->plugin->getPluginName() !== $plugin_name ) {
|
116 |
-
return $notices;
|
117 |
-
}
|
118 |
-
|
119 |
-
if ( ! $this->is_migration_error() || ! current_user_can( 'update_plugins' ) ) {
|
120 |
-
return $notices;
|
121 |
-
}
|
122 |
-
|
123 |
-
if ( $this->plugin->isNetworkActive() ) {
|
124 |
-
$migration_error_text = get_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), '' );
|
125 |
-
} else {
|
126 |
-
$migration_error_text = get_option( $this->plugin->getOptionName( 'plugin_migration_error' ), '' );
|
127 |
-
}
|
128 |
-
|
129 |
-
$fix_migration_error_url = add_query_arg( 'wbcr_factory_fix_migration_error', 1 );
|
130 |
-
|
131 |
-
$notice_text = $migration_error_text;
|
132 |
-
$notice_text .= "<br><br><a href='{$fix_migration_error_url}' class='button button-default'>" . __( 'I fixed, confirm migration', '
|
133 |
-
|
134 |
-
$notices[] = [
|
135 |
-
'id' => 'migration_debug_bar',
|
136 |
-
'type' => 'error',
|
137 |
-
'dismissible' => false,
|
138 |
-
'dismiss_expires' => 0,
|
139 |
-
'text' => '<p><b>' . $this->plugin->getPluginTitle() . ' ' . __( 'migration error', '
|
140 |
-
];
|
141 |
-
|
142 |
-
return $notices;
|
143 |
-
}
|
144 |
-
|
145 |
-
/**
|
146 |
-
* Debug panel, display some information from the database. Also allows
|
147 |
-
* perform manual migrations to test new migrations.
|
148 |
-
*
|
149 |
-
* @param array $notices
|
150 |
-
* @param string $plugin_name
|
151 |
-
*
|
152 |
-
* @return array
|
153 |
-
*/
|
154 |
-
public function debug_bar_notice( $notices, $plugin_name ) {
|
155 |
-
|
156 |
-
if ( $this->plugin->getPluginName() !== $plugin_name ) {
|
157 |
-
return $notices;
|
158 |
-
}
|
159 |
-
if ( ! $this->is_debug() || ! current_user_can( 'update_plugins' ) ) {
|
160 |
-
return $notices;
|
161 |
-
}
|
162 |
-
|
163 |
-
$migrate_url = add_query_arg( 'wbcr_factory_test_migration', 1 );
|
164 |
-
|
165 |
-
$notice_text = __( "Plugin activated:", "
|
166 |
-
|
167 |
-
$notice_text .= __( "Old plugin version (debug):", "
|
168 |
-
$notice_text .= __( "Current plugin version:", "
|
169 |
-
$notice_text .= __( "Need migration:", "
|
170 |
-
$notice_text .= "<a href='{$migrate_url}' class='button button-default'>" . __( "Migrate now", "
|
171 |
-
|
172 |
-
$notices[] = [
|
173 |
-
'id' => 'migration_debug_bar',
|
174 |
-
'type' => 'warning',
|
175 |
-
'dismissible' => false,
|
176 |
-
'dismiss_expires' => 0,
|
177 |
-
'text' => '<p><b style="color:red;">' . $this->plugin->getPluginTitle() . ' ' . __( 'migrations DEBUG bar', '
|
178 |
-
];
|
179 |
-
|
180 |
-
return $notices;
|
181 |
-
}
|
182 |
-
|
183 |
-
/**
|
184 |
-
* Runs when plugin is activated. Checks if you need to migrate
|
185 |
-
* and if necessary it does it. Also adds a option when the plugin
|
186 |
-
* was activated for the first time.
|
187 |
-
*/
|
188 |
-
public function activation_hook() {
|
189 |
-
/*if ( $this->need_migration() && ! $this->is_debug() ) {
|
190 |
-
$this->make_migration();
|
191 |
-
}*/
|
192 |
-
|
193 |
-
// just time to know when the plugin was activated the first time
|
194 |
-
$activated = $this->get_plugin_activated_time();
|
195 |
-
|
196 |
-
if ( ! $activated ) {
|
197 |
-
if ( $this->plugin->isNetworkActive() ) {
|
198 |
-
update_site_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
|
199 |
-
update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
|
200 |
-
} else {
|
201 |
-
update_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
|
202 |
-
update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
|
203 |
-
}
|
204 |
-
}
|
205 |
-
}
|
206 |
-
|
207 |
-
/**
|
208 |
-
* Checks if debug mode of migrations from version x.x.x to x.x.y is enabled.
|
209 |
-
*
|
210 |
-
* @return bool
|
211 |
-
*/
|
212 |
-
protected function is_debug() {
|
213 |
-
return defined( 'FACTORY_MIGRATIONS_DEBUG' ) && FACTORY_MIGRATIONS_DEBUG;
|
214 |
-
}
|
215 |
-
|
216 |
-
/**
|
217 |
-
* Gets previous version of plugin that plugin had before updating to the new version.
|
218 |
-
*
|
219 |
-
* @return string|null
|
220 |
-
*/
|
221 |
-
protected function get_old_plugin_version() {
|
222 |
-
|
223 |
-
if ( $this->is_debug() && defined( 'FACTORY_MIGRATIONS_FORCE_OLD_VERSION' ) ) {
|
224 |
-
return FACTORY_MIGRATIONS_FORCE_OLD_VERSION;
|
225 |
-
}
|
226 |
-
|
227 |
-
if ( $this->plugin->isNetworkActive() ) {
|
228 |
-
$plugin_version = get_site_option( $this->plugin->getOptionName( 'plugin_version' ), null );
|
229 |
-
} else {
|
230 |
-
$plugin_version = get_option( $this->plugin->getOptionName( 'plugin_version' ), null );
|
231 |
-
}
|
232 |
-
|
233 |
-
if ( ! empty( $plugin_version ) ) {
|
234 |
-
return $plugin_version;
|
235 |
-
}
|
236 |
-
|
237 |
-
# TODO: Remove after few releases
|
238 |
-
# This block for compatibility code with old version of framework < 4.1.1
|
239 |
-
#-------------------------------------------
|
240 |
-
if ( $this->plugin->isNetworkActive() ) {
|
241 |
-
$plugin_versions = get_site_option( 'factory_plugin_versions', [] );
|
242 |
-
} else {
|
243 |
-
$plugin_versions = get_option( 'factory_plugin_versions', [] );
|
244 |
-
}
|
245 |
-
|
246 |
-
$plugin_version = isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ? $plugin_versions[ $this->plugin->getPluginName() ] : null;
|
247 |
-
|
248 |
-
if ( ! empty( $plugin_version ) ) {
|
249 |
-
$plugin_version = str_replace( [ 'free-', 'premium-', 'offline-' ], '', $plugin_version );
|
250 |
-
}
|
251 |
-
|
252 |
-
#-------------------------------------------
|
253 |
-
|
254 |
-
return $plugin_version;
|
255 |
-
}
|
256 |
-
|
257 |
-
/**
|
258 |
-
* Gets the current version of plugin.
|
259 |
-
*
|
260 |
-
* @return string
|
261 |
-
*/
|
262 |
-
protected function get_current_plugin_version() {
|
263 |
-
return $this->plugin->getPluginVersion();
|
264 |
-
}
|
265 |
-
|
266 |
-
/**
|
267 |
-
* Do I need migration for plugin? If previous migration was with a error, then
|
268 |
-
* method will always return false to prevent looping.
|
269 |
-
*
|
270 |
-
* @return mixed
|
271 |
-
*/
|
272 |
-
protected function need_migration() {
|
273 |
-
if ( $this->is_migration_error() ) {
|
274 |
-
return false;
|
275 |
-
}
|
276 |
-
|
277 |
-
return version_compare( $this->get_old_plugin_version(), $this->get_current_plugin_version(), '<' );
|
278 |
-
}
|
279 |
-
|
280 |
-
/**
|
281 |
-
* Are there errors from previous migrations?
|
282 |
-
*
|
283 |
-
* @return bool
|
284 |
-
*/
|
285 |
-
protected function is_migration_error() {
|
286 |
-
if ( $this->plugin->isNetworkActive() ) {
|
287 |
-
$error = get_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), false );
|
288 |
-
} else {
|
289 |
-
$error = get_option( $this->plugin->getOptionName( 'plugin_migration_error' ), false );
|
290 |
-
}
|
291 |
-
|
292 |
-
return $error !== false;
|
293 |
-
}
|
294 |
-
|
295 |
-
/**
|
296 |
-
* Remove an option in database, thereby fix errors of the previous migration.
|
297 |
-
*/
|
298 |
-
protected function fix_migration_error() {
|
299 |
-
if ( $this->plugin->isNetworkActive() ) {
|
300 |
-
delete_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ) );
|
301 |
-
|
302 |
-
return;
|
303 |
-
}
|
304 |
-
|
305 |
-
delete_option( $this->plugin->getOptionName( 'plugin_migration_error' ) );
|
306 |
-
}
|
307 |
-
|
308 |
-
/**
|
309 |
-
* Migrates the plugin from version x.x.x to x.x.y. Automatically searches for files
|
310 |
-
* migrations to the plugin's root directory and executes them. Default files
|
311 |
-
* migrations are stored in wp-content/plugins/plugin-name/migrations and have names
|
312 |
-
* 0x0x0x.php, which corresponds to the version x.x.x. Method executes those migration files
|
313 |
-
* versions of which are between the previous version of plugin and current one.
|
314 |
-
*
|
315 |
-
*/
|
316 |
-
protected function make_migration() {
|
317 |
-
|
318 |
-
if ( ! current_user_can( 'update_plugins' ) ) {
|
319 |
-
return;
|
320 |
-
}
|
321 |
-
|
322 |
-
$old_plugin_version = $this->get_old_plugin_version();
|
323 |
-
$new_plugin_version = $this->get_current_plugin_version();
|
324 |
-
|
325 |
-
if ( empty( $old_plugin_version ) ) {
|
326 |
-
$this->update_plugin_version_in_db();
|
327 |
-
}
|
328 |
-
|
329 |
-
// converts versions like 0.0.0 to 000000
|
330 |
-
$old_number = $this->get_version_number( $old_plugin_version );
|
331 |
-
$new_number = $this->get_version_number( $new_plugin_version );
|
332 |
-
|
333 |
-
try {
|
334 |
-
|
335 |
-
$update_files = $this->plugin->get_paths()->migrations;
|
336 |
-
$files = $this->find_files( $update_files );
|
337 |
-
|
338 |
-
if ( empty( $files ) ) {
|
339 |
-
$this->update_plugin_version_in_db();
|
340 |
-
|
341 |
-
return;
|
342 |
-
}
|
343 |
-
|
344 |
-
// finds updates that has intermediate version
|
345 |
-
foreach ( (array) $files as $item ) {
|
346 |
-
if ( ! preg_match( '/^\d+$/', $item['name'] ) ) {
|
347 |
-
continue;
|
348 |
-
}
|
349 |
-
|
350 |
-
$item_number = intval( $item['name'] );
|
351 |
-
|
352 |
-
if ( $item_number > $old_number && $item_number <= $new_number ) {
|
353 |
-
$classes = $this->get_classes( $item['path'] );
|
354 |
-
|
355 |
-
if ( count( $classes ) == 0 ) {
|
356 |
-
continue;
|
357 |
-
}
|
358 |
-
|
359 |
-
foreach ( $classes as $path => $class_data ) {
|
360 |
-
include_once( $path );
|
361 |
-
$update_class = $class_data['name'];
|
362 |
-
|
363 |
-
$update = new $update_class( $this->plugin );
|
364 |
-
$update->install();
|
365 |
-
}
|
366 |
-
}
|
367 |
-
}
|
368 |
-
|
369 |
-
$this->update_plugin_version_in_db();
|
370 |
-
} catch( Exception $e ) {
|
371 |
-
if ( $this->plugin->isNetworkActive() ) {
|
372 |
-
update_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), $e->getMessage() );
|
373 |
-
|
374 |
-
return;
|
375 |
-
}
|
376 |
-
update_option( $this->plugin->getOptionName( 'plugin_migration_error' ), $e->getMessage() );
|
377 |
-
}
|
378 |
-
}
|
379 |
-
|
380 |
-
/**
|
381 |
-
* Updates version of plugin in database. So that we can track which
|
382 |
-
* previous version of plugin was at the user, before he updated
|
383 |
-
* plugin.
|
384 |
-
*/
|
385 |
-
protected function update_plugin_version_in_db() {
|
386 |
-
|
387 |
-
# TODO: Delete after few releases
|
388 |
-
# This block for compatibility code with the old version of framework.
|
389 |
-
# Cleans up old data, after the transition to new version of framework.
|
390 |
-
#-------------------------------------------
|
391 |
-
if ( $this->plugin->isNetworkActive() ) {
|
392 |
-
$plugin_versions = get_site_option( 'factory_plugin_versions', [] );
|
393 |
-
} else {
|
394 |
-
$plugin_versions = get_option( 'factory_plugin_versions', [] );
|
395 |
-
}
|
396 |
-
|
397 |
-
if ( isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ) {
|
398 |
-
unset( $plugin_versions[ $this->plugin->getPluginName() ] );
|
399 |
-
}
|
400 |
-
|
401 |
-
if ( $this->plugin->isNetworkActive() ) {
|
402 |
-
if ( empty( $plugin_versions ) ) {
|
403 |
-
delete_site_option( 'factory_plugin_versions' );
|
404 |
-
}
|
405 |
-
update_site_option( 'factory_plugin_versions', $plugin_versions );
|
406 |
-
update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
|
407 |
-
|
408 |
-
return;
|
409 |
-
}
|
410 |
-
|
411 |
-
if ( empty( $plugin_versions ) ) {
|
412 |
-
delete_option( 'factory_plugin_versions' );
|
413 |
-
}
|
414 |
-
|
415 |
-
update_option( 'factory_plugin_versions', $plugin_versions );
|
416 |
-
update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
|
417 |
-
}
|
418 |
-
|
419 |
-
/**
|
420 |
-
* Converts string representation of the version to the numeric.
|
421 |
-
*
|
422 |
-
* @since 1.0.0
|
423 |
-
*
|
424 |
-
* @param string $version A string version to convert.
|
425 |
-
*
|
426 |
-
* @return integer
|
427 |
-
*/
|
428 |
-
protected function get_version_number( $version ) {
|
429 |
-
preg_match( '/(\d+)\.(\d+)\.(\d+)/', $version, $matches );
|
430 |
-
if ( count( $matches ) == 0 ) {
|
431 |
-
return false;
|
432 |
-
}
|
433 |
-
|
434 |
-
$number = '';
|
435 |
-
$number .= ( strlen( $matches[1] ) == 1 ) ? '0' . $matches[1] : $matches[1];
|
436 |
-
$number .= ( strlen( $matches[2] ) == 1 ) ? '0' . $matches[2] : $matches[2];
|
437 |
-
$number .= ( strlen( $matches[3] ) == 1 ) ? '0' . $matches[3] : $matches[3];
|
438 |
-
|
439 |
-
return intval( $number );
|
440 |
-
}
|
441 |
-
|
442 |
-
/**
|
443 |
-
* Returns a list of files at a given path.
|
444 |
-
*
|
445 |
-
* @param string $path path for search
|
446 |
-
*/
|
447 |
-
private function find_files( $path ) {
|
448 |
-
return $this->find_file_or_folders( $path, true );
|
449 |
-
}
|
450 |
-
|
451 |
-
/**
|
452 |
-
* Returns a list of folders at a given path.
|
453 |
-
*
|
454 |
-
* @param string $path path for search
|
455 |
-
*/
|
456 |
-
/*private function find_folders( $path ) {
|
457 |
-
return $this->find_file_or_folders( $path, false );
|
458 |
-
}*/
|
459 |
-
|
460 |
-
/**
|
461 |
-
* Returns a list of files or folders at a given path.
|
462 |
-
*
|
463 |
-
* @param string $path path for search
|
464 |
-
* @param bool $files files or folders?
|
465 |
-
*/
|
466 |
-
private function find_file_or_folders( $path, $areFiles = true ) {
|
467 |
-
if ( ! is_dir( $path ) ) {
|
468 |
-
return [];
|
469 |
-
}
|
470 |
-
|
471 |
-
$entries = scandir( $path );
|
472 |
-
if ( empty( $entries ) ) {
|
473 |
-
return [];
|
474 |
-
}
|
475 |
-
|
476 |
-
$files = [];
|
477 |
-
foreach ( $entries as $entryName ) {
|
478 |
-
if ( $entryName == '.' || $entryName == '..' ) {
|
479 |
-
continue;
|
480 |
-
}
|
481 |
-
|
482 |
-
$filename = $path . '/' . $entryName;
|
483 |
-
if ( ( $areFiles && is_file( $filename ) ) || ( ! $areFiles && is_dir( $filename ) ) ) {
|
484 |
-
$files[] = [
|
485 |
-
'path' => str_replace( "\\", "/", $filename ),
|
486 |
-
'name' => $areFiles ? str_replace( '.php', '', $entryName ) : $entryName
|
487 |
-
];
|
488 |
-
}
|
489 |
-
}
|
490 |
-
|
491 |
-
return $files;
|
492 |
-
}
|
493 |
-
|
494 |
-
/**
|
495 |
-
* Gets php classes defined in a specified file.
|
496 |
-
*
|
497 |
-
* @param string $path
|
498 |
-
*
|
499 |
-
* @throws Exception
|
500 |
-
*/
|
501 |
-
private function get_classes( $path ) {
|
502 |
-
|
503 |
-
$phpCode = file_get_contents( $path );
|
504 |
-
|
505 |
-
$classes = [];
|
506 |
-
|
507 |
-
if ( ! function_exists( 'token_get_all' ) ) {
|
508 |
-
throw new Exception( __( 'There is no PHP Tokenizer extension installed on your server, you cannot use the token_get_all function.', '
|
509 |
-
}
|
510 |
-
|
511 |
-
$tokens = token_get_all( $phpCode );
|
512 |
-
|
513 |
-
$count = count( $tokens );
|
514 |
-
for ( $i = 2; $i < $count; $i ++ ) {
|
515 |
-
if ( is_array( $tokens ) && $tokens[ $i - 2 ][0] == T_CLASS && $tokens[ $i - 1 ][0] == T_WHITESPACE && $tokens[ $i ][0] == T_STRING ) {
|
516 |
-
|
517 |
-
$extends = null;
|
518 |
-
if ( $tokens[ $i + 2 ][0] == T_EXTENDS && $tokens[ $i + 4 ][0] == T_STRING ) {
|
519 |
-
$extends = $tokens[ $i + 4 ][1];
|
520 |
-
}
|
521 |
-
|
522 |
-
$class_name = $tokens[ $i ][1];
|
523 |
-
$classes[ $path ] = [
|
524 |
-
'name' => $class_name,
|
525 |
-
'extends' => $extends
|
526 |
-
];
|
527 |
-
}
|
528 |
-
}
|
529 |
-
|
530 |
-
/**
|
531 |
-
* result example:
|
532 |
-
*
|
533 |
-
* $classes['/plugin/items/filename.php'] = array(
|
534 |
-
* 'name' => 'PluginNameItem',
|
535 |
-
* 'extendes' => 'PluginNameItemBase'
|
536 |
-
* )
|
537 |
-
*/
|
538 |
-
|
539 |
-
return $classes;
|
540 |
-
}
|
541 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WBCR\Factory_446;
|
4 |
+
|
5 |
+
use Exception;
|
6 |
+
use Wbcr_Factory446_Plugin;
|
7 |
+
|
8 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
9 |
+
exit;
|
10 |
+
}
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Often when updating plugins, you need to make some changes to the database.
|
14 |
+
* This class automatically checks for plugin migrations and executes them when
|
15 |
+
* updating.
|
16 |
+
*
|
17 |
+
* The class has a debug mode, to enable the debug mode add constants to your plugin:
|
18 |
+
* define ('FACTORY_MIGRATIONS_DEBUG', true) - enables/disables debugging mode
|
19 |
+
* define ('FACTORY_MIGRATIONS_FORCE_OLD_VERSION', '1.1.9') - sets previous version
|
20 |
+
* for the plugin, if constant isn't set, then the previous version is taken from
|
21 |
+
* the database.
|
22 |
+
*
|
23 |
+
* todo: get_option and get_site_option are used because some caching plugins caching options, which causes problems
|
24 |
+
*
|
25 |
+
*
|
26 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
27 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
28 |
+
*
|
29 |
+
* @since 4.1.1
|
30 |
+
*/
|
31 |
+
class Migrations {
|
32 |
+
|
33 |
+
protected $plugin;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Migrations constructor.
|
37 |
+
*
|
38 |
+
* @param Wbcr_Factory446_Plugin $plugin
|
39 |
+
*
|
40 |
+
* @throws Exception
|
41 |
+
*/
|
42 |
+
public function __construct( Wbcr_Factory446_Plugin $plugin ) {
|
43 |
+
|
44 |
+
$this->plugin = $plugin;
|
45 |
+
$plugin_name = $plugin->getPluginName();
|
46 |
+
|
47 |
+
if ( ! file_exists( $this->plugin->get_paths()->migrations ) ) {
|
48 |
+
throw new Exception( 'Starting with version 4.1.1 of the Core for Factory framework module, you must create a "migrations" folder in the root of your plugin to store the migration of the plugin.' );
|
49 |
+
}
|
50 |
+
|
51 |
+
if ( is_admin() ) {
|
52 |
+
add_action( "admin_init", [ $this, "check_migrations" ] );
|
53 |
+
|
54 |
+
add_action( "wbcr/factory/plugin_{$plugin_name}_activated", [ $this, 'activation_hook' ] );
|
55 |
+
add_action( "wbcr/factory/admin_notices", [ $this, "debug_bar_notice" ], 10, 2 );
|
56 |
+
add_action( "wbcr/factory/admin_notices", [ $this, "migration_error_notice" ], 10, 2 );
|
57 |
+
}
|
58 |
+
}
|
59 |
+
|
60 |
+
/**
|
61 |
+
* @author Alexander Kovalev <alex.kovalevv@gmail.com>
|
62 |
+
* @since 4.1.1
|
63 |
+
* @return mixed|void
|
64 |
+
*/
|
65 |
+
public function get_plugin_activated_time() {
|
66 |
+
if ( $this->plugin->isNetworkActive() ) {
|
67 |
+
return get_site_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
|
68 |
+
}
|
69 |
+
|
70 |
+
return get_option( $this->plugin->getOptionName( 'plugin_activated' ), 0 );
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Check if migration is necessary for plugin and if there are errors from previous migrations.
|
75 |
+
* In debug mode, migrations are not performed automatically.
|
76 |
+
*/
|
77 |
+
public function check_migrations() {
|
78 |
+
if ( $this->is_migration_error() && isset( $_GET['wbcr_factory_fix_migration_error'] ) ) {
|
79 |
+
$this->fix_migration_error();
|
80 |
+
wp_redirect( remove_query_arg( 'wbcr_factory_fix_migration_error' ) );
|
81 |
+
die();
|
82 |
+
}
|
83 |
+
|
84 |
+
if ( $this->is_debug() && isset( $_GET['wbcr_factory_test_migration'] ) ) {
|
85 |
+
$this->make_migration();
|
86 |
+
wp_redirect( remove_query_arg( 'wbcr_factory_test_migration' ) );
|
87 |
+
die();
|
88 |
+
}
|
89 |
+
|
90 |
+
if ( $this->need_migration() && ! $this->is_debug() ) {
|
91 |
+
$this->make_migration();
|
92 |
+
}
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Notification displays the errors of outstanding migrations to fix errors
|
97 |
+
* you need to follow the instructions in the notification and click
|
98 |
+
* "I fixed, confirm migration".
|
99 |
+
*
|
100 |
+
* What is it for. Migrations are performed in background and on some sites,
|
101 |
+
* due to php errors or for some other reason, migration may be
|
102 |
+
* interrupted, because of what plugin will work incorrectly, you may lose settings.
|
103 |
+
*
|
104 |
+
* When creating new migrations, developer will add error handlers,
|
105 |
+
* and framework will intercept them safely for user and display them
|
106 |
+
* in this notice.
|
107 |
+
*
|
108 |
+
* @param array $notices
|
109 |
+
* @param static $plugin_name
|
110 |
+
*
|
111 |
+
* @return array
|
112 |
+
*/
|
113 |
+
public function migration_error_notice( $notices, $plugin_name ) {
|
114 |
+
|
115 |
+
if ( $this->plugin->getPluginName() !== $plugin_name ) {
|
116 |
+
return $notices;
|
117 |
+
}
|
118 |
+
|
119 |
+
if ( ! $this->is_migration_error() || ! current_user_can( 'update_plugins' ) ) {
|
120 |
+
return $notices;
|
121 |
+
}
|
122 |
+
|
123 |
+
if ( $this->plugin->isNetworkActive() ) {
|
124 |
+
$migration_error_text = get_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), '' );
|
125 |
+
} else {
|
126 |
+
$migration_error_text = get_option( $this->plugin->getOptionName( 'plugin_migration_error' ), '' );
|
127 |
+
}
|
128 |
+
|
129 |
+
$fix_migration_error_url = add_query_arg( 'wbcr_factory_fix_migration_error', 1 );
|
130 |
+
|
131 |
+
$notice_text = $migration_error_text;
|
132 |
+
$notice_text .= "<br><br><a href='{$fix_migration_error_url}' class='button button-default'>" . __( 'I fixed, confirm migration', 'wbcr_factory_446' ) . "</a>";
|
133 |
+
|
134 |
+
$notices[] = [
|
135 |
+
'id' => 'migration_debug_bar',
|
136 |
+
'type' => 'error',
|
137 |
+
'dismissible' => false,
|
138 |
+
'dismiss_expires' => 0,
|
139 |
+
'text' => '<p><b>' . $this->plugin->getPluginTitle() . ' ' . __( 'migration error', 'wbcr_factory_446' ) . '</b><br>' . $notice_text . '</p>'
|
140 |
+
];
|
141 |
+
|
142 |
+
return $notices;
|
143 |
+
}
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Debug panel, display some information from the database. Also allows
|
147 |
+
* perform manual migrations to test new migrations.
|
148 |
+
*
|
149 |
+
* @param array $notices
|
150 |
+
* @param string $plugin_name
|
151 |
+
*
|
152 |
+
* @return array
|
153 |
+
*/
|
154 |
+
public function debug_bar_notice( $notices, $plugin_name ) {
|
155 |
+
|
156 |
+
if ( $this->plugin->getPluginName() !== $plugin_name ) {
|
157 |
+
return $notices;
|
158 |
+
}
|
159 |
+
if ( ! $this->is_debug() || ! current_user_can( 'update_plugins' ) ) {
|
160 |
+
return $notices;
|
161 |
+
}
|
162 |
+
|
163 |
+
$migrate_url = add_query_arg( 'wbcr_factory_test_migration', 1 );
|
164 |
+
|
165 |
+
$notice_text = __( "Plugin activated:", "wbcr_factory_446" ) . ' ' . date( "Y-m-d H:i:s", $this->get_plugin_activated_time() ) . "<br>";
|
166 |
+
|
167 |
+
$notice_text .= __( "Old plugin version (debug):", "wbcr_factory_446" ) . ' ' . $this->get_old_plugin_version() . "<br>";
|
168 |
+
$notice_text .= __( "Current plugin version:", "wbcr_factory_446" ) . ' ' . $this->get_current_plugin_version() . "<br>";
|
169 |
+
$notice_text .= __( "Need migration:", "wbcr_factory_446" ) . ' ' . ( $this->need_migration() ? "true" : "false" ) . "<br><br>";
|
170 |
+
$notice_text .= "<a href='{$migrate_url}' class='button button-default'>" . __( "Migrate now", "wbcr_factory_446" ) . "</a><br>";
|
171 |
+
|
172 |
+
$notices[] = [
|
173 |
+
'id' => 'migration_debug_bar',
|
174 |
+
'type' => 'warning',
|
175 |
+
'dismissible' => false,
|
176 |
+
'dismiss_expires' => 0,
|
177 |
+
'text' => '<p><b style="color:red;">' . $this->plugin->getPluginTitle() . ' ' . __( 'migrations DEBUG bar', 'wbcr_factory_446' ) . '</b><br>' . $notice_text . '</p>'
|
178 |
+
];
|
179 |
+
|
180 |
+
return $notices;
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Runs when plugin is activated. Checks if you need to migrate
|
185 |
+
* and if necessary it does it. Also adds a option when the plugin
|
186 |
+
* was activated for the first time.
|
187 |
+
*/
|
188 |
+
public function activation_hook() {
|
189 |
+
/*if ( $this->need_migration() && ! $this->is_debug() ) {
|
190 |
+
$this->make_migration();
|
191 |
+
}*/
|
192 |
+
|
193 |
+
// just time to know when the plugin was activated the first time
|
194 |
+
$activated = $this->get_plugin_activated_time();
|
195 |
+
|
196 |
+
if ( ! $activated ) {
|
197 |
+
if ( $this->plugin->isNetworkActive() ) {
|
198 |
+
update_site_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
|
199 |
+
update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
|
200 |
+
} else {
|
201 |
+
update_option( $this->plugin->getOptionName( 'plugin_activated' ), time() );
|
202 |
+
update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
|
203 |
+
}
|
204 |
+
}
|
205 |
+
}
|
206 |
+
|
207 |
+
/**
|
208 |
+
* Checks if debug mode of migrations from version x.x.x to x.x.y is enabled.
|
209 |
+
*
|
210 |
+
* @return bool
|
211 |
+
*/
|
212 |
+
protected function is_debug() {
|
213 |
+
return defined( 'FACTORY_MIGRATIONS_DEBUG' ) && FACTORY_MIGRATIONS_DEBUG;
|
214 |
+
}
|
215 |
+
|
216 |
+
/**
|
217 |
+
* Gets previous version of plugin that plugin had before updating to the new version.
|
218 |
+
*
|
219 |
+
* @return string|null
|
220 |
+
*/
|
221 |
+
protected function get_old_plugin_version() {
|
222 |
+
|
223 |
+
if ( $this->is_debug() && defined( 'FACTORY_MIGRATIONS_FORCE_OLD_VERSION' ) ) {
|
224 |
+
return FACTORY_MIGRATIONS_FORCE_OLD_VERSION;
|
225 |
+
}
|
226 |
+
|
227 |
+
if ( $this->plugin->isNetworkActive() ) {
|
228 |
+
$plugin_version = get_site_option( $this->plugin->getOptionName( 'plugin_version' ), null );
|
229 |
+
} else {
|
230 |
+
$plugin_version = get_option( $this->plugin->getOptionName( 'plugin_version' ), null );
|
231 |
+
}
|
232 |
+
|
233 |
+
if ( ! empty( $plugin_version ) ) {
|
234 |
+
return $plugin_version;
|
235 |
+
}
|
236 |
+
|
237 |
+
# TODO: Remove after few releases
|
238 |
+
# This block for compatibility code with old version of framework < 4.1.1
|
239 |
+
#-------------------------------------------
|
240 |
+
if ( $this->plugin->isNetworkActive() ) {
|
241 |
+
$plugin_versions = get_site_option( 'factory_plugin_versions', [] );
|
242 |
+
} else {
|
243 |
+
$plugin_versions = get_option( 'factory_plugin_versions', [] );
|
244 |
+
}
|
245 |
+
|
246 |
+
$plugin_version = isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ? $plugin_versions[ $this->plugin->getPluginName() ] : null;
|
247 |
+
|
248 |
+
if ( ! empty( $plugin_version ) ) {
|
249 |
+
$plugin_version = str_replace( [ 'free-', 'premium-', 'offline-' ], '', $plugin_version );
|
250 |
+
}
|
251 |
+
|
252 |
+
#-------------------------------------------
|
253 |
+
|
254 |
+
return $plugin_version;
|
255 |
+
}
|
256 |
+
|
257 |
+
/**
|
258 |
+
* Gets the current version of plugin.
|
259 |
+
*
|
260 |
+
* @return string
|
261 |
+
*/
|
262 |
+
protected function get_current_plugin_version() {
|
263 |
+
return $this->plugin->getPluginVersion();
|
264 |
+
}
|
265 |
+
|
266 |
+
/**
|
267 |
+
* Do I need migration for plugin? If previous migration was with a error, then
|
268 |
+
* method will always return false to prevent looping.
|
269 |
+
*
|
270 |
+
* @return mixed
|
271 |
+
*/
|
272 |
+
protected function need_migration() {
|
273 |
+
if ( $this->is_migration_error() ) {
|
274 |
+
return false;
|
275 |
+
}
|
276 |
+
|
277 |
+
return version_compare( $this->get_old_plugin_version(), $this->get_current_plugin_version(), '<' );
|
278 |
+
}
|
279 |
+
|
280 |
+
/**
|
281 |
+
* Are there errors from previous migrations?
|
282 |
+
*
|
283 |
+
* @return bool
|
284 |
+
*/
|
285 |
+
protected function is_migration_error() {
|
286 |
+
if ( $this->plugin->isNetworkActive() ) {
|
287 |
+
$error = get_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), false );
|
288 |
+
} else {
|
289 |
+
$error = get_option( $this->plugin->getOptionName( 'plugin_migration_error' ), false );
|
290 |
+
}
|
291 |
+
|
292 |
+
return $error !== false;
|
293 |
+
}
|
294 |
+
|
295 |
+
/**
|
296 |
+
* Remove an option in database, thereby fix errors of the previous migration.
|
297 |
+
*/
|
298 |
+
protected function fix_migration_error() {
|
299 |
+
if ( $this->plugin->isNetworkActive() ) {
|
300 |
+
delete_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ) );
|
301 |
+
|
302 |
+
return;
|
303 |
+
}
|
304 |
+
|
305 |
+
delete_option( $this->plugin->getOptionName( 'plugin_migration_error' ) );
|
306 |
+
}
|
307 |
+
|
308 |
+
/**
|
309 |
+
* Migrates the plugin from version x.x.x to x.x.y. Automatically searches for files
|
310 |
+
* migrations to the plugin's root directory and executes them. Default files
|
311 |
+
* migrations are stored in wp-content/plugins/plugin-name/migrations and have names
|
312 |
+
* 0x0x0x.php, which corresponds to the version x.x.x. Method executes those migration files
|
313 |
+
* versions of which are between the previous version of plugin and current one.
|
314 |
+
*
|
315 |
+
*/
|
316 |
+
protected function make_migration() {
|
317 |
+
|
318 |
+
if ( ! current_user_can( 'update_plugins' ) ) {
|
319 |
+
return;
|
320 |
+
}
|
321 |
+
|
322 |
+
$old_plugin_version = $this->get_old_plugin_version();
|
323 |
+
$new_plugin_version = $this->get_current_plugin_version();
|
324 |
+
|
325 |
+
if ( empty( $old_plugin_version ) ) {
|
326 |
+
$this->update_plugin_version_in_db();
|
327 |
+
}
|
328 |
+
|
329 |
+
// converts versions like 0.0.0 to 000000
|
330 |
+
$old_number = $this->get_version_number( $old_plugin_version );
|
331 |
+
$new_number = $this->get_version_number( $new_plugin_version );
|
332 |
+
|
333 |
+
try {
|
334 |
+
|
335 |
+
$update_files = $this->plugin->get_paths()->migrations;
|
336 |
+
$files = $this->find_files( $update_files );
|
337 |
+
|
338 |
+
if ( empty( $files ) ) {
|
339 |
+
$this->update_plugin_version_in_db();
|
340 |
+
|
341 |
+
return;
|
342 |
+
}
|
343 |
+
|
344 |
+
// finds updates that has intermediate version
|
345 |
+
foreach ( (array) $files as $item ) {
|
346 |
+
if ( ! preg_match( '/^\d+$/', $item['name'] ) ) {
|
347 |
+
continue;
|
348 |
+
}
|
349 |
+
|
350 |
+
$item_number = intval( $item['name'] );
|
351 |
+
|
352 |
+
if ( $item_number > $old_number && $item_number <= $new_number ) {
|
353 |
+
$classes = $this->get_classes( $item['path'] );
|
354 |
+
|
355 |
+
if ( count( $classes ) == 0 ) {
|
356 |
+
continue;
|
357 |
+
}
|
358 |
+
|
359 |
+
foreach ( $classes as $path => $class_data ) {
|
360 |
+
include_once( $path );
|
361 |
+
$update_class = $class_data['name'];
|
362 |
+
|
363 |
+
$update = new $update_class( $this->plugin );
|
364 |
+
$update->install();
|
365 |
+
}
|
366 |
+
}
|
367 |
+
}
|
368 |
+
|
369 |
+
$this->update_plugin_version_in_db();
|
370 |
+
} catch( Exception $e ) {
|
371 |
+
if ( $this->plugin->isNetworkActive() ) {
|
372 |
+
update_site_option( $this->plugin->getOptionName( 'plugin_migration_error' ), $e->getMessage() );
|
373 |
+
|
374 |
+
return;
|
375 |
+
}
|
376 |
+
update_option( $this->plugin->getOptionName( 'plugin_migration_error' ), $e->getMessage() );
|
377 |
+
}
|
378 |
+
}
|
379 |
+
|
380 |
+
/**
|
381 |
+
* Updates version of plugin in database. So that we can track which
|
382 |
+
* previous version of plugin was at the user, before he updated
|
383 |
+
* plugin.
|
384 |
+
*/
|
385 |
+
protected function update_plugin_version_in_db() {
|
386 |
+
|
387 |
+
# TODO: Delete after few releases
|
388 |
+
# This block for compatibility code with the old version of framework.
|
389 |
+
# Cleans up old data, after the transition to new version of framework.
|
390 |
+
#-------------------------------------------
|
391 |
+
if ( $this->plugin->isNetworkActive() ) {
|
392 |
+
$plugin_versions = get_site_option( 'factory_plugin_versions', [] );
|
393 |
+
} else {
|
394 |
+
$plugin_versions = get_option( 'factory_plugin_versions', [] );
|
395 |
+
}
|
396 |
+
|
397 |
+
if ( isset( $plugin_versions[ $this->plugin->getPluginName() ] ) ) {
|
398 |
+
unset( $plugin_versions[ $this->plugin->getPluginName() ] );
|
399 |
+
}
|
400 |
+
|
401 |
+
if ( $this->plugin->isNetworkActive() ) {
|
402 |
+
if ( empty( $plugin_versions ) ) {
|
403 |
+
delete_site_option( 'factory_plugin_versions' );
|
404 |
+
}
|
405 |
+
update_site_option( 'factory_plugin_versions', $plugin_versions );
|
406 |
+
update_site_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
|
407 |
+
|
408 |
+
return;
|
409 |
+
}
|
410 |
+
|
411 |
+
if ( empty( $plugin_versions ) ) {
|
412 |
+
delete_option( 'factory_plugin_versions' );
|
413 |
+
}
|
414 |
+
|
415 |
+
update_option( 'factory_plugin_versions', $plugin_versions );
|
416 |
+
update_option( $this->plugin->getOptionName( 'plugin_version' ), $this->get_current_plugin_version() );
|
417 |
+
}
|
418 |
+
|
419 |
+
/**
|
420 |
+
* Converts string representation of the version to the numeric.
|
421 |
+
*
|
422 |
+
* @since 1.0.0
|
423 |
+
*
|
424 |
+
* @param string $version A string version to convert.
|
425 |
+
*
|
426 |
+
* @return integer
|
427 |
+
*/
|
428 |
+
protected function get_version_number( $version ) {
|
429 |
+
preg_match( '/(\d+)\.(\d+)\.(\d+)/', $version, $matches );
|
430 |
+
if ( count( $matches ) == 0 ) {
|
431 |
+
return false;
|
432 |
+
}
|
433 |
+
|
434 |
+
$number = '';
|
435 |
+
$number .= ( strlen( $matches[1] ) == 1 ) ? '0' . $matches[1] : $matches[1];
|
436 |
+
$number .= ( strlen( $matches[2] ) == 1 ) ? '0' . $matches[2] : $matches[2];
|
437 |
+
$number .= ( strlen( $matches[3] ) == 1 ) ? '0' . $matches[3] : $matches[3];
|
438 |
+
|
439 |
+
return intval( $number );
|
440 |
+
}
|
441 |
+
|
442 |
+
/**
|
443 |
+
* Returns a list of files at a given path.
|
444 |
+
*
|
445 |
+
* @param string $path path for search
|
446 |
+
*/
|
447 |
+
private function find_files( $path ) {
|
448 |
+
return $this->find_file_or_folders( $path, true );
|
449 |
+
}
|
450 |
+
|
451 |
+
/**
|
452 |
+
* Returns a list of folders at a given path.
|
453 |
+
*
|
454 |
+
* @param string $path path for search
|
455 |
+
*/
|
456 |
+
/*private function find_folders( $path ) {
|
457 |
+
return $this->find_file_or_folders( $path, false );
|
458 |
+
}*/
|
459 |
+
|
460 |
+
/**
|
461 |
+
* Returns a list of files or folders at a given path.
|
462 |
+
*
|
463 |
+
* @param string $path path for search
|
464 |
+
* @param bool $files files or folders?
|
465 |
+
*/
|
466 |
+
private function find_file_or_folders( $path, $areFiles = true ) {
|
467 |
+
if ( ! is_dir( $path ) ) {
|
468 |
+
return [];
|
469 |
+
}
|
470 |
+
|
471 |
+
$entries = scandir( $path );
|
472 |
+
if ( empty( $entries ) ) {
|
473 |
+
return [];
|
474 |
+
}
|
475 |
+
|
476 |
+
$files = [];
|
477 |
+
foreach ( $entries as $entryName ) {
|
478 |
+
if ( $entryName == '.' || $entryName == '..' ) {
|
479 |
+
continue;
|
480 |
+
}
|
481 |
+
|
482 |
+
$filename = $path . '/' . $entryName;
|
483 |
+
if ( ( $areFiles && is_file( $filename ) ) || ( ! $areFiles && is_dir( $filename ) ) ) {
|
484 |
+
$files[] = [
|
485 |
+
'path' => str_replace( "\\", "/", $filename ),
|
486 |
+
'name' => $areFiles ? str_replace( '.php', '', $entryName ) : $entryName
|
487 |
+
];
|
488 |
+
}
|
489 |
+
}
|
490 |
+
|
491 |
+
return $files;
|
492 |
+
}
|
493 |
+
|
494 |
+
/**
|
495 |
+
* Gets php classes defined in a specified file.
|
496 |
+
*
|
497 |
+
* @param string $path
|
498 |
+
*
|
499 |
+
* @throws Exception
|
500 |
+
*/
|
501 |
+
private function get_classes( $path ) {
|
502 |
+
|
503 |
+
$phpCode = file_get_contents( $path );
|
504 |
+
|
505 |
+
$classes = [];
|
506 |
+
|
507 |
+
if ( ! function_exists( 'token_get_all' ) ) {
|
508 |
+
throw new Exception( __( 'There is no PHP Tokenizer extension installed on your server, you cannot use the token_get_all function.', 'wbcr_factory_446' ) );
|
509 |
+
}
|
510 |
+
|
511 |
+
$tokens = token_get_all( $phpCode );
|
512 |
+
|
513 |
+
$count = count( $tokens );
|
514 |
+
for ( $i = 2; $i < $count; $i ++ ) {
|
515 |
+
if ( is_array( $tokens ) && $tokens[ $i - 2 ][0] == T_CLASS && $tokens[ $i - 1 ][0] == T_WHITESPACE && $tokens[ $i ][0] == T_STRING ) {
|
516 |
+
|
517 |
+
$extends = null;
|
518 |
+
if ( $tokens[ $i + 2 ][0] == T_EXTENDS && $tokens[ $i + 4 ][0] == T_STRING ) {
|
519 |
+
$extends = $tokens[ $i + 4 ][1];
|
520 |
+
}
|
521 |
+
|
522 |
+
$class_name = $tokens[ $i ][1];
|
523 |
+
$classes[ $path ] = [
|
524 |
+
'name' => $class_name,
|
525 |
+
'extends' => $extends
|
526 |
+
];
|
527 |
+
}
|
528 |
+
}
|
529 |
+
|
530 |
+
/**
|
531 |
+
* result example:
|
532 |
+
*
|
533 |
+
* $classes['/plugin/items/filename.php'] = array(
|
534 |
+
* 'name' => 'PluginNameItem',
|
535 |
+
* 'extendes' => 'PluginNameItemBase'
|
536 |
+
* )
|
537 |
+
*/
|
538 |
+
|
539 |
+
return $classes;
|
540 |
+
}
|
541 |
+
}
|
libs/factory/core/includes/class-factory-notices.php
CHANGED
@@ -1,291 +1,296 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace WBCR\
|
4 |
-
|
5 |
-
use
|
6 |
-
|
7 |
-
// Exit if accessed directly
|
8 |
-
if
|
9 |
-
exit;
|
10 |
-
}
|
11 |
-
|
12 |
-
/**
|
13 |
-
* A class to manage notices.
|
14 |
-
*
|
15 |
-
* @since 1.0.0
|
16 |
-
*/
|
17 |
-
|
18 |
-
/**
|
19 |
-
* A group of classes and methods to create and manage notices.
|
20 |
-
*
|
21 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
22 |
-
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
23 |
-
*
|
24 |
-
* @package factory-notices
|
25 |
-
* @since 1.0.0
|
26 |
-
*/
|
27 |
-
class Notices {
|
28 |
-
|
29 |
-
/**
|
30 |
-
* @var
|
31 |
-
*/
|
32 |
-
protected $plugin;
|
33 |
-
/**
|
34 |
-
* @var array
|
35 |
-
*/
|
36 |
-
protected $notices = [];
|
37 |
-
|
38 |
-
/**
|
39 |
-
* @var array
|
40 |
-
*/
|
41 |
-
protected $default_where = [
|
42 |
-
'plugins',
|
43 |
-
'themes',
|
44 |
-
'dashboard',
|
45 |
-
'edit',
|
46 |
-
'settings',
|
47 |
-
'dashboard-network',
|
48 |
-
'plugins-network',
|
49 |
-
'themes-network',
|
50 |
-
'settings-network',
|
51 |
-
];
|
52 |
-
|
53 |
-
/**
|
54 |
-
* @var array
|
55 |
-
*/
|
56 |
-
private $dissmised_notices;
|
57 |
-
|
58 |
-
/**
|
59 |
-
* Инициализируем уведомлений сразу после загрузки модуля уведомлений
|
60 |
-
*
|
61 |
-
* @param
|
62 |
-
*/
|
63 |
-
public function __construct(
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
$this->
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
*
|
83 |
-
*
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
$
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
if (
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
}
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
*
|
166 |
-
*
|
167 |
-
*
|
168 |
-
* $data['
|
169 |
-
* $
|
170 |
-
* $
|
171 |
-
* $data['
|
172 |
-
* $data['
|
173 |
-
*
|
174 |
-
*
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
'
|
181 |
-
'
|
182 |
-
'
|
183 |
-
'
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
$
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
$
|
222 |
-
|
223 |
-
//
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
*
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WBCR\Factory_446;
|
4 |
+
|
5 |
+
use Wbcr_Factory446_Plugin;
|
6 |
+
|
7 |
+
// Exit if accessed directly
|
8 |
+
if( !defined('ABSPATH') ) {
|
9 |
+
exit;
|
10 |
+
}
|
11 |
+
|
12 |
+
/**
|
13 |
+
* A class to manage notices.
|
14 |
+
*
|
15 |
+
* @since 1.0.0
|
16 |
+
*/
|
17 |
+
|
18 |
+
/**
|
19 |
+
* A group of classes and methods to create and manage notices.
|
20 |
+
*
|
21 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
22 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
23 |
+
*
|
24 |
+
* @package factory-notices
|
25 |
+
* @since 1.0.0
|
26 |
+
*/
|
27 |
+
class Notices {
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @var Wbcr_Factory446_Plugin
|
31 |
+
*/
|
32 |
+
protected $plugin;
|
33 |
+
/**
|
34 |
+
* @var array
|
35 |
+
*/
|
36 |
+
protected $notices = [];
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @var array
|
40 |
+
*/
|
41 |
+
protected $default_where = [
|
42 |
+
'plugins',
|
43 |
+
'themes',
|
44 |
+
'dashboard',
|
45 |
+
'edit',
|
46 |
+
'settings',
|
47 |
+
'dashboard-network',
|
48 |
+
'plugins-network',
|
49 |
+
'themes-network',
|
50 |
+
'settings-network',
|
51 |
+
];
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @var array
|
55 |
+
*/
|
56 |
+
private $dissmised_notices;
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Инициализируем уведомлений сразу после загрузки модуля уведомлений
|
60 |
+
*
|
61 |
+
* @param Wbcr_Factory446_Plugin $plugin
|
62 |
+
*/
|
63 |
+
public function __construct($plugin)
|
64 |
+
{
|
65 |
+
//default notices
|
66 |
+
//---
|
67 |
+
|
68 |
+
$this->plugin = $plugin;
|
69 |
+
$this->dissmised_notices = $this->plugin->getPopulateOption('factory_dismissed_notices', []);
|
70 |
+
|
71 |
+
add_action('current_screen', [$this, 'currentScreenAction']);
|
72 |
+
|
73 |
+
if( defined('DOING_AJAX') && DOING_AJAX ) {
|
74 |
+
add_action('wp_ajax_' . $this->plugin->getPluginName() . '_dismiss_notice', [
|
75 |
+
$this,
|
76 |
+
'dismiss_notice'
|
77 |
+
]);
|
78 |
+
}
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Регистрирует экшены для работы с уведомлениями на текущем экране странице.
|
83 |
+
* Уведомления собираются через фильтр wbcr_factory_admin_notices, если в массиве уведомлений,
|
84 |
+
* хотя бы одно, соответствует условиям в параметре $notice['where'], то метод печает вспомогательные скрипты и уведомления.
|
85 |
+
*/
|
86 |
+
public function currentScreenAction()
|
87 |
+
{
|
88 |
+
/**
|
89 |
+
* @since 2.1.2 - Добавлен, модуль factory_notices_000 был удален. Поэтому в этому хуке мы заменили префикс на factory_446
|
90 |
+
*/
|
91 |
+
$this->notices = apply_filters('wbcr/factory/admin_notices', $this->notices, $this->plugin->getPluginName());
|
92 |
+
|
93 |
+
if( count($this->notices) == 0 ) {
|
94 |
+
return;
|
95 |
+
}
|
96 |
+
|
97 |
+
$screen = get_current_screen();
|
98 |
+
|
99 |
+
$has_notices = false;
|
100 |
+
foreach((array)$this->notices as $notice) {
|
101 |
+
if( !isset($notice['id']) ) {
|
102 |
+
continue;
|
103 |
+
}
|
104 |
+
|
105 |
+
$where = !isset($notice['where']) || empty($notice['where']) ? $this->default_where : $notice['where'];
|
106 |
+
|
107 |
+
if( in_array($screen->base, $where) && !$this->is_dissmissed($notice['id']) ) {
|
108 |
+
$has_notices = true;
|
109 |
+
break;
|
110 |
+
};
|
111 |
+
}
|
112 |
+
|
113 |
+
if( $has_notices ) {
|
114 |
+
add_action('admin_footer', [$this, 'print_js_code']);
|
115 |
+
|
116 |
+
$this->show_notices();
|
117 |
+
}
|
118 |
+
}
|
119 |
+
|
120 |
+
/**
|
121 |
+
* Показывает все зарегистрированные уведомления для текущего плагина.
|
122 |
+
* Уведомления показываются только на определенных страницах через параметр $notice['where'],
|
123 |
+
* если уведомление ранее было скрыто или не соотвествует правилам $notice['where'], оно не будет показано!
|
124 |
+
*/
|
125 |
+
public function show_notices()
|
126 |
+
{
|
127 |
+
if( count($this->notices) == 0 ) {
|
128 |
+
return;
|
129 |
+
}
|
130 |
+
|
131 |
+
if( !current_user_can('activate_plugins') || !current_user_can('edit_plugins') || !current_user_can('install_plugins') ) {
|
132 |
+
return;
|
133 |
+
}
|
134 |
+
|
135 |
+
$screen = get_current_screen();
|
136 |
+
|
137 |
+
foreach($this->notices as $notice) {
|
138 |
+
|
139 |
+
if( !isset($notice['id']) ) {
|
140 |
+
continue;
|
141 |
+
}
|
142 |
+
|
143 |
+
$where = !isset($notice['where']) || empty($notice['where']) ? $this->default_where : $notice['where'];
|
144 |
+
|
145 |
+
if( in_array($screen->base, $where) && !$this->is_dissmissed($notice['id']) ) {
|
146 |
+
if( $this->plugin->isNetworkActive() ) {
|
147 |
+
if( current_user_can('manage_network') ) {
|
148 |
+
add_action('network_admin_notices', function () use ($notice) {
|
149 |
+
$this->show_notice($notice);
|
150 |
+
});
|
151 |
+
add_action('admin_notices', function () use ($notice) {
|
152 |
+
$this->show_notice($notice);
|
153 |
+
});
|
154 |
+
}
|
155 |
+
} else {
|
156 |
+
add_action('admin_notices', function () use ($notice) {
|
157 |
+
$this->show_notice($notice);
|
158 |
+
});
|
159 |
+
}
|
160 |
+
};
|
161 |
+
}
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* Показывает уведомление, по переданным параметрам
|
166 |
+
*
|
167 |
+
* @param array $data - Параметры уведомления
|
168 |
+
* $data['id'] - Индентификатор уведомления
|
169 |
+
* $data['type'] - Тип уведомления (error, warning, success)
|
170 |
+
* $notice['where'] - На каких страницах показывать уведомление ('plugins', 'dashboard', 'edit')
|
171 |
+
* $data['text'] - Текст уведомления
|
172 |
+
* $data['dismissible'] - Если true, уведомление будет с кнопкой закрыть
|
173 |
+
* $data['dismiss_expires'] - Когда снова показать уведомление, нужно указывать время в unix timestamp.
|
174 |
+
* Пример time() + 3600 (1ч), уведомление будет скрыто на 1 час.
|
175 |
+
* $data['classes'] - Произвольный классы для контейнера уведомления.
|
176 |
+
*/
|
177 |
+
public function show_notice($data)
|
178 |
+
{
|
179 |
+
$settings = wp_parse_args($data, [
|
180 |
+
'id' => null,
|
181 |
+
'text' => null,
|
182 |
+
'type' => 'error',
|
183 |
+
'dismissible' => false,
|
184 |
+
'dismiss_expires' => 0,
|
185 |
+
'classes' => []
|
186 |
+
]);
|
187 |
+
|
188 |
+
if( empty($settings['id']) || empty($settings['text']) ) {
|
189 |
+
return;
|
190 |
+
}
|
191 |
+
|
192 |
+
$plugin_name = str_replace('_', '-', $this->plugin->getPluginName());
|
193 |
+
|
194 |
+
$classes = array_merge([
|
195 |
+
'notice',
|
196 |
+
'notice-' . $settings['type'],
|
197 |
+
$plugin_name . '-factory-notice'
|
198 |
+
], $settings['classes']);
|
199 |
+
|
200 |
+
if( $settings['dismissible'] ) {
|
201 |
+
$classes[] = 'is-dismissible';
|
202 |
+
$classes[] = $plugin_name . '-factory-notice-dismiss';
|
203 |
+
}
|
204 |
+
?>
|
205 |
+
<div data-name="wbcr_factory_notice_<?php echo esc_attr($data['id']) ?>" data-expires="<?= esc_attr($settings['dismiss_expires']) ?>" data-nonce="<?php echo wp_create_nonce($this->plugin->getPluginName() . '_factory_dismiss_notice'); ?>" class="<?php echo esc_attr(implode(' ', $classes)) ?>">
|
206 |
+
<?= $data['text'] ?>
|
207 |
+
</div>
|
208 |
+
<?php
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* Когда пользователь нажимает кнопку закрыть уведомление,
|
213 |
+
* отправляется ajax запрос с вызовом текущего метода
|
214 |
+
*/
|
215 |
+
public function dismiss_notice()
|
216 |
+
{
|
217 |
+
if( !current_user_can('activate_plugins') || !current_user_can('edit_plugins') || !current_user_can('install_plugins') ) {
|
218 |
+
wp_die(-1, 403);
|
219 |
+
}
|
220 |
+
|
221 |
+
check_admin_referer($this->plugin->getPluginName() . '_factory_dismiss_notice', 'nonce');
|
222 |
+
|
223 |
+
// Имя уведомления (идентификатор)
|
224 |
+
$name = $this->plugin->request->post('name', null, true);
|
225 |
+
|
226 |
+
// Время в Unix timestamp, по истечению, которого уведомление снова будет показано
|
227 |
+
// Если передан 0, то уведомление будет скрыто навсегда
|
228 |
+
$expires = $this->plugin->request->post('expires', 0, 'intval');
|
229 |
+
|
230 |
+
if( empty($name) ) {
|
231 |
+
wp_send_json_error(['error_message' => 'You must pass the notification "Name"! Action was rejected.']);
|
232 |
+
}
|
233 |
+
|
234 |
+
$notices = $this->plugin->getPopulateOption("factory_dismissed_notices", []);
|
235 |
+
|
236 |
+
if( !empty($notices) ) {
|
237 |
+
foreach((array)$notices as $notice_id => $notice_expires) {
|
238 |
+
if( $notice_expires !== 0 && $notice_expires < time() ) {
|
239 |
+
unset($notices[$notice_id]);
|
240 |
+
}
|
241 |
+
}
|
242 |
+
}
|
243 |
+
|
244 |
+
$notices[$name] = $expires;
|
245 |
+
|
246 |
+
$this->plugin->updatePopulateOption('factory_dismissed_notices', $notices);
|
247 |
+
|
248 |
+
wp_send_json_success();
|
249 |
+
}
|
250 |
+
|
251 |
+
/**
|
252 |
+
* Javascript code
|
253 |
+
* Печает в подвале страницы код, для взаимодействия с сервером через ajax,
|
254 |
+
* код используется при нажатии на кнопку закрыть уведомление. *
|
255 |
+
*/
|
256 |
+
public function print_js_code()
|
257 |
+
{
|
258 |
+
$plugin_name = str_replace('_', '-', $this->plugin->getPluginName());
|
259 |
+
|
260 |
+
?>
|
261 |
+
<script type="text/javascript">
|
262 |
+
jQuery(function($) {
|
263 |
+
|
264 |
+
$(document).on('click', '.<?php echo $plugin_name; ?>-factory-notice-dismiss .notice-dismiss', function() {
|
265 |
+
$.post(ajaxurl, {
|
266 |
+
'action': '<?php echo $this->plugin->getPluginName(); ?>_dismiss_notice',
|
267 |
+
'name': $(this).parent().data('name'),
|
268 |
+
'expires': $(this).parent().data('expires'),
|
269 |
+
'nonce': $(this).parent().attr('data-nonce')
|
270 |
+
});
|
271 |
+
});
|
272 |
+
|
273 |
+
});
|
274 |
+
</script>
|
275 |
+
<?php
|
276 |
+
}
|
277 |
+
|
278 |
+
|
279 |
+
/**
|
280 |
+
* Проверяет скрыто уведоление или нет
|
281 |
+
*
|
282 |
+
* @param string $notice_id - имя уведомления
|
283 |
+
*
|
284 |
+
* @return bool
|
285 |
+
*/
|
286 |
+
protected function is_dissmissed($notice_id)
|
287 |
+
{
|
288 |
+
if( !empty($this->dissmised_notices) && isset($this->dissmised_notices['wbcr_factory_notice_' . $notice_id]) ) {
|
289 |
+
$expires = (int)$this->dissmised_notices['wbcr_factory_notice_' . $notice_id];
|
290 |
+
|
291 |
+
return $expires === 0 || $expires > time();
|
292 |
+
}
|
293 |
+
|
294 |
+
return false;
|
295 |
+
}
|
296 |
+
}
|
libs/factory/core/includes/class-factory-options.php
CHANGED
@@ -1,432 +1,432 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
namespace WBCR\
|
4 |
-
|
5 |
-
// Exit if accessed directly
|
6 |
-
use Exception;
|
7 |
-
|
8 |
-
if ( ! defined( 'ABSPATH' ) ) {
|
9 |
-
exit;
|
10 |
-
}
|
11 |
-
|
12 |
-
/**
|
13 |
-
* Трейт используется для расширения базового класса плагина
|
14 |
-
*
|
15 |
-
* Этот трейт является оберткой для Wordpress функций get_option, get_site_option, update_option, update_site_option,
|
16 |
-
* delete_option, delete_site_option. Основная задача была получать, обновлять, удалять опции без использования префиксов,
|
17 |
-
* чтобы класс выполнял эту работу за программиста. В дополнение, трейт содержит методы для полной выгрузки всех опций
|
18 |
-
* плагина, что позволяет при инициализации плагина автоматически выгрузить все существующие опции плагина в объектный
|
19 |
-
* кеш. Все опции, с которыми работает плагин, могут быть отфильтрованы.
|
20 |
-
*
|
21 |
-
* Документация по трейту: https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/393805831/
|
22 |
-
* Документация по созданию плагина: https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/327828
|
23 |
-
* Репозиторий: https://github.com/alexkovalevv
|
24 |
-
*
|
25 |
-
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
26 |
-
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
27 |
-
*
|
28 |
-
* @since 4.0.8 - Добавлен
|
29 |
-
* @package factory-core
|
30 |
-
*/
|
31 |
-
trait Options {
|
32 |
-
|
33 |
-
/**
|
34 |
-
* Абстрактный метод, должен быть реализован в классе использующем этот трейт. Метод позволяет получить префикс
|
35 |
-
* плагина для формирования имен опций в базе данных Wordpress. У опций должно быть свое пространство имен,
|
36 |
-
* иначе может быть конфликт с другими плагинами или с сами ядром Wordpress.
|
37 |
-
*
|
38 |
-
* @since 4.0.8 - Добавлен
|
39 |
-
* @return string Возвращает префикс плагина. Пример: wbcr_clearfy_
|
40 |
-
*/
|
41 |
-
abstract public function getPrefix();
|
42 |
-
|
43 |
-
/**
|
44 |
-
* Выгружает все опции плагина в объектный кеш. Плагин может получить любую свою опцию без запроса к базе данных.
|
45 |
-
* Метод ускоряет работу плагина, если опций очень много.
|
46 |
-
*
|
47 |
-
* Используется только один раз при инициализации плагина.
|
48 |
-
*
|
49 |
-
* @since 4.0.8 - Добавлен
|
50 |
-
*/
|
51 |
-
public function loadAllOptions() {
|
52 |
-
global $wpdb;
|
53 |
-
|
54 |
-
$is_option_loaded = wp_cache_get( $this->getPrefix() . 'all_options_loaded', $this->getPrefix() . 'options' );
|
55 |
-
|
56 |
-
if ( false === $is_option_loaded ) {
|
57 |
-
$result = $wpdb->get_results( "SELECT option_name, option_value FROM {$wpdb->options} WHERE option_name LIKE '{$this->getPrefix()}%'" );
|
58 |
-
|
59 |
-
$options = [];
|
60 |
-
|
61 |
-
if ( ! empty( $result ) ) {
|
62 |
-
wp_cache_add( $this->getPrefix() . 'all_options_loaded', 1, $this->getPrefix() . 'options' );
|
63 |
-
|
64 |
-
foreach ( $result as $option ) {
|
65 |
-
$value = maybe_unserialize( $option->option_value );
|
66 |
-
$value = $this->normalizeValue( $value );
|
67 |
-
|
68 |
-
wp_cache_add( $option->option_name, $value, $this->getPrefix() . 'options' );
|
69 |
-
$options[ $option->option_name ] = $value;
|
70 |
-
}
|
71 |
-
|
72 |
-
/**
|
73 |
-
* Действие, которое будет выполнено, когда все опции плагина будут выгружены.
|
74 |
-
*
|
75 |
-
* @since 4.0.9 - Добавлен
|
76 |
-
*
|
77 |
-
* @param string $plugin_name Имя плагина
|
78 |
-
* @param array $options Ассоциативный массив опций плагина
|
79 |
-
*/
|
80 |
-
do_action( 'wbcr/factory/all_options_loaded', $options, $this->plugin_name );
|
81 |
-
}
|
82 |
-
}
|
83 |
-
}
|
84 |
-
|
85 |
-
/**
|
86 |
-
* Выгружает все сетевые опции плагина в объектный кеш. Плагин может получить любую свою опцию без запроса к базе
|
87 |
-
* данных. Метод ускоряет работу плагина, если опций очень много.
|
88 |
-
*
|
89 |
-
* Используется и работает только в режиме мультисайтов, один раз при инициализации плагина.!
|
90 |
-
*
|
91 |
-
* @since 4.0.8 - Добавлен
|
92 |
-
* @return void
|
93 |
-
*/
|
94 |
-
public function loadAllNetworkOptions() {
|
95 |
-
global $wpdb;
|
96 |
-
|
97 |
-
$network_id = (int) get_current_network_id();
|
98 |
-
|
99 |
-
$is_option_loaded = wp_cache_get( $network_id . ":" . $this->getPrefix() . 'all_options_loaded', $this->getPrefix() . 'network_options' );
|
100 |
-
|
101 |
-
if ( false === $is_option_loaded ) {
|
102 |
-
wp_cache_add_global_groups( [ $this->getPrefix() . 'network_options' ] );
|
103 |
-
|
104 |
-
$result = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} WHERE site_id='{$network_id}' AND meta_key LIKE '{$this->getPrefix()}%'" );
|
105 |
-
|
106 |
-
$options = [];
|
107 |
-
if ( ! empty( $result ) ) {
|
108 |
-
wp_cache_add( $network_id . ":" . $this->getPrefix() . 'all_options_loaded', 1, $this->getPrefix() . 'network_options' );
|
109 |
-
|
110 |
-
foreach ( $result as $option ) {
|
111 |
-
$value = maybe_unserialize( $option->meta_value );
|
112 |
-
$value = $this->normalizeValue( $value );
|
113 |
-
|
114 |
-
$cache_key = $network_id . ":" . $option->meta_key;
|
115 |
-
wp_cache_add( $cache_key, $value, $this->getPrefix() . 'network_options' );
|
116 |
-
$options[ $option->meta_key ] = $value;
|
117 |
-
}
|
118 |
-
|
119 |
-
/**
|
120 |
-
*
|
121 |
-
* Действие, которое будет выполнено, когда все сетевые опции плагина будут выгружены.
|
122 |
-
*
|
123 |
-
* @since 4.0.9 - Добавлен
|
124 |
-
*
|
125 |
-
* @param array $options Ассоциативный массив опций плагина
|
126 |
-
* @param string $plugin_name Имя плагина
|
127 |
-
*/
|
128 |
-
do_action( 'wbcr/factory/all_network_options_loaded', $options, $this->plugin_name );
|
129 |
-
}
|
130 |
-
}
|
131 |
-
}
|
132 |
-
|
133 |
-
/**
|
134 |
-
* Позволяет получить популярную опцию. В случае если плагин установлен для сети (в режиме мультисайтов),
|
135 |
-
* то метод возвращает опции только для сети, иначе метод возвращает опцию для текущего сайта. Работает
|
136 |
-
* на основе self::getOption и self::getNetworkOption, смотрите полную реализацию в этих методах.
|
137 |
-
*
|
138 |
-
* @since 4.0.8 - Добавлен
|
139 |
-
*
|
140 |
-
* @param string $option_name Имя опции без префикса.
|
141 |
-
* @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
|
142 |
-
*
|
143 |
-
* @return mixed Возвращает значение опции, если это сериализованная строка, то автоматически распаковывает ее.
|
144 |
-
*/
|
145 |
-
public function getPopulateOption( $option_name, $default = false ) {
|
146 |
-
if ( $this->isNetworkActive() ) {
|
147 |
-
$option_value = $this->getNetworkOption( $option_name, $default );
|
148 |
-
} else {
|
149 |
-
$option_value = $this->getOption( $option_name, $default );
|
150 |
-
}
|
151 |
-
|
152 |
-
/**
|
153 |
-
* Фильтр позволяет отфильтровать возвращаемое значение популярной опции.
|
154 |
-
*
|
155 |
-
* @since 4.0.9 - Добавлен
|
156 |
-
*
|
157 |
-
* @param mixed $option_value Значение опции
|
158 |
-
* @param string $option_name Имя опции
|
159 |
-
* @param mixed $default Значение опции по умолчанию
|
160 |
-
*/
|
161 |
-
return apply_filters( "wbcr/factory/populate_option_{$option_name}", $option_value, $option_name, $default );
|
162 |
-
}
|
163 |
-
|
164 |
-
/**
|
165 |
-
* Позволяет получить сетевые опции. Если плагин установлен для сети (в режиме мультисайтов), то
|
166 |
-
* метод возвращает опции только для сети, иначе метод возвращает опцию для текущего сайта.
|
167 |
-
*
|
168 |
-
* Опция вытаскивается из объектного кеша, после выполнения метода self:loadAllNetworkOptions,
|
169 |
-
* а не напрямую из базы данных, из-за чего при работе с некоторыми кеширующими плагинами,
|
170 |
-
* может быть странное поведение в работе плагина.
|
171 |
-
*
|
172 |
-
* @since 4.0.8 - Добавлен
|
173 |
-
*
|
174 |
-
* @param string $option_name Имя опции без префикса.
|
175 |
-
* @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
|
176 |
-
*
|
177 |
-
* @return mixed Возвращает значение опции, если это сериализованная строка, то автоматически распаковывает ее.
|
178 |
-
*/
|
179 |
-
public function getNetworkOption( $option_name, $default = false ) {
|
180 |
-
if ( empty( $option_name ) || ! is_string( $option_name ) ) {
|
181 |
-
throw new Exception( 'Option name must be a string and must not be empty.' );
|
182 |
-
}
|
183 |
-
|
184 |
-
if ( ! is_multisite() ) {
|
185 |
-
return $this->getOption( $option_name, $default );
|
186 |
-
}
|
187 |
-
|
188 |
-
$this->loadAllNetworkOptions();
|
189 |
-
|
190 |
-
$network_id = (int) get_current_network_id();
|
191 |
-
$cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
|
192 |
-
$option_value = wp_cache_get( $cache_key, $this->getPrefix() . 'network_options' );
|
193 |
-
|
194 |
-
if ( false === $option_value ) {
|
195 |
-
$option_value = $default;
|
196 |
-
}
|
197 |
-
|
198 |
-
/**
|
199 |
-
* Фильтр позволяет отфильтровать возвращаемое значение сетевой опции.
|
200 |
-
*
|
201 |
-
* @since 4.0.9 - Добавлен
|
202 |
-
*
|
203 |
-
* @param mixed $option_value Значение опции
|
204 |
-
* @
|
205 |
-
* @param mixed $default Значение опции по умолчанию
|
206 |
-
* @param int $network_id ID сети
|
207 |
-
*/
|
208 |
-
|
209 |
-
return apply_filters( "wbcr/factory/network_option_{$option_name}", $option_value, $option_name, $default, $network_id );
|
210 |
-
}
|
211 |
-
|
212 |
-
/**
|
213 |
-
* Метод позволяет получить опцию для текущего сайта. Опция вытаскивается из объектного кеша, после выполнения метода
|
214 |
-
* self:loadAllOptions, а не напрямую из базы данных, из-за чего при работе с некоторыми кеширующими плагинами,
|
215 |
-
* может быть странное поведение в работе плагина.
|
216 |
-
*
|
217 |
-
* @since 4.0.0 - Добавлен
|
218 |
-
* @since 4.0.8 - Полностью переделан
|
219 |
-
*
|
220 |
-
* @param string $option_name Имя опции без префикса.
|
221 |
-
* @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
|
222 |
-
*
|
223 |
-
* @return mixed
|
224 |
-
*/
|
225 |
-
public function getOption( $option_name, $default = false ) {
|
226 |
-
if ( empty( $option_name ) || ! is_string( $option_name ) ) {
|
227 |
-
throw new Exception( 'Option name must be a string and must not be empty.' );
|
228 |
-
}
|
229 |
-
|
230 |
-
$this->loadAllOptions();
|
231 |
-
|
232 |
-
$option_value = wp_cache_get( $this->getPrefix() . $option_name, $this->getPrefix() . 'options' );
|
233 |
-
|
234 |
-
if ( false === $option_value ) {
|
235 |
-
$option_value = $default;
|
236 |
-
}
|
237 |
-
|
238 |
-
/**
|
239 |
-
* Фильтр позволяет отфильтровать возвращаемое значение опции сайта.
|
240 |
-
*
|
241 |
-
* @since 4.0.9 - Добавлен
|
242 |
-
*
|
243 |
-
* @param mixed $option_value Значение опции
|
244 |
-
* @param string $option_name Имя опции
|
245 |
-
* @param mixed $default Значение опции по умолчанию
|
246 |
-
*/
|
247 |
-
|
248 |
-
return apply_filters( "wbcr/factory/option_{$option_name}", $option_value, $option_name, $default );
|
249 |
-
}
|
250 |
-
|
251 |
-
/**
|
252 |
-
* Позволяет обновить популярную опцию в базе данных. Если плагин установлен для сети (в режиме мультисайтов), то метод обновляет опцию
|
253 |
-
* только в таблице sitemeta, иначе в таблице options для текущего сайта.
|
254 |
-
*
|
255 |
-
* @param string $option_name Имя опции без префикса.
|
256 |
-
* @param mixed $option_value Значение опции. Может принимать массив или объект.
|
257 |
-
*/
|
258 |
-
public function updatePopulateOption( $option_name, $option_value ) {
|
259 |
-
if ( $this->isNetworkActive() ) {
|
260 |
-
$this->updateNetworkOption( $option_name, $option_value );
|
261 |
-
} else {
|
262 |
-
$this->updateOption( $option_name, $option_value );
|
263 |
-
}
|
264 |
-
}
|
265 |
-
|
266 |
-
/**
|
267 |
-
* Обновляет сетевую опцию в БД таблица sitemeta. После успешного обновления опции в базе данных, метод добавляет опцию в объектный кеш,
|
268 |
-
* чтобы плагин мог приступить к работе с этой опцией незамедлительно.
|
269 |
-
*
|
270 |
-
* @since 4.0.8 - Добавлен
|
271 |
-
*
|
272 |
-
* @param string $option_name Имя опции без префикса.
|
273 |
-
* @param mixed $option_value Значение опции. Может принимать массив или объект.
|
274 |
-
*/
|
275 |
-
public function updateNetworkOption( $option_name, $option_value ) {
|
276 |
-
$network_id = (int) get_current_network_id();
|
277 |
-
$cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
|
278 |
-
wp_cache_set( $cache_key, $option_value, $this->getPrefix() . 'network_options' );
|
279 |
-
|
280 |
-
update_site_option( $this->getPrefix() . $option_name, $option_value );
|
281 |
-
|
282 |
-
/**
|
283 |
-
* Действие будет выполнено, когда сетевая опция будет обновлена.
|
284 |
-
*
|
285 |
-
* @since 4.0.8 - Добавлен
|
286 |
-
*
|
287 |
-
* @param string $option_name Имя опции без префикса.
|
288 |
-
* @param mixed $option_value Значение опции. Может принимать массив или объект.
|
289 |
-
*/
|
290 |
-
do_action( "wbcr/factory/update_network_option", $option_name, $option_value );
|
291 |
-
}
|
292 |
-
|
293 |
-
/**
|
294 |
-
* Обновляет опцию сайта в БД таблица options. После успешного обновления опции в базе данных, метод добавляет опцию в объектный кеш,
|
295 |
-
* чтобы плагин мог приступить к работе с этой опцией незамедлительно.
|
296 |
-
*
|
297 |
-
* @since 4.0.0 - Добавлен
|
298 |
-
* @since 4.0.8 - Полностью переделан
|
299 |
-
*
|
300 |
-
* @param string $option_name Имя опции без префикса.
|
301 |
-
* @param mixed $option_value Значение опции. Может принимать массив или объект.
|
302 |
-
*
|
303 |
-
* @return bool
|
304 |
-
*/
|
305 |
-
public function updateOption( $option_name, $option_value ) {
|
306 |
-
wp_cache_set( $this->getPrefix() . $option_name, $option_value, $this->getPrefix() . 'options' );
|
307 |
-
$result = update_option( $this->getPrefix() . $option_name, $option_value );
|
308 |
-
|
309 |
-
/**
|
310 |
-
* @since 4.0.8
|
311 |
-
*
|
312 |
-
* @param string $option_name
|
313 |
-
*
|
314 |
-
* @param mixed $option_value
|
315 |
-
*/
|
316 |
-
do_action( "wbcr/factory/update_option", $option_name, $option_value );
|
317 |
-
|
318 |
-
return $result;
|
319 |
-
}
|
320 |
-
|
321 |
-
/**
|
322 |
-
* Позволяет удалять популярную опцию в базе данных. Если плагин установлен для сети (в режиме мультисайтов), то метод удаляет опцию
|
323 |
-
* только в таблице sitemeta, иначе в таблице options для текущего сайта.
|
324 |
-
*
|
325 |
-
* @since 4.0.0 - Добавлен
|
326 |
-
*
|
327 |
-
* @param string $option_name Имя опции без префикса.
|
328 |
-
*/
|
329 |
-
public function deletePopulateOption( $option_name ) {
|
330 |
-
if ( $this->isNetworkActive() ) {
|
331 |
-
$this->deleteNetworkOption( $option_name );
|
332 |
-
} else {
|
333 |
-
$this->deleteOption( $option_name );
|
334 |
-
}
|
335 |
-
}
|
336 |
-
|
337 |
-
/**
|
338 |
-
* Удаляет сетевую.опцию в БД таблица sitemeta, а если опция есть в кеше, индивидуально удаляет опцию из кеша.
|
339 |
-
*
|
340 |
-
* @since 4.0.0 - Добавлен
|
341 |
-
*
|
342 |
-
* @param string $option_name Имя опции без префикса.
|
343 |
-
*
|
344 |
-
* @return bool Возвращает true, если опция удалена успешно, false в случае ошибки.
|
345 |
-
*/
|
346 |
-
public function deleteNetworkOption( $option_name ) {
|
347 |
-
$network_id = (int) get_current_network_id();
|
348 |
-
$cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
|
349 |
-
$delete_cache = wp_cache_delete( $cache_key, $this->getPrefix() . 'network_options' );
|
350 |
-
|
351 |
-
$delete_opt1 = delete_site_option( $this->getPrefix() . $option_name );
|
352 |
-
|
353 |
-
return $delete_cache && $delete_opt1;
|
354 |
-
}
|
355 |
-
|
356 |
-
/**
|
357 |
-
* Удаляет опцию сайта в БД таблица options, а если опция есть в кеше, индивидуально удаляет опцию из кеша.
|
358 |
-
*
|
359 |
-
* @since 4.0.0 - Добавлен
|
360 |
-
*
|
361 |
-
* @param string $option_name Имя опции без префикса.
|
362 |
-
*
|
363 |
-
* @return bool Возвращает true, если опция удалена успешно, false в случае ошибки.
|
364 |
-
*/
|
365 |
-
public function deleteOption( $option_name ) {
|
366 |
-
$delete_cache = wp_cache_delete( $this->getPrefix() . $option_name, $this->getPrefix() . 'options' );
|
367 |
-
|
368 |
-
// todo: удалить, когда большая часть пользователей обновятся до современных релизов
|
369 |
-
$delete_opt1 = delete_option( $this->getPrefix() . $option_name . '_is_active' );
|
370 |
-
$delete_opt2 = delete_option( $this->getPrefix() . $option_name );
|
371 |
-
|
372 |
-
return $delete_cache && $delete_opt1 && $delete_opt2;
|
373 |
-
}
|
374 |
-
|
375 |
-
/**
|
376 |
-
* Сбрасывает объектный кеш. Может использоваться для перезагрузки опций плагина и Wordpress в целом.
|
377 |
-
*
|
378 |
-
* @since 4.0.0 - Добавлен
|
379 |
-
* @return bool Возвращает true, если кеш сброшен успешно, false в случае ошибки.
|
380 |
-
*/
|
381 |
-
public function flushOptionsCache() {
|
382 |
-
return wp_cache_flush();
|
383 |
-
}
|
384 |
-
|
385 |
-
/**
|
386 |
-
* Позволяет получить полное имя опции с префиксом. Может быть использовано в тех случаях, где нужно получить
|
387 |
-
* полное имя опции.
|
388 |
-
*
|
389 |
-
* @since 4.0.0 - Добавлен
|
390 |
-
*
|
391 |
-
* @param string $option_name Имя опции без префикса.
|
392 |
-
*
|
393 |
-
* @return null|string Возвращает имя опции с префиксом. Например wbcr_clearfy_{options_name}
|
394 |
-
*/
|
395 |
-
public function getOptionName( $option_name ) {
|
396 |
-
$option_name = trim( rtrim( $option_name ) );
|
397 |
-
if ( empty( $option_name ) || ! is_string( $option_name ) ) {
|
398 |
-
return null;
|
399 |
-
}
|
400 |
-
|
401 |
-
return $this->getPrefix() . $option_name;
|
402 |
-
}
|
403 |
-
|
404 |
-
/**
|
405 |
-
* Позволяет нормализовать данные. В некоторых методах этого трейта, ожидаются данные определенного типа, чтобы
|
406 |
-
* выполнить различные логические операции. Как раз в этом случае этот метод можно использовать, чтобы привести
|
407 |
-
* все сырые данные в строгий тип. Такое решение позволит избежать ошибок в работе программиста.
|
408 |
-
*
|
409 |
-
* @since 4.0.0 - Добавлен
|
410 |
-
*
|
411 |
-
* @param mixed $data Данные, которые нужно нормализовать.
|
412 |
-
*
|
413 |
-
* @return mixed Возвращает нормализованное значение.
|
414 |
-
* - Если передана строка "true" или "false" вернет булево значение.
|
415 |
-
* - Если передана строка "1" или "0" вернет число.
|
416 |
-
*/
|
417 |
-
public function normalizeValue( $data ) {
|
418 |
-
if ( is_string( $data ) ) {
|
419 |
-
$check_string = rtrim( trim( $data ) );
|
420 |
-
|
421 |
-
if ( $check_string == "1" || $check_string == "0" ) {
|
422 |
-
return intval( $data );
|
423 |
-
} else if ( $check_string === 'false' ) {
|
424 |
-
return false;
|
425 |
-
} else if ( $check_string === 'true' ) {
|
426 |
-
return true;
|
427 |
-
}
|
428 |
-
}
|
429 |
-
|
430 |
-
return $data;
|
431 |
-
}
|
432 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace WBCR\Factory_446;
|
4 |
+
|
5 |
+
// Exit if accessed directly
|
6 |
+
use Exception;
|
7 |
+
|
8 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
9 |
+
exit;
|
10 |
+
}
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Трейт используется для расширения базового класса плагина Wbcr_Factory446_Base, позволяя работать с опциями плагина.
|
14 |
+
*
|
15 |
+
* Этот трейт является оберткой для Wordpress функций get_option, get_site_option, update_option, update_site_option,
|
16 |
+
* delete_option, delete_site_option. Основная задача была получать, обновлять, удалять опции без использования префиксов,
|
17 |
+
* чтобы класс выполнял эту работу за программиста. В дополнение, трейт содержит методы для полной выгрузки всех опций
|
18 |
+
* плагина, что позволяет при инициализации плагина автоматически выгрузить все существующие опции плагина в объектный
|
19 |
+
* кеш. Все опции, с которыми работает плагин, могут быть отфильтрованы.
|
20 |
+
*
|
21 |
+
* Документация по трейту: https://webcraftic.atlassian.net/wiki/spaces/FFD/pages/393805831/
|
22 |
+
* Документация по созданию плагина: https://webcraftic.atlassian.net/wiki/spaces/CNCFC/pages/327828
|
23 |
+
* Репозиторий: https://github.com/alexkovalevv
|
24 |
+
*
|
25 |
+
* @author Alex Kovalev <alex.kovalevv@gmail.com>, repo: https://github.com/alexkovalevv
|
26 |
+
* @author Webcraftic <wordpress.webraftic@gmail.com>, site: https://webcraftic.com
|
27 |
+
*
|
28 |
+
* @since 4.0.8 - Добавлен
|
29 |
+
* @package factory-core
|
30 |
+
*/
|
31 |
+
trait Options {
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Абстрактный метод, должен быть реализован в классе использующем этот трейт. Метод позволяет получить префикс
|
35 |
+
* плагина для формирования имен опций в базе данных Wordpress. У опций должно быть свое пространство имен,
|
36 |
+
* иначе может быть конфликт с другими плагинами или с сами ядром Wordpress.
|
37 |
+
*
|
38 |
+
* @since 4.0.8 - Добавлен
|
39 |
+
* @return string Возвращает префикс плагина. Пример: wbcr_clearfy_
|
40 |
+
*/
|
41 |
+
abstract public function getPrefix();
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Выгружает все опции плагина в объектный кеш. Плагин может получить любую свою опцию без запроса к базе данных.
|
45 |
+
* Метод ускоряет работу плагина, если опций очень много.
|
46 |
+
*
|
47 |
+
* Используется только один раз при инициализации плагина.
|
48 |
+
*
|
49 |
+
* @since 4.0.8 - Добавлен
|
50 |
+
*/
|
51 |
+
public function loadAllOptions() {
|
52 |
+
global $wpdb;
|
53 |
+
|
54 |
+
$is_option_loaded = wp_cache_get( $this->getPrefix() . 'all_options_loaded', $this->getPrefix() . 'options' );
|
55 |
+
|
56 |
+
if ( false === $is_option_loaded ) {
|
57 |
+
$result = $wpdb->get_results( "SELECT option_name, option_value FROM {$wpdb->options} WHERE option_name LIKE '{$this->getPrefix()}%'" );
|
58 |
+
|
59 |
+
$options = [];
|
60 |
+
|
61 |
+
if ( ! empty( $result ) ) {
|
62 |
+
wp_cache_add( $this->getPrefix() . 'all_options_loaded', 1, $this->getPrefix() . 'options' );
|
63 |
+
|
64 |
+
foreach ( $result as $option ) {
|
65 |
+
$value = maybe_unserialize( $option->option_value );
|
66 |
+
$value = $this->normalizeValue( $value );
|
67 |
+
|
68 |
+
wp_cache_add( $option->option_name, $value, $this->getPrefix() . 'options' );
|
69 |
+
$options[ $option->option_name ] = $value;
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Действие, которое будет выполнено, когда все опции плагина будут выгружены.
|
74 |
+
*
|
75 |
+
* @since 4.0.9 - Добавлен
|
76 |
+
*
|
77 |
+
* @param string $plugin_name Имя плагина
|
78 |
+
* @param array $options Ассоциативный массив опций плагина
|
79 |
+
*/
|
80 |
+
do_action( 'wbcr/factory/all_options_loaded', $options, $this->plugin_name );
|
81 |
+
}
|
82 |
+
}
|
83 |
+
}
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Выгружает все сетевые опции плагина в объектный кеш. Плагин может получить любую свою опцию без запроса к базе
|
87 |
+
* данных. Метод ускоряет работу плагина, если опций очень много.
|
88 |
+
*
|
89 |
+
* Используется и работает только в режиме мультисайтов, один раз при инициализации плагина.!
|
90 |
+
*
|
91 |
+
* @since 4.0.8 - Добавлен
|
92 |
+
* @return void
|
93 |
+
*/
|
94 |
+
public function loadAllNetworkOptions() {
|
95 |
+
global $wpdb;
|
96 |
+
|
97 |
+
$network_id = (int) get_current_network_id();
|
98 |
+
|
99 |
+
$is_option_loaded = wp_cache_get( $network_id . ":" . $this->getPrefix() . 'all_options_loaded', $this->getPrefix() . 'network_options' );
|
100 |
+
|
101 |
+
if ( false === $is_option_loaded ) {
|
102 |
+
wp_cache_add_global_groups( [ $this->getPrefix() . 'network_options' ] );
|
103 |
+
|
104 |
+
$result = $wpdb->get_results( "SELECT meta_key, meta_value FROM {$wpdb->sitemeta} WHERE site_id='{$network_id}' AND meta_key LIKE '{$this->getPrefix()}%'" );
|
105 |
+
|
106 |
+
$options = [];
|
107 |
+
if ( ! empty( $result ) ) {
|
108 |
+
wp_cache_add( $network_id . ":" . $this->getPrefix() . 'all_options_loaded', 1, $this->getPrefix() . 'network_options' );
|
109 |
+
|
110 |
+
foreach ( $result as $option ) {
|
111 |
+
$value = maybe_unserialize( $option->meta_value );
|
112 |
+
$value = $this->normalizeValue( $value );
|
113 |
+
|
114 |
+
$cache_key = $network_id . ":" . $option->meta_key;
|
115 |
+
wp_cache_add( $cache_key, $value, $this->getPrefix() . 'network_options' );
|
116 |
+
$options[ $option->meta_key ] = $value;
|
117 |
+
}
|
118 |
+
|
119 |
+
/**
|
120 |
+
*
|
121 |
+
* Действие, которое будет выполнено, когда все сетевые опции плагина будут выгружены.
|
122 |
+
*
|
123 |
+
* @since 4.0.9 - Добавлен
|
124 |
+
*
|
125 |
+
* @param array $options Ассоциативный массив опций плагина
|
126 |
+
* @param string $plugin_name Имя плагина
|
127 |
+
*/
|
128 |
+
do_action( 'wbcr/factory/all_network_options_loaded', $options, $this->plugin_name );
|
129 |
+
}
|
130 |
+
}
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Позволяет получить популярную опцию. В случае если плагин установлен для сети (в режиме мультисайтов),
|
135 |
+
* то метод возвращает опции только для сети, иначе метод возвращает опцию для текущего сайта. Работает
|
136 |
+
* на основе self::getOption и self::getNetworkOption, смотрите полную реализацию в этих методах.
|
137 |
+
*
|
138 |
+
* @since 4.0.8 - Добавлен
|
139 |
+
*
|
140 |
+
* @param string $option_name Имя опции без префикса.
|
141 |
+
* @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
|
142 |
+
*
|
143 |
+
* @return mixed Возвращает значение опции, если это сериализованная строка, то автоматически распаковывает ее.
|
144 |
+
*/
|
145 |
+
public function getPopulateOption( $option_name, $default = false ) {
|
146 |
+
if ( $this->isNetworkActive() ) {
|
147 |
+
$option_value = $this->getNetworkOption( $option_name, $default );
|
148 |
+
} else {
|
149 |
+
$option_value = $this->getOption( $option_name, $default );
|
150 |
+
}
|
151 |
+
|
152 |
+
/**
|
153 |
+
* Фильтр позволяет отфильтровать возвращаемое значение популярной опции.
|
154 |
+
*
|
155 |
+
* @since 4.0.9 - Добавлен
|
156 |
+
*
|
157 |
+
* @param mixed $option_value Значение опции
|
158 |
+
* @param string $option_name Имя опции
|
159 |
+
* @param mixed $default Значение опции по умолчанию
|
160 |
+
*/
|
161 |
+
return apply_filters( "wbcr/factory/populate_option_{$option_name}", $option_value, $option_name, $default );
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* Позволяет получить сетевые опции. Если плагин установлен для сети (в режиме мультисайтов), то
|
166 |
+
* метод возвращает опции только для сети, иначе метод возвращает опцию для текущего сайта.
|
167 |
+
*
|
168 |
+
* Опция вытаскивается из объектного кеша, после выполнения метода self:loadAllNetworkOptions,
|
169 |
+
* а не напрямую из базы данных, из-за чего при работе с некоторыми кеширующими плагинами,
|
170 |
+
* может быть странное поведение в работе плагина.
|
171 |
+
*
|
172 |
+
* @since 4.0.8 - Добавлен
|
173 |
+
*
|
174 |
+
* @param string $option_name Имя опции без префикса.
|
175 |
+
* @param mixed $default Значение по умолчанию. Если опции нет в базе данных, будет возвращено это значение. По умолчанию false
|
176 |
+
*
|
177 |
+
* @return mixed Возвращает значение опции, если это сериализованная строка, то автоматически распаковывает ее.
|
178 |
+
*/
|
179 |
+
public function getNetworkOption( $option_name, $default = false ) {
|
180 |
+
if ( empty( $option_name ) || ! is_string( $option_name ) ) {
|
181 |
+
throw new Exception( 'Option name must be a string and must not be empty.' );
|
182 |
+
}
|
183 |
+
|
184 |
+
if ( ! is_multisite() ) {
|
185 |
+
return $this->getOption( $option_name, $default );
|
186 |
+
}
|
187 |
+
|
188 |
+
$this->loadAllNetworkOptions();
|
189 |
+
|
190 |
+
$network_id = (int) get_current_network_id();
|
191 |
+
$cache_key = $network_id . ':' . $this->getPrefix() . $option_name;
|
192 |
+
$option_value = wp_cache_get( $cache_key, $this->getPrefix() . 'network_options' );
|
193 |
+
|
194 |
+
if ( false === $option_value ) {
|
195 |
+
$option_value = $default;
|
196 |
+
}
|
197 |
+
|
198 |
+
/**
|
199 |
+
* Фильтр позволяет отфильтровать возвращаемое значение сетевой опции.
|
200 |
+
*
|
201 |
+
* @since 4.0.9 - Добавлен
|
202 |
+
*
|
203 |
+
* @param mixed $option_value Значение опции
|
204 |
+
* @pa
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|